[
  {
    "path": ".github/ISSUE_TEMPLATE/-------.md",
    "content": "---\nname: 質問＆サポート\nabout: わからないことや質問\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n## 困っていること\n\n## 画面名、機能名など（任意）\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/-----.md",
    "content": "---\nname: 不具合報告\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n## 不具合の概要\n\n## 再現方法\n**不具合の再現方法を箇条書きで記述してください**\n## 期待する動作\n\n## Screenshots\n**不具合が発生した時のスクリーンショットやキャプチャー**\n\n## 不具合が発生した時の端末\n - Device:\n - OS Version:\n - App Version:\n\n## 備考　\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n## 不具合の概要\n\n## 再現方法\n**不具合の再現方法を箇条書きで記述してください**\n## 期待する動作\n\n## Screenshots\n**不具合が発生した時のスクリーンショットやキャプチャー**\n\n## 不具合が発生した時の端末\n - Device:\n - OS Version:\n - App Version:\n\n## 備考　\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/other.md",
    "content": "---\nname: Other\nabout: Describe this issue template's purpose here.\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where the package manifests are located.\n# Please see the documentation for all configuration options:\n# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates\n\nversion: 2\nupdates:\n  - package-ecosystem: \"gradle\" # See documentation for possible values\n    directory: \"/\" # Location of package manifests\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/workflows/android-unit-test.yml",
    "content": "name: Android Unit Test\non:\n  push:\n    branches:\n      - master\n      - develop\n  pull_request:\n    branches:\n      - master\n      - develop\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v4\n      - name: Set up JDK 17\n        uses: actions/setup-java@v4\n        with:\n          java-version: '17'\n          distribution: zulu\n          cache: gradle\n\n      - name: Generate secret.properties\n        env:\n          PUSH_TO_FCM_AUTH: ${{ secrets.PUSH_TO_FCM_AUTH }}\n          PUSH_TO_FCM_PUBLIC_KEY: ${{ secrets.PUSH_TO_FCM_PUBLIC_KEY }}\n          PUSH_TO_FCM_SERVER_BASE_URL: ${{ secrets.PUSH_TO_FCM_SERVER_BASE_URL }}\n        run: |\n          echo \"push_to_fcm.server_base_url=${PUSH_TO_FCM_SERVER_BASE_URL}\" >> ./secret.properties\n          echo \"push_to_fcm.public_key=${PUSH_TO_FCM_PUBLIC_KEY}\" >> ./secret.properties\n          echo \"push_to_fcm.auth=${PUSH_TO_FCM_AUTH}\" >> ./secret.properties\n      - name: Grant execute permission for gradlew\n        run: chmod +x gradlew\n      - name: Run unit-test\n        run: ./gradlew lint testDebug --continue\n      - name: Build with Gradle\n        run: ./gradlew assembleRelease\n      - uses: actions/upload-artifact@v4\n        with:\n          name: outputs\n          path: app/build/outputs/"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Release Android to Google Play Store\non:\n  push:\n    branches-ignore:\n      - '**'\n    tags:\n      - 'v*'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v4\n      - name: Set up JDK 17\n        uses: actions/setup-java@v4\n        with:\n          java-version: '17'\n          distribution: zulu\n          cache: gradle\n      - name: Decode Keystore\n        run: |\n          echo \"${{ secrets.KEYSTORE_BASE64 }}\" | base64 --decode > app/keystore.jks\n          echo \"KEYSTORE_PATH=$(pwd)/app/keystore.jks\" >> $GITHUB_ENV\n      - name: Generate secret.properties\n        env:\n          PUSH_TO_FCM_AUTH: ${{ secrets.PUSH_TO_FCM_AUTH }}\n          PUSH_TO_FCM_PUBLIC_KEY: ${{ secrets.PUSH_TO_FCM_PUBLIC_KEY }}\n          PUSH_TO_FCM_SERVER_BASE_URL: ${{ secrets.PUSH_TO_FCM_SERVER_BASE_URL }}\n        run: |\n          echo \"push_to_fcm.server_base_url=${PUSH_TO_FCM_SERVER_BASE_URL}\" >> ./secret.properties\n          echo \"push_to_fcm.public_key=${PUSH_TO_FCM_PUBLIC_KEY}\" >> ./secret.properties\n          echo \"push_to_fcm.auth=${PUSH_TO_FCM_AUTH}\" >> ./secret.properties\n      - name: Get the version tag\n        run: echo \"ORG_GRADLE_PROJECT_VERSION_NAME=${GITHUB_REF#refs/tags/}\" >> $GITHUB_ENV\n      - name: Grant execute permission for gradlew\n        run: chmod +x gradlew\n      - name: Restore publish json key and write to ANDROID_PUBLISHER_CREDENTIALS\n        run: |\n            echo \"${{ secrets.ANDROID_PUBLISHER_CREDENTIALS_BASE64 }}\" | base64 --decode > app/google-play-publisher.json\n            echo \"ANDROID_PUBLISHER_CREDENTIALS_FILE=$(pwd)/app/google-play-publisher.json\" >> $GITHUB_ENV\n#        run: |\n#          JSON_CONTENT=\"$(echo \"${{ secrets.ANDROID_PUBLISHER_CREDENTIALS_BASE64 }}\" | base64 --decode)\"\n#          echo \"ANDROID_PUBLISHER_CREDENTIALS=$JSON_CONTENT\" >> $GITHUB_ENV\n\n      - name: Calculate version code\n        run: echo \"ORG_GRADLE_PROJECT_VERSION_CODE=$((${{ github.run_number }} + 3000))\" >> $GITHUB_ENV\n      - name: Assemble release build and publish\n        env:\n          KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}\n          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}\n          ALIAS: ${{ secrets.ALIAS }}\n        run: |\n          ./gradlew publishBundle \\\n          -Pandroid.injected.signing.store.file=$KEYSTORE_PATH \\\n          -Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD \\\n          -Pandroid.injected.signing.key.alias=$ALIAS \\\n          -Pandroid.injected.signing.key.password=$KEY_PASSWORD\n          \n\n\n\n\n\n"
  },
  {
    "path": ".github/workflows/release2github.yml",
    "content": "name: Release Android to Github Releases\non:\n  push:\n    branches-ignore:\n      - '**'\n    tags:\n      - 'v*'\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    timeout-minutes: 45\n    steps:\n      - uses: actions/checkout@v4\n      - name: Set up JDK 17\n        uses: actions/setup-java@v4\n        with:\n          java-version: '17'\n          distribution: zulu\n          cache: gradle\n      - name: Decode Keystore\n        run: |\n          echo \"${{ secrets.KEYSTORE_BASE64 }}\" | base64 --decode > app/keystore.jks\n          echo \"KEYSTORE_PATH=$(pwd)/app/keystore.jks\" >> $GITHUB_ENV\n      - name: Generate secret.properties\n        env:\n          PUSH_TO_FCM_AUTH: ${{ secrets.PUSH_TO_FCM_AUTH }}\n          PUSH_TO_FCM_PUBLIC_KEY: ${{ secrets.PUSH_TO_FCM_PUBLIC_KEY }}\n          PUSH_TO_FCM_SERVER_BASE_URL: ${{ secrets.PUSH_TO_FCM_SERVER_BASE_URL }}\n        run: |\n          echo \"push_to_fcm.server_base_url=${PUSH_TO_FCM_SERVER_BASE_URL}\" >> ./secret.properties\n          echo \"push_to_fcm.public_key=${PUSH_TO_FCM_PUBLIC_KEY}\" >> ./secret.properties\n          echo \"push_to_fcm.auth=${PUSH_TO_FCM_AUTH}\" >> ./secret.properties\n      - name: Get the version tag\n        run: echo \"ORG_GRADLE_PROJECT_VERSION_NAME=${GITHUB_REF#refs/tags/}\" >> $GITHUB_ENV\n      - name: Grant execute permission for gradlew\n        run: chmod +x gradlew\n\n      - name: Calculate version code\n        run: echo \"ORG_GRADLE_PROJECT_VERSION_CODE=$((${{ github.run_number }} + 3000))\" >> $GITHUB_ENV\n      - name: build apk\n        env:\n          KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}\n          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}\n          ALIAS: ${{ secrets.ALIAS }}\n        run: |\n          ./gradlew assembleRelease \\\n          -Pandroid.injected.signing.store.file=$KEYSTORE_PATH \\\n          -Pandroid.injected.signing.store.password=$KEYSTORE_PASSWORD \\\n          -Pandroid.injected.signing.key.alias=$ALIAS \\\n          -Pandroid.injected.signing.key.password=$KEY_PASSWORD\n      - name: release to github releases\n        uses: ncipollo/release-action@v1\n        with:\n          artifacts: \"app/build/outputs/**/*.apk\"\n          token: ${{ secrets.GITHUB_TOKEN }}\n\n\n\n\n\n\n"
  },
  {
    "path": ".gitignore",
    "content": "# Built application files\r\n*.apk\r\n*.ap_\r\n*.aab\r\n\r\n# Files for the ART/Dalvik VM\r\n*.dex\r\n\r\n# Java class files\r\n*.class\r\n\r\n# Generated files\r\nbin/\r\ngen/\r\nout/\r\n#  Uncomment the following line in case you need and you don't have the release build type files in your app\r\n# release/\r\n\r\n# Gradle files\r\n.gradle/\r\nbuild/\r\n\r\n# Local configuration file (sdk path, etc)\r\nlocal.properties\r\nsecret.properties\r\nbenchmark.properties\r\n# Proguard folder generated by Eclipse\r\nproguard/\r\n\r\n# Log Files\r\n*.log\r\n\r\n# Android Studio Navigation editor temp files\r\n.navigation/\r\n\r\n# Android Studio captures folder\r\ncaptures/\r\n\r\n# IntelliJ\r\n*.iml\r\n.idea/workspace.xml\r\n.idea/tasks.xml\r\n.idea/gradle.xml\r\n.idea/assetWizardSettings.xml\r\n.idea/dictionaries\r\n.idea/libraries\r\n# Android Studio 3 in .gitignore file.\r\n.idea/caches\r\n.idea/modules.xml\r\n# Comment next line if keeping position of elements in Navigation Editor is relevant for you\r\n.idea/navEditor.xml\r\n\r\n.idea/codeStyles/*\r\n# User-specific configurations\r\n.idea/caches/build_file_checksums.ser\r\n.idea/codeStyles/\r\n.idea/compiler.xml\r\n.idea/copyright/profiles_settings.xml\r\n.idea/dictionaries/\r\n.idea/libraries/\r\n.idea/misc.xml\r\n.idea/scopes/scope_settings.xml\r\n.idea/.name\r\n\r\n# Keystore files\r\n# Uncomment the following lines if you do not want to check your keystore files in.\r\n#*.jks\r\n#*.keystore\r\n\r\n# External native build folder generated in Android Studio 2.2 and later\r\n.externalNativeBuild\r\n\r\n# Google Services (e.g. APIs or Firebase)\r\n# google-services.json\r\n\r\n# Freeline\r\nfreeline.py\r\nfreeline/\r\nfreeline_project_description.json\r\n\r\n# fastlane\r\nfastlane/report.xml\r\nfastlane/Preview.html\r\nfastlane/screenshots\r\nfastlane/test_output\r\nfastlane/readme.md\r\n\r\n# Version control\r\nvcs.xml\r\n\r\n# lint\r\nlint/intermediates/\r\nlint/generated/\r\nlint/outputs/\r\nlint/tmp/\r\n# lint/reports/\r\n\r\nSecretConstant.java\r\nSecretConstantTest.java\r\nMisskeyAndroidClient.zip\r\n\r\n.DS_Store\r\n*.jks"
  },
  {
    "path": ".idea/.gitignore",
    "content": "runConfigurations.xml\ndeploymentTargetDropDown.xml\n!.gitignore\nandroidTestResultsUserPreferences.xml\n/inspectionProfiles"
  },
  {
    "path": ".idea/AndroidProjectSystem.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"AndroidProjectSystem\">\n    <option name=\"providerId\" value=\"com.android.tools.idea.GradleProjectSystem\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/GitLink.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"uk.co.ben_gibson.git.link.SettingsState\">\n    <option name=\"fallbackBranch\" value=\"develop\" />\n    <option name=\"host\" value=\"72037fcc-cb9c-4c22-960a-ffe73fd5e229\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/deploymentTargetSelector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"deploymentTargetSelector\">\n    <selectionStates>\n      <SelectionState runConfigName=\"app\">\n        <option name=\"selectionMode\" value=\"DROPDOWN\" />\n        <DropdownSelection timestamp=\"2026-04-11T07:25:48.537794Z\">\n          <Target type=\"DEFAULT_BOOT\">\n            <handle>\n              <DeviceId pluginId=\"LocalEmulator\" identifier=\"path=/Users/panta/.android/avd/Pixel_7_Pro_API_34.avd\" />\n            </handle>\n          </Target>\n        </DropdownSelection>\n        <DialogSelection />\n      </SelectionState>\n      <SelectionState runConfigName=\"TimelineCacheDAOTest\">\n        <option name=\"selectionMode\" value=\"DROPDOWN\" />\n      </SelectionState>\n      <SelectionState runConfigName=\"getTimelineItems()\">\n        <option name=\"selectionMode\" value=\"DROPDOWN\" />\n      </SelectionState>\n      <SelectionState runConfigName=\"findLastPreviousId()\">\n        <option name=\"selectionMode\" value=\"DROPDOWN\" />\n      </SelectionState>\n    </selectionStates>\n  </component>\n</project>"
  },
  {
    "path": ".idea/deviceManager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"DeviceTable\">\n    <option name=\"columnSorters\">\n      <list>\n        <ColumnSorterState>\n          <option name=\"column\" value=\"Name\" />\n          <option name=\"order\" value=\"ASCENDING\" />\n        </ColumnSorterState>\n      </list>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n  <component name=\"Encoding\" addBOMForNewFiles=\"with NO BOM\" />\r\n</project>"
  },
  {
    "path": ".idea/jarRepositories.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n  <component name=\"RemoteRepositoriesConfiguration\">\r\n    <remote-repository>\r\n      <option name=\"id\" value=\"central\" />\r\n      <option name=\"name\" value=\"Maven Central repository\" />\r\n      <option name=\"url\" value=\"https://repo1.maven.org/maven2\" />\r\n    </remote-repository>\r\n    <remote-repository>\r\n      <option name=\"id\" value=\"jboss.community\" />\r\n      <option name=\"name\" value=\"JBoss Community repository\" />\r\n      <option name=\"url\" value=\"https://repository.jboss.org/nexus/content/repositories/public/\" />\r\n    </remote-repository>\r\n    <remote-repository>\r\n      <option name=\"id\" value=\"BintrayJCenter\" />\r\n      <option name=\"name\" value=\"BintrayJCenter\" />\r\n      <option name=\"url\" value=\"https://jcenter.bintray.com/\" />\r\n    </remote-repository>\r\n    <remote-repository>\r\n      <option name=\"id\" value=\"maven\" />\r\n      <option name=\"name\" value=\"maven\" />\r\n      <option name=\"url\" value=\"https://jitpack.io\" />\r\n    </remote-repository>\r\n    <remote-repository>\r\n      <option name=\"id\" value=\"Google\" />\r\n      <option name=\"name\" value=\"Google\" />\r\n      <option name=\"url\" value=\"https://dl.google.com/dl/android/maven2/\" />\r\n    </remote-repository>\r\n    <remote-repository>\r\n      <option name=\"id\" value=\"MavenRepo\" />\r\n      <option name=\"name\" value=\"MavenRepo\" />\r\n      <option name=\"url\" value=\"https://repo.maven.apache.org/maven2/\" />\r\n    </remote-repository>\r\n    <remote-repository>\r\n      <option name=\"id\" value=\"maven2\" />\r\n      <option name=\"name\" value=\"maven2\" />\r\n      <option name=\"url\" value=\"https://maven.google.com\" />\r\n    </remote-repository>\r\n  </component>\r\n</project>"
  },
  {
    "path": ".idea/kotlinc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"KotlinJpsPluginSettings\">\n    <option name=\"version\" value=\"2.0.0\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/markdown.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"MarkdownSettings\">\n    <option name=\"previewPanelProviderInfo\">\n      <ProviderInfo name=\"Compose (experimental)\" className=\"com.intellij.markdown.compose.preview.ComposePanelProvider\" />\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "CLAUDE.md",
    "content": "# Milktea Android SDK 対応チェックリスト\n\nこのファイルはAndroid最新SDK対応の進捗管理用です。\n作業完了したタスクは `- [ ]` を `- [x]` に変えてください。\n\n---\n\n## Phase 1: M3 テーマ基盤の構築\n\n**全 Compose 作業の前提条件。最初に完了させる。**\n\n### 1-1. XML テーマを Material3 に移行\n- [x] `app/src/main/res/values-v23/themes.xml` — `Theme.MaterialComponents` → `Theme.Material3`、システムバー色属性を削除\n- [x] `app/src/main/res/values-v27/themes.xml` — 同上\n- [x] `modules/common_resource/src/main/res/values/themes.xml` — 同上（Dark/Black/Bread/ElephantDark テーマ）\n- [x] `app/src/main/res/values-v21/styles.xml` — 古いスタイル整理\n- [x] `modules/common_resource/src/main/res/values/styles.xml` — Widget.MaterialComponents.* → Widget.Material3.* に更新\n\n### 1-2. Compose M3 テーマラッパーの作成\n現在 `MdcTheme`（Material2 ブリッジ）を使用中 → M3 の `MaterialTheme` に置き換える。\n- [x] `modules/common_compose/MilkteaTheme.kt` に M3 用 `ColorScheme` を 5テーマ分定義\n  - White / Dark / Black / Bread / ElephantDark\n  - `Theme.toColorScheme()` 拡張関数で ThemeUtil.kt の Theme enum と同期\n- [x] `MdcTheme { }` → `MaterialTheme(colorScheme = ...) { }` に置き換え\n- [x] `libs.versions.toml` に `compose-material3 = \"1.3.1\"` を追加\n- [x] `common_compose/build.gradle` で material2 → material3 に差し替え、MdcTheme アダプター削除\n- [x] ビルド確認（Phase 2 の import 置き換え前なのでコンパイルエラーが大量に出る想定）\n\n---\n\n## Phase 2: Compose 全体の M3 移行\n\n**ビルドエラーを潰しながら進める。一気にやらず機能モジュール単位で対応。**\n\n### 2-1. 全ファイルの import 置き換え\n- [x] `androidx.compose.material.` → `androidx.compose.material3.` に一括置換（注意: API が変わるものがある）\n\n### 2-2. API 変更対応（M2 → M3 で変わる主要コンポーネント）\n\n| M2 | M3 | 対応ファイル数 |\n|----|-----|------------|\n| `MaterialTheme.colors.*` | `MaterialTheme.colorScheme.*` | 多数 |\n| `TopAppBar(backgroundColor=)` | `TopAppBar(colors=TopAppBarDefaults.*)` | 多数 |\n| `ModalBottomSheetLayout` | `ModalBottomSheet` | 3ファイル |\n| `Scaffold(backgroundColor=)` | `Scaffold(containerColor=)` | 33ファイル |\n| `Card(backgroundColor=)` | `Card(colors=CardDefaults.*)` | 多数 |\n| `Divider` | `HorizontalDivider` | 複数 |\n| `TabRow` | `TabRow`（ほぼ同じだが色指定が変わる） | 複数 |\n\n### 2-3. `ModalBottomSheetLayout` → `ModalBottomSheet` の書き換え（API が別物）\n- [x] `SearchAndSelectUserScreen.kt`\n- [x] `TabItemsListScreen.kt`\n- [x] `AccountSettingScreen.kt`\n\n### 2-4. モジュール別動作確認\n- [x] `features/auth` — AuthScreen, SignUpScreen 等\n- [x] `features/setting` — 22ファイル（最多）\n- [x] `features/note` — エディタ周り\n- [x] `features/channel` — ChannelScreen\n- [x] `features/drive` — DriveScreen\n- [x] `features/user` — ユーザー画面\n- [x] `features/messaging` — MessageScreen\n- [x] `features/gallery` — GalleryEditorPage\n- [x] `features/clip`, `group`, `userlist`, `search`, `account`\n- [x] `common_compose`, `common_android_ui` — 共通コンポーネント\n\n### ビルド確認\n- [x] `./gradlew :app:assembleDebug` BUILD SUCCESSFUL\n\n---\n\n## Phase 3: Accompanist 廃止ライブラリの置き換え\n\nM3 移行後に対応（M3 の PullToRefreshBox を使うため）。\n\n- [x] `accompanist-swiperefresh`（0.25.1）→ Material3 `PullToRefreshBox` に置き換え（`user/followrequests/FollowRequestsScreen.kt` 等）\n- [x] `accompanist-pager`（0.14.0）→ Compose Foundation の `HorizontalPager` / `VerticalPager` に置き換え\n  - `ChannelScreen.kt`（`ExperimentalPagerApi` 使用中）\n  - `DriveScreen.kt`（`ExperimentalPagerApi` 使用中）\n\n---\n\n## Phase 4: enableEdgeToEdge() 追加 + テーマのシステムバー色設定を削除\n\n`enableEdgeToEdge()` がシステムバー色を管理するため、テーマ側の設定と競合する（Phase 1 で XML テーマから削除済みのはず）。\n\n- [x] 全 Activity に `enableEdgeToEdge()` を追加（`onCreate` の `setContentView` より前）\n\n---\n\n## Phase 5: Compose 画面の Insets 対応\n\nPhase 4 で `enableEdgeToEdge()` が有効になった後、Compose 側の Insets を整備する。\n\n- [x] 全 `Scaffold` に `contentWindowInsets = WindowInsets.safeDrawing` を設定（33ファイル）\n- [x] `AuthScreen.kt` — 既存の `windowInsetsPadding` を `safeDrawing` に統一\n- [x] `MessageScreen.kt` — 同上\n\n---\n\n## Phase 6: 簡単な Android View Activity の個別 Insets 対応\n\n`adjustResize` → `adjustNothing` への変更 + `ViewCompat.setOnApplyWindowInsetsListener` で Insets を手動適用。\n\n- [x] `AuthorizationActivity` — `windowSoftInputMode` 変更 + Insets 対応\n- [x] `SearchActivity` — `windowSoftInputMode` 変更 + Insets 対応\n- [x] `GalleryPostsActivity` — `windowSoftInputMode` 変更 + Insets 対応\n- [x] `SearchAndSelectUserActivity` — `windowSoftInputMode` 変更 + Insets 対応\n\n---\n\n## Phase 7: MainActivity（DrawerLayout）対応\n\nDrawerLayout は `fitsSystemWindows` の挙動が変わるため個別対応が必要。\n\n> **注意: ViewPager2 の Insets 非伝播問題**\n> ViewPager2 は内部の `RecyclerView` が Window Insets を子 View に伝播しない既知の問題がある。\n> 各 Fragment が独自に Insets を処理するか、以下のワークアラウンドが必要：\n> ```kotlin\n> ViewCompat.setOnApplyWindowInsetsListener(viewPager) { _, insets ->\n>     for (i in 0 until viewPager.childCount) {\n>         ViewCompat.dispatchApplyWindowInsets(viewPager.getChildAt(i), insets)\n>     }\n>     insets\n> }\n> ```\n>\n> **ViewPager2 使用箇所（要個別確認）:**\n> - `TabFragment` — メインタブ（MainActivity 内）\n> - `SearchTopFragment` — 検索タブ\n> - `SearchResultActivity` — 検索結果タブ\n> - `MediaActivity` — メディアビューア\n> - `NoteDetailPagerFragment` — ノート詳細\n> - `UserDetailActivity` — ユーザープロフィールタブ\n> - `GalleryPostTabFragment` — ギャラリータブ\n> - `NotificationMentionFragment` — 通知タブ\n> - `EmojiPickerFragment` — 絵文字ピッカー\n> - `ReactionHistoryPagerDialog` — リアクション履歴\n> - `BottomSheetViewPager` — ボトムシート内 ViewPager\n\n- [x] `activity_main.xml` の DrawerLayout から `android:fitsSystemWindows=\"true\"` を削除（NavigationView は保持）\n- [x] `MainActivity` に `enableEdgeToEdge()` 追加（Phase 4 で対応済み）\n- [x] `MainActivity` に `ViewCompat.setOnApplyWindowInsetsListener` を追加、BottomNavigationView に bottom inset を適用\n- [x] `fragment_tab.xml` の AppBarLayout に `fitsSystemWindows=\"true\"` を追加して status bar inset を処理\n- [ ] ナビゲーションドロワーの表示確認（要実機確認）\n- [ ] `windowSoftInputMode=\"adjustPan\"` → `adjustNothing` への変更検討\n- [ ] `TabFragment` の ViewPager2 に Insets dispatch ワークアラウンドを追加（TabFragment は旧 ViewPager を使用、不要）\n\n---\n\n## Phase 8: キーボード絡みの Activity 対応\n\nIME（ソフトキーボード）表示時のレイアウト調整が必要な Activity。\n\n- [x] `NoteEditorActivity` — `adjustResize` → `adjustNothing` + `WindowInsetsCompat.Type.ime()` で対応\n- [x] `MessageActivity` — `adjustResize` → `adjustNothing` + IME Insets でチャット UI を押し上げ（MessageScreen.kt の contentWindowInsets を safeContent に変更）\n\n---\n\n## Phase 9: SDK・ライブラリバージョン更新\n\n### SDK\n- [x] `compileSdk` 34 → 35\n- [x] `targetSdk` 34 → 35\n\n### AGP・ビルドツール\n- [x] AGP `8.1.3` → `8.7.3` / Gradle `8.4` → `8.9`\n- [x] Google Services Plugin `4.3.15` → `4.4.2`\n- [x] Firebase Crashlytics Gradle `2.9.7` → `3.0.3`\n\n### ライブラリ\n- [ ] Kotlin `2.0.0` → `2.1.x`（**要 kapt → KSP 移行**。Dagger/Hilt の kapt が Kotlin 2.1.x メタデータ形式未対応）\n- [ ] Compose BOM 最新化（現在 `1.7.1`）\n- [x] Hilt `2.48.1` → `2.56` / hilt-work, hilt-compiler `1.0.0` → `1.2.0`\n- [x] Room `2.6.0` → `2.7.0`\n- [ ] Coil `2.4.0` → `3.x`（API 変更あり、要注意）\n- [x] OkHttp `4.10.0` → `4.12.0`\n- [x] Retrofit `2.9.0` → `2.11.0`\n- [x] Firebase BOM `32.2.2` → `33.12.0`\n- [x] kotlinx.datetime `0.4.0` → `0.6.1`\n- [x] kotlinx.serialization `1.6.3` → `1.7.3`\n- [x] coroutines `1.7.3` → `1.8.1`（新たに libs.versions.toml 管理へ）\n- [x] `swiperefreshlayout` `1.2.0-alpha01` → `1.1.0`（安定版）\n- [x] desugar_jdk_libs `1.1.5` → `2.1.3`\n\n### benchmark モジュール\n- [x] `benchmark/build.gradle` の Java バージョンを `1.8` → `17` に統一\n\n### その他対応\n- [x] バージョン定義を `libs.versions.toml` に一元化（room/retrofit/coroutines/nav/firebase-bom を ext ブロックから移行）\n- [x] SDK 35 対応: `Bitmap.Config` nullable 化 (`QRCodeBitmapGenerator.kt`)\n- [x] Firebase BOM 33.x 対応: `play-services-base` を data module に明示追加\n\n### 残タスク（Phase 10 候補）\n- [ ] Kotlin `2.1.x` 移行（kapt → KSP への全モジュール移行が必要）\n- [ ] Coil `3.x` 移行（アーティファクト ID 変更 + API 変更）\n- [ ] Compose BOM 最新化\n\n---\n\n## Phase 10: 16KB ページサイズ対応\n\nAndroid 15 以降で 16KB ページサイズデバイスに対応するための変更。\n\n- [x] `AndroidManifest.xml` に `android:extractNativeLibs=\"false\"` を追加（.so を APK 内で非圧縮格納し直接 mmap 可能にする）\n- [x] Flipper を削除（16KB 非対応のネイティブライブラリ libflipper.so 等を除去）\n  - `app/build.gradle` から `com.facebook.flipper:flipper`, `soloader`, `flipper-network-plugin` を削除\n  - `FlipperSetupManagerImpl.kt` を削除\n  - `DebugAppModule.kt` / `DebugAPIModule.kt` を no-op 実装に置き換え\n  - `EmptyDebuggerSetupManagerImpl` を `main` ソースセットに移動\n\n---\n\n## 参考：主要ファイルパス\n\n| 内容 | パス |\n|------|------|\n| アプリ build.gradle | `app/build.gradle` |\n| バージョンカタログ | `libs.versions.toml` |\n| AndroidManifest | `app/src/main/AndroidManifest.xml` |\n| Compose テーマ | `modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/MilkteaTheme.kt` |\n| テーマユーティリティ | `app/src/main/java/jp/panta/misskeyandroidclient/ThemeUtil.kt` |\n| MainActivity | `app/src/main/java/jp/panta/misskeyandroidclient/MainActivity.kt` |\n| メインレイアウト | `app/src/main/res/layout/activity_main.xml` |\n| テーマ（v23） | `app/src/main/res/values-v23/themes.xml` |\n| テーマ（v27） | `app/src/main/res/values-v27/themes.xml` |\n| 共通テーマ | `modules/common_resource/src/main/res/values/themes.xml` |\n| AuthScreen | `modules/features/auth/src/main/java/net/pantasystem/milktea/auth/AuthScreen.kt` |\n| MessageScreen | `modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessageScreen.kt` |\n| ChannelScreen | `modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelScreen.kt` |\n| DriveScreen | `modules/features/drive/src/main/java/net/pantasystem/milktea/drive/DriveScreen.kt` |\n| 設定 Compose | `modules/features/setting/src/main/java/net/pantasystem/milktea/setting/` |\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contribution Guide\nMilkteaにコントリビュートするためのガイドです。  \n\n## Issue\n下記のIssueを受け付けています。  \n- 不具合報告\n- 新機能要望\n- 機能強化要望\n- 質問\n\n## Pull Request\nPull Requestはいつでも大歓迎です！  \nIssueからPull Requestを作成するときは、必ずAssignするようにしてください。  \nPull Requestを作成するときは下記ルールに従い作成するようにしてください。  \n- ライセンスや法を遵守したコードであること\n- アーキテクチャやコーディング規約が存在する場合はそれらに従ったコードを書くこと\n- テンプレートに従いPRを作成すること\n- 動作するコードであること（CI/CDが完了する＆エミュレーターで動作することを確認してください)\n\n## ブランチの命名規則\n### 機能開発&リファクタリング\nIssueが存在しない場合はfeatureで初めてスラッシュで区切って、作業名や機能名で分割するようにしてください  \n`feature/機能名`  \n機能ブランチかつIssueが存在する場合はfeatureスラッシュ、で初めて次にシャープIssue番号、次にスラッシュで区切って作業名や機能名で分割するようにしてください。  \n`feature/#Issue番号/機能名`\n\n### 不具合修正系\nhotfixで始めるようにして、Issueが存在する場合はIssue番号を入れて、\n存在しない場合はそのまま修正する機能名や不具合名で始めるようにしてください。  \n`hotfix/#Issue番号/機能名or不具合名`  \n`hotfix/機能名or不具合名`\n\n# アーキテクチャ\n現在MilkteaではMVVMアーキテクチャをベースとしたアーキテクチャを採用しています。  \n非同期系の処理にはCoroutinesを採用しています。  \nリアクティブ系の処理にはCoroutines Flowを使用して処理をしています。  \n\n## ディレクトリ構成\nMilkteaではマルチモジュール構成になっていて、以下のような構造になっています。\n```\n.  \n├──app  \n├──modules  \n   ├──api  \n   ├──api_streaming\n   ├──app_store\n   ├──common\n   ├──common_android\n   ├──common_android_ui\n   ├──common_compose\n   ├──common_navigation\n   ├──common_resource\n   ├──common_viewmodel\n   ├──data\n   ├──features\n      ├──antenna\n      ├──auth\n      ├──channel\n      ├──drive\n      ├──favorite\n      ├──gallery\n      ├──group\n      ├──media\n      ├──messaging\n      ├──note\n      ├──notification\n      ├──search\n      ├──setting\n      ├──user\n      ├──userlist\n   ├──model\n```\n### app\nMainActivityなどの初回起動系のActivityやその関連の処理が入っています。\n### modules\n各種モジュールが入っているモジュールディレクトリです。\n### api\nRetrofit2のインターフェースや、通信のためのDTOなどのオブジェクトがここに入っています。\n### api_streaming\nMisskeyのStreaming APIに関する処理のモジュールです。\n### app_store\nアプリ全体で共有したい状態を管理する機能のことをMilkteaでは.*Storeと呼んでいて、\napp_storeモジュールはそれら機能を配置するためのモジュールです。\n### common\nAndroid, プロジェクトに依存しないような共通で使われる機能用のモジュールです。\n### common_android\nAndroidに関する共通機能を内包したモジュールです。  \nUIに関する機能は後述するcommon_android_uiかcommon_composeに分類しています。\n\n### common_android_ui\nAndroidのUIに関する共通機能などをここに分類しています。　\n### common_compose\nJetpack Composeに関する共通機能をここに分類しています。\n### common_navigation\nマルチモジュールを実現するために、遷移先の実装を抽象化する必要がありました。\ncommon_navigationは画面繊維や、その抽象のためのインターフェースが分類されています。\n\n### common_resource\ndrawableやstringsなどで共通して使いたいリソースをここに分類しています。\n\n### common_viewmodel\n本来ViewModelは画面:1で存在するべきものですが、  \n確認ダイアログやアプリ全体で共通して使う必要のあるViewModel実装をここに分類しています。  \n基本的には.*Storeで事足りるので、滅多に使わないものだと思ってください。\n\n### data\nAPI通信やDB処理に関する実装クラスがここに入っています。  \n後述するmodelに作成された抽象をここで実装することが多いです。  \n\n### features\nこのディレクトリには、各種機能ごとのUIのモジュールが格納されています。  \n各種機能のモジュールには、viewmodelやそのUIに関する処理が格納されています。  \n\n### model\nビジネスロジックや、APIやDB処理やキャッシュ処理などの抽象がここに入っています。  \n一般的にはここに抽象が作成され、dataモジュールで実装され、HiltというDIコンテナーで依存性の解決を行うことが多いです。\n\n## 代表的な役割クラス\nMilkteaではMVVMアーキテクチャを採用しています。  \nその中でもMilktea内でよく使われる概念や用語の説明をします。  \n\n### リソース名(Entity)\nUserやNoteなどのリソース名を直接指定したオブジェクトをEntityと呼称しています。  \n主にそのリソースに関するフィールドを持っていたり、そのデータに関連する振る舞いの実装を持っていることが多いです。  \n\n### リソース名Repository(Repository)\n永続化処理に関する抽象クラスです。  \n主にAPIへの取得、更新リクエストや、DBへの取得更新リクエストを行なっています。  \nまたMilkteaでは後述するDataSourceというサーバキャッシュ層を持っており、それらの更新をRepositoryが担っていたりします。  \n\n### リソース名DataSource(DataSource)\nサーバーから取得したデータ(Entity)のキャッシュを行なっています。  \n実際には実装クラスがあり、メモリ上やSQLite上に実装されることがあります。\n\n### リソース名Relation\n複数のEntityを組み合わせた構造体です。\n\n### 機能名,画面名ViewModel(ViewModel)\nViewModelです。\n\n### 機能名,画面名Activity(Activity)\nActivityです。\n\n### 機能名,画面名Fragment(Fragment)\nFragmentです。\n\n### 要素名Adapter(RecyclerView.Adapter)\nRecyclerView.Adapterの実装クラスです。  \nごく稀に諸事情でListViewのAdapter実装クラスの場合もあります。  \n\n### リソース名ViewData\nEntityやRelationをよりViewに最適化した構造のことをViewDataと呼称しています。  \nレイヤーとしてはViewModelやアプリケーション層に分類されると思っています。\n\n## ビルドするには\n\nプロジェクトをgit cloneします。  \nsecret.propertiesを作成します。  \n```\ntouch secret.properties\n```\nsecret.propertiesには  \n以下のような属性を追加してプッシュ通知の中継鯖についての設定をします。  \nプッシュ通知中継サーバについて  \nhttps://github.com/pantasystem/MisskeyAndroidClient/blob/develop/PushToFCM/README.md  \n\npush_to_fcm.server_base_urlにはプッシュ通知サーバのベースURLを設定します。  \npush_to_fcm.public_keyにはPushToFCMで生成したpublicを設定します。  \npush_to_fcm.authにはPushToFCMで生成したauthを設定します。  \n\n```\npush_to_fcm.server_base_url=https://hogehogehoge-pus\npush_to_fcm.public_key=中継鯖（PushToFCM）に設定したpublic_keyを設定します\npush_to_fcm.auth=中継鯖に設定したauth_secret.txtを設定します\n```\nAndroid SDK, AndroidStudioでビルドします。  "
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "PushToFCM/.dockerignore",
    "content": "node_modules\nnpm-debug.log"
  },
  {
    "path": "PushToFCM/.gitignore",
    "content": "/node_modules"
  },
  {
    "path": "PushToFCM/README.md",
    "content": "# プッシュ通知中継サーバ\nこれはプッシュ通知を受信するための中継サーバプログラムです。\n\n## 説明\nMisskeyからプッシュ通知を受信するには\n中継サーバを構築して、そこからFirebase Cloud Massaging経由で通知を送信します。\n\n## 使用方法\n### secretとkeyの生成\n初めにkeyGenerator.jsをnode.jsで実行してプッシュ通知を使用するための鍵を取得します。<br>\n\n```\nnode keyGenerator.js \npublic: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nprivate: yyyyyyyyyyyyyyyyyyyyyyyyyyyyy\nauth: vvvvvvvvvvvvvv\n```\n\nkeyディレクトリに以下のファイルを作成します。<br>\nauth_secret.txt<br>\nprivate_key.txt<br>\npublic_key.txt<br>\n```\ntouch ./key/auth_secret.txt\ntouch ./key/private_key.txt\ntouch ./key/public_key.txt\n```\n\nそれぞれのファイルにkeyGenerator.jsで生成した値を設定します。<br>\npublicを./key/public_key.txt<br>\nprivateを./key/private_key.txt<br>\nauthを./key/auth_secret.txt<br>\n```\necho xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > ./key/public_key.txt\necho yyyyyyyyyyyyyyyyyyyyyyyyyyyyy > ./key/private_key.txt\necho vvvvvvvvvvvvvv > ./key/auth_secret.txt\n```\n\n### Firebase adminの設定\nFirebase Cloud Messagingに接続するために<br>\nサーバーにFirebase Adminの設定をする必要があります。\nhttps://firebase.google.cn/docs/admin/setup?hl=ja<br>\n```\nexport GOOGLE_APPLICATION_CREDENTIALS=firebase-adminのjsonファイル.json\n```\n\nindex.jsを起動します。<br>\nあとはnginxなどで中継するように設定してください。\n"
  },
  {
    "path": "PushToFCM/docker/Dockerfile",
    "content": "from node:12\nWORKDIR /usr/src/app\nCOPY package*.json ./\nRUN npm install --only=production\nCOPY . .\nEXPOSE 3000\nCMD [\"node\", \"index.js\"]"
  },
  {
    "path": "PushToFCM/docker/node/Dockerfile",
    "content": "FROM node:16\nWORKDIR /usr/src/app\n\n"
  },
  {
    "path": "PushToFCM/docker-compose.yml",
    "content": "version: \"3\"\nservices:\n    push-server:\n        build: ./docker/node\n        user: ${user}\n        ports:\n            - 3000:3000\n        volumes:\n            - ./:/usr/src/app\n        command: [\"node\", \"index.js\"]\n        healthcheck:\n            test: [\"CMD-SHELL\", \"curl -fSsO /dev/null http://localhost:3000/health || exit 1\"]\n            interval: \"1s\"\n            timeout: \"1s\"\n            retries: \"2\"\n\n"
  },
  {
    "path": "PushToFCM/index.js",
    "content": "const express = require('express');\nconst app = express();\nconst Concat = require('concat-stream');\nconst fs = require('fs');\nconst i18n = require('i18n');\nconst notificationBuilder = require('./notification_builder');\n\nconst webPushDecipher = require('./webPushDecipher.js');\n\nconst AUTH_SECRET = fs.readFileSync('./key/auth_secret.txt', 'utf8');\nconst PUBLIC_KEY = fs.readFileSync('./key/public_key.txt', 'utf8');\nconst PRIVATE_KEY = fs.readFileSync('./key/private_key.txt', 'utf8');\n\nconst admin = require('firebase-admin');\nconst { resourceUsage } = require('process');\nadmin.initializeApp({\n    credential: admin.credential.applicationDefault(),\n});\nconst messaging = admin.messaging();\n\ni18n.configure({\n    locales: ['ja', 'en'],\n    defaultLocal: 'en',\n    directory: __dirname + \"/locales\",\n    objectNotation: true\n});\n\n\nconsole.log('start server');\n\napp.use(i18n.init);\n\nconst switchLangMiddleware = (req, _, next) => {\n    if(req.query.lang) {\n        i18n.setLocale(req, req.query.lang);\n    }else{\n        i18n.setLocale(req, 'en');\n    }\n    next();\n}\n\nconst rawBodyMiddlware = (req, _, next) => {\n    req.pipe(new Concat(function(data) {\n        req.rawBody = data;\n        next();\n    }))\n}\n\nconst decodeBodyMiddleware = (req, res, next) => {\n    let rawBody = req.rawBody;\n    if (!rawBody) { \n        console.log('Invalid Body');\n        return res.status(200).send('Invalid Body.').end(); \n    }\n    const converted = rawBody.toString('base64');\n    const key = webPushDecipher.buildReciverKey(PUBLIC_KEY, PRIVATE_KEY, AUTH_SECRET);\n    //console.log(`public_key:${PUBLIC_KEY}, private_key:${PRIVATE_KEY}, auth_secret:${AUTH_SECRET}`);\n    try {\n        let decrypted = webPushDecipher.decrypt(converted, key, false);\n        req.rawJson = decrypted;\n    } catch (e) {\n        console.log(`Decrypt Error: ${e}, request original url: ${req.originalUrl}, headers:${JSON.stringify(req.headers)}`);\n        throw e;\n    }\n    \n    next();\n}\n\nconst decodeMastodonWebPushMiddleware = (req, res, next) => {\n    let rawBody = req.rawBody;\n    if (!rawBody) { \n        console.log('Invalid Body');\n        return res.status(200).send('Invalid Body.').end(); \n    }\n    const converted = rawBody.toString('base64');\n    const key = webPushDecipher.buildReciverKey(PUBLIC_KEY, PRIVATE_KEY, AUTH_SECRET);\n    //console.log(`public_key:${PUBLIC_KEY}, private_key:${PRIVATE_KEY}, auth_secret:${AUTH_SECRET}`);\n    try {\n        const saltInHeader = req.headers['encryption'];\n        const keyidInHeader = req.headers['crypto-key'];\n        const salt = webPushDecipher.decodeBase64(saltInHeader.substring(\"salt=\".length, saltInHeader.length));\n        const keyid = webPushDecipher.decodeBase64(keyidInHeader.substring(\"keyid=\".length, keyidInHeader.length));\n        console.log(`salt:${salt.length}, keyid:${keyid.length}`);\n        let decrypted = webPushDecipher.decryptContent(converted, key, salt, keyid, false);\n        req.rawJson = decrypted;\n    } catch (e) {\n        console.log(`Decrypt Error: ${e}, request original url: ${req.originalUrl}`);\n        throw e;\n    }\n    \n    next();\n}\nconst parseJsonMiddleware = (req, res, next) => {\n    try {\n        req.decodeJson = JSON.parse(req.rawJson);\n        next();\n    }catch(e) {\n        console.log('parse error', req.rawJson, e);\n        return res.status(400).end();\n    }\n}\n\napp.post('/webpushcallback', rawBodyMiddlware, decodeBodyMiddleware, parseJsonMiddleware, switchLangMiddleware ,async (req, res, next)=>{\n    let deviceToken = req.query.deviceToken;\n    let accountId = req.query.accountId;\n    console.log('call webpushcallback');\n    if(!(deviceToken && accountId)) {\n        console.warn('無効な値');\n        return res.status(410).end();\n    }\n\n    if(req.decodeJson.type != 'notification') {\n        return res.status(500).end();\n    }\n    let convertedNotification;\n    try {\n        convertedNotification = notificationBuilder.generateNotification(res, req.decodeJson.body);\n    } catch (e) {\n        return res.status(500).end();\n    }\n\n\n    const msgData = {\n        title: convertedNotification.title,\n        body: convertedNotification.body,\n        type: convertedNotification.type,\n        notificationId: req.decodeJson.body.id,\n        accountId: accountId\n    }\n    \n    const message = {\n        token: deviceToken,\n        notification: {\n            title: convertedNotification.title,\n            body: convertedNotification.body\n        }\n    };\n    if(req.decodeJson.body.note != null) {\n        msgData.noteId = req.decodeJson.body.note.id;\n    }\n    if(req.decodeJson.body.userId != null) {\n        msgData.userId = req.decodeJson.body.userId;\n    }\n    message.data = msgData;\n    // console.log(message);\n    try {\n        await messaging.send(message);\n        res.status(204).end();\n        return;\n    } catch (e) {\n        if (\n            [\n              'The registration token is not a valid FCM registration token',\n              'Requested entity was not found.',\n              'NotRegistered.'\n            ].includes(e.message)\n        ) {\n            console.log('トークン切れ');\n            res.status(410).end();\n        } else {\n            console.error(\"未知のエラー\", e);\n            res.status(500).end();\n        }\n        return;\n    }\n\n});\n\napp.post(\"/webpushcallback-4-mastodon\", rawBodyMiddlware, decodeMastodonWebPushMiddleware, parseJsonMiddleware, switchLangMiddleware ,async (req, res)=>{\n    let deviceToken = req.query.deviceToken;\n    let accountId = req.query.accountId;\n    if(!(deviceToken && accountId)) {\n        console.warn('無効な値');\n        return res.status(410).end();\n    }\n    const title = req.decodeJson.title;\n    const body = req.decodeJson.body;\n    const message = {\n        token: deviceToken,\n        notification: {\n            title: title,\n            body: body\n        }\n    };\n    message.data = {\n        title: title,\n        body: body,\n        type: req.decodeJson.notification_type,\n        notificationId: req.decodeJson.notification_id,\n        accountId: accountId\n    }\n    console.log(message);\n    try {\n        await messaging.send(message);\n        res.status(204).end();\n        return;\n    } catch (e) {\n        if (\n            [\n              'The registration token is not a valid FCM registration token',\n              'Requested entity was not found.',\n              'NotRegistered.'\n            ].includes(e.message)\n        ) {\n            console.log('トークン切れ');\n            res.status(410).end();\n        } else {\n            console.error(\"未知のエラー\", e);\n            res.status(500).end();\n        }\n        return;\n    }\n});\n\napp.get('/health', switchLangMiddleware,(req, res)=>{\n    let msg= res.__('test.message');\n    res.json({'msg': msg});\n})\napp.listen(3000);"
  },
  {
    "path": "PushToFCM/key/.gitignore",
    "content": "*\n!.gitignore"
  },
  {
    "path": "PushToFCM/keyGenerator.js",
    "content": "const crypto = require('crypto');\nconst util = require('util');\nconst urlsafeBase64 = require('urlsafe-base64');\n\nconst keyCurve = crypto.createECDH('prime256v1');\nkeyCurve.generateKeys();\n\nconsole.log(\"public:\", urlsafeBase64.encode(keyCurve.getPublicKey()));\nconsole.log(\"private:\", urlsafeBase64.encode(keyCurve.getPrivateKey()));\nconsole.log(\"auth:\", urlsafeBase64.encode(crypto.randomBytes(16)));"
  },
  {
    "path": "PushToFCM/locales/en.json",
    "content": "{\n    \"title\": {\n        \"follow\": \"Followed\",\n        \"mention\": \"Mentioned by {{name}}\",\n        \"reply\": \"Replied by {{name}}\",\n        \"renote\": \"Renoted by {{name}\",\n        \"quote\": \"Quoted by {{name}}\",\n        \"reaction\": \"{{reaction}}:{{name}}\",\n        \"pollVote\": \"Voted by {{name}}\",\n        \"receiveFollowRequest\": \"Receive follow request\",\n        \"followRequestAccepted\": \"Accepted the follow request\"\n    },\n    \n    \"test\": {\n        \"message\": \"Test\"\n    }\n}"
  },
  {
    "path": "PushToFCM/locales/ja.json",
    "content": "{\n    \"title\": {\n        \"follow\": \"フォローされました\",\n        \"mention\": \"{{name}}からメンションがきました\",\n        \"reply\": \"{{name}}さんから返信がきました\",\n        \"renote\": \"{{name}}さんにリノートされました\",\n        \"quote\": \"{{name}}さんに引用されました\",\n        \"reaction\": \"{{reaction}}:{{name}}\",\n        \"pollVote\": \"{{name}}さんが投票しました\",\n        \"receiveFollowRequest\": \"フォローリクエストを受け取りました\",\n        \"followRequestAccepted\": \"フォローリクエストを承認しました\"\n    },\n    \"test\": {\n        \"message\": \"てすと\"\n    }\n}"
  },
  {
    "path": "PushToFCM/notification_builder.js",
    "content": "\nconst notificationType = {\n    follow: \"follow\",\n    mention: \"mention\",\n    reply: \"reply\",\n    renote: \"renote\",\n    quote: \"quote\",\n    reaction: \"reaction\",\n    pollVote: \"pollVote\",\n    receiveFollowRequest: \"receiveFollowRequest\",\n    followRequestAccepted: \"followRequestAccepted\"\n\n};\n\nfunction buildTitle(res, notification) {\n    if(notification.type == 'reaction')  {\n        return res.__('title.reaction', {name : getDisplayUserName(notification.user), reaction: notification.reaction });\n    }\n\n    if(notification.type == notificationType.follow \n        || notification.type == notificationType.receiveFollowRequest\n        || notification.type == notificationType.followRequestAccepted\n        || notification.type == notificationType.followRequestAccepted\n    ) {\n        return res.__(`title.${notification.type}`);\n    } \n    return res.__(`title.${notification.type}`, {name: getDisplayUserName(notification.user)});\n}\n\nfunction getShortMessageFromNote(note) {\n    if(note.text || note.cw) {\n        return note.cw ?? note.text;\n    }\n    if(note.files && note.files.length) {\n        return `files: ${note.files.length}`;\n    }\n    if(note.poll != null) {\n        return `choices: ${note.poll.choices}`;\n    }\n}\n\nfunction buildBody(_, notification) {\n    let type = notification.type;\n    if(type == notificationType.follow) {\n        return getDisplayUserName(notification.user);\n    }\n    if(type == notificationType.mention) {\n        return getShortMessageFromNote(notification.note);\n    }\n    if(type == notificationType.reply) {\n        return getShortMessageFromNote(notification.note);\n    }\n    if(type == notificationType.renote) {\n        return getShortMessageFromNote(notification.note.renote);\n    }\n    if(type == notificationType.quote) {\n        return getShortMessageFromNote(notification.note);\n    }\n    if(type == notificationType.reaction) {\n        return getShortMessageFromNote(notification.note);\n    }\n    if(type == notificationType.pollVote) {\n        return getShortMessageFromNote(notification.note);\n    }\n    return null;\n}\n\nclass MessagingNotification {\n    constructor(type, title, body) {\n        this.type = type;\n        this.title = title;\n        this.body = body;\n    }\n}\n\n\nexports.generateNotification = function (res, notification) {\n\n    let type = notification.type;\n    let title = buildTitle(res, notification);\n    let body = buildBody(res, notification);\n    return new MessagingNotification(type, title, body);\n}\n\nfunction getDisplayUserName(user) {\n    if(user.name) {\n        return user.name;\n    }\n    return user.userName;\n}"
  },
  {
    "path": "PushToFCM/package.json",
    "content": "{\n  \"name\": \"pushtofcm\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Misskey Push to fcm server\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\",\n    \"start\": \"node index.js\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"concat-stream\": \"^2.0.0\",\n    \"crypt\": \"^0.0.2\",\n    \"encoding-japanese\": \"^1.0.30\",\n    \"express\": \"^4.17.3\",\n    \"firebase-admin\": \"^11.5.0\",\n    \"fs\": \"^0.0.1-security\",\n    \"i18n\": \"^0.13.3\",\n    \"node-forge\": \">=1.3.0\",\n    \"urlsafe-base64\": \"^1.0.0\",\n    \"util\": \"^0.12.4\"\n  }\n}\n"
  },
  {
    "path": "PushToFCM/webPushDecipher.js",
    "content": "//\n// WebPushをdecryptするヤツ(on Node.js)\n//\n// **参考**\n// https://tools.ietf.org/html/rfc8188\n// https://tools.ietf.org/html/rfc8291\n// https://tools.ietf.org/html/rfc8291#appendix-A\n// https://gist.github.com/tateisu/685eab242549d9c9ffc85020f09a4b71\n// ↑一部 @tateisu氏のコードを参考にしています\n// (アドバイスありがとうございました！→ https://mastodon.juggler.jp/@tateisu/104098620591598243)\n// こちらのコードは@YuigaWadaさんのコードを一部改変して利用しています。\n// https://github.com/YuigaWada/MissCat/blob/develop/ApiServer/api.js\nconst util = require(\"util\");\nconst crypto = require(\"crypto\");\nconst encoding = require('encoding-japanese');\n\nfunction decodeBase64(src) {\n  return Buffer.from(src, \"base64\");\n}\n\nfunction sha256(key, data) {\n  return crypto.createHmac(\"sha256\", key).update(data).digest();\n}\n\nfunction log(verbose, label, text) {\n  if (!verbose) { return; }\n  console.log(label, text);\n}\n\n// 通知を受け取る側で生成したキーを渡す\nexports.buildReciverKey = function (public, private, authSecret) {\n  this.public = decodeBase64(public);\n  this.private = decodeBase64(private);\n  this.authSecret = decodeBase64(authSecret);\n  return this;\n};\n\n// WebPushで流れてきた通知をdecrypt\nexports.decrypt = function (body64, receiverKey, verbose) {\n  let body = decodeBase64(body64);\n\n  // bodyを分解してsalt, keyid, 暗号化されたcontentsを取り出す\n  // bodyの構造は以下の通り↓\n  /*\n  https://tools.ietf.org/id/draft-ietf-httpbis-encryption-encoding-09.xml#header\n\t+-----------+--------+-----------+---------------+\n\t| salt (16) | rs (4) | idlen (1) | keyid (idlen) |\n\t+-----------+--------+-----------+---------------+\n\t*/\n\n  const salt = body.slice(0, 16);\n  const rs = body.slice(16, 16 + 4);\n\n  const idlen_hex = body.slice(16 + 4, 16 + 4 + 1).toString(\"hex\");\n  const idlen = parseInt(idlen_hex, 16); // keyidの長さ\n  const keyid = body.slice(16 + 4 + 1, 16 + 4 + 1 + idlen);\n\n  const content = body.slice(16 + 4 + 1 + idlen, body.length);\n\n  // For Verbose Mode\n  log(verbose, \"salt\", salt.toString(\"base64\"));\n  log(verbose, \"rs\", rs.toString(\"hex\"));\n  log(verbose, \"idlen_hex\", idlen_hex);\n  log(verbose, \"idlen\", idlen);\n  log(verbose, \"keyid\", keyid.toString(\"base64\"));\n\n  return decryptContent(content, receiverKey, salt, keyid, verbose);\n};\n\nfunction decryptContent(content, receiverKey, salt, keyid ,verbose) {\n  let auth_secret = receiverKey.authSecret;\n  let receiver_public = receiverKey.public;\n  let receiver_private = receiverKey.private;\n\n  const sender_public = decodeBase64(keyid.toString(\"base64\"));\n\n  // 共有秘密鍵を生成(ECDH)\n  let receiver_curve = crypto.createECDH(\"prime256v1\");\n  receiver_curve.setPrivateKey(receiver_private);\n  const sharedSecret = receiver_curve.computeSecret(keyid);\n\n  /*\n\t  # HKDF-Extract(salt=auth_secret, IKM=ecdh_secret)\n\t  PRK_key = HMAC-SHA-256(auth_secret, ecdh_secret)\n\t  # HKDF-Expand(PRK_key, key_info, L_key=32)\n\t  key_info = \"WebPush: info\" || 0x00 || ua_public || as_public\n\t  IKM = HMAC-SHA-256(PRK_key, key_info || 0x01)\n\t  ## HKDF calculations from RFC 8188\n\t  # HKDF-Extract(salt, IKM)\n\t  PRK = HMAC-SHA-256(salt, IKM)\n\t  # HKDF-Expand(PRK, cek_info, L_cek=16)\n\t  cek_info = \"Content-Encoding: aes128gcm\" || 0x00\n\t  CEK = HMAC-SHA-256(PRK, cek_info || 0x01)[0..15]\n\t  # HKDF-Expand(PRK, nonce_info, L_nonce=12)\n\t  nonce_info = \"Content-Encoding: nonce\" || 0x00\n\t  NONCE = HMAC-SHA-256(PRK, nonce_info || 0x01)[0..11]\n\t*/\n\n  // key\n  const prk_key = sha256(auth_secret, sharedSecret);\n  const keyInfo = Buffer.concat([\n    Buffer.from(\"WebPush: info\\0\"),\n    receiver_public,\n    sender_public,\n    Buffer.from(\"\\1\")\n  ]);\n  const ikm = sha256(prk_key, keyInfo);\n\n  // prk\n  // https://tools.ietf.org/id/draft-ietf-httpbis-encryption-encoding-09.xml#derivation\n  const prk = sha256(salt, ikm);\n  log(verbose, \"prk\", prk.toString(\"base64\"));\n\n  // cek\n  // https://tools.ietf.org/id/draft-ietf-httpbis-encryption-encoding-09.xml#derivation\n  const cekInfo = Buffer.from(\"Content-Encoding: aes128gcm\\0\\1\");\n  const cek = sha256(prk, cekInfo).slice(0, 16);\n  log(verbose, \"cek\", cek.toString(\"base64\"));\n\n  // initialization vector\n  // https://tools.ietf.org/id/draft-ietf-httpbis-encryption-encoding-09.xml#nonce\n  const nonceInfo = Buffer.from(\"Content-Encoding: nonce\\0\\1\");\n  const nonce = sha256(prk, nonceInfo).slice(0, 12);\n  const iv = nonce;\n  log(verbose, \"nonce:\", nonce.toString(\"base64\"));\n\n  // aes-128-gcm\n  const decipher = crypto.createDecipheriv(\"aes-128-gcm\", cek, iv);\n  let result = decipher.update(content);\n  log(verbose, 'type:', typeof(result));\n  log(verbose, '文字コード:', encoding.detect(result));\n  log(verbose, \"decrypted: \", result.toString(\"utf8\"));\n\n  // remove padding and GCM auth tag\n  while (result.slice(result.length-1,result.length) != \"}\") { // jsonの末端が見えるまで一文字ずつ消していく\n    result = result.slice(0,result.length-1);\n  }\n\n  log(verbose, \"shaped:\", result.toString(\"utf8\"));\n  return result.toString(\"utf8\");\n}\n\nexports.decryptContent = decryptContent;\nexports.decodeBase64 = decodeBase64;"
  },
  {
    "path": "README-EN.md",
    "content": "# Milktea\n\n<img src=\"https://github.com/Kinoshita0623/MisskeyAndroidClient/blob/master/app/src/main/ic_launcher-web.png?raw=true\" width=\"100px\">\nWould you like Milktea with Misskey?<br>\nMisskey Android client app<br>\n\n## Introduction\nMilktea is Android client app for [Misskey](https://github.com/misskey-dev/misskey)<br>\n\n## Purpose\nMilktea was developed to achieve following purposes.\n- Provide as like Android UI\n- Support as many Misskey features as possible\n- Comfortable touch even if you have migrated from other social network apps \n- Unique features to make Milktea easier to use\n- Get more people to use Misskey\n- Develop Milktea on an ongoing basis\n\n## Features\n### Timeline\nMilktea can displaies Timeline from Misskey instance in real time.<br>\n\n### Timeline Tab function\nYou can fix and rearrange the most frequently viewed Timeline at the top of tabs.<br>\nThe tab function can be used to fix below Timeline.\n- Global Timeline\n- Social Timeline\n- Local Timeline\n- Home Timeline\n- User List Timeline\n- List of user's Notes\n- Search result\n- Antenna Timeline\n- Gallery\n- List of Threads\n- Favorite\n- Notification\n### Posting Note\nYou can create and post Notes from Milktea.<br>\nThere is no need to wait until the finish of its upload when posting Notes, because its upload is done asynchronously.<br>\n\n### Reaction Picker\nThe function of making a reaction for Notes.<br>\nReaction picker is categorized by (custom)emojis on the tabs.<br>\n- Pinned user's setting\n- Frequently used emojis\n- Several (custom)emoji categories\n\n### Save drafts of Notes\nThis is one of the unique feature for Milktea.<br>\nYou can save a draft of Notes while creating it.\n### Drive\nYou can see your own files in Misskey Drive.\n\n### Overwrite display name\nIn Misskey, there was a case that the Name displayed on the screen was different from the nickname which used in the conversation between Misskey users. It was very complicated to have a difference of Name and the nickname. So, I implemented a function to overwrite the nickname and only display it on Milktea.<br>\n\n\n## Installation\nDownload from [Google Play Store](https://play.google.com/store/apps/details?id=jp.panta.misskeyandroidclient) and install into your device.\n\nCreate your account on the instance you wish to use.<br>\n[About Misskey](https://misskey-hub.net/en/docs/misskey.html) /\n[List of Instances](https://misskey-hub.net/en/instances.html)\n\nLaunch the app after its installation is complete.\nWhen \"Authentication\" screen appears, type Misskey instance URL you're trying to use.\nFor example, when you want to use misskey.io, type `misskey.io` .\n\nYou can freely change \"App name\".<br>\n\"App name\" maybe displaied with \"via\" on the instance depending on a Misskey version of it.<br>\n\nPress AUTHENTICATION when you're ready.<br><br>\n<img src=\"https://user-images.githubusercontent.com/38454985/81928170-d03c8080-961f-11ea-8acc-b1d752d72de7.png\" width=\"320px\">\n\nThe authentication screen will appear in your default browser. If there is no problem, click \"Accept\".<br>\nIf you're not redirected to the app, press the \"Back\" button and press \"I have given permission\".<br><br>\n<img src=\"https://user-images.githubusercontent.com/38454985/81928454-3cb77f80-9620-11ea-839b-ea28962a0a92.png\" width=\"320px\">\n\nIf successful, you will be redirected to Milktea and press \"CONTINUE\" to complete.<br><br>\n<img src=\"https://user-images.githubusercontent.com/38454985/81928572-6c668780-9620-11ea-800a-bbb03721ce8e.png\" width=\"320px\">\n\n## Build\n\n`git clone` this repo and create a file `secret.properties`.<br>\n```\ntouch secret.properties\n```\nAdd the following attributes to secret.properties to configure the settings about the relay server for push notifications.<br>\nTo read more about the relay server for push notifications, please check below link.<br>\nhttps://github.com/pantasystem/MisskeyAndroidClient/blob/develop/PushToFCM/README.md<br>\n\nSet these settings for each variables:<br>\nBase URL for the push notification server for `push_to_fcm.server_base_url`<br>\n`public_key` generated by PushToFCM for `push_to_fcm.public_key`<br>\n`auth_secret.txt` generated by PushToFCM for `push_to_fcm.auth`\n\nFor example:<br>\n```\npush_to_fcm.server_base_url=https://FooBarFooBar-pus\npush_to_fcm.public_key=public_key\npush_to_fcm.auth=auth_secret.txt\n```\nAnd then, build Milktea on Android SDK or AndroidStudio.\n"
  },
  {
    "path": "README.md",
    "content": "# Milktea\n\n<img src=\"https://github.com/Kinoshita0623/MisskeyAndroidClient/blob/master/app/src/main/ic_launcher-web.png?raw=true\" width=\"100px\">\n<br>\nFediverseにMilkteaはいかが？<br>\nMisskey, MastodonのAndroidクライアント<br>\n\n## 説明\nMilkteaはMastodonと[Misskey](https://github.com/misskey-dev/misskey)のためのAndroidクライアントアプリケーションです。<br>\n\n## 目標\nMilkteaでは以下のことを達成することを目標とし開発をしました。\n- ソフトウェアの差をできる限り意識させることなくFediverseライフをおくれるようにすること\n- AndroidらしいUIで提供すること\n- 競合サービスから移住してきても違和感なく触れるUIであること\n- 独自機能を追加してより使いやすくすること\n- 継続的な開発ができること\n- Fediverseの存在を意識せずにFediverse lifeをおくれるようにすること\n\n## 機能\n### タイムライン\nMastodon, Misskeyから流れてきたタイムラインを、<br>\nリアルタイムで表示することができます。<br>\n\n### タイムラインタブ機能\nよく表示するタイムラインを上部のタブに固定＆並び替えをすることができます。<br>\nタブ機能は以下のタイムラインの項目を固定することができます。\n- グローバルタイムライン\n- ソーシャルタイムライン\n- ローカルタイムライン\n- ホームタイムライン\n- ユーザーリストタイムライン\n- ユーザーの投稿一覧\n- 検索結果\n- アンテナタイムライン\n- ギャラリー\n- スレッド一覧\n- お気に入り\n- 通知\n### ノート投稿\nMilkteaから投稿を作成することができます。<br>\nファイルのアップロードが非同期で行われるため、<br>\n投稿時にファイルアップロードを待つ必要がありません。<br>\n\n### リアクションピッカー\nノートにリアクションを付けるときのための機能です。<br>\nリアクションピッカーはタブ状にカスタム絵文字、絵文字が分類されています。<br>\n- ユーザー固定\n- よく使うリアクション\n- カテゴリ別(複数)\n\n### ノートの下書き機能\nMilkteaの独自機能で、<br>\nノートを途中で下書き保存することができます。\n### ドライブ\nMisskeyのドライブのファイルを表示することができます。\n\n### ニックネームの上書き\nMisskeyでは表記上のニックネームと、<br>\n実際にユーザー間の会話で用いられる呼び名が異なることがありました。<br>\n表示名と呼び名が異なるのは非常にややこしかったので、<br>\n表面的にニックネームを上書き＆表示する機能を実装しました。<br>\n\n\n## インストール方法\n[GooglePlayストア](https://play.google.com/store/apps/details?id=jp.panta.misskeyandroidclient)でダウンロード&インストール\n\n利用するインスタンスで事前にアカウントを作成してください。<br>\n[はじめに](https://join.misskey.page/ja/wiki/first)\n[インスタンス一覧](https://join.misskey.page/ja/wiki/instances/)\n\nインストールが完了したらアプリを起動します。\n認可画面が表示されるので、利用しようとしているインスタンスのURLを入力します。<br>\n例えばmisskey.ioを利用する場合は、「misskey.io」と入力します。\n\napp nameは自由に設定することがでます。<br>\napp nameはインスタンスのバージョンによってはvia名として公開される場合があります。<br>\n\n準備ができれば AUTHENTICATION (認証)を押します。<br>\n<img src=\"https://user-images.githubusercontent.com/38454985/81928170-d03c8080-961f-11ea-8acc-b1d752d72de7.png\" width=\"320px\">\n\n認証画面がブラウザに表示されるので、問題がなければ許可(Accept)を押します。<br>\nもし、リダイレクトしない場合は戻るボタンを押して、「私は許可をしました」を押してください。<br>\n<img src=\"https://user-images.githubusercontent.com/38454985/81928454-3cb77f80-9620-11ea-839b-ea28962a0a92.png\" width=\"320px\"><br>\n\n成功すればMilkteaにリダイレクトするので[続行(CONTINUE)]を押し完了です。<br>\n<img src=\"https://user-images.githubusercontent.com/38454985/81928572-6c668780-9620-11ea-800a-bbb03721ce8e.png\" width=\"320px\"><br>\n\n\n\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "plugins {\n    id('com.android.application')\n    id('kotlin-android')\n    id('kotlin-kapt')\n    alias libs.plugins.kotlin.serialization.plugin\n    id('com.google.gms.google-services')\n    id('com.google.android.gms.oss-licenses-plugin')\n    id('dagger.hilt.android.plugin')\n    id('com.github.triplet.play') version(\"3.7.0\")\n    id('com.google.firebase.crashlytics')\n    alias(libs.plugins.compose.compiler)\n}\n\n\nplay {\n    track = \"internal\"\n    enabled = (System.getenv(\"ANDROID_PUBLISHER_CREDENTIALS_FILE\") != null)\n    if (System.getenv(\"ANDROID_PUBLISHER_CREDENTIALS_FILE\") != null) {\n        serviceAccountCredentials.set(file(System.getenv(\"ANDROID_PUBLISHER_CREDENTIALS_FILE\")))\n    }\n}\n\nandroid {\n    compileSdk 35\n    defaultConfig {\n        applicationId \"jp.panta.misskeyandroidclient\"\n        minSdkVersion 21\n        targetSdkVersion 35\n        multiDexEnabled true\n        versionCode VERSION_CODE as int\n        versionName VERSION_NAME\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments += [\"room.schemaLocation\": \"$projectDir/schemas\".toString()]\n            }\n        }\n\n        // プッシュ通知関連のデータをlocal.propertiesからBuildConfigへ書き込んでいます。\n        def properties = new Properties()\n        properties.load(project.rootProject.file('secret.properties').newDataInputStream())\n        def PUSH_TO_FCM_SERVER_BASE_URL = properties.getProperty('push_to_fcm.server_base_url')\n        def PUSH_TO_FCM_PUBLIC_KEY = properties.getProperty('push_to_fcm.public_key')\n        def PUSH_TO_FCM_AUTH = properties.getProperty('push_to_fcm.auth')\n        buildConfigField('String', 'PUSH_TO_FCM_SERVER_BASE_URL', \"\\\"${PUSH_TO_FCM_SERVER_BASE_URL}\\\"\")\n        buildConfigField('String', 'PUSH_TO_FCM_PUBLIC_KEY', \"\\\"${PUSH_TO_FCM_PUBLIC_KEY}\\\"\")\n        buildConfigField('String', 'PUSH_TO_FCM_AUTH', \"\\\"${PUSH_TO_FCM_AUTH}\\\"\")\n\n    }\n    buildTypes {\n        release {\n            minifyEnabled true\n            shrinkResources true\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n        benchmark {\n            initWith release\n            signingConfig signingConfigs.debug\n            matchingFallbacks = ['release']\n            debuggable false\n        }\n    }\n\n    compileOptions {\n        coreLibraryDesugaringEnabled true\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n\n    buildFeatures {\n        compose true\n        dataBinding true\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n    }\n\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'jp.panta.misskeyandroidclient'\n\n    packagingOptions {\n        jniLibs {\n            useLegacyPackaging = false\n        }\n    }\n}\n\n\n\ndependencies {\n    implementation fileTree(dir: 'libs', include: ['*.jar'])\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:features:auth')\n    implementation project(path: ':modules:features:channel')\n    implementation project(path: ':modules:features:drive')\n    implementation project(path: ':modules:features:media')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_resource')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:features:messaging')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:features:gallery')\n    implementation project(path: ':modules:api_streaming')\n    implementation project(path: ':modules:features:group')\n    implementation project(path: ':modules:features:note')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:features:antenna')\n    implementation project(path: ':modules:features:user')\n    implementation project(path: ':modules:features:notification')\n    implementation project(path: ':modules:features:search')\n    implementation project(path: ':modules:features:favorite')\n    implementation project(path: ':modules:features:account')\n    implementation project(path: ':modules:worker')\n    implementation project(path: ':modules:features:clip')\n\n\n    testImplementation project(path: ':modules:api_streaming')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:features:setting')\n    implementation project(path: ':modules:features:userlist')\n\n\n    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.3'\n\n    //noinspection GradleCompatible\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n    implementation libs.appcompat.appcompat\n\n    implementation libs.androidx.emoji2\n    implementation libs.androidx.emoji2.bundled\n\n\n    // NOTE: リアクションピッカーなどでリフレクションを行っているのでバージョンを変更しないこと\n    implementation libs.android.material.material\n    implementation libs.androidx.constraintlayout\n\n    implementation 'androidx.preference:preference-ktx:1.2.0'\n    //noinspection GradleDynamicVersion\n    testImplementation 'junit:junit:4.+'\n    androidTestImplementation libs.androidx.test.ext.junit\n\n\n    // Required for instrumented tests\n    androidTestImplementation 'com.android.support:support-annotations:28.0.0'\n    androidTestImplementation 'com.android.support.test:runner:1.0.2'\n    androidTestImplementation libs.androidx.test.espresso.core\n    androidTestImplementation 'com.android.support.test:rules:1.0.2'\n\n\n\n    implementation libs.room.runtime\n    kapt libs.room.compiler\n\n    // optional - Kotlin Extensions and Coroutines support for Room\n    implementation libs.room.ktx\n\n    // optional - Test helpers\n    testImplementation libs.room.testing\n\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n\n\n    //Kotlin coroutines用ライブラリ(async, await)\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n    testImplementation libs.arch.core.testing\n\n    implementation libs.recyclerview\n\n    //retrofit\n    implementation libs.retrofit\n    implementation libs.okhttp3.logging.inspector\n\n\n\n    //glide\n    //implementation 'com.github.bumptech.glide:glide:3.7.0'\n    implementation libs.glide.glide\n    kapt libs.glide.compiler\n    implementation libs.accompanist.glide\n    implementation libs.animation.apng\n\n\n\n    //CardView\n    //implementation \"com.android.support:cardview-v7:28.0.0\"\n    implementation 'androidx.cardview:cardview:1.0.0'\n\n    //svg\n    implementation 'com.caverock:androidsvg-aar:1.4'\n\n\n    implementation libs.flexbox\n\n    implementation 'com.google.android.gms:play-services-oss-licenses:17.0.1'\n\n    // Swipe refresh\n    implementation libs.androidx.swiperefreshlayout\n\n\n    // ViewPager2\n    implementation libs.androidx.viewpager2\n\n\n\n    implementation libs.kotlin.serialization\n\n    implementation libs.wada811.databinding\n\n    implementation libs.fragment.ktx\n    implementation platform(libs.firebase.bom)\n    implementation 'com.google.firebase:firebase-messaging'\n    implementation 'com.google.firebase:firebase-crashlytics'\n    implementation 'com.google.firebase:firebase-analytics-ktx'\n\n    implementation libs.androidx.core.ktx\n\n    implementation libs.androidx.work.ktx\n    implementation libs.kotlin.datetime\n\n    implementation libs.lifecycle.livedata\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material.material\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.android.material.compose.theme.adapter\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    implementation libs.coil.gif\n    implementation libs.compose.constraintlayout\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.retrofit.serialization.converter\n\n\n    // Java language implementation\n    implementation libs.navigation.fragment.ktx\n    implementation libs.navigation.ui.ktx\n\n    // Kotlin\n    implementation libs.navigation.fragment.ktx\n    implementation libs.navigation.ui.ktx\n\n    // Feature module Support\n    implementation libs.navigation.dynamic.features\n\n    // Testing Navigation\n    androidTestImplementation libs.navigation.testing\n\n    // Jetpack Compose Integration\n    implementation libs.navigation.compose\n\n//    implementation libs.activity.ktx\n    implementation libs.activity.ktx\n\n    implementation libs.hilt.work\n    kapt libs.androidx.hilt.compiler\n\n    implementation libs.androidx.appstartup\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.10'\n\n    testImplementation \"org.mockito.kotlin:mockito-kotlin:4.1.0\"\n\n}\n\nkapt {\n    correctErrorTypes true\n}"
  },
  {
    "path": "app/google-services.json",
    "content": "{\n  \"project_info\": {\n    \"project_number\": \"488937418039\",\n    \"project_id\": \"milktea-38a76\",\n    \"storage_bucket\": \"milktea-38a76.appspot.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:488937418039:android:e7eff50ab73cb4560f3eb2\",\n        \"android_client_info\": {\n          \"package_name\": \"jp.panta.misskeyandroidclient\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"488937418039-7a3aos75ncb4u8l5dpsbn6u2t6i7gj1a.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"jp.panta.misskeyandroidclient\",\n            \"certificate_hash\": \"305007c09b8c6d454c4aac5c88dfa92362c5ce88\"\n          }\n        },\n        {\n          \"client_id\": \"488937418039-ohoqu72vcf056djpqlitem3jch0cdjgb.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"jp.panta.misskeyandroidclient\",\n            \"certificate_hash\": \"a0829916db5a5dd7f72264ea3a0550e6ae57b012\"\n          }\n        },\n        {\n          \"client_id\": \"488937418039-qvdak1q6k7n67e0jvi4lc19gtkjvhbnh.apps.googleusercontent.com\",\n          \"client_type\": 1,\n          \"android_info\": {\n            \"package_name\": \"jp.panta.misskeyandroidclient\",\n            \"certificate_hash\": \"2defef4045b7a3626f4441ee74b61746e5048e46\"\n          }\n        },\n        {\n          \"client_id\": \"488937418039-8utt6eghs42mg99lsc3eepb279pu9d1c.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"AIzaSyAGbZBLasgeDN9cziJnlaV1kBxSScWVYYA\"\n        }\n      ],\n      \"services\": {\n        \"appinvite_service\": {\n          \"other_platform_oauth_client\": [\n            {\n              \"client_id\": \"488937418039-8utt6eghs42mg99lsc3eepb279pu9d1c.apps.googleusercontent.com\",\n              \"client_type\": 3\n            }\n          ]\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "\n# flipperの除外設定\n-keep class com.facebook.jni.**  {  *;  }\n-keep class com.facebook.flipper.** {  *;  }\n\n-dontwarn com.facebook.litho.**\n-dontwarn com.facebook.flipper.**\n-dontwarn com.facebook.yoga.**\n-dontwarn org.mozilla.**\n-dontwarn  com.facebook.fbui.**\n\n\n# retrofitの設定\n-keepattributes Signature, InnerClasses, EnclosingMethod\n\n# Retrofit does reflection on method and parameter annotations.\n-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations\n\n# Keep annotation default values (e.g., retrofit2.http.Field.encoded).\n-keepattributes AnnotationDefault\n\n# Retain service method parameters when optimizing.\n-keepclassmembers,allowshrinking,allowobfuscation interface * {\n    @retrofit2.http.* <methods>;\n}\n\n\n# Ignore JSR 305 annotations for embedding nullability information.\n-dontwarn javax.annotation.**\n\n# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath.\n-dontwarn kotlin.Unit\n\n# Top-level functions that can only be used by Kotlin.\n-dontwarn retrofit2.KotlinExtensions\n-dontwarn retrofit2.KotlinExtensions$*\n\n# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy\n# and replaces all potential values with null. Explicitly keeping the interfaces prevents this.\n-if interface * { @retrofit2.http.* <methods>; }\n-keep,allowobfuscation interface <1>\n\n# Keep inherited services.\n-if interface * { @retrofit2.http.* <methods>; }\n-keep,allowobfuscation interface * extends <1>\n\n# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).\n-keep,allowobfuscation,allowshrinking interface retrofit2.Call\n-keep,allowobfuscation,allowshrinking class retrofit2.Response\n\n# With R8 full mode generic signatures are stripped for classes that are not\n# kept. Suspend functions are wrapped in continuations where the type argument\n# is used.\n-keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation\n\n\n# Kotlin serializationの設定\n# Kotlin serialization looks up the generated serializer classes through a function on companion\n# objects. The companions are looked up reflectively so we need to explicitly keep these functions.\n-keepclasseswithmembers class **.*$Companion {\n    kotlinx.serialization.KSerializer serializer(...);\n}\n# If a companion has the serializer function, keep the companion field on the original type so that\n# the reflective lookup succeeds.\n-if class **.*$Companion {\n  kotlinx.serialization.KSerializer serializer(...);\n}\n-keepclassmembers class <1>.<2> {\n  <1>.<2>$Companion Companion;\n}\n\n\n# glideの設定\n-keep public class * implements com.bumptech.glide.module.GlideModule\n-keep class * extends com.bumptech.glide.module.AppGlideModule {\n <init>(...);\n}\n-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {\n  **[] $VALUES;\n  public *;\n}\n-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {\n  *** rewind();\n}\n\n# ViewPagerの設定\n-keep class androidx.viewpager.widget.ViewPager$LayoutParams { int position; }\n-keep class com.google.android.material.bottomsheet.BottomSheetBehavior { *** findScrollingChild(...); }\n\n-keepclassmembers enum * {\n    public *;\n}\n\n# databinding\n-dontwarn androidx.databinding.**\n-keep class androidx.databinding.** { *; }\n-keep class * extends androidx.databinding.DataBinderMapper\n\n# glide\n-keep public class * implements com.bumptech.glide.module.GlideModule\n-keep class * extends com.bumptech.glide.module.AppGlideModule {\n <init>(...);\n}\n-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {\n  **[] $VALUES;\n  public *;\n}\n-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder {\n  *** rewind();\n}\n"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/10.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 10,\n    \"identityHash\": \"e57ecde54b614792af12c09f03436dc1\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e57ecde54b614792af12c09f03436dc1')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/11.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 11,\n    \"identityHash\": \"c50ce2972f355ed260b3b30b300c8a9f\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c50ce2972f355ed260b3b30b300c8a9f')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/12.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 12,\n    \"identityHash\": \"d16f596614a6ec0c5703e7719b14256b\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd16f596614a6ec0c5703e7719b14256b')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/3.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"786087deeceb0d1e04244116153de219\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '786087deeceb0d1e04244116153de219')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/4.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 4,\n    \"identityHash\": \"522c0549c443474673b33153ce928a8c\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '522c0549c443474673b33153ce928a8c')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/5.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 5,\n    \"identityHash\": \"4d4ea06174551643c866184ef5de6130\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4d4ea06174551643c866184ef5de6130')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/6.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 6,\n    \"identityHash\": \"f0b44b577de14e836e23b7ff464647a6\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f0b44b577de14e836e23b7ff464647a6')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/7.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 7,\n    \"identityHash\": \"75b46cd180746b997e83291bf1013d1a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '75b46cd180746b997e83291bf1013d1a')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/8.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 8,\n    \"identityHash\": \"7a5223ff0728af36a89dccaed48f97ec\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7a5223ff0728af36a89dccaed48f97ec')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/schemas/jp.panta.misskeyandroidclient.model.DataBase/9.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 9,\n    \"identityHash\": \"9ca4eba1d0228c9795b0c3a2995db32a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ca4eba1d0228c9795b0c3a2995db32a')\"\n    ]\n  }\n}"
  },
  {
    "path": "app/src/androidTest/java/jp/panta/misskeyandroidclient/ExampleInstrumentedTest.kt",
    "content": "package jp.panta.misskeyandroidclient\n\nimport androidx.test.InstrumentationRegistry\nimport androidx.test.runner.AndroidJUnit4\n\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\nimport org.junit.Assert.*\n\n/**\n * Instrumented test, which will execute on an Android device.\n *\n * See [testing documentation](http://d.android.com/tools/testing).\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleInstrumentedTest {\n    @Test\n    fun useAppContext() {\n        // Context of the app under test.\n        val appContext = InstrumentationRegistry.getTargetContext()\n        assertEquals(\"jp.panta.misskeyandroidclient\", appContext.packageName)\n    }\n}\n"
  },
  {
    "path": "app/src/androidTest/java/jp/panta/misskeyandroidclient/model/account/db/RoomAccountRepositoryTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.account.db\n\nimport android.content.Context\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.common.Encryption\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountDAO\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.data.infrastructure.account.db.RoomAccountRepository\nimport net.pantasystem.milktea.data.infrastructure.auth.KeyStoreSystemEncryption\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport org.junit.Assert.assertEquals\nimport org.junit.Assert.assertNotEquals\nimport org.junit.Before\nimport org.junit.Test\n\nclass RoomAccountRepositoryTest {\n\n    private lateinit var database: DataBase\n\n    private lateinit var roomAccountRepository: RoomAccountRepository\n\n    private lateinit var accountDAO: AccountDAO\n\n    private lateinit var encryption: Encryption\n\n    @Before\n    fun setupRepository() {\n        val context = ApplicationProvider.getApplicationContext<Context>()\n        database = Room.inMemoryDatabaseBuilder(context, DataBase::class.java).build()\n        encryption = KeyStoreSystemEncryption(context)\n\n        roomAccountRepository = RoomAccountRepository(\n            database,\n            context.getSharedPreferences(\"test\", Context.MODE_PRIVATE),\n            database.accountDAO(),\n            database.pageDAO(),\n            encryption = encryption,\n        )\n        accountDAO = database.accountDAO()\n    }\n\n    @Test\n    fun addAccountTest() {\n        val remoteId = \"hogehoge\"\n        val instanceDomain = \"http://misskey.io\"\n        val userName = \"Panta\"\n        val account = Account(\n            remoteId,\n            instanceDomain,\n            userName,\n            Account.InstanceType.MISSKEY,\n            \"hogehogehoge\"\n        )\n        runBlocking {\n            val result = roomAccountRepository.add(account).getOrThrow()\n\n            assertEquals(account.userName, result.userName)\n            assertEquals(account.instanceDomain, result.instanceDomain)\n            assertNotEquals(result.accountId, 0)\n            assertEquals(1, result.accountId)\n            println(result)\n\n            val account2 = Account(\n                remoteId,\n                instanceDomain,\n                \"Test\",\n                Account.InstanceType.MISSKEY,\n                \"hogehogehoge\"\n            )\n\n            val result2 = roomAccountRepository.add(account2).getOrThrow()\n            assertEquals(\"Test\", result2.userName)\n            assertEquals(account.instanceDomain, result2.instanceDomain)\n            assertEquals(1, result2.accountId)\n            assert(result2.accountId > 0)\n            println(result2)\n        }\n\n    }\n\n    @Test\n    fun addAccountUpdateTest() {\n        val remoteId = \"hogehoge\"\n        val instanceDomain = \"http://misskey.io\"\n        val userName = \"Panta\"\n        val account = Account(\n            remoteId,\n            instanceDomain,\n            userName,\n            Account.InstanceType.MISSKEY,\n            \"hogehogehoge\"\n        )\n        runBlocking {\n            val result = roomAccountRepository.add(account).getOrThrow()\n\n            val updated =\n                result.copy(pages = listOf(Page(result.accountId, \"hoge\", 0, Pageable.Favorite)))\n            assertEquals(result.accountId, updated.accountId)\n            assertEquals(updated.accountId, 1)\n            val updatedResult = roomAccountRepository.add(updated, true).getOrThrow()\n            assertEquals(updatedResult.pages.size, 1)\n\n            val getResult = roomAccountRepository.get(updatedResult.accountId).getOrThrow()\n            assertEquals(getResult.pages.size, 1)\n\n            assertNotEquals(getResult.pages.first().pageId, 0)\n        }\n    }\n\n    @Test\n    fun insertAccountTest() {\n        val remoteId = \"hogehoge\"\n        val instanceDomain = \"http://misskey.io\"\n        val userName = \"Panta\"\n        val account = Account(\n            remoteId,\n            instanceDomain,\n            userName,\n            Account.InstanceType.MISSKEY,\n            \"hogehogehoge\"\n        )\n        runBlocking {\n            val resultId = accountDAO.insert(AccountRecord.from(account, encryption))\n            assertNotEquals(0, resultId)\n            val result = accountDAO.get(resultId)!!\n            assertEquals(account.userName, result.userName)\n            assertEquals(account.instanceDomain, result.instanceDomain)\n            assertNotEquals(0, result.accountId)\n            assertEquals(1, result.accountId)\n            println(result)\n\n            /*val account2 = Account(remoteId, instanceDomain, \"Test\", \"hogehogehoge\")\n\n            val result2 = roomAccountRepository.add(account2)\n            assertEquals(result2.userName, \"Test\")\n            assertEquals(result2.instanceDomain, account.instanceDomain)\n            assertNotEquals(result2.accountId, 0)\n            assertEquals(result2.accountId, 2)\n            assert(result2.accountId < 0)\n            println(result2)*/\n        }\n    }\n}"
  },
  {
    "path": "app/src/androidTest/java/jp/panta/misskeyandroidclient/model/instance/db/RoomMetaDataSourceTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.instance.db\n\nimport android.content.Context\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.instance.db.RoomMetaDataSource\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.instance.MetaDataSource\nimport org.junit.Assert.assertNotNull\nimport org.junit.Before\nimport org.junit.Test\n\nclass RoomMetaDataSourceTest {\n\n    private lateinit var metaRepository: MetaDataSource\n\n    private lateinit var database: DataBase\n\n    private lateinit var sampleMeta: Meta\n\n    @Before\n    fun setUp() {\n        val context = ApplicationProvider.getApplicationContext<Context>()\n        database = Room.inMemoryDatabaseBuilder(context, DataBase::class.java).build()\n\n        metaRepository = RoomMetaDataSource(database.metaDAO(), database)\n\n\n        sampleMeta = Meta(\n            bannerUrl = \"https://hogehoge.io/hogehoge.jpg\",\n            cacheRemoteFiles = true,\n            description = \"hogehogeTest\",\n            disableGlobalTimeline = false,\n            disableLocalTimeline = false,\n            disableRegistration = false,\n            driveCapacityPerLocalUserMb = 1000,\n            driveCapacityPerRemoteUserMb = 2000,\n            enableDiscordIntegration = true,\n            enableEmail = false,\n            enableEmojiReaction = true,\n            enableGithubIntegration = true,\n            enableRecaptcha = true,\n            enableServiceWorker = true,\n            enableTwitterIntegration = true,\n            errorImageUrl = \"https://error.img\",\n            feedbackUrl = \"https://feedback.com\",\n            iconUrl = \"https://favicon.png\",\n            maintainerEmail = \"\",\n            maintainerName = \"\",\n            mascotImageUrl = \"\",\n            maxNoteTextLength = 500,\n            name = \"\",\n            recaptchaSiteKey = \"key\",\n            secure = true,\n            swPublicKey = \"swPublicKey\",\n            toSUrl = \"toSUrl\",\n            version = \"12.0.1\",\n            uri = \"https://test.misskey.io\"\n        )\n\n    }\n\n    @Test\n    fun addAndGetMetaTest() {\n        runBlocking {\n            val added = metaRepository.add(sampleMeta)\n            val got = metaRepository.get(added.uri)\n            assertNotNull(got)\n\n        }\n    }\n\n\n\n\n}"
  },
  {
    "path": "app/src/androidTest/java/net/pantasystem/milktea/model/filter/MastodonFilterServiceTest.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.make\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.Assert\nimport org.junit.Test\n\n\nclass MastodonFilterServiceTest {\n\n    @Test\n    fun isShouldFilterNote_GiveMatchText() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"hogepiyofuga\"\n            )\n        )\n        Assert.assertTrue(actual)\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveUnMatchText() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"piyutarou\"\n            )\n        )\n        Assert.assertFalse(actual)\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveMatchTextInPoll() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"piyutarou\",\n                poll = Poll(\n                    choices = listOf(\n                        Poll.Choice(\n                            0,\n                            \"piyo\",\n                            10,\n                            false,\n                        ),\n                        Poll.Choice(\n                            1,\n                            \"hoge\",\n                            10,\n                            false,\n                        ),\n                        Poll.Choice(\n                            2,\n                            \"fuga\",\n                            10,\n                            false,\n                        ),\n                    ),\n                    null,\n                    false,\n                )\n            )\n        )\n        Assert.assertTrue(actual)\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveOtherContext() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Public\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                ),\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"fuga\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Public\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"piyopiyo\",\n                poll = Poll(\n                    choices = listOf(\n                        Poll.Choice(\n                            0,\n                            \"piyo\",\n                            10,\n                            false,\n                        ),\n                        Poll.Choice(\n                            1,\n                            \"hoge\",\n                            10,\n                            false,\n                        ),\n                        Poll.Choice(\n                            2,\n                            \"fuga\",\n                            10,\n                            false,\n                        ),\n                    ),\n                    null,\n                    false,\n                )\n            )\n        )\n        Assert.assertFalse(actual)\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveManyFilters() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                ),\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"fuga\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                ),\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"hoge\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"piyofugahoge\"\n            )\n        )\n        Assert.assertTrue(actual)\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveManyFiltersAndNotMatchText() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                ),\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"fuga\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                ),\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"hoge\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = false,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"kawaiipantaharunonmeltazuki\"\n            )\n        )\n        Assert.assertFalse(actual)\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveWholeWord() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = true,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"hoge piyo fuga\"\n            )\n        )\n        Assert.assertTrue(actual)\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveWholeWordNotMatched() {\n        val service = MastodonFilterService(\n            FilterPatternCache(),\n            GetMatchContextFilters()\n        )\n        val actual = service.isShouldFilterNote(\n            Pageable.Mastodon.HomeTimeline(),\n            filters = listOf(\n                MastodonWordFilter(\n                    id = MastodonWordFilter.Id(\n                        accountId = 0,\n                        filterId = \"\"\n                    ),\n                    phrase = \"piyo\",\n                    context = listOf(\n                        MastodonWordFilter.FilterContext.Home\n                    ),\n                    wholeWord = true,\n                    expiresAt = null,\n                    irreversible = false\n                )\n            ),\n            note = Note.make(\n                Note.Id(0L, \"\"),\n                User.Id(0L, \"\"),\n                text = \"hogepiyofuga\"\n            )\n        )\n        Assert.assertFalse(actual)\n    }\n}"
  },
  {
    "path": "app/src/benchmark/java/jp/panta/misskeyandroidclient/di/module/ReleaseAPIModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.impl.OkHttpClientProviderImpl\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class ReleaseAPIModule {\n\n    @Binds\n    abstract fun bindOkHttpClientProvider(\n        impl: OkHttpClientProviderImpl\n    ): OkHttpClientProvider\n}"
  },
  {
    "path": "app/src/benchmark/java/jp/panta/misskeyandroidclient/di/module/ReleaseAppModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.util.DebuggerSetupManager\nimport jp.panta.misskeyandroidclient.util.EmptyDebuggerSetupManagerImpl\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class ReleaseAppModule {\n\n    @Binds\n    @Singleton\n    abstract fun provideFlipperSetupManager(manager: EmptyDebuggerSetupManagerImpl): DebuggerSetupManager\n}"
  },
  {
    "path": "app/src/benchmark/java/jp/panta/misskeyandroidclient/util/EmptyDebuggerSetupManagerImpl.kt",
    "content": "package jp.panta.misskeyandroidclient.util\n\nimport android.content.Context\nimport javax.inject.Inject\n\nclass EmptyDebuggerSetupManagerImpl @Inject constructor(): DebuggerSetupManager {\n\n    override fun setup(context: Context) {\n\n    }\n\n}"
  },
  {
    "path": "app/src/debug/java/jp/panta/misskeyandroidclient/util/di/module/DebugAPIModule.kt",
    "content": "package jp.panta.misskeyandroidclient.util.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.impl.OkHttpClientProviderImpl\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class DebugAPIModule {\n\n    @Binds\n    abstract fun bindOkHttpClientProvider(\n        impl: OkHttpClientProviderImpl\n    ): OkHttpClientProvider\n}\n"
  },
  {
    "path": "app/src/debug/java/jp/panta/misskeyandroidclient/util/di/module/DebugAppModule.kt",
    "content": "package jp.panta.misskeyandroidclient.util.di.module\n\nimport android.content.Context\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.util.DebuggerSetupManager\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class DebugAppModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindDebuggerSetupManager(impl: EmptyDebuggerSetupManagerImpl): DebuggerSetupManager\n}\n\n\nclass EmptyDebuggerSetupManagerImpl @Inject constructor() : DebuggerSetupManager {\n\n    override fun setup(context: Context) {\n\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission\n        android:name=\"android.permission.READ_EXTERNAL_STORAGE\"\n        android:maxSdkVersion=\"32\" />\n    <uses-permission android:name=\"android.permission.READ_USER_DICTIONARY\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.SCHEDULE_EXACT_ALARM\" />\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n    <uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />\n    <uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\" />\n    <uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />\n    <uses-permission android:name=\"com.google.android.gms.permission.AD_ID\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.VIBRATE\" />\n\n    <application\n        android:name=\".MiApplication\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:largeHeap=\"true\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\"\n        tools:ignore=\"AllowBackup,GoogleAppIndexingWarning\">\n        <profileable\n            android:shell=\"true\"\n            tools:targetApi=\"29\" />\n\n        <provider\n            android:name=\"androidx.startup.InitializationProvider\"\n            android:authorities=\"${applicationId}.androidx-startup\"\n            android:exported=\"false\"\n            tools:node=\"merge\">\n\n            <!-- If you are using androidx.startup to initialize other components -->\n            <meta-data\n                android:name=\"androidx.work.WorkManagerInitializer\"\n                android:value=\"androidx.startup\"\n                tools:node=\"remove\" />\n            <meta-data\n                android:name=\"jp.panta.misskeyandroidclient.startup.EmojiCompatInitializer\"\n                android:value=\"androidx.startup\" />\n            <meta-data\n                android:name=\"jp.panta.misskeyandroidclient.startup.DebuggerSetupInitializer\"\n                android:value=\"androidx.startup\" />\n        </provider>\n\n        <activity\n            android:name=\"net.pantasystem.milktea.setting.activities.SecuritySettingActivity\"\n            android:exported=\"false\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.channel.ChannelActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"channels\"\n                    android:scheme=\"milktea\" />\n            </intent-filter>\n        </activity>\n\n        <receiver\n            android:name=\".AlarmNotePostReceiver\"\n            android:enabled=\"true\"\n            android:exported=\"false\" />\n\n        <meta-data\n            android:name=\"com.google.firebase.messaging.default_notification_icon\"\n            android:resource=\"@drawable/ic_launcher_foreground\" />\n        <meta-data\n            android:name=\"firebase_crashlytics_collection_enabled\"\n            android:value=\"false\" />\n        <meta-data\n            android:name=\"firebase_analytics_collection_enabled\"\n            android:value=\"false\" />\n        <meta-data\n            android:name=\"google_analytics_adid_collection_enabled\"\n            android:value=\"false\" />\n\n        <service\n            android:name=\".FCMService\"\n            android:enabled=\"true\"\n            android:exported=\"false\">\n            <intent-filter>\n                <action android:name=\"com.google.firebase.MESSAGING_EVENT\" />\n            </intent-filter>\n        </service>\n\n        <activity\n            android:name=\"net.pantasystem.milktea.gallery.GalleryPostsActivity\"\n            android:windowSoftInputMode=\"adjustNothing\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.auth.AuthorizationActivity\"\n            android:exported=\"true\"\n            android:launchMode=\"singleInstance\"\n            android:windowSoftInputMode=\"adjustNothing\">\n            <intent-filter tools:ignore=\"AppLinkUrlError\">\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n\n                <data\n                    android:host=\"app_auth_callback\"\n                    android:scheme=\"misskey\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\"net.pantasystem.milktea.note.DraftNotesActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.antenna.AntennaEditorActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.antenna.AntennaListActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.setting.activities.PageSettingActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.messaging.MessagingListActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.notification.NotificationsActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.setting.activities.ReactionSettingActivity\" />\n        <activity\n            android:name=\"com.google.android.gms.oss.licenses.OssLicensesActivity\"\n            android:theme=\"@style/LicensePageTheme\" />\n        <activity\n            android:name=\"com.google.android.gms.oss.licenses.OssLicensesMenuActivity\"\n            android:theme=\"@style/LicensePageTheme\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.user.search.SearchAndSelectUserActivity\"\n            android:windowSoftInputMode=\"adjustNothing\" />\n        <activity android:name=\"net.pantasystem.milktea.userlist.UserListDetailActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.userlist.ListListActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.favorite.FavoriteActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.user.followlist.FollowFollowerActivity\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.search.SearchActivity\"\n            android:windowSoftInputMode=\"adjustNothing\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.search.SearchResultActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"search\"\n                    android:scheme=\"misskey\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\"net.pantasystem.milktea.media.MediaActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.setting.activities.SettingAppearanceActivity\" />\n        <activity android:name=\"net.pantasystem.milktea.setting.activities.SettingMovementActivity\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.setting.activities.SettingsActivity\"\n            android:label=\"@string/title_activity_settings\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.user.profile.UserDetailActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"user\"\n                    android:scheme=\"misskey\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"*\"\n                    android:pathPrefix=\"/@\"\n                    android:scheme=\"https\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\"net.pantasystem.milktea.note.NoteDetailActivity\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"*\"\n                    android:pathPrefix=\"/notes/\"\n                    android:scheme=\"https\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data\n                    android:host=\"*\"\n                    android:pathPrefix=\"/notes/\"\n                    android:scheme=\"milktea\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\"net.pantasystem.milktea.messaging.MessageActivity\"\n            android:windowSoftInputMode=\"adjustNothing\" />\n        <activity android:name=\"net.pantasystem.milktea.drive.DriveActivity\" />\n        <activity\n            android:name=\"net.pantasystem.milktea.note.NoteEditorActivity\"\n            android:exported=\"true\"\n            android:windowSoftInputMode=\"adjustNothing\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"text/*\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"image/*\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND_MULTIPLE\" />\n\n                <category android:name=\"android.intent.category.DEFAULT\" />\n\n                <data android:mimeType=\"image/*\" />\n            </intent-filter>\n        </activity>\n        <activity\n            android:name=\".MainActivity\"\n            android:exported=\"true\"\n            android:windowSoftInputMode=\"adjustPan\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n\n            <meta-data\n                android:name=\"android.app.shortcuts\"\n                android:resource=\"@xml/shortcuts\" />\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/AlarmNotePostReceiver.kt",
    "content": "package jp.panta.misskeyandroidclient\n\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.app.TaskStackBuilder\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.util.Log\nimport androidx.core.app.NotificationCompat\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.notification.NotificationUtil\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftNoteDao\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.CreateNoteUseCase\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.toCreateNote\nimport net.pantasystem.milktea.note.NoteDetailActivity\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass AlarmNotePostReceiver : BroadcastReceiver() {\n\n    companion object {\n        private const val NOTIFICATION_CHANNEL_ID: String = \"SCHEDULE_POST_NOTE_RESULT_NOTIFICATION\"\n    }\n\n    @Inject\n    lateinit var draftNoteDAO: DraftNoteDao\n    @Inject\n    lateinit var accountRepository: AccountRepository\n    @Inject\n    lateinit var coroutineScope: CoroutineScope\n    @Inject\n    lateinit var noteRepository: NoteRepository\n\n    @Inject\n    lateinit var createNoteUseCase: CreateNoteUseCase\n\n    @Inject\n    lateinit var notificationUtil: NotificationUtil\n\n    override fun onReceive(context: Context, intent: Intent) {\n        val draftNoteId = intent.getLongExtra(\"DRAFT_NOTE_ID\", -1)\n        val accountId = intent.getLongExtra(\"ACCOUNT_ID\", -1)\n        require(draftNoteId >= 0)\n        require(accountId >= 0)\n\n        val notificationManager = notificationUtil.makeNotificationManager(\n            id = NOTIFICATION_CHANNEL_ID,\n            description = \"Schedule post notification\",\n            name = \"Schedule Note\"\n        )\n        coroutineScope.launch {\n            runCancellableCatching {\n                val draftNote =\n                    draftNoteDAO.getDraftNote(accountId = accountId, draftNoteId = draftNoteId)\n                draftNote ?: return@launch\n                val account = accountRepository.get(accountId).getOrThrow()\n                val createNote = draftNote.toCreateNote(account)\n                createNoteUseCase.invoke(createNote).getOrThrow()\n            }.onFailure {\n                Log.e(\"AlarmPostExecutor\", \"failed create note\", it)\n                showCreateNoteFailureNotification(context, notificationManager, draftNoteId)\n            }.onSuccess {\n                showCreateNoteSuccessNotification(context, notificationManager, draftNoteId, it)\n            }\n\n        }\n\n    }\n\n    private fun showCreateNoteSuccessNotification(context: Context,notificationManager: NotificationManager, draftNoteId: Long,  note: Note) {\n\n        val builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)\n            .setSmallIcon(R.drawable.ic_check_black_24dp)\n            .setContentTitle(context.getString(R.string.successfully_created_note))\n        builder.priority = NotificationCompat.PRIORITY_DEFAULT\n\n        val pendingIntentBuilder = TaskStackBuilder.create(context)\n            .addNextIntentWithParentStack(NoteDetailActivity.newIntent(context, note.id))\n        val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n            pendingIntentBuilder\n                .getPendingIntent(0, PendingIntent.FLAG_IMMUTABLE)\n        } else {\n            pendingIntentBuilder\n                .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)\n        }\n        builder.setContentIntent(pendingIntent)\n\n        with(notificationManager) {\n            notify((draftNoteId / Int.MAX_VALUE).toInt(), builder.build())\n        }\n    }\n\n    private fun showCreateNoteFailureNotification(context: Context, notificationManager: NotificationManager,  draftNoteId: Long) {\n        val builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)\n            .setSmallIcon(android.R.drawable.ic_menu_close_clear_cancel)\n            .setContentTitle(context.getString(R.string.note_creation_failure))\n        builder.priority = NotificationCompat.PRIORITY_DEFAULT\n\n        val pendingIntentBuilder = TaskStackBuilder.create(context)\n            .addNextIntentWithParentStack(NoteEditorActivity.newBundle(context, draftNoteId = draftNoteId))\n        val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n            pendingIntentBuilder\n                .getPendingIntent(0, PendingIntent.FLAG_MUTABLE)\n        } else {\n            pendingIntentBuilder\n                .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)\n        }\n        builder.setContentIntent(pendingIntent)\n        with(notificationManager) {\n            notify((draftNoteId / Int.MAX_VALUE).toInt(), builder.build())\n        }\n\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/FCMService.kt",
    "content": "package jp.panta.misskeyandroidclient\n\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.app.TaskStackBuilder\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.util.Log\nimport androidx.core.app.NotificationCompat\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkManager\nimport androidx.work.workDataOf\nimport com.google.firebase.messaging.FirebaseMessagingService\nimport com.google.firebase.messaging.RemoteMessage\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.notification.PushNotification\nimport net.pantasystem.milktea.model.notification.toPushNotification\nimport net.pantasystem.milktea.model.sw.register.DeviceTokenRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.NoteDetailActivity\nimport net.pantasystem.milktea.user.profile.UserDetailActivity\nimport net.pantasystem.milktea.worker.sw.SubscriptionRegistrationWorker\nimport javax.inject.Inject\n\nconst val NOTIFICATION_CHANNEL_ID =\n    \"jp.panta.misskeyandroidclient.NotificationService.NOTIFICATION_CHANNEL_ID\"\nconst val GROUP_KEY_MISSKEY_NOTIFICATION = \"jp.panta.misskeyandroidclient.notifications\"\n\n\n@Suppress(\"SameParameterValue\")\n@FlowPreview\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass FCMService : FirebaseMessagingService() {\n\n\n    @Inject internal lateinit var accountStore: AccountStore\n\n    @Inject internal lateinit var deviceTokenRepository: DeviceTokenRepository\n\n    override fun onNewToken(token: String) {\n        super.onNewToken(token)\n\n        deviceTokenRepository.save(token)\n        val subscriptionRegistrationWorker =\n            OneTimeWorkRequestBuilder<SubscriptionRegistrationWorker>()\n\n                .setInputData(\n                    workDataOf(\n                        SubscriptionRegistrationWorker.TOKEN to token\n                    )\n                ).build()\n\n        WorkManager.getInstance(this).enqueue(subscriptionRegistrationWorker)\n    }\n\n    override fun onMessageReceived(msg: RemoteMessage) {\n        super.onMessageReceived(msg)\n\n        // receive message\n        val pushNotification = msg.data.toPushNotification()\n        val isCurrentAccountsNotification =\n            accountStore.currentAccountId == pushNotification.accountId\n\n        if (isCurrentAccountsNotification) {\n            // 通知がcurrent accountでプッシュ通知の不要なActivityがActiveな時はこれ以上処理をしない\n            return\n        }\n        Log.d(\"FCMService\", \"pushNotification:$pushNotification\")\n        val builder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)\n        builder.setContentTitle(pushNotification.title)\n            .setContentText(pushNotification.body)\n            .setSmallIcon(R.mipmap.ic_launcher_foreground)\n            .setGroup(GROUP_KEY_MISSKEY_NOTIFICATION)\n            .setGroupSummary(true)\n\n        runCancellableCatching {\n            val pendingIntentBuilder = TaskStackBuilder.create(this)\n                .addNextIntentWithParentStack(pushNotification.makeIntent())\n            val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n                pendingIntentBuilder\n                    .getPendingIntent(0, PendingIntent.FLAG_MUTABLE)\n            } else {\n                pendingIntentBuilder\n                    .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)\n            }\n\n            builder.setContentIntent(pendingIntent)\n        }.onFailure { e ->\n            Log.e(\"FCMService\", \"Intent作成に失敗\", e)\n            throw e\n        }\n\n        with(makeNotificationManager(NOTIFICATION_CHANNEL_ID)) {\n            notify(5, builder.build())\n            this\n        }\n\n\n    }\n\n//    override fun onDeletedMessages() {\n//        super.onDeletedMessages()\n//\n//    }\n\n    private fun PushNotification.makeIntent(): Intent {\n        return when (this.type) {\n            \"follow\", \"receiveFollowRequest\", \"followRequestAccepted\" -> UserDetailActivity.newInstance(\n                this@FCMService,\n                User.Id(accountId, this.userId!!)\n            ).apply {\n                putExtra(UserDetailActivity.EXTRA_IS_MAIN_ACTIVE, false)\n\n            }\n            \"mention\", \"reply\", \"renote\", \"quote\", \"reaction\" -> NoteDetailActivity.newIntent(\n                this@FCMService,\n                Note.Id(accountId, noteId!!)\n            ).apply {\n                putExtra(NoteDetailActivity.EXTRA_IS_MAIN_ACTIVE, false)\n            }\n            else -> Intent(this@FCMService, MainActivity::class.java)\n        }\n    }\n\n    private fun makeNotificationManager(channelId: String): NotificationManager {\n        val notificationManager =\n            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n        val name = getString(R.string.app_name)\n        val description = \"THE NOTIFICATION\"\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            if (notificationManager.getNotificationChannel(channelId) == null) {\n                val channel =\n                    NotificationChannel(channelId, name, NotificationManager.IMPORTANCE_HIGH)\n                channel.description = description\n                notificationManager.createNotificationChannel(channel)\n            }\n        }\n        return notificationManager\n\n    }\n\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/MainActivity.kt",
    "content": "package jp.panta.misskeyandroidclient\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.View\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.annotation.MainThread\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.widget.Toolbar\nimport androidx.core.view.GravityCompat\nimport androidx.drawerlayout.widget.DrawerLayout\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.navigation.fragment.NavHostFragment\nimport androidx.navigation.ui.setupWithNavController\nimport com.bumptech.glide.Glide\nimport com.google.android.gms.common.GoogleApiAvailability\nimport com.google.firebase.analytics.FirebaseAnalytics\nimport com.google.firebase.analytics.ktx.logEvent\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport jp.panta.misskeyandroidclient.databinding.ActivityMainBinding\nimport jp.panta.misskeyandroidclient.ui.main.AccountViewModelHandler\nimport jp.panta.misskeyandroidclient.ui.main.FabClickHandler\nimport jp.panta.misskeyandroidclient.ui.main.IntentToAddAccountHandler\nimport jp.panta.misskeyandroidclient.ui.main.MainActivityEventHandler\nimport jp.panta.misskeyandroidclient.ui.main.MainActivityInitialIntentHandler\nimport jp.panta.misskeyandroidclient.ui.main.MainActivityMenuProvider\nimport jp.panta.misskeyandroidclient.ui.main.MainActivityNavigationDrawerMenuItemClickListener\nimport jp.panta.misskeyandroidclient.ui.main.SetSimpleEditor\nimport jp.panta.misskeyandroidclient.ui.main.SetUpNavHeader\nimport jp.panta.misskeyandroidclient.ui.main.SetupOnBackPressedDispatcherHandler\nimport jp.panta.misskeyandroidclient.ui.main.ToggleNavigationDrawerDelegate\nimport jp.panta.misskeyandroidclient.ui.main.viewmodel.MainViewModel\nimport jp.panta.misskeyandroidclient.ui.setLongPressListenerOnNavigationItem\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common.ui.ToolbarSetter\nimport net.pantasystem.milktea.common_android_ui.account.AccountSwitchingDialog\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_android_ui.error.UserActionAppGlobalErrorListener\nimport net.pantasystem.milktea.common_android_ui.report.ReportViewModel\nimport net.pantasystem.milktea.common_navigation.MainNavigation\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.common_viewmodel.ScrollToTopViewModel\nimport net.pantasystem.milktea.data.infrastructure.streaming.ChannelAPIMainEventDispatcherAdapter\nimport net.pantasystem.milktea.data.infrastructure.streaming.MediatorMainEventDispatcher\nimport net.pantasystem.milktea.note.renote.RenoteResultHandler\nimport net.pantasystem.milktea.note.renote.RenoteViewModel\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n\n@AndroidEntryPoint\nclass MainActivity : AppCompatActivity(), ToolbarSetter {\n\n    @Inject\n    internal lateinit var settingStore: SettingStore\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var mainActivityEventHandlerFactory: MainActivityEventHandler.Factory\n\n    @Inject\n    internal lateinit var mainActivityInitialIntentHandlerFactory: MainActivityInitialIntentHandler.Factory\n\n    @Inject\n    internal lateinit var fabClickHandleFactory: FabClickHandler.Factory\n\n    @Inject\n    internal lateinit var mainEventDispatcherFactory: MediatorMainEventDispatcher.Factory\n\n    @Inject\n    internal lateinit var channelAPIMainEventDispatcherAdapter: ChannelAPIMainEventDispatcherAdapter\n\n    @Inject\n    internal lateinit var userActionAppGlobalErrorListener: UserActionAppGlobalErrorListener\n\n    @Inject\n    internal lateinit var intentToAddAccountHandler: IntentToAddAccountHandler.Factory\n\n    private val notesViewModel: NotesViewModel by viewModels()\n\n    private val accountViewModel: AccountViewModel by viewModels()\n\n    private val binding: ActivityMainBinding by dataBinding()\n\n    private val mainViewModel: MainViewModel by viewModels()\n\n    private val currentPageableTimelineViewModel: CurrentPageableTimelineViewModel by viewModels()\n\n    private val reportViewModel: ReportViewModel by viewModels()\n\n    private val scrollToTopViewModel: ScrollToTopViewModel by viewModels()\n\n    private val renoteViewMode by viewModels<RenoteViewModel>()\n\n    private lateinit var toggleNavigationDrawerDelegate: ToggleNavigationDrawerDelegate\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme.invoke()\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_main)\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.appBarMain.bottomNavigation.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n\n        intentToAddAccountHandler.create(lifecycleScope, mainViewModel).invoke(intent)\n\n        toggleNavigationDrawerDelegate = ToggleNavigationDrawerDelegate(this, binding.drawerLayout)\n\n        binding.navView.setNavigationItemSelectedListener { item ->\n            MainActivityNavigationDrawerMenuItemClickListener(this, accountViewModel)\n                .onSelect(item)\n            binding.drawerLayout.closeDrawerWhenOpened()\n            false\n        }\n\n        binding.appBarMain.fab.setOnClickListener {\n            onFabClicked()\n        }\n\n        binding.appBarMain.bottomNavigation.setOnItemReselectedListener {\n            scrollToTopViewModel.scrollToTop()\n        }\n        binding.appBarMain.bottomNavigation.setLongPressListenerOnNavigationItem(\n            R.id.navigation_message_list\n        ) {\n            AccountSwitchingDialog().show(supportFragmentManager, AccountSwitchingDialog.FRAGMENT_TAG)\n            true\n        }\n\n        AccountViewModelHandler(binding, this, accountViewModel).setup()\n        SetUpNavHeader(binding.navView, this, accountViewModel).invoke()\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n\n\n        setupNavigation()\n        setupOnBackPressedDispatcherCallBack()\n\n        addMenuProvider(MainActivityMenuProvider(this, settingStore))\n\n        mainActivityEventHandlerFactory.create(\n            activity = this,\n            binding = binding,\n            mainViewModel = mainViewModel,\n            reportViewModel = reportViewModel,\n            requestPostNotificationsPermissionLauncher = requestPermissionLauncher,\n            currentPageableTimelineViewModel = currentPageableTimelineViewModel\n        ).setup()\n\n        RenoteResultHandler(\n            viewModel = renoteViewMode,\n            lifecycle = lifecycle,\n            scope = lifecycleScope,\n            context = this\n        ).setup()\n\n        handleIntent(savedInstanceState)\n\n\n        val mainEventDispatcher = mainEventDispatcherFactory.create()\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                channelAPIMainEventDispatcherAdapter(mainEventDispatcher)\n            }\n        }\n\n        GoogleApiAvailability.getInstance().makeGooglePlayServicesAvailable(this)\n        userActionAppGlobalErrorListener(\n            lifecycle = lifecycle,\n            fragmentManager = supportFragmentManager\n        )\n    }\n\n    override fun setToolbar(toolbar: Toolbar, visibleTitle: Boolean) {\n        setSupportActionBar(toolbar)\n        toggleNavigationDrawerDelegate.updateToolbar(toolbar)\n        supportActionBar?.setDisplayShowTitleEnabled(visibleTitle)\n    }\n\n    override fun onResume() {\n        super.onResume()\n        GoogleApiAvailability.getInstance().makeGooglePlayServicesAvailable(this)\n    }\n\n    /**\n     * シンプルエディターの表示・非表示を行う\n     */\n    private fun ActivityMainBinding.setSimpleEditor() {\n        SetSimpleEditor(\n            supportFragmentManager,\n            settingStore,\n            appBarMain.fab\n        ).invoke()\n    }\n\n    @MainThread\n    private fun DrawerLayout.closeDrawerWhenOpened() {\n        if (this.isDrawerOpen(GravityCompat.START)) {\n            this.closeDrawer(GravityCompat.START)\n        }\n    }\n\n\n    override fun onStart() {\n        super.onStart()\n        setBackgroundImage()\n        applyUI()\n    }\n\n    private fun setupNavigation() {\n        val navHostFragment = supportFragmentManager.findFragmentById(R.id.contentMain) as NavHostFragment\n        val navController = navHostFragment.navController\n        binding.appBarMain.bottomNavigation.setupWithNavController(navController)\n        navHostFragment.navController.addOnDestinationChangedListener { _, destination, _ ->\n            FirebaseAnalytics.getInstance(this).logEvent(FirebaseAnalytics.Event.SCREEN_VIEW) {\n                param(FirebaseAnalytics.Param.SCREEN_NAME, destination.label.toString())\n                param(FirebaseAnalytics.Param.SCREEN_CLASS, destination.label.toString())\n            }\n        }\n    }\n\n    private fun handleIntent(savedInstanceState: Bundle?) {\n        if (savedInstanceState == null) {\n            mainActivityInitialIntentHandlerFactory.create(\n                binding.appBarMain.bottomNavigation,\n                this,\n            ).invoke(intent)\n        }\n    }\n\n    private fun setupOnBackPressedDispatcherCallBack() {\n        SetupOnBackPressedDispatcherHandler(\n            this,\n            binding\n        ).setup()\n    }\n\n    private fun setBackgroundImage() {\n        val path = settingStore.backgroundImagePath\n        Glide.with(this)\n            .load(path)\n            .into(binding.appBarMain.contentMain.backgroundImage)\n    }\n\n    @MainThread\n    private fun applyUI() {\n        invalidateOptionsMenu()\n        binding.setSimpleEditor()\n\n        binding.appBarMain.bottomNavigation.visibility = if (settingStore.isClassicUI) {\n            View.GONE\n        } else {\n            View.VISIBLE\n        }\n\n    }\n\n    private fun onFabClicked() {\n        fabClickHandleFactory.create(\n            currentPageableTimelineViewModel = currentPageableTimelineViewModel,\n            activity = this,\n        ).onClicked()\n    }\n\n\n    private val requestPermissionLauncher = registerForActivityResult(\n        ActivityResultContracts.RequestPermission()\n    ) {\n        mainViewModel.onPushNotificationConfirmed()\n    }\n}\n\n\nclass MainNavigationImpl @Inject constructor(\n    val activity: Activity\n) : MainNavigation {\n    override fun newIntent(args: Unit): Intent {\n        return Intent(activity, MainActivity::class.java)\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/MiApplication.kt",
    "content": "package jp.panta.misskeyandroidclient\n\nimport android.app.Application\nimport android.os.Build\nimport android.os.Looper\nimport android.util.Log\nimport androidx.hilt.work.HiltWorkerFactory\nimport androidx.work.Configuration\nimport coil.Coil\nimport coil.ImageLoader\nimport coil.decode.GifDecoder\nimport coil.decode.ImageDecoderDecoder\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport dagger.hilt.android.HiltAndroidApp\nimport jp.panta.misskeyandroidclient.media.CoilApngDecoder\nimport jp.panta.misskeyandroidclient.setup.AppStateController\nimport jp.panta.misskeyandroidclient.worker.WorkerJobInitializer\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common_android.platform.activeNetworkFlow\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider\nimport javax.inject.Inject\n\n//基本的な情報はここを返して扱われる\n@HiltAndroidApp\nclass MiApplication : Application(), Configuration.Provider {\n\n    @Inject\n    internal lateinit var mAccountStore: AccountStore\n\n    @Inject\n    internal lateinit var mSocketWithAccountProvider: SocketWithAccountProvider\n\n\n\n\n\n    @Inject\n    internal lateinit var applicationScope: CoroutineScope\n\n    @Inject\n    internal lateinit var lf: Logger.Factory\n\n    private val logger: Logger by lazy {\n        lf.create(\"MiApplication\")\n    }\n\n\n    @Inject\n    lateinit var workerFactory: HiltWorkerFactory\n\n    @Inject\n    internal lateinit var memoryCacheCleaner: MemoryCacheCleaner\n\n    @Inject\n    internal lateinit var initWorkerJobs: WorkerJobInitializer\n\n    @Inject\n    internal lateinit var appStateController: AppStateController\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onCreate() {\n        super.onCreate()\n\n        val defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler()\n        val mainThreadId = Looper.getMainLooper().thread.id\n        Thread.setDefaultUncaughtExceptionHandler { t, e ->\n            FirebaseCrashlytics.getInstance().recordException(e)\n            Log.e(\"MiApplication\", \"Thread上で致命的なエラーが発生しました thread id:${t.id}, name:${t.name}\", e)\n            if (mainThreadId == t.id) {\n                defaultUncaughtExceptionHandler?.uncaughtException(t, e)\n            }\n        }\n\n        setupCoilImageLoader()\n\n        applicationScope.launch {\n            appStateController.initializeSettings()\n        }\n\n        activeNetworkFlow().distinctUntilChanged().onEach {\n            logger.debug { \"接続状態が変化:${if (it) \"接続\" else \"未接続\"}\" }\n            mSocketWithAccountProvider.all().forEach { socket ->\n                if (it) {\n                    socket.onNetworkActive()\n                } else {\n                    socket.onNetworkInActive()\n                }\n            }\n        }.catch { e ->\n            logger.error(\"致命的なエラー\", e)\n        }.launchIn(applicationScope + Dispatchers.IO)\n\n\n        enqueueWorkManagers()\n\n    }\n\n    override val workManagerConfiguration: Configuration\n        get() = Configuration.Builder()\n            .setWorkerFactory(workerFactory)\n            .build()\n\n\n\n    override fun onTrimMemory(level: Int) {\n        super.onTrimMemory(level)\n\n        when (level) {\n            TRIM_MEMORY_RUNNING_CRITICAL, TRIM_MEMORY_RUNNING_MODERATE, TRIM_MEMORY_MODERATE, TRIM_MEMORY_RUNNING_LOW -> {\n                applicationScope.launch {\n                    memoryCacheCleaner.clean()\n                }\n            }\n            TRIM_MEMORY_BACKGROUND -> Unit\n            TRIM_MEMORY_UI_HIDDEN -> Unit\n            TRIM_MEMORY_COMPLETE -> Unit\n\n\n        }\n    }\n\n    /**\n     * Coil の ImageLoader をアプリ全体で共有するシングルトンとして設定する。\n     *\n     * GIF・APNG のアニメーション表示に必要なデコーダを登録する:\n     * - API 28+: ImageDecoderDecoder（Android ネイティブ, GIF + APNG 対応）\n     * - API 28未満: CoilApngDecoder（penfeizhou ラッパー, APNG 対応）+ GifDecoder（GIF 対応）\n     *\n     * この設定により CustomEmojiText・MfmText 等の InlineTextContent 内の\n     * AsyncImage がアニメーション絵文字を正しく再生できるようになる。\n     */\n    private fun setupCoilImageLoader() {\n        val imageLoader = ImageLoader.Builder(this)\n            .components {\n                if (Build.VERSION.SDK_INT >= 28) {\n                    add(ImageDecoderDecoder.Factory())\n                } else {\n                    // CoilApngDecoder を GifDecoder より先に登録し、PNG を優先処理させる\n                    add(CoilApngDecoder.Factory())\n                    add(GifDecoder.Factory())\n                }\n            }\n            .build()\n        Coil.setImageLoader(imageLoader)\n    }\n\n    private fun enqueueWorkManagers() {\n        initWorkerJobs()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ThemeUtil.kt",
    "content": "package jp.panta.misskeyandroidclient\n\nimport android.app.Activity\nimport android.content.Context\nimport android.util.TypedValue\nimport android.view.Menu\nimport androidx.appcompat.app.AppCompatDelegate\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.Theme\nimport net.pantasystem.milktea.model.setting.isNightTheme\n\nfun Activity.setTheme(configRepository: LocalConfigRepository) {\n    val config = configRepository.get().getOrNull() ?: return\n\n    val theme = config.theme\n    if (theme.isNightTheme()) {\n        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)\n    } else {\n        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)\n    }\n\n    when (theme) {\n        is Theme.Dark -> setTheme(R.style.AppThemeDark)\n        Theme.Black -> setTheme(R.style.AppThemeBlack)\n        Theme.Bread -> setTheme(R.style.AppThemeBread)\n        Theme.White -> setTheme(R.style.AppTheme)\n        Theme.ElephantDark -> setTheme(R.style.AppThemeMastodonDark)\n    }\n\n}\n\nfun Context.setMenuTint(menu: Menu) {\n    val typedValue = TypedValue()\n    theme.resolveAttribute(R.attr.normalIconTint, typedValue, true)\n    0.until(menu.size()).forEach {\n        val item = menu.getItem(it)\n        item.icon?.setTint(typedValue.data)\n    }\n}\n\nclass ApplyThemeImpl(\n    val activity: Activity,\n    private val configRepository: LocalConfigRepository\n) : ApplyTheme {\n    override fun invoke() {\n        activity.setTheme(configRepository)\n    }\n}\n\nclass ApplyMenuTintImpl : ApplyMenuTint {\n    override fun invoke(context: Context, menu: Menu) {\n        context.setMenuTint(menu)\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/entorypoint/InitializerEntryPoint.kt",
    "content": "package jp.panta.misskeyandroidclient.di.entorypoint\n\nimport android.content.Context\nimport dagger.hilt.EntryPoint\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.EntryPointAccessors\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.util.DebuggerSetupManager\n\n@EntryPoint\n@InstallIn(SingletonComponent::class)\ninterface InitializerEntryPoint {\n\n    companion object {\n        fun resolve(context: Context): InitializerEntryPoint {\n            val appContext = context.applicationContext ?: throw IllegalStateException()\n            return EntryPointAccessors.fromApplication(\n                appContext,\n                InitializerEntryPoint::class.java\n            )\n        }\n    }\n\n    fun debuggerSetupManager(): DebuggerSetupManager\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/AccountModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport android.content.Context\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.impl.PageDefaultStringsOnAndroid\nimport net.pantasystem.milktea.model.account.MakeDefaultPagesUseCase\nimport net.pantasystem.milktea.model.instance.MetaRepository\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject AccountModule {\n\n\n    @Provides\n    @Singleton\n    fun provideMakeDefaultPagesUseCase(\n        @ApplicationContext context: Context,\n        nodeInfoRepository: NodeInfoRepository,\n        metaRepository: MetaRepository\n    ) : MakeDefaultPagesUseCase {\n        return MakeDefaultPagesUseCase(\n            PageDefaultStringsOnAndroid(context),\n            nodeInfoRepository,\n            metaRepository,\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/AppLoggerModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.common.Logger\nimport jp.panta.misskeyandroidclient.impl.AndroidDefaultLogger\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nobject AppLoggerModule {\n    @Singleton\n    @Provides\n    fun loggerFactory(): Logger.Factory {\n        return AndroidDefaultLogger.Factory\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/CoroutineScopeModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineExceptionHandler\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nobject CoroutinesScopesModule {\n\n    @Singleton // Provide always the same instance\n    @Provides\n    fun providesCoroutineScope(): CoroutineScope {\n        val errorHandler = CoroutineExceptionHandler { _, throwable ->\n            FirebaseCrashlytics.getInstance().recordException(throwable)\n        }\n        return CoroutineScope(SupervisorJob() + Dispatchers.Default + errorHandler)\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/CustomAuthStoreModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport android.content.Context\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.CustomAuthStore\nimport net.pantasystem.milktea.common.getPreferences\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject CustomAuthStoreModule {\n\n    @Provides\n    fun provideCustomAuthStore(\n        @ApplicationContext context: Context\n    ): CustomAuthStore {\n        return CustomAuthStore(context.getPreferences())\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/EmojiModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.impl.CheckEmojiAndroidImpl\nimport net.pantasystem.milktea.model.note.reaction.CheckEmoji\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject EmojiModule {\n\n    @Singleton\n    @Provides\n    fun provideCheckEmoji(\n    ): CheckEmoji {\n        return CheckEmojiAndroidImpl()\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/EncryptionModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport android.content.Context\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.common.Encryption\nimport net.pantasystem.milktea.data.infrastructure.auth.KeyStoreSystemEncryption\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject EncryptionModule {\n\n    @Provides\n    @Singleton\n    fun encryption(@ApplicationContext context: Context): Encryption {\n        return KeyStoreSystemEncryption(context)\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/NavigationModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport jp.panta.misskeyandroidclient.MainNavigationImpl\nimport net.pantasystem.milktea.common_navigation.*\nimport net.pantasystem.milktea.search.SearchNavigationImpl\nimport net.pantasystem.milktea.setting.activities.AccountSettingActivityNavigationImpl\nimport net.pantasystem.milktea.user.search.SearchAndSelectUserNavigationImpl\nimport net.pantasystem.milktea.user.profile.UserDetailNavigationImpl\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n\n    @Binds\n    abstract fun provideUserDetailNavigation(impl: UserDetailNavigationImpl): UserDetailNavigation\n\n    @Binds\n    abstract fun bindMainNavigation(impl: MainNavigationImpl): MainNavigation\n\n    @Binds\n    abstract fun bindSearchAndSelectUserNavigation(impl: SearchAndSelectUserNavigationImpl): SearchAndSelectUserNavigation\n\n    @Binds\n    abstract fun bindSearchResultNavigation(impl: SearchNavigationImpl): SearchNavigation\n\n    @Binds\n    abstract fun bindAccountSettingNav(impl: AccountSettingActivityNavigationImpl) : AccountSettingNavigation\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/NoteModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport android.content.Context\nimport dagger.Binds\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.impl.AndroidNoteReservationPostExecutor\nimport net.pantasystem.milktea.common_android_ui.UserPinnedNotesFragmentFactory\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.ReactionRepositoryImpl\nimport net.pantasystem.milktea.model.note.reaction.ReactionRepository\nimport net.pantasystem.milktea.model.note.reservation.NoteReservationPostExecutor\nimport net.pantasystem.milktea.note.pinned.UserPinnedNotesFragmentFactoryImpl\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject NoteModule {\n    @Provides\n    @Singleton\n    fun noteReservationPostExecutor(\n        @ApplicationContext context: Context\n    ) : NoteReservationPostExecutor {\n        return AndroidNoteReservationPostExecutor(context)\n    }\n\n\n}\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class NoteBindModule {\n    @Binds\n    @Singleton\n    abstract fun bindUserPinnedNotesFragmentFactory(impl: UserPinnedNotesFragmentFactoryImpl): UserPinnedNotesFragmentFactory\n\n    @Binds\n    @Singleton\n    abstract fun bindReactionRepository(impl: ReactionRepositoryImpl): ReactionRepository\n}\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/PageableModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.ui.PageableFragmentFactoryImpl\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class PageableModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindsPageableFragmentFactory(impl: PageableFragmentFactoryImpl): PageableFragmentFactory\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/PushSubscriptionModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport android.content.Context\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.BuildConfig\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.getPreferences\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.sw.register.DeviceTokenRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.sw.register.SubscriptionRegistrationImpl\nimport net.pantasystem.milktea.data.infrastructure.sw.register.SubscriptionUnRegistrationImpl\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.sw.register.DeviceTokenRepository\nimport net.pantasystem.milktea.model.sw.register.SubscriptionRegistration\nimport net.pantasystem.milktea.model.sw.register.SubscriptionUnRegistration\nimport java.util.*\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject PushSubscriptionModule {\n\n    @Singleton\n    @Provides\n    fun provideSubscriptionRegistration(\n        @ApplicationContext context: Context,\n        accountRepository: AccountRepository,\n        misskeyAPIProvider: MisskeyAPIProvider,\n        loggerFactory: Logger.Factory,\n        deviceTokenRepository: DeviceTokenRepository,\n        mastodonAPIProvider: MastodonAPIProvider,\n    ): SubscriptionRegistration {\n        return SubscriptionRegistrationImpl(\n            accountRepository,\n            misskeyAPIProvider,\n            lang = Locale.getDefault().language,\n            loggerFactory,\n            auth = BuildConfig.PUSH_TO_FCM_AUTH,\n            publicKey = BuildConfig.PUSH_TO_FCM_PUBLIC_KEY,\n            endpointBase = BuildConfig.PUSH_TO_FCM_SERVER_BASE_URL,\n            context = context,\n            deviceTokenRepository = deviceTokenRepository,\n            mastodonAPIProvider = mastodonAPIProvider,\n        )\n    }\n\n    @Singleton\n    @Provides\n    fun provideUnSubscriptionRegistration(\n        @ApplicationContext context: Context,\n        accountRepository: AccountRepository,\n        misskeyAPIProvider: MisskeyAPIProvider,\n        mastodonAPIProvider: MastodonAPIProvider,\n    ): SubscriptionUnRegistration {\n        return SubscriptionUnRegistrationImpl(\n            accountRepository,\n            lang = Locale.getDefault().language,\n            misskeyAPIProvider = misskeyAPIProvider,\n            endpointBase = BuildConfig.PUSH_TO_FCM_SERVER_BASE_URL,\n            auth = BuildConfig.PUSH_TO_FCM_AUTH,\n            publicKey = BuildConfig.PUSH_TO_FCM_PUBLIC_KEY,\n            context = context,\n            mastodonAPIProvider = mastodonAPIProvider,\n        )\n    }\n\n    @Singleton\n    @Provides\n    fun provideDeviceTokenRepository(\n        @ApplicationContext context: Context,\n    ): DeviceTokenRepository {\n        return DeviceTokenRepositoryImpl(\n            context = context,\n            sharedPreferences = context.getPreferences()\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/TaskExecutorsModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineScope\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.CreateGalleryTaskExecutor\nimport net.pantasystem.milktea.model.TaskExecutorImpl\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nobject TaskExecutorsModule {\n\n    @Provides\n    @Singleton\n    fun provideGalleryPostTaskExecutor(\n        coroutineScope: CoroutineScope,\n        loggerFactory: Logger.Factory,\n    ): CreateGalleryTaskExecutor {\n        return CreateGalleryTaskExecutor(\n            provideTaskExecutor(coroutineScope, loggerFactory)\n        )\n    }\n\n    private fun <T> provideTaskExecutor(\n        coroutineScope: CoroutineScope,\n        loggerFactory: Logger.Factory,\n    ): TaskExecutorImpl<T> {\n        return TaskExecutorImpl(coroutineScope, loggerFactory.create(\"CreateNoteTaskExecutor\"))\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/di/module/ThemeModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport android.app.Activity\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport jp.panta.misskeyandroidclient.ApplyMenuTintImpl\nimport jp.panta.misskeyandroidclient.ApplyThemeImpl\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\n\n@Module\n@InstallIn(ActivityComponent::class)\nobject ThemeModule {\n\n    @Provides\n    fun provideSetTheme(activity: Activity, configRepository: LocalConfigRepository): ApplyTheme {\n        return ApplyThemeImpl(activity, configRepository)\n    }\n\n    @Provides\n    fun provideMenuTint(): ApplyMenuTint {\n        return ApplyMenuTintImpl()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/impl/AndroidDefaultLogger.kt",
    "content": "package jp.panta.misskeyandroidclient.impl\n\nimport android.util.Log\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport net.pantasystem.milktea.common.BuildConfig\nimport net.pantasystem.milktea.common.Logger\n\nclass AndroidDefaultLogger(\n    override val defaultTag: String\n) : Logger {\n\n    override fun debug(tag: String, e: Throwable?, message: () -> String) {\n        if (BuildConfig.DEBUG) {\n            Log.d(tag, message(), e)\n        }\n    }\n\n    override fun debug(msg: String, tag: String, e: Throwable?) {\n        if (BuildConfig.DEBUG) {\n            Log.d(tag, msg, e)\n        }\n    }\n\n    override fun error(msg: String, e: Throwable?, tag: String) {\n        if (BuildConfig.DEBUG) {\n            Log.e(tag, msg, e)\n        } else {\n            if (e == null) {\n                FirebaseCrashlytics.getInstance().log(\"$tag: E:$msg\")\n            } else {\n                FirebaseCrashlytics.getInstance().recordException(e)\n            }\n        }\n    }\n\n    override fun log(msg: String) {\n        FirebaseCrashlytics.getInstance().log(msg)\n    }\n\n    override fun info(msg: String, tag: String, e: Throwable?) {\n        Log.i(tag, msg, e)\n    }\n\n    override fun warning(msg: String, tag: String, e: Throwable?) {\n        Log.w(tag, msg, e)\n    }\n\n    object Factory : Logger.Factory {\n        override fun create(tag: String): Logger {\n            return AndroidDefaultLogger(tag)\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/impl/AndroidNoteReservationPostExecutor.kt",
    "content": "package jp.panta.misskeyandroidclient.impl\n\nimport android.annotation.SuppressLint\nimport android.app.AlarmManager\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport jp.panta.misskeyandroidclient.AlarmNotePostReceiver\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.reservation.NoteReservationPostExecutor\n\nclass AndroidNoteReservationPostExecutor(\n    val context: Context\n) : NoteReservationPostExecutor {\n\n    @SuppressLint(\"ScheduleExactAlarm\")\n    override fun register(draftNote: DraftNote) {\n        val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager\n        val intent = Intent(context, AlarmNotePostReceiver::class.java)\n        intent.putExtra(\"DRAFT_NOTE_ID\", draftNote.draftNoteId)\n        intent.putExtra(\"ACCOUNT_ID\", draftNote.accountId)\n\n        val flag = when {\n            Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {\n                PendingIntent.FLAG_MUTABLE\n                    .or(PendingIntent.FLAG_UPDATE_CURRENT)\n\n            }\n            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {\n                PendingIntent.FLAG_UPDATE_CURRENT\n            }\n            else -> PendingIntent.FLAG_UPDATE_CURRENT\n        }\n        val pendingIntent = PendingIntent.getBroadcast(\n            context,\n            (draftNote.draftNoteId % 1000).toInt(),\n            intent,\n            flag\n        )\n\n        // NOTE: 参考にした https://qiita.com/upft_rkoshida/items/8149605f751137b4c21c\n        when {\n            Build.VERSION.SDK_INT < Build.VERSION_CODES.M -> {\n                alarmManager.setExact(\n                    AlarmManager.RTC_WAKEUP,\n                    draftNote.reservationPostingAt!!.time,\n                    pendingIntent\n                )\n            }\n            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {\n                alarmManager.setExactAndAllowWhileIdle(\n                    AlarmManager.RTC_WAKEUP,\n                    draftNote.reservationPostingAt!!.time,\n                    pendingIntent\n                )\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/impl/CheckEmojiAndroidImpl.kt",
    "content": "package jp.panta.misskeyandroidclient.impl\n\nimport net.pantasystem.milktea.model.note.reaction.CheckEmoji\nimport javax.inject.Inject\n\nclass CheckEmojiAndroidImpl @Inject constructor(\n) : CheckEmoji {\n    override suspend fun checkEmoji(char: CharSequence): Boolean {\n//        return (EmojiCompat.get()?.hasEmojiGlyph(char) ?: false) || utf8EmojiRepository.exists(char)\n        // TODO: 正しく判定できるように修正する\n        return true\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/impl/NavigationModule.kt",
    "content": "package jp.panta.misskeyandroidclient.impl\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.antenna.AntennaNavigationImpl\nimport net.pantasystem.milktea.common_navigation.AntennaNavigation\nimport net.pantasystem.milktea.common_navigation.UserListNavigation\nimport net.pantasystem.milktea.userlist.UserListNavigationImpl\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n\n    @Binds\n    abstract fun bindUserListNavigation(impl: UserListNavigationImpl) : UserListNavigation\n\n    @Binds\n    abstract fun bindAntennaNavigation(impl: AntennaNavigationImpl) : AntennaNavigation\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/impl/OkHttpClientProviderImpl.kt",
    "content": "package jp.panta.misskeyandroidclient.impl\n\nimport android.os.Build\nimport jp.panta.misskeyandroidclient.BuildConfig\nimport net.pantasystem.milktea.api.misskey.DefaultOkHttpClientProvider\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport okhttp3.OkHttpClient\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass OkHttpClientProviderImpl @Inject constructor(): OkHttpClientProvider {\n    private val client by lazy {\n        DefaultOkHttpClientProvider().client.newBuilder()\n            .addInterceptor { interceptor ->\n                val request = interceptor.request().newBuilder()\n                    .addHeader(\"User-Agent\", \"Milktea/:${BuildConfig.VERSION_NAME} Android/${Build.VERSION.RELEASE}\")\n                    .build()\n                interceptor.proceed(request)\n            }.build()\n    }\n    override fun get(): OkHttpClient {\n        return client\n    }\n\n    override fun create(): OkHttpClient {\n        return OkHttpClient()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/impl/PageDefaultStringsOnAndroid.kt",
    "content": "package jp.panta.misskeyandroidclient.impl\n\nimport android.content.Context\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.model.account.PageDefaultStrings\n\nclass PageDefaultStringsOnAndroid(val context: Context) :\n    PageDefaultStrings {\n    override val globalTimeline: String\n        get() = context.getString(R.string.global_timeline)\n    override val homeTimeline: String\n        get() = context.getString(R.string.home_timeline)\n    override val hybridThrowable: String\n        get() = context.getString(R.string.hybrid_timeline)\n    override val localTimeline: String\n        get() = context.getString(R.string.local_timeline)\n    override val recommendedTimeline: String\n        get() = context.getString(R.string.calckey_recomended_timeline)\n\n    override val media: String\n        get() = context.getString(R.string.media)\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/media/CoilApngDecoder.kt",
    "content": "package jp.panta.misskeyandroidclient.media\n\nimport android.graphics.BitmapFactory\nimport android.graphics.drawable.BitmapDrawable\nimport android.os.Build\nimport coil.ImageLoader\nimport coil.decode.DecodeResult\nimport coil.decode.Decoder\nimport coil.decode.ImageSource\nimport coil.fetch.SourceResult\nimport coil.request.Options\nimport com.github.penfeizhou.animation.apng.APNGDrawable\nimport com.github.penfeizhou.animation.apng.decode.APNGDecoder\nimport com.github.penfeizhou.animation.apng.decode.APNGParser\nimport com.github.penfeizhou.animation.io.ByteBufferReader\nimport com.github.penfeizhou.animation.loader.ByteBufferLoader\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport java.io.IOException\nimport java.nio.ByteBuffer\n\n/**\n * API 28 未満向けの APNG 対応 Coil Decoder。\n *\n * penfeizhou animation ライブラリ（既に Glide 経由で使用中）を Coil の Decoder インターフェースでラップし、\n * Compose の AsyncImage / InlineTextContent 内で APNG アニメーションを表示できるようにする。\n *\n * API 28 以上では ImageDecoderDecoder が GIF・APNG 両方をネイティブに処理するためスキップする。\n *\n * PNG コンテンツに対して Factory が create() を返し、decode() 内で APNG かどうかを判定する:\n * - APNG の場合: APNGDrawable（アニメーション）を返す\n * - 静止 PNG の場合: BitmapDrawable にフォールバックする\n */\nclass CoilApngDecoder(\n    private val source: ImageSource,\n    private val options: Options,\n) : Decoder {\n\n    override suspend fun decode(): DecodeResult {\n        val bytes = withContext(Dispatchers.IO) {\n            source.source().readByteArray()\n        }\n\n        val byteBuffer = ByteBuffer.wrap(bytes)\n\n        // IEND チャンク以降のデータが残っていると penfeizhou が例外を投げるため\n        // IEND チャンクの終端位置に limit を設定してトリムする\n        val iendPos = findIendChunkPosition(bytes)\n        if (iendPos >= 0) {\n            byteBuffer.limit(iendPos + IEND_CHUNK.size)\n        }\n\n        // APNG かどうかを判定（ByteBuffer を消費しないよう duplicate() を使用）\n        val isApng = APNGParser.isAPNG(ByteBufferReader(byteBuffer.duplicate()))\n\n        return if (isApng) {\n            val loader = object : ByteBufferLoader() {\n                override fun getByteBuffer(): ByteBuffer {\n                    byteBuffer.position(0)\n                    return byteBuffer\n                }\n            }\n            DecodeResult(\n                drawable = APNGDrawable(APNGDecoder(loader, null)),\n                isSampled = false,\n            )\n        } else {\n            // 静止 PNG として BitmapFactory でデコード\n            val bitmap = withContext(Dispatchers.IO) {\n                BitmapFactory.decodeByteArray(bytes, 0, bytes.size)\n            } ?: throw IOException(\"Failed to decode PNG as bitmap\")\n            DecodeResult(\n                drawable = BitmapDrawable(options.context.resources, bitmap),\n                isSampled = false,\n            )\n        }\n    }\n\n    class Factory : Decoder.Factory {\n        override fun create(result: SourceResult, options: Options, imageLoader: ImageLoader): Decoder? {\n            // API 28 以上は ImageDecoderDecoder に委ねる\n            if (Build.VERSION.SDK_INT >= 28) return null\n            // PNG 系 MIME タイプのみ対象（GIF は GifDecoder が処理する）\n            val mime = result.mimeType\n            if (mime != null &&\n                !mime.startsWith(\"image/png\", ignoreCase = true) &&\n                !mime.equals(\"image/apng\", ignoreCase = true)\n            ) return null\n            return CoilApngDecoder(result.source, options)\n        }\n    }\n\n    companion object {\n        /** PNG ファイル末尾を示す IEND チャンク（長さ0 + \"IEND\" + CRC） */\n        private val IEND_CHUNK = byteArrayOf(\n            0x00, 0x00, 0x00, 0x00,\n            0x49, 0x45, 0x4E, 0x44,\n            0xAE.toByte(), 0x42, 0x60.toByte(), 0x82.toByte(),\n        )\n\n        /**\n         * バイト配列の末尾から IEND チャンクを探して先頭インデックスを返す。\n         * 見つからない場合は -1 を返す。\n         */\n        private fun findIendChunkPosition(bytes: ByteArray): Int {\n            if (bytes.size < IEND_CHUNK.size) return -1\n            val startPos = bytes.size - IEND_CHUNK.size\n            for (i in startPos downTo 0) {\n                if (bytes[i] == IEND_CHUNK[0]) {\n                    val slice = bytes.sliceArray(i until (i + IEND_CHUNK.size))\n                    if (slice.contentEquals(IEND_CHUNK)) return i\n                }\n            }\n            return -1\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/setup/AppStateController.kt",
    "content": "package jp.panta.misskeyandroidclient.setup\n\nimport android.content.Context\nimport com.google.firebase.analytics.FirebaseAnalytics\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.model.account.ClientIdRepository\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\nclass AppStateController @Inject constructor(\n    private val accountStore: AccountStore,\n    private val configRepository: LocalConfigRepository,\n    private val clientIdRepository: ClientIdRepository,\n    @ApplicationContext private val applicationContext: Context\n) {\n\n\n    suspend fun initializeSettings() {\n        coroutineScope {\n            launch {\n                initAccountStore()\n            }\n            launch {\n                manageCrashlyticsCollectionState()\n            }\n            launch {\n                manageAnalyticsCollectionState()\n            }\n            setFirebaseUserIds()\n        }\n\n    }\n\n    private suspend fun initAccountStore() {\n        accountStore.initialize()\n    }\n\n    private suspend fun manageCrashlyticsCollectionState() {\n        configRepository.observe().map {\n            it.isCrashlyticsCollectionEnabled\n        }.distinctUntilChanged().collect {\n            FirebaseCrashlytics.getInstance()\n                .setCrashlyticsCollectionEnabled(it.isEnable)\n        }\n    }\n\n    private suspend fun manageAnalyticsCollectionState() {\n        configRepository.observe().map {\n            it.isAnalyticsCollectionEnabled\n        }.distinctUntilChanged().collect {\n            FirebaseAnalytics.getInstance(applicationContext)\n                .setAnalyticsCollectionEnabled(it.isEnabled)\n        }\n    }\n\n    private fun setFirebaseUserIds() {\n        val clientId = clientIdRepository.getOrCreate().clientId\n        FirebaseAnalytics.getInstance(applicationContext).setUserId(clientId)\n        FirebaseCrashlytics.getInstance().setUserId(clientId)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/startup/DebuggerSetupInitializer.kt",
    "content": "package jp.panta.misskeyandroidclient.startup\n\nimport android.content.Context\nimport androidx.startup.Initializer\nimport jp.panta.misskeyandroidclient.di.entorypoint.InitializerEntryPoint\n\nclass DebuggerSetupInitializer : Initializer<Unit> {\n\n    override fun create(context: Context) {\n        return InitializerEntryPoint.resolve(context).debuggerSetupManager().setup(context)\n    }\n\n    override fun dependencies(): MutableList<Class<out Initializer<*>>> {\n        return mutableListOf()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/startup/EmojiCompatInitializer.kt",
    "content": "package jp.panta.misskeyandroidclient.startup\n\nimport android.content.Context\nimport androidx.emoji2.bundled.BundledEmojiCompatConfig\nimport androidx.emoji2.text.EmojiCompat\nimport androidx.startup.Initializer\n\nclass EmojiCompatInitializer : Initializer<EmojiCompat> {\n    override fun create(context: Context): EmojiCompat {\n        EmojiCompat.init(\n            BundledEmojiCompatConfig(context)\n                .setReplaceAll(true)\n                .setMetadataLoadStrategy(EmojiCompat.LOAD_STRATEGY_MANUAL)\n        )\n        EmojiCompat.get().load()\n        return EmojiCompat.get()\n    }\n\n    override fun dependencies(): MutableList<Class<out Initializer<*>>> {\n        return mutableListOf()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/BottomNavigationLongClickListener.kt",
    "content": "package jp.panta.misskeyandroidclient.ui\n\nimport android.annotation.SuppressLint\nimport android.view.ViewGroup\nimport androidx.core.view.forEach\nimport com.google.android.material.bottomnavigation.BottomNavigationItemView\nimport com.google.android.material.bottomnavigation.BottomNavigationView\n\n@SuppressLint(\"RestrictedApi\")\nfun BottomNavigationView.setLongPressListenerOnNavigationItem(\n    itemId: Int,\n    onLongClicked: () -> Boolean\n) {\n    this.getChildAt(0)?.also { view ->\n        if (view is ViewGroup) {\n            view.forEach { child ->\n                if (child is BottomNavigationItemView) {\n                    if (child.itemData?.itemId == itemId) {\n                        child.setOnLongClickListener {\n                            onLongClicked()\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/PageableFragmentFactoryImpl.kt",
    "content": "package jp.panta.misskeyandroidclient.ui\n\nimport androidx.fragment.app.Fragment\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.gallery.GalleryPostsFragment\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.note.detail.NoteDetailFragment\nimport net.pantasystem.milktea.note.timeline.TimelineFragment\nimport net.pantasystem.milktea.notification.NotificationFragment\nimport javax.inject.Inject\n\n\nclass PageableFragmentFactoryImpl @Inject constructor(): PageableFragmentFactory {\n\n    override fun create(page: Page): Fragment {\n        return when(val pageable = page.pageable()){\n            is Pageable.Show ->{\n                NoteDetailFragment.newInstance(page)\n            }\n            is Pageable.Notification ->{\n                NotificationFragment.newInstance(page.attachedAccountId ?: page.accountId)\n            }\n            is Pageable.Gallery -> {\n                return GalleryPostsFragment.newInstance(pageable, page.attachedAccountId ?: page.accountId)\n            }\n            else ->{\n                TimelineFragment.newInstance(page)\n            }\n        }\n\n    }\n\n    override fun create(pageable: Pageable): Fragment {\n        return when(pageable){\n            is Pageable.Show ->{\n                NoteDetailFragment.newInstance(pageable.noteId)\n            }\n            is Pageable.Notification ->{\n                NotificationFragment()\n            }\n            is Pageable.Gallery -> {\n                return GalleryPostsFragment.newInstance(pageable, null)\n            }\n            else ->{\n                TimelineFragment.newInstance(pageable)\n            }\n        }\n    }\n\n    override fun create(accountId: Long?, pageable: Pageable): Fragment {\n        if (accountId == null) {\n            return create(pageable)\n        }\n        return when(pageable){\n            is Pageable.Show ->{\n                NoteDetailFragment.newInstance(pageable.noteId, accountId)\n            }\n            is Pageable.Notification ->{\n                NotificationFragment.newInstance(accountId)\n            }\n            is Pageable.Gallery -> {\n                return GalleryPostsFragment.newInstance(pageable, accountId)\n            }\n            else ->{\n                TimelineFragment.newInstance(pageable, accountId)\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/AccountViewModelHandler.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport androidx.annotation.MainThread\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.GravityCompat\nimport androidx.drawerlayout.widget.DrawerLayout\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport jp.panta.misskeyandroidclient.databinding.ActivityMainBinding\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.putActivity\nimport net.pantasystem.milktea.common_android_ui.account.AccountSwitchingDialog\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.followlist.FollowFollowerActivity\nimport net.pantasystem.milktea.user.profile.UserDetailActivity\n\nclass AccountViewModelHandler(\n    val binding: ActivityMainBinding,\n    val activity: AppCompatActivity,\n    val accountViewModel: AccountViewModel,\n) {\n\n    fun setup() {\n        initAccountViewModelListener()\n    }\n\n\n    private fun initAccountViewModelListener() {\n        accountViewModel.switchAccountEvent.onEach {\n            binding.drawerLayout.closeDrawer(GravityCompat.START)\n            val dialog = AccountSwitchingDialog()\n            dialog.show(activity.supportFragmentManager, AccountSwitchingDialog.FRAGMENT_TAG)\n        }.flowWithLifecycle(activity.lifecycle, Lifecycle.State.RESUMED).launchIn(activity.lifecycleScope)\n\n        accountViewModel.showFollowersEvent.onEach {\n            binding.drawerLayout.closeDrawerWhenOpened()\n            val intent = FollowFollowerActivity.newIntent(activity, it, false)\n            activity.startActivity(intent)\n        }.flowWithLifecycle(activity.lifecycle, Lifecycle.State.RESUMED).launchIn(activity.lifecycleScope)\n\n        accountViewModel.showFollowingsEvent.onEach {\n            binding.drawerLayout.closeDrawerWhenOpened()\n            val intent = FollowFollowerActivity.newIntent(activity, it, true)\n            activity.startActivity(intent)\n        }.flowWithLifecycle(activity.lifecycle, Lifecycle.State.RESUMED).launchIn(activity.lifecycleScope)\n\n        accountViewModel.showProfileEvent.onEach {\n            binding.drawerLayout.closeDrawerWhenOpened()\n            val intent =\n                UserDetailActivity.newInstance(activity, userId = User.Id(it.accountId, it.remoteId))\n            intent.putActivity(Activities.ACTIVITY_IN_APP)\n            activity.startActivity(intent)\n        }.flowWithLifecycle(activity.lifecycle, Lifecycle.State.RESUMED).launchIn(activity.lifecycleScope)\n\n    }\n\n    @MainThread\n    private fun DrawerLayout.closeDrawerWhenOpened() {\n        if (this.isDrawerOpen(GravityCompat.START)) {\n            this.closeDrawer(GravityCompat.START)\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/ChangeNavMenuVisibilityFromAPIVersion.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport com.google.android.material.navigation.NavigationView\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.instance.FeatureType\n\ninternal class ChangeNavMenuVisibilityFromAPIVersion(\n    private val navView: NavigationView,\n    private val featureEnables: FeatureEnables,\n) {\n    suspend operator fun invoke(currentAccount: Account) {\n        val enableFeatures = featureEnables.enableFeatures(currentAccount.normalizedInstanceUri)\n        navView.menu.also { menu ->\n            menu.findItem(R.id.nav_antenna).isVisible = enableFeatures.contains(FeatureType.Antenna)\n            menu.findItem(R.id.nav_channel).isVisible = enableFeatures.contains(FeatureType.Channel)\n            menu.findItem(R.id.nav_gallery).isVisible = enableFeatures.contains(FeatureType.Gallery)\n            menu.findItem(R.id.nav_group).isVisible = enableFeatures.contains(FeatureType.Group)\n            menu.findItem(R.id.nav_drive).isVisible = enableFeatures.contains(FeatureType.Drive)\n            menu.findItem(R.id.nav_clip).isVisible = enableFeatures.contains(FeatureType.Clip)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/ConfirmCrashlyticsDialog.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport jp.panta.misskeyandroidclient.R\nimport jp.panta.misskeyandroidclient.ui.main.viewmodel.MainViewModel\n\n@AndroidEntryPoint\nclass ConfirmCrashlyticsDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"ConfirmCrashlyticsDialog\"\n    }\n\n    private val mainViewModel by activityViewModels<MainViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.send_a_crash_report)\n            .setPositiveButton(R.string.agree) { _, _ ->\n                mainViewModel.setCrashlyticsCollectionEnabled(true)\n            }\n            .setNegativeButton(R.string.cancel) { _, _ ->\n                mainViewModel.setCrashlyticsCollectionEnabled(false)\n            }\n            .setMessage(R.string.crash_reports_are_useful_for_development)\n            .show()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/ConfirmGoogleAnalyticsDialog.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport jp.panta.misskeyandroidclient.R\nimport jp.panta.misskeyandroidclient.ui.main.viewmodel.MainViewModel\n\n@AndroidEntryPoint\nclass ConfirmGoogleAnalyticsDialog : DialogFragment() {\n    companion object {\n        const val FRAGMENT_TAG = \"ConfirmGoogleAnalyticsDialog\"\n    }\n\n    private val mainViewModel: MainViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.consent_to_collect_behavior_history)\n            .setMessage(R.string.consent_to_collect_behavior_history_message)\n            .setPositiveButton(R.string.agree) { _, _ ->\n                mainViewModel.setAnalyticsCollectionEnabled(true)\n            }\n            .setNegativeButton(R.string.disagree) { _, _ ->\n                mainViewModel.setAnalyticsCollectionEnabled(false)\n            }.show()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/FabClickHandler.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport dagger.hilt.android.scopes.ActivityScoped\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common_android_ui.account.AccountSwitchingDialog\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageType\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.common_viewmodel.SuitableType\nimport net.pantasystem.milktea.common_viewmodel.suitableType\nimport net.pantasystem.milktea.gallery.GalleryPostsActivity\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport javax.inject.Inject\n\ninternal class FabClickHandler(\n    private val currentPageableTimelineViewModel: CurrentPageableTimelineViewModel,\n    private val activity: AppCompatActivity,\n    private val accountStore: AccountStore,\n) {\n\n    @ActivityScoped\n    internal class Factory @Inject constructor(\n        private val accountStore: AccountStore,\n    ) {\n        fun create(\n            currentPageableTimelineViewModel: CurrentPageableTimelineViewModel,\n            activity: AppCompatActivity,\n        ): FabClickHandler {\n            return FabClickHandler(\n                currentPageableTimelineViewModel,\n                activity,\n                accountStore\n            )\n        }\n    }\n\n    fun onClicked() {\n        activity.apply {\n            when (val type = currentPageableTimelineViewModel.currentType.value) {\n                CurrentPageType.Account -> {\n                    AccountSwitchingDialog().show(\n                        activity.supportFragmentManager,\n                        AccountSwitchingDialog.FRAGMENT_TAG\n                    )\n                }\n                is CurrentPageType.Page -> {\n                    when (val suitableType = type.pageable.suitableType()) {\n                        is SuitableType.Other -> {\n                            val text = when (val pageable = type.pageable) {\n                                is Pageable.SearchByTag -> \"#${pageable.tag}\"\n                                is Pageable.Mastodon.HashTagTimeline -> \"#${pageable.hashtag}\"\n                                else -> \"\"\n                            }\n                            startActivity(\n                                NoteEditorActivity.newBundle(\n                                    this,\n                                    accountId = type.accountId,\n                                    text = text\n                                )\n                            )\n                        }\n                        is SuitableType.Gallery -> {\n                            val intent = Intent(this, GalleryPostsActivity::class.java)\n                            intent.action = Intent.ACTION_EDIT\n                            startActivity(intent)\n                        }\n                        is SuitableType.Channel -> {\n                            val accountId = type.accountId ?: accountStore.currentAccountId!!\n                            startActivity(\n                                NoteEditorActivity.newBundle(\n                                    this,\n                                    channelId = Channel.Id(accountId, suitableType.channelId),\n                                )\n                            )\n                        }\n                    }\n                }\n            }\n\n        }\n\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/IntentToAddAccountHandler.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.content.Intent\nimport jp.panta.misskeyandroidclient.BuildConfig\nimport jp.panta.misskeyandroidclient.ui.main.viewmodel.MainViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport javax.inject.Inject\n\n/**\n * 起動時にIntentを受け取り、その中に認証情報が含まれていれば、\n * DBに認証情報を追加するための処理。\n * 脆弱性につながる可能性があるため、デバッグモード時とベンチマーク時には動作しないように実装してある。\n */\ninternal class IntentToAddAccountHandler(\n    private val coroutineScope: CoroutineScope,\n    private val mainViewModel: MainViewModel,\n    private val accountRepository: AccountRepository,\n) {\n\n    class Factory @Inject constructor(\n        private val accountRepository: AccountRepository,\n    ) {\n        fun create(\n            coroutineScope: CoroutineScope,\n            mainViewModel: MainViewModel,\n        ): IntentToAddAccountHandler {\n            return IntentToAddAccountHandler(\n                coroutineScope,\n                mainViewModel,\n                accountRepository,\n            )\n        }\n    }\n\n    @Suppress(\"KotlinConstantConditions\")\n    operator fun invoke(intent: Intent) {\n        if (BuildConfig.BUILD_TYPE == \"benchmark\" || BuildConfig.BUILD_TYPE == \"debug\") {\n            mainViewModel.setShouldWaitForAuthentication(true)\n            coroutineScope.launch {\n                try {\n                    val username = intent.getStringExtra(\"username\") ?: return@launch\n                    val host = intent.getStringExtra(\"host\") ?: return@launch\n                    val token = intent.getStringExtra(\"token\") ?: return@launch\n                    val remoteId = intent.getStringExtra(\"remoteId\") ?: return@launch\n\n                    val state = mainViewModel.accountState.first()\n                    if (state.state.accounts.any {\n                        it.userName == username && it.instanceDomain == host\n                    }) {\n                        return@launch\n                    }\n\n                    mainViewModel.accountStore.addAccount(\n                        Account(\n                            remoteId = remoteId,\n                            instanceDomain = host,\n                            userName = username,\n                            token = token,\n                            instanceType = Account.InstanceType.MISSKEY,\n                        )\n                    )\n                } finally {\n                    mainViewModel.setShouldWaitForAuthentication(false)\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/MainActivityEventHandler.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.Manifest\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.media.AudioManager\nimport android.media.Ringtone\nimport android.media.RingtoneManager\nimport android.os.Build\nimport android.util.Log\nimport androidx.activity.result.ActivityResultLauncher\nimport androidx.core.content.ContextCompat\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.work.WorkInfo\nimport com.google.firebase.analytics.FirebaseAnalytics\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport jp.panta.misskeyandroidclient.MainActivity\nimport jp.panta.misskeyandroidclient.R\nimport jp.panta.misskeyandroidclient.databinding.ActivityMainBinding\nimport jp.panta.misskeyandroidclient.ui.main.viewmodel.MainViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.distinctUntilChangedBy\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.auth.JoinMilkteaActivity\nimport net.pantasystem.milktea.common_android_ui.report.ReportViewModel\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageType\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.note.draft.DraftNoteService\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.user.report.ReportState\nimport net.pantasystem.milktea.notification.notificationMessageScope\nimport net.pantasystem.milktea.user.ReportStateHandler\nimport net.pantasystem.milktea.worker.note.CreateNoteWorkerExecutor\nimport javax.inject.Inject\n\ninternal class MainActivityEventHandler(\n    val activity: MainActivity,\n    val binding: ActivityMainBinding,\n    private val lifecycleScope: CoroutineScope,\n    private val lifecycleOwner: LifecycleOwner,\n    private val mainViewModel: MainViewModel,\n    val reportViewModel: ReportViewModel,\n    private val createNoteWorkerExecutor: CreateNoteWorkerExecutor,\n    val accountStore: AccountStore,\n    private val requestPostNotificationsPermissionLauncher: ActivityResultLauncher<String>,\n    val changeNavMenuVisibilityFromAPIVersion: ChangeNavMenuVisibilityFromAPIVersion,\n    private val configStore: SettingStore,\n    private val draftNoteService: DraftNoteService,\n    private val currentPageableTimelineViewModel: CurrentPageableTimelineViewModel,\n) {\n\n    class Factory @Inject constructor(\n        private val createNoteWorkerExecutor: CreateNoteWorkerExecutor,\n        val accountStore: AccountStore,\n        private val configStore: SettingStore,\n        private val draftNoteService: DraftNoteService,\n        private val featureEnables: FeatureEnables,\n    ) {\n        fun create(\n            activity: MainActivity,\n            binding: ActivityMainBinding,\n            mainViewModel: MainViewModel,\n            reportViewModel: ReportViewModel,\n            requestPostNotificationsPermissionLauncher: ActivityResultLauncher<String>,\n            currentPageableTimelineViewModel: CurrentPageableTimelineViewModel,\n        ): MainActivityEventHandler {\n            return MainActivityEventHandler(\n                activity,\n                binding,\n                activity.lifecycleScope,\n                activity,\n                mainViewModel,\n                reportViewModel,\n                createNoteWorkerExecutor,\n                accountStore,\n                requestPostNotificationsPermissionLauncher,\n                ChangeNavMenuVisibilityFromAPIVersion(binding.navView, featureEnables),\n                configStore,\n                draftNoteService,\n                currentPageableTimelineViewModel\n            )\n        }\n    }\n\n\n    fun setup() {\n        // NOTE: 各バージョンに合わせMenuを制御している\n        accountStore.observeCurrentAccount.filterNotNull().onEach {\n            changeNavMenuVisibilityFromAPIVersion(it)\n        }.catch {\n            Log.e(\"MainActivity\", \"check version error\", it)\n        }.launchIn(lifecycleScope)\n\n\n        mainViewModel.state.onEach { uiState ->\n            ShowBottomNavigationBadgeDelegate(binding.appBarMain.bottomNavigation)(uiState)\n        }.launchIn(lifecycleScope)\n\n        collectLatestNotifications()\n        collectCrashlyticsCollectionState()\n        collectReportSendingState()\n        collectCreateNoteState()\n        collectUnauthorizedState()\n        collectConfirmGoogleAnalyticsState()\n        collectRequestPostNotificationState()\n        collectDraftNoteSavedEvent()\n        collectCurrentPageableState()\n        collectEnableSafeSearchDescriptionState()\n    }\n\n    private fun collectCrashlyticsCollectionState() {\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                mainViewModel.isShowFirebaseCrashlytics.collect {\n                    if (it && activity.supportFragmentManager.findFragmentByTag(\n                            ConfirmCrashlyticsDialog.FRAGMENT_TAG\n                        ) == null\n                    ) {\n                        ConfirmCrashlyticsDialog().show(\n                            activity.supportFragmentManager,\n                            ConfirmCrashlyticsDialog.FRAGMENT_TAG\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    private fun collectEnableSafeSearchDescriptionState() {\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                mainViewModel.isShowEnableSafeSearchDescription.collect {\n                    if (it && activity.supportFragmentManager.findFragmentByTag(\n                            SafeSearchDescriptionDialog.TAG\n                        ) == null\n                    ) {\n                        SafeSearchDescriptionDialog().show(\n                            activity.supportFragmentManager,\n                            SafeSearchDescriptionDialog.TAG\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    private fun collectConfirmGoogleAnalyticsState() {\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                mainViewModel.isShowGoogleAnalyticsDialog.collect {\n                    if (it && activity.supportFragmentManager.findFragmentByTag(\n                            ConfirmGoogleAnalyticsDialog.FRAGMENT_TAG\n                        ) == null\n                    ) {\n                        ConfirmGoogleAnalyticsDialog().show(\n                            activity.supportFragmentManager,\n                            ConfirmGoogleAnalyticsDialog.FRAGMENT_TAG\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    private fun collectReportSendingState() {\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                reportViewModel.successOrFailureEvent.distinctUntilChangedBy {\n                    it is ReportState.Sending.Success\n                            || it is ReportState.Sending.Failed\n                }.collect { state ->\n                    showSendReportStateFrom(state)\n                }\n            }\n\n        }\n    }\n\n    private fun collectCreateNoteState() {\n        // NOTE: ノート作成処理の状態をSnackBarで表示する\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                createNoteWorkerExecutor.getCreateNoteWorkInfosInAppActives()\n                    .collect { workInfoList ->\n                        Log.d(\"collectCreateNoteState\", \"workInfoList:$workInfoList\")\n                        workInfoList.forEach {\n                            showCreateNoteTaskStatusSnackBar(it)\n                        }\n                    }\n            }\n        }\n    }\n\n    private fun collectLatestNotifications() {\n        // NOTE: 最新の通知をSnackBar等に表示する\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                mainViewModel.newNotifications.collect { notificationRelation ->\n                    activity.apply {\n                        notificationMessageScope {\n                            notificationRelation.showSnackBarMessage(binding.appBarMain.simpleNotification)\n                        }\n                    }\n                }\n            }\n        }\n        val audioManager = activity.getSystemService(Context.AUDIO_SERVICE) as AudioManager\n\n        var replayedNotifyId: Notification.Id? = null\n        var ringtone: Ringtone? = null\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                withContext(Dispatchers.Default) {\n                    if (ringtone == null) {\n                        val uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)\n                        ringtone = RingtoneManager.getRingtone(activity, uri)\n                    }\n                }\n                mainViewModel.newNotifications.collect {\n                    if (replayedNotifyId == it.notification.id) {\n                        return@collect\n                    }\n                    replayedNotifyId = it.notification.id\n                    if (ringtone?.isPlaying == true) {\n                        ringtone?.stop()\n                    }\n                    if (\n                        configStore.configState.value.isEnableNotificationSound\n                        && audioManager.ringerMode == AudioManager.RINGER_MODE_NORMAL\n                    ) {\n                        ringtone?.play()\n                    }\n                }\n            }\n        }\n    }\n\n    private fun collectUnauthorizedState() {\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {\n                mainViewModel.accountState.collect { state ->\n                    FirebaseCrashlytics.getInstance().setCustomKey(\n                        \"CURRENT_ACCOUNT_USER_ID\",\n                        state.state.currentAccount?.remoteId ?: \"\"\n                    )\n                    FirebaseCrashlytics.getInstance().setCustomKey(\n                        \"CURRENT_INSTANCE_DOMAIN\",\n                        state.state.currentAccount?.instanceDomain ?: \"\"\n                    )\n                    FirebaseCrashlytics.getInstance().setCustomKey(\n                        \"CURRENT_USERNAME\",\n                        state.state.currentAccount?.userName ?: \"\"\n                    )\n                    FirebaseAnalytics.getInstance(activity).setUserProperty(\n                        \"CURRENT_ACCOUNT_USER_ID\",\n                        state.state.currentAccount?.let {\n                            it.remoteId.substring(0, 36.coerceAtMost(it.remoteId.length))\n                        }\n                    )\n                    FirebaseAnalytics.getInstance(activity).setUserProperty(\n                        \"CURRENT_INSTANCE_DOMAIN\",\n                        state.state.currentAccount?.let {\n                            it.instanceDomain.substring(\n                                0,\n                                36.coerceAtMost(it.instanceDomain.length)\n                            )\n                        }\n                    )\n                    FirebaseAnalytics.getInstance(activity).setUserProperty(\n                        \"CURRENT_USERNAME\",\n                        state.state.currentAccount?.let {\n                            it.userName.substring(0, 36.coerceAtMost(it.userName.length))\n                        }\n                    )\n\n                    // NOTE: shouldWaitForAuthenticationは任意の処理が終わるまで認証画面への遷移をブロックするための処理で、\n                    // NOTE: 未認証かつ待ち受ける必要性がない場合に認証画面に遷移するようにしている。\n                    if (state.state.isUnauthorized && !state.shouldWaitForAuthentication) {\n                        activity.startActivity(\n                            Intent(activity, JoinMilkteaActivity::class.java)\n                        )\n                        activity.finish()\n                    }\n                }\n            }\n        }\n    }\n\n    private fun collectRequestPostNotificationState() {\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                mainViewModel.isRequestPushNotificationPermission.collect { requestPermission ->\n                    if (requestPermission &&\n                        ContextCompat.checkSelfPermission(\n                            activity,\n                            Manifest.permission.POST_NOTIFICATIONS\n                        ) == PackageManager.PERMISSION_DENIED\n                        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU\n                    ) {\n                        requestPostNotificationsPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)\n                    }\n                }\n            }\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private fun collectDraftNoteSavedEvent() {\n        lifecycleScope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                accountStore.observeCurrentAccount.filterNotNull().flatMapLatest {\n                    draftNoteService.getDraftNoteSavedEventBy(it.accountId)\n                }.collect(\n                    ShowRequestSchedulePostResultSnackBar(\n                        activity,\n                        binding.appBarMain.simpleNotification\n                    )::invoke\n                )\n            }\n        }\n    }\n\n    private fun showSendReportStateFrom(state: ReportState) {\n        ReportStateHandler().invoke(binding.appBarMain.simpleNotification, state)\n    }\n\n    private fun showCreateNoteTaskStatusSnackBar(state: WorkInfo) {\n        NoteCreateResultHandler(\n            activity,\n            binding.appBarMain.simpleNotification,\n            createNoteWorkerExecutor,\n        )(state)\n    }\n\n    private fun collectCurrentPageableState() {\n        currentPageableTimelineViewModel.currentType.onEach {\n            binding.appBarMain.fab.setImageResource(\n                when (it) {\n                    CurrentPageType.Account -> {\n                        R.drawable.ic_person_add_black_24dp\n                    }\n\n                    is CurrentPageType.Page -> {\n                        R.drawable.ic_edit_black_24dp\n                    }\n                }\n            )\n\n        }.flowWithLifecycle(activity.lifecycle, Lifecycle.State.RESUMED).launchIn(lifecycleScope)\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/MainActivityInitialIntentHandler.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.bottomnavigation.BottomNavigationView\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport dagger.hilt.android.scopes.ActivityScoped\nimport jp.panta.misskeyandroidclient.R\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.notification.PushNotification\nimport net.pantasystem.milktea.model.notification.toPushNotification\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.NoteDetailActivity\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport javax.inject.Inject\n\n/**\n * MainActivity起動時にIntentを処理するクラス\n * 例えばバックグラウンドからのFCMのプッシュ通知を開かれた時は\n * Intentに通知情報が入っているので、その情報を処理して通知に対応した画面に遷移するようにする。\n */\nclass MainActivityInitialIntentHandler(\n    private val bottomNavigationView: BottomNavigationView,\n    private val activity: AppCompatActivity,\n    private val userDetailNavigation: UserDetailNavigation,\n    private val accountRepository: AccountRepository,\n    private val accountStore: AccountStore,\n) {\n\n    @ActivityScoped\n    class Factory @Inject constructor(\n        private val userDetailNavigation: UserDetailNavigation,\n        private val accountRepository: AccountRepository,\n        private val accountStore: AccountStore,\n    ) {\n        fun create(\n            bottomNavigationView: BottomNavigationView,\n            activity: AppCompatActivity,\n        ): MainActivityInitialIntentHandler {\n            return MainActivityInitialIntentHandler(\n                bottomNavigationView,\n                activity,\n                userDetailNavigation,\n                accountRepository,\n                accountStore,\n            )\n        }\n    }\n\n    operator fun invoke(intent: Intent) {\n        // NOTE: バックグラウンドから通知を開いた場合、通知のデータがintentに入っている\n        val pushNotification = intent.extras?.toPushNotification()?.getOrNull()\n        if (pushNotification != null) {\n            activity.lifecycleScope.launch {\n                accountRepository.get(pushNotification.accountId).mapCancellableCatching {\n                    accountStore.setCurrent(it)\n                }.onSuccess {\n                    navigateBy(pushNotification)\n                }.onFailure {\n                    FirebaseCrashlytics.getInstance().recordException(it)\n                }\n            }\n            return\n        }\n\n        val shortcutType = runCancellableCatching {\n            intent.getStringExtra(\"SHORTCUT_TYPE\")\n                ?.let { AppShortcutType.valueOf(it) }\n        }.getOrNull()\n\n        when (\n            shortcutType\n        ) {\n            AppShortcutType.TYPE_OPEN_MESSAGING -> {\n                bottomNavigationView.selectedItemId = R.id.navigation_message_list\n            }\n            AppShortcutType.TYPE_OPEN_NOTIFICATION -> {\n                bottomNavigationView.selectedItemId = R.id.navigation_notification\n            }\n            AppShortcutType.TYPE_EDIT_NOTE -> {\n                activity.startActivity(NoteEditorActivity.newBundle(activity))\n            }\n            null -> {\n\n            }\n        }\n    }\n\n    private fun navigateBy(pushNotification: PushNotification) {\n        bottomNavigationView.selectedItemId = R.id.navigation_notification\n        when {\n            pushNotification.isNearUserNotification() -> {\n                activity.startActivity(\n                    userDetailNavigation.newIntent(\n                        UserDetailNavigationArgs.UserId(\n                            userId = User.Id(\n                                pushNotification.accountId,\n                                pushNotification.userId!!\n                            )\n                        )\n                    )\n                )\n            }\n            pushNotification.isNearNoteNotification() -> {\n                activity.startActivity(\n                    NoteDetailActivity.newIntent(\n                        activity, Note.Id(\n                            pushNotification.accountId,\n                            pushNotification.noteId!!,\n                        )\n                    )\n                )\n            }\n        }\n    }\n}\n\nenum class AppShortcutType {\n    TYPE_OPEN_MESSAGING, TYPE_OPEN_NOTIFICATION, TYPE_EDIT_NOTE\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/MainActivityMenuProvider.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.content.Intent\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport androidx.core.view.MenuProvider\nimport jp.panta.misskeyandroidclient.MainActivity\nimport jp.panta.misskeyandroidclient.R\nimport jp.panta.misskeyandroidclient.setMenuTint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.messaging.MessagingListActivity\nimport net.pantasystem.milktea.notification.NotificationsActivity\nimport net.pantasystem.milktea.search.SearchActivity\nimport net.pantasystem.milktea.setting.activities.PageSettingActivity\n\ninternal class MainActivityMenuProvider(\n    val activity: MainActivity,\n    val settingStore: SettingStore\n) : MenuProvider {\n    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n        activity.setMenuTint(menu)\n        menuInflater.inflate(R.menu.main, menu)\n\n        listOf(\n            menu.findItem(R.id.action_messaging),\n            menu.findItem(R.id.action_notification),\n            menu.findItem(R.id.action_search)\n        ).forEach {\n            it.isVisible = settingStore.isClassicUI\n        }\n\n    }\n\n    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n        val idAndActivityMap = mapOf(\n            R.id.action_tab_setting to PageSettingActivity::class.java,\n            R.id.action_notification to NotificationsActivity::class.java,\n            R.id.action_messaging to MessagingListActivity::class.java,\n            R.id.action_search to SearchActivity::class.java\n        )\n\n        val targetActivity = idAndActivityMap[menuItem.itemId]\n            ?: return false\n        activity.startActivity(Intent(activity, targetActivity))\n        return true\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/MainActivityNavigationDrawerMenuItemClickListener.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.content.Intent\nimport android.view.MenuItem\nimport jp.panta.misskeyandroidclient.MainActivity\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.antenna.AntennaListActivity\nimport net.pantasystem.milktea.channel.ChannelActivity\nimport net.pantasystem.milktea.clip.ClipListActivity\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.drive.DriveActivity\nimport net.pantasystem.milktea.favorite.FavoriteActivity\nimport net.pantasystem.milktea.gallery.GalleryPostsActivity\nimport net.pantasystem.milktea.group.GroupActivity\nimport net.pantasystem.milktea.note.DraftNotesActivity\nimport net.pantasystem.milktea.setting.activities.SettingsActivity\nimport net.pantasystem.milktea.userlist.ListListActivity\n\ninternal class MainActivityNavigationDrawerMenuItemClickListener(\n    val mainActivity: MainActivity,\n    val accountViewModel: AccountViewModel,\n) {\n    fun onSelect(item: MenuItem) {\n        val activity = when (item.itemId) {\n            R.id.nav_setting -> SettingsActivity::class.java\n            R.id.nav_drive -> DriveActivity::class.java\n            R.id.nav_favorite -> FavoriteActivity::class.java\n            R.id.nav_list -> ListListActivity::class.java\n            R.id.nav_antenna -> AntennaListActivity::class.java\n            R.id.nav_draft -> DraftNotesActivity::class.java\n            R.id.nav_gallery -> GalleryPostsActivity::class.java\n            R.id.nav_channel -> ChannelActivity::class.java\n            R.id.nav_group -> GroupActivity::class.java\n            R.id.nav_clip -> ClipListActivity::class.java\n            R.id.nav_switch_account -> {\n                accountViewModel.showSwitchDialog()\n                return\n            }\n            else -> throw IllegalStateException(\"未定義なNavigation Itemです\")\n        }\n        mainActivity.startActivity(Intent(mainActivity, activity))\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/NoteCreateResultHandler.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.work.WorkInfo\nimport com.google.android.material.snackbar.Snackbar\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.NoteDetailActivity\nimport net.pantasystem.milktea.worker.note.CreateNoteWorker\nimport net.pantasystem.milktea.worker.note.CreateNoteWorkerExecutor\n\ninternal class NoteCreateResultHandler(\n    private val activity: AppCompatActivity,\n    private val view: View,\n    private val createNoteWorkerExecutor: CreateNoteWorkerExecutor,\n) {\n\n    operator fun invoke(workInfo: WorkInfo) {\n        when (workInfo.state) {\n            WorkInfo.State.ENQUEUED -> Unit\n            WorkInfo.State.RUNNING -> Unit\n            WorkInfo.State.SUCCEEDED -> {\n                val noteId =\n                    workInfo.outputData.getLong(CreateNoteWorker.EXTRA_ACCOUNT_ID, -1).takeIf {\n                        it != -1L\n                    }?.let {\n                        Note.Id(\n                            it,\n                            workInfo.outputData.getString(CreateNoteWorker.EXTRA_NOTE_ID) ?: \"\"\n                        )\n                    } ?: return\n                activity.getString(R.string.successfully_created_note).showSnackBar(\n                    activity.getString(R.string.show) to ({\n                        activity.startActivity(\n                            NoteDetailActivity.newIntent(activity, noteId)\n                        )\n                    })\n                )\n                createNoteWorkerExecutor.onHandled(workInfo.id)\n            }\n\n            WorkInfo.State.FAILED -> {\n                val draftNoteId =\n                    workInfo.outputData.getLong(CreateNoteWorker.EXTRA_DRAFT_NOTE_ID, -1).takeIf {\n                        it != -1L\n                    } ?: return\n                if (activity.supportFragmentManager.findFragmentByTag(\"NotePostFailedDialogFragment\") == null) {\n                    val reasonType =\n                        workInfo.outputData.getString(CreateNoteWorker.EXTRA_FAILED_REASON)\n                    NotePostFailedDialogFragment.newInstance(\n                        draftNoteId,\n                        reasonType?.let {\n                            CreateNoteWorker.ErrorReasonType.values().find {\n                                it.name == reasonType\n                            }\n                        } ?: CreateNoteWorker.ErrorReasonType.UnknownError,\n                        workInfo.outputData.getString(CreateNoteWorker.EXTRA_FAILED_STACKTRACE),\n                    ).show(activity.supportFragmentManager, \"NotePostFailedDialogFragment\")\n                }\n                createNoteWorkerExecutor.onHandled(workInfo.id)\n            }\n            WorkInfo.State.BLOCKED -> Unit\n            WorkInfo.State.CANCELLED -> Unit\n        }\n    }\n\n    private fun String.showSnackBar(action: Pair<String, (View) -> Unit>? = null) {\n        val snackBar =\n            Snackbar.make(view, this, Snackbar.LENGTH_LONG)\n        if (action != null) {\n            snackBar.setAction(action.first, action.second)\n        }\n        snackBar.show()\n    }\n\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/NotePostFailedDialogFragment.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.compose.animation.AnimatedVisibility\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.heightIn\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material.Text\nimport androidx.compose.material.TextButton\nimport androidx.compose.material.TextField\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport com.google.android.material.composethemeadapter.MdcTheme\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.worker.note.CreateNoteWorker\nimport net.pantasystem.milktea.worker.note.CreateNoteWorkerExecutor\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass NotePostFailedDialogFragment : AppCompatDialogFragment() {\n\n    companion object {\n        private const val DRAFT_NOTE_ID = \"DRAFT_NOTE_ID\"\n        private const val ERROR_REASON_TYPE = \"ERROR_REASON_TYPE\"\n        private const val STACKTRACE = \"STACKTRACE\"\n\n        fun newInstance(\n            draftNoteId: Long,\n            errorReasonType: CreateNoteWorker.ErrorReasonType,\n            stackTrace: String?,\n        ): NotePostFailedDialogFragment {\n            return NotePostFailedDialogFragment().apply {\n                arguments = Bundle().apply {\n                    putLong(DRAFT_NOTE_ID, draftNoteId)\n                    putString(ERROR_REASON_TYPE, errorReasonType.name)\n                    putString(STACKTRACE, stackTrace)\n                }\n            }\n        }\n    }\n\n\n    @Inject\n    internal lateinit var createNoteWorkerExecutor: CreateNoteWorkerExecutor\n\n    private val draftNoteId: Long by lazy {\n        requireArguments().getLong(DRAFT_NOTE_ID)\n    }\n\n    private val errorReasonType: CreateNoteWorker.ErrorReasonType by lazy {\n        requireArguments().getString(ERROR_REASON_TYPE)?.let { type ->\n            CreateNoteWorker.ErrorReasonType.values().find {\n                it.name == type\n            }\n        } ?: CreateNoteWorker.ErrorReasonType.UnknownError\n    }\n\n    private val stackTrace: String? by lazy {\n        requireArguments().getString(STACKTRACE)\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.note_creation_failure)\n            .setPositiveButton(R.string.retry){ _, _ ->\n                createNoteWorkerExecutor.enqueue(draftNoteId)\n            }\n            .setView(\n                ComposeView(requireContext()).apply {\n                    setContent {\n                        MdcTheme {\n                            var isVisibleDetailMessage by remember { mutableStateOf(false) }\n                            Column(Modifier.padding(horizontal = 16.dp)) {\n                                Text(\n                                    getReasonText(\n                                        errorReasonType = errorReasonType,\n                                        stackTrace = stackTrace\n                                    ),\n                                    Modifier.padding(horizontal = 8.dp, vertical = 8.dp),\n                                    fontWeight = FontWeight.Bold,\n                                )\n                                TextButton(onClick = { isVisibleDetailMessage = !isVisibleDetailMessage }) {\n                                    Text(stringResource(id = R.string.show_error))\n                                }\n                                AnimatedVisibility(\n                                    visible = isVisibleDetailMessage,\n                                ) {\n                                    TextField(\n                                        stackTrace ?: \"Unknown Error\",\n                                        onValueChange = {},\n                                        modifier = Modifier.heightIn(\n                                            min = 100.dp,\n                                            max = 300.dp\n                                        ).verticalScroll(rememberScrollState()),\n                                    )\n                                }\n                            }\n                        }\n                    }\n                }\n            )\n            .setNegativeButton(R.string.cancel) { _, _ ->\n                dismiss()\n            }\n            .create()\n    }\n}\n\n@Composable\nfun getReasonText(errorReasonType: CreateNoteWorker.ErrorReasonType, stackTrace: String?): String {\n    val context = LocalContext.current\n    return when(errorReasonType) {\n        CreateNoteWorker.ErrorReasonType.NetworkError -> context.getString(R.string.network_error)\n        CreateNoteWorker.ErrorReasonType.FileUploadDeviceSecurityError -> \"Device File Security Error\"\n        CreateNoteWorker.ErrorReasonType.FileUploadDriveNoFreeSpaceError -> context.getString(R.string.misskey_role_drive_no_free_space_error_message)\n        CreateNoteWorker.ErrorReasonType.ServerError -> context.getString(R.string.server_error)\n        CreateNoteWorker.ErrorReasonType.ClientError -> context.getString(R.string.parameter_error)\n        CreateNoteWorker.ErrorReasonType.UnauthorizedError -> context.getString(R.string.unauthorized_error)\n        CreateNoteWorker.ErrorReasonType.IAmAiError -> context.getString(R.string.bot_error)\n        CreateNoteWorker.ErrorReasonType.ToManyRequestError -> context.getString(R.string.rate_limit_error)\n        CreateNoteWorker.ErrorReasonType.NotFoundError -> context.getString(R.string.not_found_error)\n        CreateNoteWorker.ErrorReasonType.UnknownError -> stackTrace ?: \"Unknown Error\"\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/SafeSearchDescriptionDialog.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.app.Dialog\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport jp.panta.misskeyandroidclient.ui.main.viewmodel.MainViewModel\nimport net.pantasystem.milktea.common_resource.R\nimport net.pantasystem.milktea.setting.activities.SettingMovementActivity\n\nclass SafeSearchDescriptionDialog : DialogFragment() {\n    companion object {\n        const val TAG = \"SafeSearchDescriptionDialog\"\n    }\n\n    private val preferences by lazy {\n        requireContext().getSharedPreferences(\"safe_search_description_dialog\", Context.MODE_PRIVATE)\n    }\n\n    private val mainViewModel by activityViewModels<MainViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.safe_search_description_dialog_title)\n            .setMessage(R.string.safe_search_description_dialog_message)\n            .setPositiveButton(R.string.safe_search_description_dialog_positive_button) { _, _ ->\n                mainViewModel.onGoToSettingSafeSearchButtonClicked()\n                val intent = Intent(requireContext(), SettingMovementActivity::class.java)\n                intent.putExtra(SettingMovementActivity.EXTRA_HIGHLIGHT_SAFE_SEARCH, true)\n                startActivity(intent)\n                dismiss()\n            }\n            .setNegativeButton(R.string.safe_search_description_dialog_negative_button) { _, _ ->\n                if (preferences.getInt(\"counter\", 0) >= 1) {\n                    mainViewModel.onDoNotShowSafeSearchDescription()\n                }\n                preferences.edit().putInt(\"counter\", preferences.getInt(\"counter\", 0) + 1).apply()\n                // 何もしない\n                dismiss()\n            }\n            .setCancelable(false)\n\n            .create()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/SetSimpleEditor.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.view.View\nimport androidx.fragment.app.FragmentManager\nimport com.google.android.material.floatingactionbutton.FloatingActionButton\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.note.editor.SimpleEditorFragment\n\n\ninternal class SetSimpleEditor(\n    private val fragmentManager: FragmentManager,\n    private val settingStore: SettingStore,\n    private val fab: FloatingActionButton,\n) {\n    operator fun invoke() {\n        val ft = fragmentManager.beginTransaction()\n\n        val editor = fragmentManager.findFragmentByTag(\"simpleEditor\")\n\n        if (settingStore.isSimpleEditorEnabled) {\n            fab.visibility = View.GONE\n            if (editor == null) {\n                ft.replace(R.id.simpleEditorBase, SimpleEditorFragment(), \"simpleEditor\")\n            }\n        } else {\n            fab.visibility = View.VISIBLE\n\n            editor?.let {\n                ft.remove(it)\n            }\n\n        }\n        ft.commit()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/SetUpNavHeader.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport com.google.android.material.navigation.NavigationView\nimport jp.panta.misskeyandroidclient.databinding.NavHeaderMainBinding\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\n\ninternal class SetUpNavHeader(\n    private val navView: NavigationView,\n    private val lifecycleOwner: LifecycleOwner,\n    private val accountViewModel: AccountViewModel\n) {\n\n    operator fun invoke() {\n        DataBindingUtil.bind<NavHeaderMainBinding>(this.navView.getHeaderView(0))\n        val headerBinding =\n            DataBindingUtil.getBinding<NavHeaderMainBinding>(this.navView.getHeaderView(0))\n        headerBinding?.lifecycleOwner = lifecycleOwner\n        headerBinding?.accountViewModel = accountViewModel\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/SetupOnBackPressedDispatcherHandler.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport androidx.activity.addCallback\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.GravityCompat\nimport androidx.drawerlayout.widget.DrawerLayout\nimport androidx.navigation.findNavController\nimport jp.panta.misskeyandroidclient.R\nimport jp.panta.misskeyandroidclient.databinding.ActivityMainBinding\n\nclass SetupOnBackPressedDispatcherHandler(\n    private val activity: AppCompatActivity,\n    private val binding: ActivityMainBinding,\n) {\n\n    @Suppress(\"RestrictedApi\")\n    fun setup() {\n        activity.onBackPressedDispatcher.addCallback {\n            val drawerLayout: DrawerLayout = binding.drawerLayout\n            val navController = binding.appBarMain.contentMain.contentMain.findNavController()\n            when {\n                drawerLayout.isDrawerOpen(GravityCompat.START) -> {\n                    drawerLayout.closeDrawer(GravityCompat.START)\n                }\n                // NOTE: そのままpopBackStackしてしまうとcurrentDestinationがNullになってしまいクラッシュしてしまう。\n                // NOTE: backQueue == 2の時は初めのDestinationを表示している状態になっている\n                // NOTE: backQueueには初期状態の時点で２つ以上入っている\n                //  destinations stack\n                //    |  fragment  |\n                //    | navigation |\n                //    |------------|\n                // 参考: https://qiita.com/kaleidot725/items/a6010dc4e67c944f44f1\n\n                navController.currentBackStack.value.filterNot { it.destination.id == R.id.main_nav }.size > 1 -> {\n                    navController.popBackStack()\n                }\n                else -> {\n                    remove()\n                    activity.onBackPressedDispatcher.onBackPressed()\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/ShowBottomNavigationBadgeDelegate.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport com.google.android.material.bottomnavigation.BottomNavigationView\nimport jp.panta.misskeyandroidclient.R\nimport jp.panta.misskeyandroidclient.ui.main.viewmodel.MainUiState\n\n\ninternal class ShowBottomNavigationBadgeDelegate(\n    private val bottomNavigationView: BottomNavigationView\n) {\n    operator fun invoke(state: MainUiState) {\n        if (state.unreadNotificationCount <= 0) {\n            bottomNavigationView.getBadge(R.id.navigation_notification)\n                ?.clearNumber()\n        }\n        if (state.unreadMessagesCount <= 0) {\n            bottomNavigationView.getBadge(R.id.navigation_message_list)?.clearNumber()\n        }\n        bottomNavigationView.getOrCreateBadge(R.id.navigation_notification)\n            .apply {\n                isVisible = state.unreadNotificationCount > 0\n                number = state.unreadNotificationCount\n            }\n        bottomNavigationView.getOrCreateBadge(R.id.navigation_message_list).apply {\n            isVisible = state.unreadMessagesCount > 0\n            number = state.unreadMessagesCount\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/ShowRequestSchedulePostResultSnackBar.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.app.Activity\nimport android.view.View\nimport com.google.android.material.snackbar.Snackbar\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.model.note.draft.DraftNoteSavedEvent\n\nclass ShowRequestSchedulePostResultSnackBar(\n    private val activity: Activity,\n    private val view: View\n) {\n\n    operator fun invoke(event: DraftNoteSavedEvent) {\n        when (event) {\n            is DraftNoteSavedEvent.Failed -> Unit\n            is DraftNoteSavedEvent.Success -> {\n                if (event.draftNote.reservationPostingAt != null) {\n                    Snackbar.make(\n                        view,\n                        activity.getString(R.string.successfully_created_schedule_note),\n                        Snackbar.LENGTH_LONG\n                    ).show()\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/ToggleNavigationDrawerDelegate.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main\n\nimport android.app.Activity\nimport androidx.annotation.MainThread\nimport androidx.appcompat.app.ActionBarDrawerToggle\nimport androidx.appcompat.widget.Toolbar\nimport androidx.drawerlayout.widget.DrawerLayout\nimport jp.panta.misskeyandroidclient.R\n\nclass ToggleNavigationDrawerDelegate(\n    private val activity: Activity,\n    private val drawerLayout: DrawerLayout\n) {\n    private var toggle: ActionBarDrawerToggle? = null\n\n    @MainThread\n    fun updateToolbar(toolbar: Toolbar) {\n        if (toggle != null) {\n            drawerLayout.removeDrawerListener(toggle!!)\n        }\n        toggle = ActionBarDrawerToggle(\n            activity,\n            drawerLayout,\n            toolbar,\n            R.string.navigation_drawer_open,\n            R.string.navigation_drawer_close\n        )\n        toggle!!.syncState()\n    }\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/main/viewmodel/MainViewModel.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.main.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport com.google.firebase.crashlytics.FirebaseCrashlytics\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport jp.panta.misskeyandroidclient.BuildConfig\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountState\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.emoji.EmojiEventHandler\nimport net.pantasystem.milktea.model.messaging.UnReadMessages\nimport net.pantasystem.milktea.model.notification.NotificationRepository\nimport net.pantasystem.milktea.model.notification.NotificationStreaming\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MainViewModel @Inject constructor(\n    val accountStore: AccountStore,\n    unreadMessages: UnReadMessages,\n    loggerFactory: Logger.Factory,\n    private val notificationRepository: NotificationRepository,\n    private val configRepository: LocalConfigRepository,\n    private val emojiEventHandler: EmojiEventHandler,\n    private val notificationStreaming: NotificationStreaming,\n    settingStore: SettingStore\n) : ViewModel() {\n    val logger by lazy {\n        loggerFactory.create(\"MainViewModel\")\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val unreadMessageCount = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest {\n        unreadMessages.findByAccountId(it.accountId)\n    }.map {\n        it.size\n    }.flowOn(Dispatchers.IO).catch { e ->\n        logger.error(\"メッセージ既読数取得エラー\", e = e)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, 0)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val unreadNotificationCount = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest {\n        notificationRepository.countUnreadNotification(it.accountId)\n    }.flowOn(Dispatchers.IO).catch { e ->\n        logger.error(\"通知既読数取得エラー\", e = e)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, 0)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val newNotifications = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest { ac ->\n        notificationStreaming.connect { ac }\n    }.flowOn(Dispatchers.IO).catch { e ->\n        logger.error(\"通知取得エラー\", e = e)\n    }.shareIn(viewModelScope, SharingStarted.WhileSubscribed())\n\n    val isShowFirebaseCrashlytics = settingStore.configState.map {\n        it.isCrashlyticsCollectionEnabled\n    }.map {\n        !(it.isEnable || it.isConfirmed)\n    }.distinctUntilChanged().shareIn(viewModelScope, SharingStarted.Lazily)\n\n    val isShowEnableSafeSearchDescription = settingStore.configState.map {\n        it.isEnableSafeSearch\n    }.map {\n        !it.isConfirmed && !it.isEnabled\n    }.distinctUntilChanged().shareIn(viewModelScope, SharingStarted.Lazily)\n\n    val isShowGoogleAnalyticsDialog = settingStore.configState.map { config ->\n        !(config.isAnalyticsCollectionEnabled.isEnabled\n                || config.isAnalyticsCollectionEnabled.isConfirmed)\n                && config.isCrashlyticsCollectionEnabled.isConfirmed\n    }.distinctUntilChanged().shareIn(viewModelScope, SharingStarted.Lazily)\n\n    val isRequestPushNotificationPermission = settingStore.configState.map { config ->\n        !config.isConfirmedPostNotification\n    }.distinctUntilChanged().shareIn(viewModelScope, SharingStarted.WhileSubscribed())\n\n\n\n    val state: StateFlow<MainUiState> = combine(\n        unreadNotificationCount,\n        unreadMessageCount,\n    ) { unc, umc->\n        MainUiState(unc, umc)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, MainUiState())\n\n    private val shouldWaitForAuthentication = MutableStateFlow(false)\n    val accountState = combine(accountStore.state, shouldWaitForAuthentication) { state, waitAuth ->\n        MainAccountState(state, waitAuth)\n    }\n\n    init {\n        viewModelScope.launch {\n            accountStore.observeCurrentAccount.collect(emojiEventHandler::observe)\n        }\n    }\n\n    fun setCrashlyticsCollectionEnabled(enabled: Boolean) {\n        viewModelScope.launch {\n            configRepository.save(\n                configRepository.get().getOrThrow().setCrashlyticsCollectionEnabled(enabled)\n            ).getOrThrow()\n        }\n    }\n\n    fun setAnalyticsCollectionEnabled(enabled: Boolean) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                configRepository.save(\n                    configRepository.get().getOrThrow().setAnalyticsCollectionEnabled(enabled)\n                ).getOrThrow()\n            }.onFailure {\n                FirebaseCrashlytics.getInstance().recordException(it)\n            }\n        }\n    }\n\n\n    fun onPushNotificationConfirmed() {\n        viewModelScope.launch {\n            configRepository.get().flatMapCancellableCatching{\n                configRepository.save(it.copy(isConfirmedPostNotification = true))\n            }.onFailure {\n                logger.error(\"設定状態の保存に失敗\", it)\n            }\n\n        }\n    }\n\n    fun onDoNotShowSafeSearchDescription() {\n        viewModelScope.launch {\n            configRepository.get().mapCancellableCatching {\n                configRepository.save(it.copy(isEnableSafeSearch = it.isEnableSafeSearch.copy(isConfirmed = true)))\n            }.onFailure {\n                logger.error(\"設定状態の保存に失敗\", it)\n            }\n        }\n    }\n\n    fun onGoToSettingSafeSearchButtonClicked() {\n        viewModelScope.launch {\n            configRepository.get().mapCancellableCatching {\n                configRepository.save(it.copy(isEnableSafeSearch = it.isEnableSafeSearch.copy(isConfirmed = true)))\n            }.onFailure {\n                logger.error(\"設定状態の保存に失敗\", it)\n            }\n        }\n    }\n\n    fun setShouldWaitForAuthentication(value: Boolean) {\n        shouldWaitForAuthentication.value = value\n    }\n}\n\ndata class MainUiState (\n    val unreadNotificationCount: Int = 0,\n    val unreadMessagesCount: Int = 0,\n)\n\n/**\n * @param shouldWaitForAuthentication 任意の処理が終わるまで、認証画面に遷移するのを待つためのフラグ。\n */\ndata class MainAccountState(\n    val state: AccountState,\n    val shouldWaitForAuthentication: Boolean = false,\n) {\n    // shouldWaitForAuthenticationはデバッグ時・ベンチマーク時の裏技機能なので本番環境では有効化できない\n    init {\n        require(!shouldWaitForAuthentication || BuildConfig.BUILD_TYPE == \"benchmark\" || BuildConfig.BUILD_TYPE == \"debug\") {\n            \"shouldWaitForAuthenticationはデバッグ・ベンチマークモード以外の時は有効にすることができません\"\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/strings_helper/web_socket_error.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.strings_helper\n\nimport android.content.Context\nimport android.widget.Toast\nimport jp.panta.misskeyandroidclient.R\nimport net.pantasystem.milktea.api_streaming.Socket\n\n\nfun Context.webSocketStateMessageScope(block: WebSocketStateMessageScope.()->Unit) {\n    block.invoke(WebSocketStateMessageScope(this))\n}\n\nclass WebSocketStateMessageScope(val context: Context) {\n    fun Socket.State.showToastMessage() {\n        val message = getStateMessage()\n        Toast.makeText(context, message, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun Socket.State.getStateMessage(): String {\n        return  when(this){\n            is Socket.State.Connected -> context.getString(R.string.connected)\n            is Socket.State.Connecting -> if (this.isReconnect) {\n                context.getString(R.string.connecting)\n            } else {\n                context.getString(R.string.connecting)\n            }\n            is Socket.State.Closing -> context.getString(R.string.closing)\n            is Socket.State.Failure -> context.getString(R.string.websocket_error) + this.throwable\n            is Socket.State.Closed -> context.getString(R.string.closed)\n            is Socket.State.NeverConnected -> \"\"\n        }\n    }\n}\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/tab/TabFragment.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.tab\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.MenuHost\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.tabs.TabLayout\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport jp.panta.misskeyandroidclient.R\nimport jp.panta.misskeyandroidclient.databinding.FragmentTabBinding\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.AvatarIconView.Companion.setShape\nimport net.pantasystem.milktea.common.ui.ToolbarSetter\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageType\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.setting.activities.PageSettingActivity\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass TabFragment : Fragment(R.layout.fragment_tab) {\n\n    companion object {\n        private const val PAGES = \"pages\"\n    }\n\n\n    private lateinit var mPagerAdapter: TimelinePagerAdapter\n\n    private val binding: FragmentTabBinding by dataBinding()\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    lateinit var loggerFactory: Logger.Factory\n\n    @Inject\n    lateinit var applyMenuTint: ApplyMenuTint\n\n    private val currentPageViewModel by activityViewModels<CurrentPageableTimelineViewModel>()\n\n    private val mTabViewModel by viewModels<TabViewModel>()\n\n    private var mPages: List<Page>? = null\n\n    @Suppress(\"DEPRECATION\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        if (savedInstanceState != null) {\n            mPages = savedInstanceState.getParcelableArrayList(PAGES)\n        }\n\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        mPagerAdapter = TimelinePagerAdapter(\n            this.childFragmentManager,\n            pageableFragmentFactory,\n            mPages ?: emptyList(),\n            loggerFactory,\n        )\n\n        return super.onCreateView(inflater, container, savedInstanceState)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n\n        binding.viewPager.adapter = mPagerAdapter\n        binding.tabLayout.setupWithViewPager(binding.viewPager)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                mTabViewModel.pages.collect { pages ->\n                    requireActivity().reportFullyDrawn()\n                    mPages = pages\n                    mPagerAdapter.setList(\n                        pages.sortedBy {\n                            it.weight\n                        })\n\n                    if (pages.size <= 1) {\n                        binding.tabLayout.visibility = View.GONE\n                        binding.elevationView.visibility = View.VISIBLE\n                    } else {\n                        binding.tabLayout.visibility = View.VISIBLE\n                        binding.elevationView.visibility = View.GONE\n                        binding.tabLayout.tabMode = if (pages.size > 5) {\n                            TabLayout.MODE_SCROLLABLE\n                        } else {\n                            TabLayout.MODE_FIXED\n                        }\n                    }\n                }\n            }\n        }\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                mTabViewModel.currentUser.filterNotNull().collect {\n                    binding.currentAccountView.setImageUrl(it.avatarUrl)\n                }\n            }\n        }\n\n        mTabViewModel.visibleInstanceInfo.onEach {\n            when(it) {\n                CurrentAccountInstanceInfoUrl.Invisible -> {\n                    binding.currentInstanceHostView.visibility = View.GONE\n                }\n                is CurrentAccountInstanceInfoUrl.Visible -> {\n                    binding.currentInstanceHostView.visibility = View.VISIBLE\n                    binding.currentInstanceHostView.text = it.host\n                }\n            }\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        mTabViewModel.avatarIconShapeType.onEach {\n            binding.currentAccountView.setShape(it.value)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        currentPageViewModel.currentType.onEach {\n            (requireActivity() as MenuHost).invalidateMenu()\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        (requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {\n            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n                menuInflater.inflate(R.menu.tab_pager_menu, menu)\n                val currentPageId = when(val type = currentPageViewModel.currentType.value) {\n                    CurrentPageType.Account -> null\n                    is CurrentPageType.Page -> type.pageId\n                }\n                menu.findItem(R.id.edit_tab).isVisible = currentPageId != null\n                applyMenuTint(requireActivity(), menu)\n            }\n\n            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n                return when (menuItem.itemId) {\n                    R.id.edit_tab -> {\n                        when(val type = currentPageViewModel.currentType.value) {\n                            CurrentPageType.Account -> return false\n                            is CurrentPageType.Page -> {\n                                val intent =  Intent(requireContext(), PageSettingActivity::class.java).apply {\n                                    putExtra(PageSettingActivity.EXTRA_EDIT_TAB_ID, type.pageId)\n                                }\n                                startActivity(intent)\n                            }\n                        }\n                        true\n                    }\n                    else -> false\n                }\n            }\n        }, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n    }\n\n    override fun onSaveInstanceState(outState: Bundle) {\n        super.onSaveInstanceState(outState)\n\n        if (mPages != null) {\n            outState.putParcelableArrayList(PAGES, ArrayList(mPages!!))\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n        (requireActivity() as? ToolbarSetter?)?.apply {\n            setToolbar(binding.toolbar)\n            setTitle(R.string.menu_home)\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        mPagerAdapter.onDestroy()\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/tab/TabViewModel.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.tab\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass TabViewModel @Inject constructor(\n    val accountStore: AccountStore,\n    private val userRepository: UserRepository,\n    private val configRepository: LocalConfigRepository,\n    loggerFactory: Logger.Factory,\n): ViewModel() {\n\n    private val logger by lazy {\n        loggerFactory.create(\"TabViewModel\")\n    }\n\n    val pages = accountStore.observeCurrentAccount.map {\n        it?.pages ?: emptyList()\n    }.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val currentUser = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest {\n        userRepository.observe(User.Id(it.accountId, it.remoteId))\n    }.flowOn(Dispatchers.IO).stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val visibleInstanceInfo = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest { account ->\n        configRepository.observe().map {\n            if (it.isVisibleInstanceUrlInToolbar) {\n                CurrentAccountInstanceInfoUrl.Visible(account.getHost())\n            } else {\n                CurrentAccountInstanceInfoUrl.Invisible\n            }\n        }\n    }.catch {\n        logger.error(\"observe account, config error\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), CurrentAccountInstanceInfoUrl.Visible(\"\"))\n\n    val avatarIconShapeType = configRepository.observe().map {\n        it.avatarIconShapeType\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), DefaultConfig.config.avatarIconShapeType)\n}\n\nsealed interface CurrentAccountInstanceInfoUrl {\n    data object Invisible : CurrentAccountInstanceInfoUrl\n    data class Visible(val host: String) : CurrentAccountInstanceInfoUrl\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/ui/tab/TimelinePagerAdapter.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\npackage jp.panta.misskeyandroidclient.ui.tab\n\nimport android.os.Bundle\nimport android.os.Parcelable\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentStatePagerAdapter\nimport androidx.viewpager.widget.PagerAdapter\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.model.account.page.Page\nimport java.util.UUID\n\n\ninternal class TimelinePagerAdapter(\n    fragmentManager: FragmentManager,\n    private val pageableFragmentFactory: PageableFragmentFactory,\n    list: List<Page>,\n    loggerFactory: Logger.Factory\n) : FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n\n    private val logger by lazy {\n        loggerFactory.create(\"TimelinePagerAdapter\")\n    }\n\n    companion object {\n        const val FRAGMENT_TAG = \"TimelinePagerAdapter.FRAGMENT_TAG\"\n    }\n\n    private var requestBaseList: List<Page> = list\n    private var oldRequestBaseSetting = requestBaseList\n\n    private val fragmentIds = mutableSetOf<String>()\n\n    override fun getCount(): Int {\n        return requestBaseList.size\n    }\n\n    override fun getItem(position: Int): Fragment {\n        val item = requestBaseList[position]\n        val fragment = pageableFragmentFactory.create(item)\n        val fragmentId = UUID.randomUUID().toString()\n        when(val args = fragment.arguments) {\n            null -> {\n                val bundle = Bundle()\n                bundle.putString(FRAGMENT_TAG, fragmentId)\n                fragment.arguments = bundle\n            }\n            else -> {\n                args.putString(FRAGMENT_TAG, fragmentId)\n            }\n        }\n        fragmentIds.add(fragmentId)\n//        mFragments.add(fragment)\n        return fragment\n    }\n\n\n    override fun getPageTitle(position: Int): String {\n        val page = requestBaseList[position]\n        return page.title\n    }\n\n\n    override fun getItemPosition(any: Any): Int {\n        val target = any as Fragment\n        val fragmentId = target.arguments?.getString(FRAGMENT_TAG)\n        if (fragmentId != null && fragmentIds.contains(fragmentId)) {\n            return PagerAdapter.POSITION_UNCHANGED\n        }\n\n        return PagerAdapter.POSITION_NONE\n    }\n\n    override fun restoreState(state: Parcelable?, loader: ClassLoader?) {\n        logger.log(\"restoreState\")\n        try {\n            super.restoreState(state, loader)\n        } catch (e: Exception) {\n            logger.error(\"restoreState error\", e)\n            e.printStackTrace()\n        }\n    }\n\n    fun setList(list: List<Page>) {\n        oldRequestBaseSetting = requestBaseList\n        requestBaseList = list\n        fragmentIds.clear()\n        if (requestBaseList != oldRequestBaseSetting) {\n            notifyDataSetChanged()\n        }\n    }\n\n    fun onDestroy() {\n        fragmentIds.clear()\n    }\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/util/DebuggerSetupManager.kt",
    "content": "package jp.panta.misskeyandroidclient.util\n\nimport android.content.Context\n\ninterface DebuggerSetupManager {\n    fun setup(context: Context)\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/util/DoubleBackPressedFinishDelegate.kt",
    "content": "package jp.panta.misskeyandroidclient.util\n\nimport android.os.Handler\nimport android.os.Looper\nimport java.util.concurrent.atomic.AtomicInteger\n\nclass DoubleBackPressedFinishDelegate {\n\n    private val mHandler = Handler(Looper.getMainLooper())\n\n    private var mCounter = 0\n\n\n    fun back(): Boolean{\n        return if(++mCounter >= 2){\n            true\n        }else{\n            mHandler.removeCallbacks(mCounterTimeReset)\n            mHandler.postDelayed(mCounterTimeReset, 2000)\n            false\n        }\n    }\n\n    private val mCounterTimeReset = Runnable { mCounter = 0 }\n\n\n}"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/util/task/task_coroutines_util.kt",
    "content": "package jp.panta.misskeyandroidclient.util.task\n\nimport com.google.android.gms.tasks.Task\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\n"
  },
  {
    "path": "app/src/main/java/jp/panta/misskeyandroidclient/worker/WorkerJobInitializer.kt",
    "content": "package jp.panta.misskeyandroidclient.worker\n\nimport android.content.Context\nimport androidx.work.ExistingPeriodicWorkPolicy\nimport androidx.work.WorkManager\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport net.pantasystem.milktea.worker.SyncAccountInfoWorker\nimport net.pantasystem.milktea.worker.SyncNodeInfoCacheWorker\nimport net.pantasystem.milktea.worker.drive.CleanupUnusedCacheWorker\nimport net.pantasystem.milktea.worker.emoji.cache.CacheCustomEmojiImageWorker\nimport net.pantasystem.milktea.worker.filter.SyncMastodonFilterWorker\nimport net.pantasystem.milktea.worker.meta.SyncMetaWorker\nimport net.pantasystem.milktea.worker.note.BackgroundSyncTimelineWorker\nimport net.pantasystem.milktea.worker.note.SyncTimelineWorker\nimport net.pantasystem.milktea.worker.sw.RegisterAllSubscriptionRegistration\nimport net.pantasystem.milktea.worker.user.SyncLoggedInUserInfoWorker\nimport net.pantasystem.milktea.worker.user.renote.mute.SyncRenoteMutesWorker\nimport javax.inject.Inject\n\nclass WorkerJobInitializer @Inject constructor(\n    @ApplicationContext private val context: Context\n) {\n\n    operator fun invoke() {\n        WorkManager.getInstance(context).apply {\n            enqueue(RegisterAllSubscriptionRegistration.createWorkRequest())\n            enqueue(CleanupUnusedCacheWorker.createOneTimeRequest())\n            enqueueUniquePeriodicWork(\n                \"syncMeta\",\n                ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,\n                SyncMetaWorker.createPeriodicWorkRequest()\n            )\n            enqueueUniquePeriodicWork(\n                \"syncNodeInfos\",\n                ExistingPeriodicWorkPolicy.UPDATE,\n                SyncNodeInfoCacheWorker.createPeriodicWorkRequest()\n            )\n            enqueueUniquePeriodicWork(\n                \"syncLoggedInUsers\",\n                ExistingPeriodicWorkPolicy.UPDATE,\n                SyncLoggedInUserInfoWorker.createPeriodicWorkRequest(),\n            )\n            enqueueUniquePeriodicWork(\n                \"syncAccountInfo\",\n                ExistingPeriodicWorkPolicy.UPDATE,\n                SyncAccountInfoWorker.createPeriodicWorkRequest(),\n            )\n\n            enqueueUniquePeriodicWork(\n                \"syncMastodonWordFilter\",\n                ExistingPeriodicWorkPolicy.UPDATE,\n                SyncMastodonFilterWorker.createPeriodicWorkerRequest(),\n            )\n            enqueueUniquePeriodicWork(\n                CacheCustomEmojiImageWorker.WORKER_NAME,\n                ExistingPeriodicWorkPolicy.KEEP,\n                CacheCustomEmojiImageWorker.createPeriodicWorkRequest(),\n            )\n\n            enqueue(\n                SyncTimelineWorker.createOneTimeWorkRequest()\n            )\n            enqueue(\n                SyncRenoteMutesWorker.createOneTimeWorkRequest()\n            )\n\n            enqueueUniquePeriodicWork(\n                BackgroundSyncTimelineWorker.WORKER_NAME,\n                ExistingPeriodicWorkPolicy.UPDATE,\n                BackgroundSyncTimelineWorker.createPeriodicWorkRequest(),\n            )\n\n        }\n\n    }\n}"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <androidx.drawerlayout.widget.DrawerLayout\n\n            android:id=\"@+id/drawer_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:openDrawer=\"start\">\n\n    <include\n            android:id=\"@+id/appBarMain\"\n            layout=\"@layout/app_bar_main\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n\n    <com.google.android.material.navigation.NavigationView\n            android:id=\"@+id/nav_view\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"start\"\n            android:fitsSystemWindows=\"true\"\n            app:headerLayout=\"@layout/nav_header_main\"\n            app:menu=\"@menu/activity_main_drawer\"/>\n    </androidx.drawerlayout.widget.DrawerLayout>\n\n</layout>\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/app_bar_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <FrameLayout\n\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\".MainActivity\"\n            android:id=\"@+id/app_bar_base\">\n\n\n        <include\n                android:id=\"@+id/contentMain\"\n                layout=\"@layout/content_main\"\n        />\n\n\n\n\n\n\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"bottom\"\n                android:orientation=\"vertical\">\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"horizontal\">\n                <androidx.coordinatorlayout.widget.CoordinatorLayout\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"bottom\"\n                        android:layout_marginStart=\"8dp\"\n                        android:layout_marginBottom=\"16dp\"\n                        android:id=\"@+id/simple_notification\"\n                        android:layout_marginEnd=\"8dp\"\n                        android:layout_weight=\"1\"/>\n                <com.google.android.material.floatingactionbutton.FloatingActionButton\n                        android:id=\"@+id/fab\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"bottom|end\"\n                        android:layout_marginEnd=\"16dp\"\n                        android:layout_marginBottom=\"16dp\"\n                        app:srcCompat=\"@drawable/ic_mode_edit_black_24dp\"\n                        android:contentDescription=\"@string/edit_note\"/>\n            </LinearLayout>\n            <FrameLayout\n                    android:id=\"@+id/simpleEditorBase\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    />\n\n            <com.google.android.material.bottomnavigation.BottomNavigationView\n                    android:id=\"@+id/bottom_navigation\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"bottom\"\n                    app:labelVisibilityMode=\"unlabeled\"\n                    app:menu=\"@menu/bottom_menu\"\n                    app:itemIconSize=\"28dp\"\n                    app:itemIconTint=\"@drawable/bottom_navigation_colors\"\n                    app:itemTextColor=\"@drawable/bottom_navigation_colors\"\n                    >\n\n\n            </com.google.android.material.bottomnavigation.BottomNavigationView>\n        </LinearLayout>\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/content_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <FrameLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:showIn=\"@layout/app_bar_main\"\n            tools:context=\".MainActivity\">\n\n        <ImageView\n                android:id=\"@+id/backgroundImage\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                android:scaleType=\"centerCrop\"\n                tools:ignore=\"ContentDescription\" />\n        <androidx.fragment.app.FragmentContainerView\n                android:id=\"@+id/contentMain\"\n                android:name=\"androidx.navigation.fragment.NavHostFragment\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_constraintLeft_toLeftOf=\"parent\"\n                app:layout_constraintRight_toRightOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n\n                app:defaultNavHost=\"true\"\n                app:navGraph=\"@navigation/main_nav\" />\n\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_tab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n        <com.google.android.material.appbar.AppBarLayout\n                android:fitsSystemWindows=\"true\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:stateListAnimator=\"@null\"\n                android:id=\"@+id/appBar\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                >\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    app:layout_scrollFlags=\"scroll|enterAlways\"\n                    android:elevation=\"0dp\"\n\n                    >\n                <net.pantasystem.milktea.common.ui.AvatarIconView\n                        android:id=\"@+id/currentAccountView\"\n                        android:layout_width=\"20dp\"\n                        android:layout_height=\"20dp\"\n                        android:layout_marginStart=\"6dp\"\n                        tools:ignore=\"ContentDescription\"\n                        android:layout_gravity=\"center_vertical\"\n                        app:iconShape=\"circle\"\n                        android:scaleType=\"centerCrop\"\n\n                    />\n                <Space\n                        android:layout_width=\"4dp\"\n                        android:layout_height=\"wrap_content\" />\n                <TextView\n                        android:id=\"@+id/currentInstanceHostView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:maxLines=\"1\"\n                        android:ellipsize=\"end\"\n                        android:textSize=\"14sp\"\n                        />\n            </androidx.appcompat.widget.Toolbar>\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"vertical\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n\n\n            <com.google.android.material.tabs.TabLayout\n                    android:id=\"@+id/tabLayout\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    android:layout_width=\"match_parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\" app:layout_constraintStart_toStartOf=\"parent\"\n                    app:tabMaxWidth=\"0dp\"\n                    app:tabMode=\"fixed\"\n                    app:tabGravity=\"fill\"\n                    />\n            <View\n                    android:id=\"@+id/elevationView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"1dp\"\n\n                    android:background=\"?attr/colorPrimary\"\n                    android:elevation=\"4dp\"\n                    android:visibility=\"visible\"\n                    />\n            <androidx.viewpager.widget.ViewPager\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\" app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/tabLayout\" android:id=\"@+id/viewPager\"/>\n        </LinearLayout>\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "app/src/main/res/layout/nav_header_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n\n        <variable\n                name=\"accountViewModel\"\n                type=\"net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\" />\n    </data>\n    <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"176dp\"\n            android:background=\"@android:color/black\">\n        <ImageView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                headerImageUrl=\"@{accountViewModel.user.info.bannerUrl}\"\n                tools:ignore=\"ContentDescription\" />\n        <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"@dimen/nav_header_height\"\n                android:paddingBottom=\"@dimen/activity_vertical_margin\"\n                android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n                android:paddingRight=\"@dimen/activity_horizontal_margin\"\n                android:paddingTop=\"@dimen/activity_vertical_margin\"\n                android:theme=\"@style/ThemeOverlay.AppCompat.Dark\"\n                app:user=\"@{accountViewModel.user}\"\n                app:mainNameView=\"@{mainName}\"\n                app:subNameView=\"@{subName}\"\n                app:account=\"@{accountViewModel.uiState.currentAccount}\"\n\n                >\n\n\n            <net.pantasystem.milktea.common.ui.AvatarIconView\n                    android:layout_width=\"60dp\"\n                    android:layout_height=\"60dp\"\n                    tools:srcCompat=\"@mipmap/ic_launcher_round\"\n                    android:id=\"@+id/imageView\"\n                    app:imageUrl=\"@{accountViewModel.user.avatarUrl}\"\n                    android:layout_gravity=\"start\"\n                    android:paddingTop=\"@dimen/nav_header_vertical_spacing\"\n                    android:layout_marginTop=\"20dp\"\n                    android:scaleType=\"centerCrop\"\n                    android:onClick=\"@{()-> accountViewModel.showProfile(accountViewModel.currentAccount)}\"\n                    app:iconShape=\"@{accountViewModel.config.avatarIconShapeType.value}\"\n                    tools:ignore=\"ContentDescription\" />\n\n            <ImageButton\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_alignParentEnd=\"true\"\n                    android:layout_marginTop=\"30dp\"\n                    app:srcCompat=\"@drawable/ic_menu_black_24dp\"\n                    android:onClick=\"@{() -> accountViewModel.showSwitchDialog() }\"\n                    tools:ignore=\"ContentDescription\" />\n\n\n            <TextView\n                    android:id=\"@+id/mainName\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/imageView\"\n                    android:textAppearance=\"@style/TextAppearance.AppCompat.Body1\"\n                    tools:text=\"mainName\"\n                    />\n\n            <TextView\n                    android:id=\"@+id/subName\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/mainName\"\n                    android:layout_marginTop=\"1dp\"\n\n                    tools:text=\"name\" />\n\n            <TextView\n                    android:id=\"@+id/following_count\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/subName\"\n                    tools:text=\"114\"\n                    android:text=\"@{ Integer.toString(accountViewModel.user.info.followingCount) }\"\n                    android:layout_marginEnd=\"3dp\"\n                    android:onClick=\"@{()-> accountViewModel.showFollowings(accountViewModel.user.id) }\"\n                    />\n\n            <TextView\n                    android:id=\"@+id/following\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_toEndOf=\"@id/following_count\"\n                    android:text=\"@string/following\"\n                    android:layout_below=\"@id/subName\"\n\n                    android:layout_marginEnd=\"12dp\"\n                    android:onClick=\"@{()-> accountViewModel.showFollowings(accountViewModel.user.id) }\"\n                    />\n            <TextView\n                    android:id=\"@+id/follower_count\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/subName\"\n                    android:layout_toEndOf=\"@id/following\"\n                    tools:text=\"514\"\n                    android:layout_marginEnd=\"3dp\"\n                    android:text=\"@{ Integer.toString(accountViewModel.user.info.followersCount) }\"\n                    android:onClick=\"@{()-> accountViewModel.showFollowers(accountViewModel.user.id) }\"\n                    />\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_toEndOf=\"@id/follower_count\"\n                    android:layout_below=\"@id/subName\"\n                    android:text=\"@string/follower\"\n                    android:onClick=\"@{()-> accountViewModel.showFollowers(accountViewModel.user.id) }\"\n                    />\n\n        </RelativeLayout>\n\n    </FrameLayout>\n</layout>\n\n"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/navigation/main_nav.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<navigation xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/main_nav\"\n        app:startDestination=\"@id/navigation_home\">\n\n    <fragment\n            android:id=\"@+id/navigation_home\"\n            android:name=\"jp.panta.misskeyandroidclient.ui.tab.TabFragment\"\n            android:label=\"@string/menu_home\" />\n    <fragment\n            android:id=\"@+id/navigation_notification\"\n            android:name=\"net.pantasystem.milktea.notification.NotificationMentionFragment\"\n            android:label=\"@string/notification\" />\n    <fragment\n            android:id=\"@+id/navigation_search\"\n            android:name=\"net.pantasystem.milktea.search.SearchTopFragment\"\n            android:label=\"@string/search\" />\n    <fragment\n            android:id=\"@+id/navigation_message_list\"\n            android:name=\"net.pantasystem.milktea.account.AccountTabFragment\"\n            android:label=\"@string/account\" />\n\n\n</navigation>"
  },
  {
    "path": "app/src/main/res/values/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"reaction_choices_columns\">6</integer>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-v21/styles.xml",
    "content": "<resources>\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v23/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n\n</resources>"
  },
  {
    "path": "app/src/main/res/values-v23/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"AppTheme\" parent=\"Theme.Material3.Light.NoActionBar\">\n\n        <item name=\"colorPrimary\">#3F51B5</item>\n        <item name=\"colorSecondary\">#575DAE</item>\n\n        <item name=\"actionBarSize\">53dp</item>\n\n        <item name=\"colorNormalReactionCounterBackground\">@color/colorNormalReaction</item>\n        <item name=\"colorSelectedReactionCounterBackground\">#808EDD</item>\n        <item name=\"colorBottomNavigationSelected\">@color/colorItemSelected</item>\n        <item name=\"colorBottomNavigationNotSelect\">@color/colorItemNotSelected</item>\n\n        <item name=\"normalIconTint\">@color/colorItemNotSelected</item>\n        <item name=\"colorMessageSelf\">#808EDD</item>\n        <item name=\"colorMessageRecipient\">@color/colorMessageRecipient</item>\n\n        <item name=\"colorSeparator\">@color/colorSeparator</item>\n\n        <item name=\"textInputStyle\">@style/TextInputLayoutStyle</item>\n\n        <item name=\"colorDotTabSelected\">#575DAE</item>\n        <item name=\"colorDotTabNormal\">@color/colorItemNotSelected</item>\n\n        <item name=\"emojiPickerRippleColor\">#5C000000</item>\n    </style>\n\n    <style name=\"AppThemeDark\" parent=\"Theme.Material3.DayNight.NoActionBar\">\n\n        <item name=\"colorPrimary\">#9FA8DA</item>\n        <item name=\"colorSecondary\">#6D7FE1</item>\n\n        <item name=\"android:windowBackground\">@color/colorDarkWindowBackground</item>\n\n        <item name=\"colorSurface\">#1E1E1E</item>\n        <item name=\"colorSurfaceContainer\">#1E1E1E</item>\n\n        <item name=\"bottomNavigationStyle\">@style/BottomNavigationView4Dark</item>\n\n        <item name=\"normalIconTint\">@color/colorDarkTextColor</item>\n        <item name=\"actionBarSize\">53dp</item>\n\n        <item name=\"colorNormalReactionCounterBackground\">#3A3A3A</item>\n        <item name=\"colorSelectedReactionCounterBackground\">#3F51B5</item>\n\n        <item name=\"colorMessageSelf\">@color/colorMessageSelfDark</item>\n        <item name=\"colorMessageRecipient\">@color/colorMessageRecipientDark</item>\n        <item name=\"colorSeparator\">@color/colorSeparatorDark</item>\n\n        <item name=\"textInputStyle\">@style/TextInputLayoutStyle</item>\n        <item name=\"colorDotTabSelected\">@color/colorDarkAccent</item>\n        <item name=\"colorDotTabNormal\">@color/colorDarkTextColor</item>\n\n        <item name=\"colorBottomNavigationSelected\">@color/colorDarkBottomNavSelected</item>\n        <item name=\"colorBottomNavigationNotSelect\">@color/colorDarkBottomNavNormal</item>\n\n        <item name=\"emojiPickerRippleColor\">#66FFFFFF</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-v27/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <style name=\"AppTheme\" parent=\"Theme.Material3.Light.NoActionBar\">\n\n        <item name=\"colorPrimary\">#3F51B5</item>\n        <item name=\"colorSecondary\">#575DAE</item>\n\n        <item name=\"actionBarSize\">53dp</item>\n\n        <item name=\"colorNormalReactionCounterBackground\">@color/colorNormalReaction</item>\n        <item name=\"colorSelectedReactionCounterBackground\">#808EDD</item>\n        <item name=\"colorBottomNavigationSelected\">@color/colorItemSelected</item>\n        <item name=\"colorBottomNavigationNotSelect\">@color/colorItemNotSelected</item>\n\n        <item name=\"normalIconTint\">@color/colorItemNotSelected</item>\n        <item name=\"colorMessageSelf\">#808EDD</item>\n        <item name=\"colorMessageRecipient\">@color/colorMessageRecipient</item>\n\n        <item name=\"colorSeparator\">@color/colorSeparator</item>\n\n        <item name=\"textInputStyle\">@style/TextInputLayoutStyle</item>\n\n        <item name=\"colorDotTabSelected\">#575DAE</item>\n        <item name=\"colorDotTabNormal\">@color/colorItemNotSelected</item>\n\n        <item name=\"emojiPickerRippleColor\">#5C000000</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w320dp/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"reaction_choices_columns\">6</integer>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-w480dp/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"reaction_choices_columns\">8</integer>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-w600dp/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"reaction_choices_columns\">10</integer>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-w720dp/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"reaction_choices_columns\">14</integer>\n</resources>"
  },
  {
    "path": "app/src/main/res/xml/shortcuts.xml",
    "content": "<shortcuts xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <shortcut\n            android:shortcutId=\"notification\"\n            android:enabled=\"true\"\n            android:icon=\"@drawable/ic_notifications_black_24dp\"\n            android:shortcutShortLabel=\"@string/notification\"\n            android:shortcutLongLabel=\"@string/notification\"\n            >\n        <intent\n                android:action=\"android.intent.action.VIEW\"\n                android:targetPackage=\"jp.panta.misskeyandroidclient\"\n                android:targetClass=\"jp.panta.misskeyandroidclient.MainActivity\" >\n            <extra android:name=\"SHORTCUT_TYPE\" android:value=\"TYPE_OPEN_NOTIFICATION\"/>\n        </intent>\n\n    </shortcut>\n    <shortcut\n            android:shortcutId=\"messaging\"\n            android:enabled=\"true\"\n            android:icon=\"@drawable/ic_message_black_24dp\"\n            android:shortcutShortLabel=\"@string/message\"\n            android:shortcutLongLabel=\"@string/message\"\n        >\n        <intent android:action=\"android.intent.action.VIEW\"\n            android:targetPackage=\"jp.panta.misskeyandroidclient\"\n            android:targetClass=\"jp.panta.misskeyandroidclient.MainActivity\"\n            >\n            <extra android:name=\"SHORTCUT_TYPE\" android:value=\"TYPE_OPEN_MESSAGING\" />\n        </intent>\n    </shortcut>\n    <shortcut\n            android:shortcutId=\"edit_note\"\n            android:enabled=\"true\"\n            android:icon=\"@drawable/ic_edit_black_24dp\"\n            android:shortcutShortLabel=\"@string/edit_note\"\n            android:shortcutLongLabel=\"@string/edit_note\"\n    >\n        <intent android:action=\"android.intent.action.EDIT\"\n                android:targetPackage=\"jp.panta.misskeyandroidclient\"\n                android:targetClass=\"jp.panta.misskeyandroidclient.MainActivity\"\n                >\n            <extra android:name=\"SHORTCUT_TYPE\" android:value=\"TYPE_EDIT_NOTE\" />\n        </intent>\n\n    </shortcut>\n\n</shortcuts>"
  },
  {
    "path": "app/src/release/java/jp/panta/misskeyandroidclient/di/module/EmptyDebuggerSetupManagerImpl.kt",
    "content": "package jp.panta.misskeyandroidclient.util\n\nimport android.content.Context\nimport javax.inject.Inject\n\nclass EmptyDebuggerSetupManagerImpl @Inject constructor() : DebuggerSetupManager {\n\n    override fun setup(context: Context) {\n\n    }\n\n}\n"
  },
  {
    "path": "app/src/release/java/jp/panta/misskeyandroidclient/di/module/ReleaseAPIModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.impl.OkHttpClientProviderImpl\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class ReleaseAPIModule {\n\n    @Binds\n    abstract fun bindOkHttpClientProvider(\n        impl: OkHttpClientProviderImpl\n    ): OkHttpClientProvider\n}"
  },
  {
    "path": "app/src/release/java/jp/panta/misskeyandroidclient/di/module/ReleaseAppModule.kt",
    "content": "package jp.panta.misskeyandroidclient.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport jp.panta.misskeyandroidclient.util.DebuggerSetupManager\nimport jp.panta.misskeyandroidclient.util.EmptyDebuggerSetupManagerImpl\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class ReleaseAppModule {\n\n    @Binds\n    @Singleton\n    abstract fun provideFlipperSetupManager(manager: EmptyDebuggerSetupManagerImpl): DebuggerSetupManager\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/GsonNullInstantTest.kt",
    "content": "package jp.panta.misskeyandroidclient\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport org.junit.jupiter.api.Test\n\n\nclass GsonNullInstantTest {\n\n    @Test\n    fun testNullDateParse() {\n        val decoder = Json {\n            ignoreUnknownKeys = true\n        }\n        val json = \"\"\"{\"id\":\"8nt24ow8o5\",\"createdAt\":\"2021-07-04T17:53:23.720Z\",\"userId\":\"8lep49hc9a\",\"user\":{\"id\":\"8lep49hc9a\",\"name\":\"sh\",\"username\":\"sfx_as\",\"host\":null,\"avatarUrl\":\"https://s3.arkjp.net/misskey/thumbnail-b95de81d-c1cd-46ed-acd0-27ae4cd47182.png\",\"avatarBlurhash\":\"yEF=K*Nu00E2yB~VIA009a~pogDj=xt+Iaspx=NG%2xt9G?Y-V4;Ip-nNFxb0L${'$'}*odR*-pMxxuEQxa%KxZE2NbnPNYRjRRxat5WCoz\",\"avatarColor\":null,\"emojis\":[],\"onlineStatus\":\"unknown\"},\"text\":null,\"cw\":null,\"visibility\":\"public\",\"viaMobile\":true,\"renoteCount\":0,\"repliesCount\":0,\"reactions\":{},\"emojis\":[],\"fileIds\":[],\"files\":[],\"replyId\":null,\"renoteId\":null,\"poll\":{\"multiple\":false,\"expiresAt\":null,\"choices\":[{\"text\":\" \",\"votes\":1,\"isVoted\":false},{\"text\":\"  \",\"votes\":1,\"isVoted\":false},{\"text\":\"   \",\"votes\":1,\"isVoted\":false},{\"text\":\"    \",\"votes\":0,\"isVoted\":false},{\"text\":\"     \",\"votes\":0,\"isVoted\":false},{\"text\":\"      \",\"votes\":0,\"isVoted\":false},{\"text\":\"       \",\"votes\":0,\"isVoted\":false},{\"text\":\"        \",\"votes\":0,\"isVoted\":false},{\"text\":\"         \",\"votes\":1,\"isVoted\":false},{\"text\":\"          \",\"votes\":0,\"isVoted\":false}]}}\"\"\"\n        val note: NoteDTO = decoder.decodeFromString(json)\n        println(note)\n\n\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/api/APIErrorTest.kt",
    "content": "package jp.panta.misskeyandroidclient.api\n\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.api.misskey.DefaultOkHttpClientProvider\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.MisskeyAPIServiceBuilder\nimport net.pantasystem.milktea.api.misskey.notes.CreateNote\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.throwIfHasError\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass APIErrorTest {\n\n    private val misskeyAPI = MisskeyAPIServiceBuilder(DefaultOkHttpClientProvider()).build(\"https://misskey.io\")\n\n\n    @Test\n    fun testClientError() {\n        Assertions.assertThrows(APIError.AuthenticationException::class.java) {\n            runBlocking {\n                misskeyAPI.create(CreateNote(\"\", text = null)).throwIfHasError()\n            }\n        }\n    }\n\n\n    //@Test(expected = APIError.AuthenticationException::class)\n    @Test\n    fun testAuthenticationError() {\n        Assertions.assertThrows(APIError.AuthenticationException::class.java) {\n            runBlocking {\n                val res = misskeyAPI.i(I(null))\n                res.throwIfHasError()\n            }\n\n        }\n        Assertions.assertTrue(true)\n    }\n\n\n    @Test\n    fun testHasErrorBody(): Unit = runBlocking {\n        val res = misskeyAPI.i(I(null))\n\n        try {\n            res.throwIfHasError()\n        } catch (e: APIError) {\n            Assertions.assertNotNull(e.error)\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/api/mastodon/emojis/TootEmojiDTOTest.kt",
    "content": "package jp.panta.misskeyandroidclient.api.mastodon.emojis\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.mastodon.emojis.TootEmojiDTO\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass TootEmojiDTOTest {\n\n    @Test\n    fun parse() {\n        val json = \"\"\"[{\"shortcode\":\"aaaa\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/007/118/original/aaaa.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/007/118/static/aaaa.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"AAAAAA\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/071/387/original/AAAAAA.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/071/387/static/AAAAAA.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"amogus\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/296/215/original/94971c0455e329bb.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/296/215/static/94971c0455e329bb.png\",\"visible_in_picker\":true},{\"shortcode\":\"angery\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/006/original/angery.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/006/static/angery.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"AngeryCat\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/158/746/original/8aec95cc046b5772.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/158/746/static/8aec95cc046b5772.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"badabing\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/161/848/original/3715091b44bc9580.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/161/848/static/3715091b44bc9580.png\",\"visible_in_picker\":true},{\"shortcode\":\"batman\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/005/163/original/8iGbkB7aT.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/005/163/static/8iGbkB7aT.png\",\"visible_in_picker\":true},{\"shortcode\":\"BigBlobhajHug\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/237/original/607b8e399832fc37.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/237/static/607b8e399832fc37.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"birdsite\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/010/316/original/birdsite.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/010/316/static/birdsite.png\",\"visible_in_picker\":true},{\"shortcode\":\"blobaww\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/011/739/original/blobaww.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/011/739/static/blobaww.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"blobcat\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/023/743/original/f31b4b0111ad8b08.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/023/743/static/f31b4b0111ad8b08.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"blobcatcoffee\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/064/080/original/64eaacfe393b80d0.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/064/080/static/64eaacfe393b80d0.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"Blobhaj\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/246/original/b7bc8932cf8dcdf1.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/246/static/b7bc8932cf8dcdf1.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajBlanketBlue\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/238/original/490d2d377f163b7e.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/238/static/490d2d377f163b7e.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajBlanketSlate\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/239/original/381db553b7da1cdc.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/239/static/381db553b7da1cdc.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajfBlobbyHug\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/240/original/210f81597e6ccb0c.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/240/static/210f81597e6ccb0c.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajHeart\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/241/original/a851df5a8ccde75c.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/241/static/a851df5a8ccde75c.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajHoldAsp\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/242/original/74217d8046e8d0ec.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/242/static/74217d8046e8d0ec.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajHoldSassage\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/243/original/0af8ef6b3659b07b.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/243/static/0af8ef6b3659b07b.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajHugFullBody\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/244/original/8f1859fcc0f3d3a4.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/244/static/8f1859fcc0f3d3a4.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobHajMlem\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/245/original/ec0b0a00e35e30b6.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/245/static/ec0b0a00e35e30b6.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajPrideHeart\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/247/original/8414756e1802abe5.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/247/static/8414756e1802abe5.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajReach\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/248/original/c64ec1381a498ee9.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/248/static/c64ec1381a498ee9.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajSadReach\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/249/original/8a954de17a8dcb07.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/249/static/8a954de17a8dcb07.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajShock\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/250/original/8d74e30a465b5c13.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/250/static/8d74e30a465b5c13.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajTinyHeart\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/251/original/869c8971545683ac.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/251/static/869c8971545683ac.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"BlobhajTransPrideHeart\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/362/252/original/456d1fea46817af8.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/362/252/static/456d1fea46817af8.png\",\"visible_in_picker\":true,\"category\":\"Blahaj\"},{\"shortcode\":\"blobmiou\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/023/745/original/80d582c929d43058.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/023/745/static/80d582c929d43058.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"blobnom\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/007/122/original/76cf62cd8240f16b.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/007/122/static/76cf62cd8240f16b.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"blobpats\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/003/679/original/80d1ba80bf06950e.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/003/679/static/80d1ba80bf06950e.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"blobpeek\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/011/885/original/ad46663e221f1762.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/011/885/static/ad46663e221f1762.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"blobsweats\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/134/689/original/721b8947c5fa62d5.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/134/689/static/721b8947c5fa62d5.png\",\"visible_in_picker\":true},{\"shortcode\":\"blobugh\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/007/669/original/f62fb5663bbbfb99.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/007/669/static/f62fb5663bbbfb99.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"blobwizard\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/111/809/original/6ec8d985ff31d304.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/111/809/static/6ec8d985ff31d304.png\",\"visible_in_picker\":true,\"category\":\"Blobs\"},{\"shortcode\":\"bongoCat\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/067/715/original/fdba57dff7576d53.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/067/715/static/fdba57dff7576d53.png\",\"visible_in_picker\":true},{\"shortcode\":\"breathe\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/782/original/breathe.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/782/static/breathe.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"calculator\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/013/352/original/6b5bd68e80c5882d.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/013/352/static/6b5bd68e80c5882d.png\",\"visible_in_picker\":true},{\"shortcode\":\"cate\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/169/410/original/7e446099eaf20ddf.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/169/410/static/7e446099eaf20ddf.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"catjam\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/224/097/original/d9c5e447581399a9.gif\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/224/097/static/d9c5e447581399a9.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"catPOWER\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/274/869/original/850d69ab6fa687a4.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/274/869/static/850d69ab6fa687a4.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"cdrr\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/012/880/original/cdrr.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/012/880/static/cdrr.png\",\"visible_in_picker\":true},{\"shortcode\":\"clippy\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/361/360/original/1e6837de9d441a3e.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/361/360/static/1e6837de9d441a3e.png\",\"visible_in_picker\":true},{\"shortcode\":\"computerfairies\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/954/original/abd0669604e01d4d.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/954/static/abd0669604e01d4d.png\",\"visible_in_picker\":true},{\"shortcode\":\"coolcat\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/005/original/354315741937270794.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/005/static/354315741937270794.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"cwy\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/134/895/original/e9759b363f8a7b12.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/134/895/static/e9759b363f8a7b12.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"dab\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/098/666/original/727fbb887c5d10d5.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/098/666/static/727fbb887c5d10d5.png\",\"visible_in_picker\":true},{\"shortcode\":\"dnd\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/004/590/original/b12ce74fe2b86ab8.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/004/590/static/b12ce74fe2b86ab8.png\",\"visible_in_picker\":true},{\"shortcode\":\"erogun\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/103/721/original/4c9038e745f790b5.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/103/721/static/4c9038e745f790b5.png\",\"visible_in_picker\":true},{\"shortcode\":\"eve\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/082/229/original/e551c6a762ca3503.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/082/229/static/e551c6a762ca3503.png\",\"visible_in_picker\":true},{\"shortcode\":\"fatpikachu\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/150/717/original/2080c3c4892d24c6.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/150/717/static/2080c3c4892d24c6.png\",\"visible_in_picker\":true},{\"shortcode\":\"fatyoshi\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/023/920/original/e57ecb623faa0dc9.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/023/920/static/e57ecb623faa0dc9.png\",\"visible_in_picker\":true},{\"shortcode\":\"firedoge\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/279/345/original/e3f6296637377ac0.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/279/345/static/e3f6296637377ac0.png\",\"visible_in_picker\":true},{\"shortcode\":\"Fortnite\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/045/833/original/32bab51bd98a3f5a.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/045/833/static/32bab51bd98a3f5a.png\",\"visible_in_picker\":true},{\"shortcode\":\"fsfe\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/266/015/original/40cafccf23c39c18.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/266/015/static/40cafccf23c39c18.png\",\"visible_in_picker\":true},{\"shortcode\":\"gargamel\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/003/677/original/d3af6f81b96e082d.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/003/677/static/d3af6f81b96e082d.png\",\"visible_in_picker\":true},{\"shortcode\":\"gnoblin\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/060/276/original/gnomedGnoblin.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/060/276/static/gnomedGnoblin.png\",\"visible_in_picker\":true},{\"shortcode\":\"gnome\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/060/277/original/gnomedGnome.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/060/277/static/gnomedGnome.png\",\"visible_in_picker\":true},{\"shortcode\":\"gnomed\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/059/920/original/gnomed.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/059/920/static/gnomed.png\",\"visible_in_picker\":true},{\"shortcode\":\"gnomeHey\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/060/278/original/gnomedHey.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/060/278/static/gnomedHey.png\",\"visible_in_picker\":true},{\"shortcode\":\"hanny\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/081/025/original/ab2e53fcbdc91548.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/081/025/static/ab2e53fcbdc91548.png\",\"visible_in_picker\":true},{\"shortcode\":\"heart_fire\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/043/926/original/heart_fire.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/043/926/static/heart_fire.png\",\"visible_in_picker\":true},{\"shortcode\":\"hotboi\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/783/original/hotboi.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/783/static/hotboi.png\",\"visible_in_picker\":true},{\"shortcode\":\"hurb\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/345/074/original/a7b8419d23bfa6a2.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/345/074/static/a7b8419d23bfa6a2.png\",\"visible_in_picker\":true},{\"shortcode\":\"janiawoo\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/011/237/original/96ae120a83734967.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/011/237/static/96ae120a83734967.png\",\"visible_in_picker\":true},{\"shortcode\":\"jeb\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/276/958/original/19120b1ac993eac0.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/276/958/static/19120b1ac993eac0.png\",\"visible_in_picker\":true},{\"shortcode\":\"jennpls\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/033/119/original/jennpls.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/033/119/static/jennpls.png\",\"visible_in_picker\":true},{\"shortcode\":\"KEKW\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/275/356/original/bc4b4fc774be017c.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/275/356/static/bc4b4fc774be017c.png\",\"visible_in_picker\":true},{\"shortcode\":\"kerbal\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/003/317/original/9614b39f11d19bcf.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/003/317/static/9614b39f11d19bcf.png\",\"visible_in_picker\":true},{\"shortcode\":\"kirby\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/067/741/original/ffd3a3fdff45d0e3.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/067/741/static/ffd3a3fdff45d0e3.png\",\"visible_in_picker\":true},{\"shortcode\":\"knitting\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/020/414/original/knitting.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/020/414/static/knitting.png\",\"visible_in_picker\":true},{\"shortcode\":\"knzk\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/105/638/original/c0380e7a33a947a6.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/105/638/static/c0380e7a33a947a6.png\",\"visible_in_picker\":true},{\"shortcode\":\"lattentacle\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/006/874/original/941f123686bd39b2.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/006/874/static/941f123686bd39b2.png\",\"visible_in_picker\":true},{\"shortcode\":\"maple\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/953/original/1b22dacadcf0e224.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/953/static/1b22dacadcf0e224.png\",\"visible_in_picker\":true},{\"shortcode\":\"mastodon\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/003/675/original/089aaae26a2abcc1.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/003/675/static/089aaae26a2abcc1.png\",\"visible_in_picker\":true},{\"shortcode\":\"michaelwazowski\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/191/148/original/44c7ff38144cfde9.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/191/148/static/44c7ff38144cfde9.png\",\"visible_in_picker\":true},{\"shortcode\":\"microblog\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/208/199/original/2d9a5114d0b38186.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/208/199/static/2d9a5114d0b38186.png\",\"visible_in_picker\":true},{\"shortcode\":\"nigmaGrin\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/121/original/294208830299176960.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/121/static/294208830299176960.png\",\"visible_in_picker\":true},{\"shortcode\":\"nigmathink\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/016/596/original/nigmathink.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/016/596/static/nigmathink.png\",\"visible_in_picker\":true},{\"shortcode\":\"noelle\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/956/original/peridot-santa-transparent.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/956/static/peridot-santa-transparent.png\",\"visible_in_picker\":true},{\"shortcode\":\"OMEGALUL\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/084/730/original/1f09c207dfb2b4b1.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/084/730/static/1f09c207dfb2b4b1.png\",\"visible_in_picker\":true},{\"shortcode\":\"omgdotlol\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/342/022/original/217ecbd0f198b748.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/342/022/static/217ecbd0f198b748.png\",\"visible_in_picker\":true},{\"shortcode\":\"OttGun\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/027/718/original/LilypadGun3_V2_112x112.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/027/718/static/LilypadGun3_V2_112x112.png\",\"visible_in_picker\":true,\"category\":\"Sheepsticked\"},{\"shortcode\":\"overwatch\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/004/594/original/6d181fa79a38e644.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/004/594/static/6d181fa79a38e644.png\",\"visible_in_picker\":true},{\"shortcode\":\"owi\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/011/738/original/blobaww.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/011/738/static/blobaww.png\",\"visible_in_picker\":true},{\"shortcode\":\"patcat\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/023/744/original/ac93ef9524eb7eb4.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/023/744/static/ac93ef9524eb7eb4.png\",\"visible_in_picker\":true},{\"shortcode\":\"pensive_party_blob\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/086/980/original/31fd04ff8be27277.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/086/980/static/31fd04ff8be27277.png\",\"visible_in_picker\":true},{\"shortcode\":\"perfect\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/021/040/original/9a1f57bbca692009.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/021/040/static/9a1f57bbca692009.png\",\"visible_in_picker\":true},{\"shortcode\":\"pika\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/063/710/original/pika.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/063/710/static/pika.png\",\"visible_in_picker\":true},{\"shortcode\":\"pixelfed\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/068/773/original/pixelfed-icon-color.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/068/773/static/pixelfed-icon-color.png\",\"visible_in_picker\":true},{\"shortcode\":\"pizza_pineapple\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/007/410/original/339d511b2e6846ee.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/007/410/static/339d511b2e6846ee.png\",\"visible_in_picker\":true},{\"shortcode\":\"polarbear\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/010/443/original/a3981421a04d4f47.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/010/443/static/a3981421a04d4f47.png\",\"visible_in_picker\":true},{\"shortcode\":\"psyduck\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/012/919/original/c2c7cf7b86087cf4.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/012/919/static/c2c7cf7b86087cf4.png\",\"visible_in_picker\":true},{\"shortcode\":\"red_candle\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/006/870/original/ccc69dfeacb2d0a1.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/006/870/static/ccc69dfeacb2d0a1.png\",\"visible_in_picker\":true},{\"shortcode\":\"rocinante\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/165/472/original/52b934c7812b0f4c.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/165/472/static/52b934c7812b0f4c.png\",\"visible_in_picker\":true},{\"shortcode\":\"roundboi\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/010/441/original/Milde.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/010/441/static/Milde.png\",\"visible_in_picker\":true},{\"shortcode\":\"sabakan\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/003/676/original/77c4094eacccac9e.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/003/676/static/77c4094eacccac9e.png\",\"visible_in_picker\":true},{\"shortcode\":\"sadness\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/158/747/original/2345f0283e1323f2.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/158/747/static/2345f0283e1323f2.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"scremcat\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/192/492/original/7c2c07178601fe71.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/192/492/static/7c2c07178601fe71.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"screwattack\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/001/889/original/6f11873e8ac5dd20.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/001/889/static/6f11873e8ac5dd20.png\",\"visible_in_picker\":true},{\"shortcode\":\"sheepoSleepo\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/214/157/original/db4a6a7999b0a4c5.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/214/157/static/db4a6a7999b0a4c5.png\",\"visible_in_picker\":true,\"category\":\"Sheepsticked\"},{\"shortcode\":\"sickmeme\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/778/original/sickmeme.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/778/static/sickmeme.png\",\"visible_in_picker\":true},{\"shortcode\":\"sidekiq\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/037/182/original/7efd7097c1d613e9.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/037/182/static/7efd7097c1d613e9.png\",\"visible_in_picker\":true},{\"shortcode\":\"SMOrc\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/134/194/original/118d7b6293628abd.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/134/194/static/118d7b6293628abd.png\",\"visible_in_picker\":true},{\"shortcode\":\"smug\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/078/035/original/smug.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/078/035/static/smug.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"splatoon\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/004/592/original/632e04f8f0f4ca62.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/004/592/static/632e04f8f0f4ca62.png\",\"visible_in_picker\":true},{\"shortcode\":\"stardewvalley\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/004/591/original/f9a94b8af8dd1c72.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/004/591/static/f9a94b8af8dd1c72.png\",\"visible_in_picker\":true},{\"shortcode\":\"thaenkin\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/012/original/334845559435296768.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/012/static/334845559435296768.png\",\"visible_in_picker\":true,\"category\":\"Thinking\"},{\"shortcode\":\"thinkerguns\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/010/444/original/ad0f730111fcec86.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/010/444/static/ad0f730111fcec86.png\",\"visible_in_picker\":true,\"category\":\"Thinking\"},{\"shortcode\":\"thinkhappy\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/000/011/original/328081997266288640.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/000/011/static/328081997266288640.png\",\"visible_in_picker\":true,\"category\":\"Thinking\"},{\"shortcode\":\"ThisTBH\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/017/890/original/thistbh.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/017/890/static/thistbh.png\",\"visible_in_picker\":true},{\"shortcode\":\"thonking\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/098/690/original/a8d36edc4a7032e8.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/098/690/static/a8d36edc4a7032e8.png\",\"visible_in_picker\":true,\"category\":\"Thinking\"},{\"shortcode\":\"thounking\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/015/243/original/thounking.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/015/243/static/thounking.png\",\"visible_in_picker\":true,\"category\":\"Thinking\"},{\"shortcode\":\"tinking\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/098/689/original/4cee17450e73c1d1.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/098/689/static/4cee17450e73c1d1.png\",\"visible_in_picker\":true,\"category\":\"Thinking\"},{\"shortcode\":\"tiredcat\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/208/133/original/3fc349614f1da0b1.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/208/133/static/3fc349614f1da0b1.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"toot\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/007/123/original/emot-toot.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/007/123/static/emot-toot.png\",\"visible_in_picker\":true},{\"shortcode\":\"toucan\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/046/747/original/toucan.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/046/747/static/toucan.png\",\"visible_in_picker\":true,\"category\":\"Sheepsticked\"},{\"shortcode\":\"transgender\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/109/578/original/5fa14063388db534.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/109/578/static/5fa14063388db534.png\",\"visible_in_picker\":true},{\"shortcode\":\"trebuchet\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/034/644/original/abfbab57084022df.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/034/644/static/abfbab57084022df.png\",\"visible_in_picker\":true},{\"shortcode\":\"unarist\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/001/091/original/b6816ca3542e9fc0.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/001/091/static/b6816ca3542e9fc0.png\",\"visible_in_picker\":true},{\"shortcode\":\"underheart\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/033/302/original/underheart.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/033/302/static/underheart.png\",\"visible_in_picker\":true},{\"shortcode\":\"warcraft\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/004/593/original/7ca494c09fae0384.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/004/593/static/7ca494c09fae0384.png\",\"visible_in_picker\":true},{\"shortcode\":\"weirdfish\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/001/489/original/8a2fdcf42b344cd9.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/001/489/static/8a2fdcf42b344cd9.png\",\"visible_in_picker\":true},{\"shortcode\":\"welp\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/046/994/original/welp.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/046/994/static/welp.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"wily_ufo\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/002/321/original/dc7da5987f1e07b0.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/002/321/static/dc7da5987f1e07b0.png\",\"visible_in_picker\":true},{\"shortcode\":\"wyd\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/001/069/original/wyd.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/001/069/static/wyd.png\",\"visible_in_picker\":true,\"category\":\"Cats\"},{\"shortcode\":\"yell\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/017/111/original/d7804d8bc27cc5d5.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/017/111/static/d7804d8bc27cc5d5.png\",\"visible_in_picker\":true},{\"shortcode\":\"yikes\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/031/275/original/yikes.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/031/275/static/yikes.png\",\"visible_in_picker\":true},{\"shortcode\":\"ziltoid\",\"url\":\"https://files.mastodon.social/custom_emojis/images/000/017/094/original/05252745eb087806.png\",\"static_url\":\"https://files.mastodon.social/custom_emojis/images/000/017/094/static/05252745eb087806.png\",\"visible_in_picker\":true}]\"\"\"\n        val emojis: List<TootEmojiDTO> = Json.decodeFromString(json)\n        Assertions.assertNotEquals(0, emojis.size)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/api/mastodon/instance/InstanceTest.kt",
    "content": "package jp.panta.misskeyandroidclient.api.mastodon.instance\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.mastodon.instance.Instance\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass InstanceTest {\n\n    @Test\n    fun decode() {\n        val str = \"\"\"{\"uri\":\"mastodon.social\",\"title\":\"Mastodon\",\"short_description\":\"Server run by the main developers of the project \\u003cimg draggable=\\\"false\\\" alt=\\\"🐘\\\" class=\\\"emojione\\\" src=\\\"https://mastodon.social/emoji/1f418.svg\\\" /\\u003e It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!\",\"description\":\"Server run by the main developers of the project \\u003cimg draggable=\\\"false\\\" alt=\\\"🐘\\\" class=\\\"emojione\\\" src=\\\"https://mastodon.social/emoji/1f418.svg\\\" /\\u003e It is not focused on any particular niche interest - everyone is welcome as long as you follow our code of conduct!\",\"email\":\"staff@mastodon.social\",\"version\":\"3.4.6\",\"urls\":{\"streaming_api\":\"wss://mastodon.social\"},\"stats\":{\"user_count\":630511,\"status_count\":34497004,\"domain_count\":21882},\"thumbnail\":\"https://files.mastodon.social/site_uploads/files/000/000/001/original/vlcsnap-2018-08-27-16h43m11s127.png\",\"languages\":[\"en\"],\"registrations\":true,\"approval_required\":false,\"invites_enabled\":true,\"configuration\":{\"statuses\":{\"max_characters\":500,\"max_media_attachments\":4,\"characters_reserved_per_url\":23},\"media_attachments\":{\"supported_mime_types\":[\"image/jpeg\",\"image/png\",\"image/gif\",\"video/webm\",\"video/mp4\",\"video/quicktime\",\"video/ogg\",\"audio/wave\",\"audio/wav\",\"audio/x-wav\",\"audio/x-pn-wave\",\"audio/ogg\",\"audio/vorbis\",\"audio/mpeg\",\"audio/mp3\",\"audio/webm\",\"audio/flac\",\"audio/aac\",\"audio/m4a\",\"audio/x-m4a\",\"audio/mp4\",\"audio/3gpp\",\"video/x-ms-asf\"],\"image_size_limit\":10485760,\"image_matrix_limit\":16777216,\"video_size_limit\":41943040,\"video_frame_rate_limit\":60,\"video_matrix_limit\":2304000},\"polls\":{\"max_options\":4,\"max_characters_per_option\":50,\"min_expiration\":300,\"max_expiration\":2629746}},\"contact_account\":{\"id\":\"1\",\"username\":\"Gargron\",\"acct\":\"Gargron\",\"display_name\":\"Eugen\",\"locked\":false,\"bot\":false,\"discoverable\":true,\"group\":false,\"created_at\":\"2016-03-16T00:00:00.000Z\",\"note\":\"\\u003cp\\u003eFounder, CEO and lead developer \\u003cspan class=\\\"h-card\\\"\\u003e\\u003ca href=\\\"https://mastodon.social/@Mastodon\\\" class=\\\"u-url mention\\\"\\u003e@\\u003cspan\\u003eMastodon\\u003c/span\\u003e\\u003c/a\\u003e\\u003c/span\\u003e, Germany.\\u003c/p\\u003e\",\"url\":\"https://mastodon.social/@Gargron\",\"avatar\":\"https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png\",\"avatar_static\":\"https://files.mastodon.social/accounts/avatars/000/000/001/original/ccb05a778962e171.png\",\"header\":\"https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg\",\"header_static\":\"https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg\",\"followers_count\":99507,\"following_count\":272,\"statuses_count\":71557,\"last_status_at\":\"2022-03-05\",\"emojis\":[],\"fields\":[{\"name\":\"Patreon\",\"value\":\"\\u003ca href=\\\"https://www.patreon.com/mastodon\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"\\u003e\\u003cspan class=\\\"invisible\\\"\\u003ehttps://www.\\u003c/span\\u003e\\u003cspan class=\\\"\\\"\\u003epatreon.com/mastodon\\u003c/span\\u003e\\u003cspan class=\\\"invisible\\\"\\u003e\\u003c/span\\u003e\\u003c/a\\u003e\",\"verified_at\":null}]},\"rules\":[{\"id\":\"1\",\"text\":\"Sexually explicit or violent media must be marked as sensitive when posting\"},{\"id\":\"2\",\"text\":\"No racism, sexism, homophobia, transphobia, xenophobia, or casteism\"},{\"id\":\"3\",\"text\":\"No incitement of violence or promotion of violent ideologies\"},{\"id\":\"4\",\"text\":\"No harassment, dogpiling or doxxing of other users\"},{\"id\":\"5\",\"text\":\"No content illegal in Germany\"},{\"id\":\"7\",\"text\":\"Do not share intentionally false or misleading information\"}]}\"\"\"\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val instance: Instance = json.decodeFromString(str)\n        Assertions.assertEquals(\"mastodon.social\", instance.uri)\n\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/api/misskey/v12/channel/ChannelDTOTest.kt",
    "content": "package jp.panta.misskeyandroidclient.api.misskey.v12.channel\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.v12.channel.ChannelDTO\nimport net.pantasystem.milktea.model.account.Account\n\nimport org.junit.jupiter.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\n\nclass ChannelDTOTest {\n\n    @Test\n    fun toModel() {\n        val jsonStr = \"\"\"{\n            \"id\": \"8rfhsu910l\",\n            \"createdAt\": \"2021-10-04T00:42:07.525Z\",\n            \"lastNotedAt\": \"2022-03-20T18:41:43.817Z\",\n            \"name\": \"はるのんしすてむどっとこむ\",\n            \"description\": \"消えたので作った\",\n            \"userId\": \"7rla9gie6j\",\n            \"bannerUrl\": null,\n            \"usersCount\": 13,\n            \"notesCount\": 375,\n            \"isFollowing\": true,\n            \"hasUnreadNote\": true\n        }\"\"\"\n        val parser = Json {\n            ignoreUnknownKeys = true\n        }\n        val channelDTO: ChannelDTO = parser.decodeFromString(jsonStr)\n        assertEquals(true, channelDTO.isFollowing)\n        assertEquals(true, channelDTO.hasUnreadNote)\n        assertEquals(13, channelDTO.usersCount)\n        assertNull(channelDTO.bannerUrl)\n        assertEquals(\"8rfhsu910l\", channelDTO.id)\n\n        val channel = channelDTO.toModel(\n            Account(\n                \"id\",\n                \"misskey.io\",\n                \"Panta\",\n                Account.InstanceType.MISSKEY,\n                \"\"\n            )\n        )\n        assertEquals(channelDTO.id, channel.id.channelId)\n        assertEquals(channelDTO.isFollowing, channel.isFollowing)\n        assertEquals(channelDTO.hasUnreadNote, channel.hasUnreadNote)\n        assertEquals(channelDTO.name, channel.name)\n        assertEquals(channelDTO.allowRenoteToExternal, channel.allowRenoteToExternal)\n    }\n\n    @Test\n    fun decodeJsonUnAuthData() {\n        val jsonStr = \"\"\"{\n            \"id\": \"8rfhsu910l\",\n            \"createdAt\": \"2021-10-04T00:42:07.525Z\",\n            \"lastNotedAt\": \"2022-03-20T18:41:43.817Z\",\n            \"name\": \"はるのんしすてむどっとこむ\",\n            \"description\": \"消えたので作った\",\n            \"userId\": \"7rla9gie6j\",\n            \"bannerUrl\": null,\n            \"usersCount\": 13,\n            \"notesCount\": 375\n            }\"\"\"\n\n        val parser = Json {\n            ignoreUnknownKeys = true\n        }\n        val channelDTO: ChannelDTO = parser.decodeFromString(jsonStr)\n        assertNull(channelDTO.isFollowing)\n        assertNull(channelDTO.hasUnreadNote)\n    }\n\n    @Test\n    fun decodeJsonAuthorizedData() {\n        val jsonStr = \"\"\"{\n            \"id\": \"8rfhsu910l\",\n            \"createdAt\": \"2021-10-04T00:42:07.525Z\",\n            \"lastNotedAt\": \"2022-03-20T18:41:43.817Z\",\n            \"name\": \"はるのんしすてむどっとこむ\",\n            \"description\": \"消えたので作った\",\n            \"userId\": \"7rla9gie6j\",\n            \"bannerUrl\": null,\n            \"usersCount\": 13,\n            \"notesCount\": 375,\n            \"isFollowing\": true,\n            \"hasUnreadNote\": true\n        }\"\"\"\n        val parser = Json {\n            ignoreUnknownKeys = true\n        }\n        val channelDTO: ChannelDTO = parser.decodeFromString(jsonStr)\n        assertEquals(true, channelDTO.isFollowing)\n        assertEquals(true, channelDTO.hasUnreadNote)\n        assertEquals(13, channelDTO.usersCount)\n        assertNull(channelDTO.bannerUrl)\n        assertEquals(\"8rfhsu910l\", channelDTO.id)\n        assertEquals(\"はるのんしすてむどっとこむ\", channelDTO.name)\n        assertEquals(\"消えたので作った\", channelDTO.description)\n        assertEquals(375, channelDTO.notesCount)\n    }\n\n    @Test\n    fun decodeJsonDescriptionIsNull() {\n        val jsonStr = \"\"\"{\n            \"id\": \"8rfhsu910l\",\n            \"createdAt\": \"2021-10-04T00:42:07.525Z\",\n            \"lastNotedAt\": \"2022-03-20T18:41:43.817Z\",\n            \"name\": \"はるのんしすてむどっとこむ\",\n            \"description\": null,\n            \"userId\": \"7rla9gie6j\",\n            \"bannerUrl\": null,\n            \"usersCount\": 13,\n            \"notesCount\": 375,\n            \"isFollowing\": true,\n            \"hasUnreadNote\": true\n        }\"\"\"\n        val parser = Json {\n            ignoreUnknownKeys = true\n        }\n        val channelDTO: ChannelDTO = parser.decodeFromString(jsonStr)\n        assertNull(channelDTO.description)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/api/notes/NoteDTOTest.kt",
    "content": "package jp.panta.misskeyandroidclient.api.notes\n\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\nimport net.pantasystem.milktea.api.misskey.emoji.EmojisType\nimport net.pantasystem.milktea.api.misskey.emoji.TestNoteObject\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass NoteDTOTest {\n\n    @Test\n    fun jsonDecodeTest() {\n        val builder = Json {\n            ignoreUnknownKeys = true\n        }\n        val jsonStr =\n            \"\"\"{\"id\":\"8lp2oiif5t\",\"createdAt\":\"2021-05-12T13:38:19.191Z\",\"userId\":\"8bku1pzti4\",\"user\":{\"id\":\"8bku1pzti4\",\"name\":\"Thor 🇳🇴\",\"username\":\"thor\",\"host\":\"pl.thj.no\",\"avatarUrl\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fpl.thj.no%2Fmedia%2Fbf68fb5dbe1ca0151a262f5f7c1a99f89c487e2da5c3f1fd6adbb1b871ca31be.jpeg&thumbnail=1\",\"avatarBlurhash\":\"yNIYC0pyyYt-%#o}J8TK%#.7NytlS5tQIUV?nhxsjEWBV?x]bHbcozM|Rjt6WBkCbHR-R-xuxuIURjxZoeofofNGoyWCt7M{bHofR*\",\"avatarColor\":null,\"instance\":{\"name\":\"Pleroma\",\"softwareName\":\"pleroma\",\"softwareVersion\":\"2.3.0-1-gb221d77a\",\"iconUrl\":\"https://pl.thj.no/favicon.png\",\"faviconUrl\":\"https://pl.thj.no/favicon.png\",\"themeColor\":null},\"emojis\":[],\"onlineStatus\":\"unknown\"},\"text\":null,\"cw\":null,\"visibility\":\"public\",\"renoteCount\":0,\"repliesCount\":0,\"reactions\":{},\"emojis\":[],\"fileIds\":[],\"files\":[],\"replyId\":null,\"renoteId\":\"8loy77x2cp\",\"uri\":\"https://pl.thj.no/activities/498b3caf-e819-457b-b5fa-934bf5cd91a9\",\"renote\":{\"id\":\"8loy77x2cp\",\"createdAt\":\"2021-05-12T11:32:53.846Z\",\"userId\":\"7y4q3ytt21\",\"user\":{\"id\":\"7y4q3ytt21\",\"name\":\"Solid Cанëк :sabakan: \",\"username\":\"solidsanek\",\"host\":\"outerheaven.club\",\"avatarUrl\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fouterheaven.club%2Fmedia%2F2b7478fa57151ffde725c6f41b18f215b1b4e6d4769805a89ff6244e0f9ceba3.blob&thumbnail=1\",\"avatarBlurhash\":\"yiKwR.~Vk=Mxo#xtoz-;IBtQsVkBf7of%gRPxuxas:ofae_3xuM{M|RQW;Rjb^kCn%oyV@f+ofxuoyaeWqV@s:ofWWRjV@j[f6WBWB\",\"avatarColor\":null,\"instance\":{\"name\":\"Outer Heaven\",\"softwareName\":\"pleroma\",\"softwareVersion\":\"2.3.0-1-gb221d77a\",\"iconUrl\":\"https://outerheaven.club/favicon.png\",\"faviconUrl\":\"https://outerheaven.club/favicon.png\",\"themeColor\":null},\"emojis\":[{\"name\":\"sabakan\",\"url\":\"https://outerheaven.club/emoji/mess/sabakan.png\"}],\"onlineStatus\":\"unknown\"},\"text\":\"Lunch time\",\"cw\":null,\"visibility\":\"public\",\"renoteCount\":6,\"repliesCount\":1,\"reactions\":{\"👍\":7},\"emojis\":[],\"fileIds\":[\"8loy7diyco\"],\"files\":[{\"id\":\"8loy7diyco\",\"createdAt\":\"2021-05-12T11:33:01.114Z\",\"name\":\"ff0fb3a916107d7ae0adb95298a9cfd170a70b5265a7204f06bddfd40ab3f3b1.mp4\",\"type\":\"video/mp4\",\"md5\":\"2b00b47cd3dce6a0f1da04e6103db676\",\"size\":0,\"isSensitive\":false,\"blurhash\":null,\"properties\":{},\"url\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fouterheaven.club%2Fmedia%2Fff0fb3a916107d7ae0adb95298a9cfd170a70b5265a7204f06bddfd40ab3f3b1.mp4\",\"thumbnailUrl\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fouterheaven.club%2Fmedia%2Fff0fb3a916107d7ae0adb95298a9cfd170a70b5265a7204f06bddfd40ab3f3b1.mp4&thumbnail=1\",\"comment\":null,\"folderId\":null,\"folder\":null,\"userId\":null,\"user\":null}],\"replyId\":null,\"renoteId\":null,\"uri\":\"https://outerheaven.club/objects/b6f14bd2-8ad1-4e4e-a5c4-ac318a3d61f0\"}}\"\"\"\n        val noteDTO: NoteDTO = builder.decodeFromString(jsonStr)\n        Assertions.assertNotNull(noteDTO)\n    }\n\n    @Test\n    fun jsonDecodeTest2() {\n        val jsonStr = \"\"\"[\n    {\n        \"id\": \"8wx5r4lrqg\",\n        \"createdAt\": \"2022-02-19T08:43:15.087Z\",\n        \"userId\": \"8fu0rxwrdm\",\n        \"user\": {\n            \"id\": \"8fu0rxwrdm\",\n            \"name\": \":_ze::_ro::_za::_su::_ki::wave:\",\n            \"username\": \"zero_zaki_ghost\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-5d26d748-398f-4a68-a876-23e1852f22b1.jpg\",\n            \"avatarBlurhash\": \"yGL|lz-p4njb-=s+aTRyog?Wa{D:WUWJ~lRjSIofN2j?jM^}M{Wmj@jLogIYI-Ri?GWBV|t7IZ?Zt6S0WVRqWD%3%Joyt6s:n.M{Iq\",\n            \"avatarColor\": null,\n            \"isCat\": true,\n            \"emojis\": [\n                {\n                    \"name\": \"_ze\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-fcf3f781-4225-43d5-a5df-53b8936fad4d.png\"\n                },\n                {\n                    \"name\": \"_ro\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-9b45480c-fa64-4cea-be52-a71c4e67d15a.png\"\n                },\n                {\n                    \"name\": \"_za\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-d7fc9cef-60eb-4301-91e0-8c74bc41be2a.png\"\n                },\n                {\n                    \"name\": \"_su\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-91ec1ee3-23d2-42c7-890c-0ef9eed65620.png\"\n                },\n                {\n                    \"name\": \"_ki\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-ae353d86-489e-4178-b568-89b37ab0c16c.png\"\n                },\n                {\n                    \"name\": \"wave\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-127746e0-08fe-4e86-be39-1d71a9d35eeb.png\"\n                }\n            ],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"いい感じのカレーが来た！🍛\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 3,\n        \"repliesCount\": 0,\n        \"reactions\": {\n            \"🍛\": 17,\n            \"👍\": 4,\n            \"😋\": 1,\n            \":blobcatdroolreach@.:\": 1\n        },\n        \"emojis\": [\n            {\n                \"name\": \"blobcatdroolreach@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-075124a1-5f71-4768-ba9f-8f5e1f5e485a.png\"\n            }\n        ],\n        \"fileIds\": [\n            \"8wx5qr4in0\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8wx5qr4in0\",\n                \"createdAt\": \"2022-02-19T08:42:57.618Z\",\n                \"name\": \"DDB5D7BF-F9AE-4414-980C-22F850477AC4.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"md5\": \"6d2a19a2fe519717dcb1bf786a527486\",\n                \"size\": 3283785,\n                \"isSensitive\": false,\n                \"blurhash\": \"yZHB0R}sRQNGs:xtxasCV@ofxaxGRjWUe=bYt6Rjs:WXNat6s.ofV[a}ofooKa}oJbHfjoLf5aeRkaxofofbHayWV\",\n                \"properties\": {\n                    \"width\": 3024,\n                    \"height\": 4032\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-51254b60-edd9-40c5-8c35-e8d6979be41a.jpg\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-d3b5f1f8-93fa-43aa-9e4a-5ea80e259fe9.jpg\",\n                \"comment\": null,\n                \"folderId\": null,\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8wx4sqjbld\",\n        \"createdAt\": \"2022-02-19T08:16:30.551Z\",\n        \"userId\": \"8fu0rxwrdm\",\n        \"user\": {\n            \"id\": \"8fu0rxwrdm\",\n            \"name\": \":_ze::_ro::_za::_su::_ki::wave:\",\n            \"username\": \"zero_zaki_ghost\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-5d26d748-398f-4a68-a876-23e1852f22b1.jpg\",\n            \"avatarBlurhash\": \"yGL|lz-p4njb-=s+aTRyog?Wa{D:WUWJ~lRjSIofN2j?jM^}M{Wmj@jLogIYI-Ri?GWBV|t7IZ?Zt6S0WVRqWD%3%Joyt6s:n.M{Iq\",\n            \"avatarColor\": null,\n            \"isCat\": true,\n            \"emojis\": [\n                {\n                    \"name\": \"_ze\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-fcf3f781-4225-43d5-a5df-53b8936fad4d.png\"\n                },\n                {\n                    \"name\": \"_ro\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-9b45480c-fa64-4cea-be52-a71c4e67d15a.png\"\n                },\n                {\n                    \"name\": \"_za\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-d7fc9cef-60eb-4301-91e0-8c74bc41be2a.png\"\n                },\n                {\n                    \"name\": \"_su\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-91ec1ee3-23d2-42c7-890c-0ef9eed65620.png\"\n                },\n                {\n                    \"name\": \"_ki\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-ae353d86-489e-4178-b568-89b37ab0c16c.png\"\n                },\n                {\n                    \"name\": \"wave\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-127746e0-08fe-4e86-be39-1d71a9d35eeb.png\"\n                }\n            ],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"「毒親だけど距離置いてしばらくしたら和解した」って人がちょいちょいおるけど、そーゆう人尊敬する。俺には無理。\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 7,\n        \"repliesCount\": 0,\n        \"reactions\": {\n            \"❤\": 1,\n            \"👍\": 7\n        },\n        \"emojis\": [],\n        \"fileIds\": [],\n        \"files\": [],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8wx4j1g676\",\n        \"createdAt\": \"2022-02-19T08:08:58.134Z\",\n        \"userId\": \"7rkrg1wo1a\",\n        \"user\": {\n            \"id\": \"7rkrg1wo1a\",\n            \"name\": \"村上さん\",\n            \"username\": \"AureoleArk\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-80626a47-0654-4863-98e1-a7ecfb1c7131.jpg\",\n            \"avatarBlurhash\": \"yHM8pYx]0n-TJCt89vLNEk+sadNK=vxYIUf+o*EQAJWqT0%1RjDjI[%LS5NeRkNIt.i_NGbbv|SixujERkWYXTa#r;jY\",\n            \"avatarColor\": null,\n            \"isModerator\": true,\n            \"emojis\": [],\n            \"onlineStatus\": \"unknown\"\n        },\n        \"text\": null,\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 4,\n        \"repliesCount\": 0,\n        \"reactions\": {\n            \"👍\": 1,\n            \"😇\": 4,\n            \"🥴\": 4,\n            \":bap@.:\": 2\n        },\n        \"emojis\": [\n            {\n                \"name\": \"bap@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/1a8e89a6-10fd-4315-85ad-491bd1144058.gif\"\n            }\n        ],\n        \"fileIds\": [\n            \"8wx4j0frcs\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8wx4j0frcs\",\n                \"createdAt\": \"2022-02-19T08:08:56.823Z\",\n                \"name\": \"2022-02-19 17-08-56 1.png\",\n                \"type\": \"image/png\",\n                \"md5\": \"f04366a251295387280bc0788293f0b4\",\n                \"size\": 384761,\n                \"isSensitive\": false,\n                \"blurhash\": \"yLAB6UaI9GnMnes8rByGjFRjjEjDnjD00tS?GkEj_bJXoL}oz%2kEbeX9XU^%WAE3j]kWW=nNxvocNKodt5oIngD*ofxtaejEslbc\",\n                \"properties\": {\n                    \"width\": 615,\n                    \"height\": 737\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-574ad5eb-66d6-42b7-b59f-e99a744dc140.png\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-b8ec2fd3-3b55-4c0e-bb2c-2a38e966a190.jpg\",\n                \"comment\": null,\n                \"folderId\": \"7v9lb3aif9\",\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8wx4at7wy5\",\n        \"createdAt\": \"2022-02-19T08:02:34.220Z\",\n        \"userId\": \"8g0j5lv00n\",\n        \"user\": {\n            \"id\": \"8g0j5lv00n\",\n            \"name\": \"t_w 79.9kg\",\n            \"username\": \"t_w\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-bfc014aa-76d8-45eb-87a5-8db3e5c1baa1.png\",\n            \"avatarBlurhash\": \"yUO9t7${'$'}+xaD~SO9ZxuxaVtV[%MoyWBbbIVIUsp%LxtofNGX7ozRjI:W=oc-pxtNGf+t7WBxas.oybFRjxtoKWCj]WAoLWV\",\n            \"avatarColor\": null,\n            \"emojis\": [],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"Rustで一家離散させて遊んでる\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 7,\n        \"repliesCount\": 2,\n        \"reactions\": {\n            \"🎉\": 1,\n            \"👍\": 4,\n            \":shikei@.:\": 4\n        },\n        \"emojis\": [\n            {\n                \"name\": \"shikei@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-01d065e5-a99e-455b-b449-f96b4a79fb52.png\"\n            }\n        ],\n        \"fileIds\": [\n            \"8wx4altv55\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8wx4altv55\",\n                \"createdAt\": \"2022-02-19T08:02:24.643Z\",\n                \"name\": \"2022-02-19 17-02-24 1.png\",\n                \"type\": \"image/png\",\n                \"md5\": \"ce5b2ed518a903daae3ff57736c2ba91\",\n                \"size\": 37629,\n                \"isSensitive\": false,\n                \"blurhash\": \"y05OQl_$'}#ICWtE7IXNfI=I;00${'$'}*s;Vu%1j=j?~qNYI.NFM{ayV[%MM|t8t7R*R*ba00xvxbs;s:RkRj_3tPR%t6R%RjR+\",\n                \"properties\": {\n                    \"width\": 462,\n                    \"height\": 542\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-50ae16b4-b466-4b67-ad52-5fb712dcae17.png\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-129337e4-7233-4c5e-8a0c-fb425208b3a5.jpg\",\n                \"comment\": null,\n                \"folderId\": null,\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8wx3kz489a\",\n        \"createdAt\": \"2022-02-19T07:42:28.808Z\",\n        \"userId\": \"7rkrg1wo1a\",\n        \"user\": {\n            \"id\": \"7rkrg1wo1a\",\n            \"name\": \"村上さん\",\n            \"username\": \"AureoleArk\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-80626a47-0654-4863-98e1-a7ecfb1c7131.jpg\",\n            \"avatarBlurhash\": \"yHM8pYx]0n-TJCt89vLNEk+sadNK=vxYIUf+QAJWqT0%1RjDjI[%LS5NeRkNIt.i_NGbbv|SixujERkWYXTa#r;jY\",\n            \"avatarColor\": null,\n            \"isModerator\": true,\n            \"emojis\": [],\n            \"onlineStatus\": \"unknown\"\n        },\n        \"text\": \"Misskeyの完全なSVGロゴなかったので作った\\n（公式のSVGはPNGがbase64に変換されたものが埋め込まれている）\\n\\nhttps://s3.arkjp.net/misskey/3219e602-a0fe-42c7-aa35-f39ddcf90fc2\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 10,\n        \"repliesCount\": 0,\n        \"reactions\": {\n            \"🎉\": 1,\n            \"😊\": 1,\n            \"🥰\": 1,\n            \":igyo@.:\": 1,\n            \":misskey@.:\": 4,\n            \":nacho_hi@.:\": 1,\n            \":arigatofes@.:\": 1,\n            \":kami@nca10.net:\": 1,\n            \":misskey@fedibird.com:\": 1,\n            \":iihanashi@umaskey.net:\": 1,\n            \":blob_hearteyes@sushi.ski:\": 1,\n            \":igyou@misky.rikunagiweb.jp:\": 1\n        },\n        \"emojis\": [\n            {\n                \"name\": \"igyo@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-d50d9d65-8413-4236-9762-393e4f3585ce.png\"\n            },\n            {\n                \"name\": \"misskey@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-f3ca12a3-0254-4326-aac8-b79915fc34d6.png\"\n            },\n            {\n                \"name\": \"nacho_hi@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-105da421-b3af-48fa-af6f-d616f9510823.png\"\n            },\n            {\n                \"name\": \"arigatofes@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-ddbfee9d-91ab-419a-9247-64dd90b62fac.png\"\n            },\n            {\n                \"name\": \"kami@nca10.net\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fs3.nca10.net%2Fmisskey%2Fwebpublic-1e162464-dbd5-48ce-bd01-39d12e5082ed.png\"\n            },\n            {\n                \"name\": \"hosii@nca10.net\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fs3.nca10.net%2Fmisskey%2Fwebpublic-ef879915-4a38-43f1-8d64-84c763bbbeae.png\"\n            },\n            {\n                \"name\": \"misskey@fedibird.com\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fs3.fedibird.com%2Fcustom_emojis%2Fimages%2F000%2F008%2F417%2Foriginal%2Fb081a4cecfbf0750.png\"\n            },\n            {\n                \"name\": \"iihanashi@umaskey.net\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fumaskey.net%2Ffiles%2F9249dae6-22f8-4536-9723-3ef10a1e6b66\"\n            },\n            {\n                \"name\": \"blob_hearteyes@sushi.ski\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmedia.sushi.ski%2Ffiles%2Fd013b1a9-8c40-48d3-827f-53422814419d.gif\"\n            },\n            {\n                \"name\": \"igyou@misky.rikunagiweb.jp\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmedia-misky.rikunagiweb.jp%2Fmedia%2Fwebpublic-9244077e-df15-4c9f-a02f-5ad4d25fe3bd.png\"\n            }\n        ],\n        \"fileIds\": [\n            \"8wx3hl69v7\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8wx3hl69v7\",\n                \"createdAt\": \"2022-02-19T07:39:50.769Z\",\n                \"name\": \"mi.svg\",\n                \"type\": \"image/svg+xml\",\n                \"md5\": \"2167b6ce26cd2c1d78530562f0a4188a\",\n                \"size\": 5837,\n                \"isSensitive\": false,\n                \"blurhash\": \"yHE;,e%r.g%sy8MkM#yAWCWYoJj[V_af8,M*th%bkBM%RTtNV^t5oej@j@WCRBV]oxf7kAj@ayagayovovkAazk9RSoxRSRTagkAow\",\n                \"properties\": {\n                    \"width\": 1345.9,\n                    \"height\": 985.05\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-597033c8-49aa-4adb-bbc6-d025e85c2df4.png\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-b34d0613-c969-40f7-a529-39725519e736.png\",\n                \"comment\": null,\n                \"folderId\": \"7v9lb3aif9\",\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8wx3dgiiss\",\n        \"createdAt\": \"2022-02-19T07:36:38.106Z\",\n        \"userId\": \"8fu0rxwrdm\",\n        \"user\": {\n            \"id\": \"8fu0rxwrdm\",\n            \"name\": \":_ze::_ro::_za::_su::_ki::wave:\",\n            \"username\": \"zero_zaki_ghost\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-5d26d748-398f-4a68-a876-23e1852f22b1.jpg\",\n            \"avatarBlurhash\": \"yGL|lz-p4njb-=s+aTRyog?Wa{D:WUWJ~lRjSIofN2j?jM^}M{Wmj@jLogIYI-Ri?GWBV|t7IZ?Zt6S0WVRqWD%3%Joyt6s:n.M{Iq\",\n            \"avatarColor\": null,\n            \"isCat\": true,\n            \"emojis\": [\n                {\n                    \"name\": \"_ze\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-fcf3f781-4225-43d5-a5df-53b8936fad4d.png\"\n                },\n                {\n                    \"name\": \"_ro\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-9b45480c-fa64-4cea-be52-a71c4e67d15a.png\"\n                },\n                {\n                    \"name\": \"_za\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-d7fc9cef-60eb-4301-91e0-8c74bc41be2a.png\"\n                },\n                {\n                    \"name\": \"_su\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-91ec1ee3-23d2-42c7-890c-0ef9eed65620.png\"\n                },\n                {\n                    \"name\": \"_ki\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-ae353d86-489e-4178-b568-89b37ab0c16c.png\"\n                },\n                {\n                    \"name\": \"wave\",\n                    \"url\": \"https://s3.arkjp.net/misskey/webpublic-127746e0-08fe-4e86-be39-1d71a9d35eeb.png\"\n                }\n            ],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"それでは〜？ぺーい！🍻\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 1,\n        \"repliesCount\": 1,\n        \"reactions\": {\n            \"🍻\": 14,\n            \"👍\": 3\n        },\n        \"emojis\": [],\n        \"fileIds\": [\n            \"8wx3dbuk47\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8wx3dbuk47\",\n                \"createdAt\": \"2022-02-19T07:36:32.060Z\",\n                \"name\": \"D1D2514D-8FF8-4524-ABB4-2CF8235E60A7.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"md5\": \"ddefed5454d0288f234799d700f69d9f\",\n                \"size\": 3300034,\n                \"isSensitive\": false,\n                \"blurhash\": \"y9I4CDD+?a57-U-VIp~BE3Sj%1M|IqR*IWE2WBRjWBRkbGNdt7%1t6ofs:t6%1R+I;xss:R+X7xDWBR+NGWBNIofoft6f*xss:s:WU\",\n                \"properties\": {\n                    \"width\": 3024,\n                    \"height\": 4032\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-71a17c67-a2ea-41e3-9102-4c2040528864.jpg\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-8d5611f8-36d2-402c-8cc6-7e10f8e9d3f6.jpg\",\n                \"comment\": null,\n                \"folderId\": null,\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8wwwqjdrhi\",\n        \"createdAt\": \"2022-02-19T04:30:51.039Z\",\n        \"userId\": \"7rkrarq81i\",\n        \"user\": {\n            \"id\": \"7rkrarq81i\",\n            \"name\": \"しゅいろ\",\n            \"username\": \"syuilo\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-c7721442-e698-4635-a662-57d78856bbc0.jpg\",\n            \"avatarBlurhash\": \"yFF5Kq0L00?a^*IBNG01^j-pV@D*o|xt58WB}@9at7s.Ip~AWB57%Laes:xaOEoLnis:ofIpoJr?NHtRV@oLoeNHNI%1M{kCWCjuxZ\",\n            \"avatarColor\": null,\n            \"isModerator\": true,\n            \"isCat\": true,\n            \"emojis\": [],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"コロニャの影響でコンビニ閉まってた:sonnakotoarunda:\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 5,\n        \"repliesCount\": 0,\n        \"reactions\": {\n            \"⭐\": 4,\n            \"👍\": 6,\n            \"😥\": 4,\n            \"😮\": 2,\n            \"🤔\": 1,\n            \":murishite@.:\": 1,\n            \":maanantekoto@.:\": 1,\n            \":omae_ga_tsukure@.:\": 1,\n            \":sonnakotoarunda@.:\": 5,\n            \":nacho_cry@nya.one:\": 1,\n            \":ablobcatblinkhyper@.:\": 1,\n            \":ablobcatcryingcute@.:\": 2,\n            \":crying_cat@nca10.net:\": 1,\n            \":blob_sleepy@sushi.ski:\": 1,\n            \":blobsleepless@k.lapy.link:\": 1,\n            \":cyber_hacking@mk.f72u.net:\": 1,\n            \":blobcatcry@misskey.m544.net:\": 1,\n            \":sonnakotoarunda@friendsyu.me:\": 1,\n            \":sonnakotoarunda@mk.lei202.com:\": 1\n        },\n        \"emojis\": [\n            {\n                \"name\": \"sonnakotoarunda\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-52ee9700-7114-4690-88cf-8633b2ad962a.png\"\n            },\n            {\n                \"name\": \"murishite@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-1f9050ad-bdc8-4c86-8c07-68f70f55f887.png\"\n            },\n            {\n                \"name\": \"maanantekoto@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-15ec5fe4-42ec-41f8-8cd8-fdfafefea93c.png\"\n            },\n            {\n                \"name\": \"omae_ga_tsukure@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-0c0c7db8-359b-4caf-ae95-5e9a47312f42.png\"\n            },\n            {\n                \"name\": \"sonnakotoarunda@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-52ee9700-7114-4690-88cf-8633b2ad962a.png\"\n            },\n            {\n                \"name\": \"nacho_cry@nya.one\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Ffile.nya.one%2Fmisskey%2Fwebpublic-494cfc89-a3c7-46a5-95d8-fb362bacd3ba.png\"\n            },\n            {\n                \"name\": \"ablobcatblinkhyper@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/c1d1be32-f3c3-4c60-9509-cb690b7935a8\"\n            },\n            {\n                \"name\": \"ablobcatcryingcute@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/b90b23ac-432d-4bd2-9e58-8ee6980f5595.apng\"\n            },\n            {\n                \"name\": \"crying_cat@nca10.net\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fs3.nca10.net%2Fmisskey%2Fc5f30fa7-2459-47eb-a9ce-060bf6c617d6.apng\"\n            },\n            {\n                \"name\": \"blob_sleepy@sushi.ski\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmedia.sushi.ski%2Ffiles%2F3f6f4034-f527-4e3a-bbb6-406dbcefb9b1.gif\"\n            },\n            {\n                \"name\": \"blobsleepless@k.lapy.link\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmisskeylapy.s3.amazonaws.com%2Fnull%2F6fe193f7-a30e-48ad-abba-04f7e92c597e.png\"\n            },\n            {\n                \"name\": \"cyber_hacking@mk.f72u.net\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmk.f72u.net%2Fmedia%2Fmisskey%2F88c357e5-0c30-43c9-9cf5-adb009e0a916.gif\"\n            },\n            {\n                \"name\": \"blobcatcry@misskey.m544.net\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmisskey-drive2.m544.net%2Fm544%2Fzcj6iwsig8iw4c9r29cegarn.png\"\n            },\n            {\n                \"name\": \"sonnakotoarunda@friendsyu.me\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Ffriendsyu.me%2Ffiles%2F602edca04d88a20c3708cd38%2F602edca04d88a20c3708cd38.png%3Fweb\"\n            },\n            {\n                \"name\": \"sonnakotoarunda@mk.lei202.com\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmk.lei202.com%2Ffiles%2F6136515418e61a041d63583e%2F6136515418e61a041d63583e.png%3Fweb\"\n            }\n        ],\n        \"fileIds\": [\n            \"8wwwpv6ex6\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8wwwpv6ex6\",\n                \"createdAt\": \"2022-02-19T04:30:19.670Z\",\n                \"name\": \"D556EB85-FF92-4592-B5F4-909F221C98D4.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"md5\": \"f20b1343b469a36ac0e7c5736926a406\",\n                \"size\": 4090988,\n                \"isSensitive\": false,\n                \"blurhash\": \"yRG+UNM{ads:E1ofM|_Nt5adIUjYRjRj?cIVM_aeM|Rjay.9M{V?M{WAocRj?bayRjaeoJRkjZ?bj[ofj?Rjofax%MWAfQayj@oeRj\",\n                \"properties\": {\n                    \"width\": 4032,\n                    \"height\": 3024\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-04603751-9ed4-44e9-81a8-462f31ce6cde.jpg\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-9ea18611-136c-4443-b782-293a627c7a97.jpg\",\n                \"comment\": null,\n                \"folderId\": null,\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8wwscscb12\",\n        \"createdAt\": \"2022-02-19T02:28:11.003Z\",\n        \"userId\": \"86p1tmjaav\",\n        \"user\": {\n            \"id\": \"86p1tmjaav\",\n            \"name\": \"みれい (1,650km・5.9E+16t)\",\n            \"username\": \"Mi\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-6c009d3c-e7cd-4f55-96a4-2f1b99670f4c.jpg\",\n            \"avatarBlurhash\": \"yiKLUEof*0kW.8t7RjI;ay-pofIUWBoex^ayayM{bIadWBjZofjsV?bHbHWBtRxvfPoKbHWBayoft7f6RjbHt7ayjt\",\n            \"avatarColor\": null,\n            \"emojis\": [],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"1,650kmのみれいさん Vs. 日本列島\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 8,\n        \"repliesCount\": 3,\n        \"reactions\": {\n            \"👍\": 4,\n            \"🤔\": 1,\n            \":cyber_hacking@.:\": 2,\n            \":ablobdundundun@.:\": 2,\n            \":confusedparrot@fedibird.com:\": 1,\n            \":octothink@misky.rikunagiweb.jp:\": 1\n        },\n        \"emojis\": [\n            {\n                \"name\": \"cyber_hacking@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/f4ace218-272f-49e7-8813-66f47db9efba\"\n            },\n            {\n                \"name\": \"ablobdundundun@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/c62c5cef-b9c0-4d8f-b0ce-2e2a358abe9a.gif\"\n            },\n            {\n                \"name\": \"confusedparrot@fedibird.com\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fs3.fedibird.com%2Fcustom_emojis%2Fimages%2F000%2F049%2F092%2Foriginal%2Fdbdc78a4a85a4b50.gif\"\n            },\n            {\n                \"name\": \"octothink@misky.rikunagiweb.jp\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmedia-misky.rikunagiweb.jp%2Fmedia%2Fwebpublic-9511a7bf-1cbd-46c5-a0f5-481f8617d1e1.png\"\n            }\n        ],\n        \"fileIds\": [\n            \"8wwsccpzeq\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8wwsccpzeq\",\n                \"createdAt\": \"2022-02-19T02:27:50.759Z\",\n                \"name\": \"みれいさん.png\",\n                \"type\": \"image/png\",\n                \"md5\": \"cfd22a363a7829a356f860499e636081\",\n                \"size\": 2034258,\n                \"isSensitive\": true,\n                \"blurhash\": \"y97K|^_LM{IoofWCaz-.xsoet7s:RjRjR%axs:oNoftQoxtQt7RkIVNFt7t7IVayxukCNGWBj[ayj?jZWBoft7f8xtofR%bFoyf8a#\",\n                \"properties\": {\n                    \"width\": 1658,\n                    \"height\": 981\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-fec77b5e-f322-47b8-b063-e1830c835f9f.png\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-0c309337-dcb1-44a5-bd78-8e4b625adacb.png\",\n                \"comment\": null,\n                \"folderId\": null,\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8ww3dhb07s\",\n        \"createdAt\": \"2022-02-18T14:48:52.956Z\",\n        \"userId\": \"7rkrarq81i\",\n        \"user\": {\n            \"id\": \"7rkrarq81i\",\n            \"name\": \"しゅいろ\",\n            \"username\": \"syuilo\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-c7721442-e698-4635-a662-57d78856bbc0.jpg\",\n            \"avatarBlurhash\": \"yFF5Kq0L00?a^*IBNG01^j-pV@D*o|xt58WB}@9at7s.Ip~AWB57%Laes:xaOEoLnis:ofIpoJr?NHtRV@oLoeNHNI%1M{kCWCjuxZ\",\n            \"avatarColor\": null,\n            \"isModerator\": true,\n            \"isCat\": true,\n            \"emojis\": [],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"テストが3時間経っても終わらにゃいの:ijo:\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 3,\n        \"repliesCount\": 0,\n        \"reactions\": {\n            \"⭐\": 6,\n            \"👍\": 5,\n            \":ijo@.:\": 3,\n            \":yabaiwayo@.:\": 1,\n            \":senko_stop@.:\": 1,\n            \":ijo@sushi.ski:\": 1,\n            \":issue@msk.minetaro12.com:\": 1\n        },\n        \"emojis\": [\n            {\n                \"name\": \"ijo\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-085c1e56-1157-4c7a-9b93-b43be4f7d7ef.png\"\n            },\n            {\n                \"name\": \"ijo@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-085c1e56-1157-4c7a-9b93-b43be4f7d7ef.png\"\n            },\n            {\n                \"name\": \"yabaiwayo@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-4c3e962c-2b2a-48fa-845b-a0822eef733d.png\"\n            },\n            {\n                \"name\": \"senko_stop@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-d600ad33-561c-4f39-a103-9772529395a9.png\"\n            },\n            {\n                \"name\": \"ijo@sushi.ski\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmedia.sushi.ski%2Ffiles%2Fwebpublic-3678f3f9-727d-4d07-85b0-b9d46d9cd88f.png\"\n            },\n            {\n                \"name\": \"issue@msk.minetaro12.com\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmsk.minetaro12.com%2Ffiles%2Fwebpublic-ef33fbde-c155-44a4-a529-ff4515d01873\"\n            }\n        ],\n        \"fileIds\": [\n            \"8ww3cxdn8i\"\n        ],\n        \"files\": [\n            {\n                \"id\": \"8ww3cxdn8i\",\n                \"createdAt\": \"2022-02-18T14:48:27.131Z\",\n                \"name\": \"スクリーンショット 2022-02-18 23.47.40.png\",\n                \"type\": \"image/png\",\n                \"md5\": \"c6d0fec428c2a5cc0f8640a3b89b9660\",\n                \"size\": 264526,\n                \"isSensitive\": false,\n                \"blurhash\": \"y01.]T%NRiadV?ofofozt7%gt8xuWAM{ITt8x]j]WBWBfjV[bJM{ogWBWCt7M{t8RkRPofayj]xvaxt7ozWAaxRj%Noet7jYaef6ay\",\n                \"properties\": {\n                    \"width\": 2352,\n                    \"height\": 1088\n                },\n                \"url\": \"https://s3.arkjp.net/misskey/webpublic-25dea5e7-606c-40f8-af49-db39a39b3eda.png\",\n                \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/thumbnail-59e4906d-c198-4cf3-92be-91925a629a1b.jpg\",\n                \"comment\": null,\n                \"folderId\": null,\n                \"folder\": null,\n                \"userId\": null,\n                \"user\": null\n            }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null\n    },\n    {\n        \"id\": \"8ww36oo3vw\",\n        \"createdAt\": \"2022-02-18T14:43:35.907Z\",\n        \"userId\": \"7rkrarq81i\",\n        \"user\": {\n            \"id\": \"7rkrarq81i\",\n            \"name\": \"しゅいろ\",\n            \"username\": \"syuilo\",\n            \"host\": null,\n            \"avatarUrl\": \"https://s3.arkjp.net/misskey/thumbnail-c7721442-e698-4635-a662-57d78856bbc0.jpg\",\n            \"avatarBlurhash\": \"yFF5Kq0L00?a^*IBNG01^j-pV@D*o|xt58WB}@9at7s.Ip~AWB57%Laes:xaOEoLnis:ofIpoJr?NHtRV@oLoeNHNI%1M{kCWCjuxZ\",\n            \"avatarColor\": null,\n            \"isModerator\": true,\n            \"isCat\": true,\n            \"emojis\": [],\n            \"onlineStatus\": \"online\"\n        },\n        \"text\": \"カーリング決勝進出:supertada:\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 0,\n        \"repliesCount\": 0,\n        \"reactions\": {\n            \"⭐\": 3,\n            \"🎉\": 3,\n            \"🏅\": 3,\n            \"👍\": 4,\n            \":blobhai@.:\": 1,\n            \":iihanashi@.:\": 2,\n            \":supertada@.:\": 3,\n            \":supertada@sushi.ski:\": 1,\n            \":supertada@friendsyu.me:\": 1,\n            \":supertada@kokonect.link:\": 1,\n            \":supertada@kr.akirin.xyz:\": 1,\n            \":supertada@mk.lei202.com:\": 1\n        },\n        \"emojis\": [\n            {\n                \"name\": \"supertada\",\n                \"url\": \"https://s3.arkjp.net/misskey/e9794209-1544-47ec-b510-e37bfdd46653\"\n            },\n            {\n                \"name\": \"blobhai@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/b607fc20-fda7-445b-b13f-37f65c3088b0.gif\"\n            },\n            {\n                \"name\": \"iihanashi@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/013cf04e-a057-4aed-ab40-4e0ea97b1aa2.gif\"\n            },\n            {\n                \"name\": \"supertada@.\",\n                \"url\": \"https://s3.arkjp.net/misskey/e9794209-1544-47ec-b510-e37bfdd46653\"\n            },\n            {\n                \"name\": \"supertada@sushi.ski\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmedia.sushi.ski%2Ffiles%2Fc9d25514-0441-451b-9767-f2d565813086.gif\"\n            },\n            {\n                \"name\": \"supertada@friendsyu.me\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Ffriendsyu.me%2Ffiles%2F603253784d88a20c37091e8a%2F603253784d88a20c37091e8a.gif%3Fweb\"\n            },\n            {\n                \"name\": \"supertada@kokonect.link\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fs3.kokonect.link%2Fkokonect%2Ffiles%2F5b58035a-7361-428c-9c07-b93c64a47ef7\"\n            },\n            {\n                \"name\": \"supertada@kr.akirin.xyz\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fkr.akirin.xyz%2Ffiles%2F06026776-ef40-47da-9072-cbd4d7095ec8%2F06026776-ef40-47da-9072-cbd4d7095ec8.gif\"\n            },\n            {\n                \"name\": \"supertada@mk.lei202.com\",\n                \"url\": \"https://misskey.io/proxy/image.png?url=https%3A%2F%2Fmk.lei202.com%2Ffiles%2F61a24f86acd966bdedae96e6%2F61a24f86acd966bdedae96e6%3Fweb\"\n            }\n        ],\n        \"fileIds\": [],\n        \"files\": [],\n        \"replyId\": null,\n        \"renoteId\": null\n    }\n]\"\"\"\n        val builder = Json {\n            ignoreUnknownKeys = true\n        }\n        val noteDTO: List<NoteDTO> = builder.decodeFromString(jsonStr)\n        Assertions.assertNotNull(noteDTO)\n\n    }\n\n    @Test\n    fun decodeArrayTypeEmoji() {\n        val builder = Json {\n            ignoreUnknownKeys = true\n        }\n        val json1 = \"\"\"\n            [{\"name\": \"hoge\", \"url\": \"https://example.com\"}]\n        \"\"\".trimIndent()\n        val result = builder.decodeFromString<EmojisType>(json1)\n        Assertions.assertEquals(EmojisType.TypeArray(listOf(CustomEmojiNetworkDTO(name = \"hoge\", url = \"https://example.com\"))), result)\n\n    }\n\n    @Test\n    fun decodeObjectTypeEmoji() {\n        val builder = Json {\n            ignoreUnknownKeys = true\n        }\n        val json1 = \"\"\"\n            {\"hoge\": \"https://example.com\", \"piyo\": \"https://misskey.io\"}\n        \"\"\".trimIndent()\n        val result = builder.decodeFromString<EmojisType>(json1)\n\n        Assertions.assertEquals(EmojisType.TypeObject(mapOf(\"hoge\" to \"https://example.com\", \"piyo\" to \"https://misskey.io\")), result)\n    }\n\n    @Test\n    fun decodeFunckingObject() {\n        val builder = Json {\n            ignoreUnknownKeys = true\n        }\n        val json1 = \"\"\"\n            {\"emojis\": [{\"name\": \"hoge\", \"url\": \"https://example.com\"}]}\n        \"\"\".trimIndent()\n        val result = builder.decodeFromString<TestNoteObject>(json1)\n        Assertions.assertEquals(TestNoteObject(EmojisType.TypeArray(\n            listOf(CustomEmojiNetworkDTO(name = \"hoge\", url = \"https://example.com\"))\n        )), result)\n    }\n\n    @Test\n    fun decodeEmptyObject() {\n        val builder = Json {\n            ignoreUnknownKeys = true\n        }\n        val json1 = \"\"\"\n            {\"emojis\": {}}\n        \"\"\".trimIndent()\n        val result = builder.decodeFromString<TestNoteObject>(json1)\n\n        Assertions.assertEquals(TestNoteObject(EmojisType.TypeObject(emptyMap())), result)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/logger/TestLogger.kt",
    "content": "package jp.panta.misskeyandroidclient.logger\n\nimport net.pantasystem.milktea.common.Logger\n\nclass TestLogger(\n    override val defaultTag: String\n) : Logger {\n\n    override fun debug(msg: String, tag: String, e: Throwable?) {\n        println(\"debug:$tag:$msg, error:$e\")\n    }\n\n    override fun debug(tag: String, e: Throwable?, message: () -> String) {\n        println(\"debug:$tag:${message()}, error:$e\")\n    }\n\n    override fun error(msg: String, e: Throwable?, tag: String) {\n        println(\"error:$tag:$msg, error:$e\")\n    }\n\n    override fun info(msg: String, tag: String, e: Throwable?) {\n        println(\"info:$tag:$msg, error:$e\")\n    }\n\n    override fun warning(msg: String, tag: String, e: Throwable?) {\n        println(\"warning:$tag:$msg, error:$e\")\n\n    }\n\n    class Factory : Logger.Factory{\n        override fun create(tag: String): Logger {\n            return TestLogger(tag)\n        }\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/account/AccountInstanceTypeConverterTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.account\n\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountInstanceTypeConverter\nimport net.pantasystem.milktea.model.account.Account\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\nclass AccountInstanceTypeConverterTest {\n\n    @Test\n    fun convertFromEnum() {\n        val converter = AccountInstanceTypeConverter()\n        assertEquals(\"misskey\", converter.convert(Account.InstanceType.MISSKEY))\n        assertEquals(\"mastodon\", converter.convert(Account.InstanceType.MASTODON))\n    }\n\n    @Test\n    fun convertFromString() {\n        val converter = AccountInstanceTypeConverter()\n        assertEquals(Account.InstanceType.MASTODON, converter.convert(\"mastodon\"))\n        assertEquals(Account.InstanceType.MISSKEY, converter.convert(\"misskey\"))\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/account/AccountStateTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.account\n\nimport net.pantasystem.milktea.app_store.account.AccountState\nimport net.pantasystem.milktea.model.account.Account\nimport org.junit.jupiter.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\n\nclass AccountStateTest {\n\n    @Test\n    fun getCurrentAccount() {\n        val accountState = AccountState(\n            isLoading = false,\n            accounts = (1..4).map {\n                Account(\n                    \"id:$it\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = it.toLong())\n            },\n            currentAccountId = 1L\n        )\n        assertEquals(1L, accountState.currentAccount?.accountId)\n\n        val changedAccountState = accountState.copy(currentAccountId = 2)\n        assertEquals(2L, changedAccountState.currentAccount?.accountId)\n\n    }\n\n    @Test\n    fun getAccountWhenInvalidCurrentAccountId() {\n        val accountState = AccountState(\n            isLoading = false,\n            accounts = (1..4).map {\n                Account(\n                    \"id:$it\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = it.toLong())\n            },\n            currentAccountId = 1000L\n        )\n        assertEquals(accountState.accounts.first(), accountState.currentAccount)\n    }\n\n    @Test\n    fun isUnauthorized() {\n        var accountState = AccountState()\n        assertFalse(accountState.isUnauthorized)\n        accountState = accountState.copy(isLoading = false)\n        assertTrue(accountState.isUnauthorized)\n    }\n\n    @Test\n    fun isUnauthorizedWhenHasAccount() {\n        var accountState = AccountState(\n            isLoading = false,\n            accounts = (1..4).map {\n                Account(\n                    \"id:$it\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = it.toLong())\n            },\n            currentAccountId = 1L\n        )\n        assertFalse(accountState.isUnauthorized)\n        accountState = accountState.copy(isLoading = false)\n        assertFalse(accountState.isUnauthorized)\n    }\n\n    @Test\n    fun hasAccount() {\n        val accountState = AccountState(\n            isLoading = false,\n            accounts = (1..4).map {\n                Account(\n                    \"id:$it\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = it.toLong())\n            },\n            currentAccountId = 1L\n        )\n        assertTrue(accountState.hasAccount(accountState.accounts.first()))\n        assertFalse(\n            accountState.hasAccount(\n                Account(\n                    \"id:100\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = 1000L)\n            )\n        )\n    }\n\n    @Test\n    fun add() {\n        val accountState = AccountState(\n            isLoading = false,\n            accounts = (1..4).map {\n                Account(\n                    \"id:$it\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = it.toLong())\n            },\n            currentAccountId = 1L\n        )\n        val addedState = accountState.add(\n            Account(\n                \"id:10\",\n                \"host\",\n                \"name\",\n                Account.InstanceType.MISSKEY,\n                \"\"\n            ).copy(accountId = 100L)\n        )\n        assertEquals(100L, addedState.accounts.last().accountId)\n    }\n\n    @Test\n    fun addWhenUnauthorized() {\n        val state = AccountState(isLoading = false)\n        assertTrue(state.isUnauthorized)\n        val added = state.add(\n            Account(\n                \"id:10\",\n                \"host\",\n                \"name\",\n                Account.InstanceType.MISSKEY,\n                \"\"\n            ).copy(accountId = 100L)\n        )\n        assertFalse(added.isUnauthorized)\n        assertEquals(100L, added.accounts.first().accountId)\n        assertEquals(100L, added.currentAccountId)\n    }\n\n    @Test\n    fun addWhenAdded() {\n        val accountState = AccountState(\n            isLoading = false,\n            accounts = (1..4).map {\n                Account(\n                    \"id:$it\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = it.toLong())\n            },\n            currentAccountId = 1L\n        )\n        val updated = accountState.add(accountState.accounts.first())\n        assertEquals(accountState.accounts.size, updated.accounts.size)\n        assertEquals(accountState.accounts, updated.accounts)\n    }\n\n    @Test\n    fun delete() {\n        val accountState = AccountState(\n            isLoading = false,\n            accounts = (1..4).map {\n                Account(\n                    \"id:$it\",\n                    \"host\",\n                    \"name\",\n                    Account.InstanceType.MISSKEY,\n                    \"\"\n                ).copy(accountId = it.toLong())\n            },\n            currentAccountId = 1L\n        )\n        val deleted = accountState.delete(accountState.accounts.first().accountId)\n        assertArrayEquals(\n            (2L..4L).toList().toLongArray(),\n            deleted.accounts.map { it.accountId }.toLongArray()\n        )\n        assertNotEquals(deleted.currentAccountId, 1L)\n\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/account/AccountTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.account\n\nimport net.pantasystem.milktea.model.account.Account\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass AccountTest {\n\n\n    @Test\n    fun testGetInstanceDomainWhenHttps() {\n        val account = Account(\n            instanceDomain = \"https://example.com\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"example.com\", account.getHost())\n    }\n\n    @Test\n    fun testGetInstanceDomainWhenHttp() {\n        val account = Account(\n            instanceDomain = \"http://example.com\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"example.com\", account.getHost())\n    }\n\n    @Test\n    fun testGetInstanceDomainWhenSchemaLess() {\n        val account = Account(\n            instanceDomain = \"example.com\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"example.com\", account.getHost())\n    }\n\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveNormal() {\n        val account = Account(\n            instanceDomain = \"https://example.com\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://example.com\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveHasBackSlash() {\n        val account = Account(\n            instanceDomain = \"https://example.com/\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://example.com\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveHasPortNumber() {\n        val account = Account(\n            instanceDomain = \"https://example.com:8080/\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://example.com:8080\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveSchemaLess() {\n        val account = Account(\n            instanceDomain = \"example.com\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://example.com\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveHasHyphen() {\n        val account = Account(\n            instanceDomain = \"https://test-example.com\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://test-example.com\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveHasUnderScore() {\n        val account = Account(\n            instanceDomain = \"https://test_example.com\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://test_example.com\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_ManyBackSlash() {\n        val account = Account(\n            instanceDomain = \"https://////////////////////test_example.com \",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://test_example.com\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_HasWww() {\n        val account = Account(\n            instanceDomain = \"https://www.example.com \",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://www.example.com\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveSchemaLess2() {\n        val account = Account(\n            instanceDomain = \"//www.example.com \",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://www.example.com\", account.normalizedInstanceUri)\n    }\n\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveIllegalFormat() {\n        val account = Account(\n            instanceDomain = \"http://\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"http://\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveIpAddress() {\n        val account = Account(\n            instanceDomain = \"http://192.168.0.1\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"http://192.168.0.1\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveIpV6Address() {\n        val account = Account(\n            instanceDomain = \"http://[2001:db8:85a3::8a2e:370:7334]\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\n            \"http://[2001:db8:85a3::8a2e:370:7334]\",\n            account.normalizedInstanceUri\n        )\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_OtherProtocol() {\n        val account = Account(\n            instanceDomain = \"ftp://[2001:db8:85a3::8a2e:370:7334]\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\n            \"ftp://[2001:db8:85a3::8a2e:370:7334]\",\n            account.normalizedInstanceUri\n        )\n\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveJapaneseUrl() {\n        val account = Account(\n            instanceDomain = \"https:///みすきー.com:8080/\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://みすきー.com:8080\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveIllegalPattern() {\n        val account = Account(\n            instanceDomain = \"https:::::::::///////みすきー.com:8080////////\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://みすきー.com:8080\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveAcct() {\n        val account = Account(\n            instanceDomain = \"https://@Panta@misskey.io\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://misskey.io\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveAcctAndIllegalHost() {\n        val account = Account(\n            instanceDomain = \"https://@Panta@MisSkey.io\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://misskey.io\", account.normalizedInstanceUri)\n    }\n\n\n\n    @Test\n    fun getNormalizedInstanceDomain_GiveAcctCase2() {\n        val account = Account(\n            instanceDomain = \"https://@artyom24@misskey.io\",\n            userName = \"\",\n            token = \"\",\n            remoteId = \"remoteId\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n        Assertions.assertEquals(\"https://misskey.io\", account.normalizedInstanceUri)\n    }\n\n    @Test\n    fun getGetHost_GiveSubdomainCase1() {\n        val account = Account(\n            remoteId = \"\",\n            instanceDomain = \"https://mk.iaia.moe\",\n            userName = \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        )\n        Assertions.assertEquals(\"mk.iaia.moe\", account.getHost())\n    }\n\n    @Test\n    fun getAcct() {\n        val account = Account(\n            remoteId = \"\",\n            instanceDomain = \"https://calc.panta.systems\",\n            userName = \"Panta\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        )\n        val actual = account.getAcct()\n        Assertions.assertEquals(\"@Panta@calc.panta.systems\", actual)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/account/MakeDefaultPagesUseCaseTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.account\n\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.MakeDefaultPagesUseCase\nimport net.pantasystem.milktea.model.account.PageDefaultStringsJp\nimport net.pantasystem.milktea.model.account.page.PageType\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\n\n\nclass MakeDefaultPagesUseCaseTest {\n\n    @Test\n    fun disableGlobalTimeline() = runTest {\n        val account = Account(\n            \"remoteId\",\n            \"https://misskey.io\",\n            \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            \"\",\n        )\n        val meta = Meta(\n            \"\",\n            disableGlobalTimeline = true,\n            disableLocalTimeline = false,\n        )\n        val nodeInfo = NodeInfo(\n            host = \"\", version = \"\", software = NodeInfo.Software(\n                name = \"misskey\",\n                version = \"\"\n            )\n        )\n        val makeDefaultPagesUseCase = MakeDefaultPagesUseCase(\n            PageDefaultStringsJp(),\n            mock() {\n                on {\n                    get(any())\n                } doReturn nodeInfo\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(nodeInfo)\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(meta)\n            },\n        )\n        val pages = makeDefaultPagesUseCase(account)\n        assertEquals(3, pages.size)\n        val types = pages.map {\n            it.pageParams.type\n        }.sorted()\n        assertEquals(listOf(PageType.SOCIAL, PageType.SOCIAL, PageType.HOME).sorted(), types)\n        assertEquals(\n            listOf(\n                Pageable.HomeTimeline(),\n                Pageable.HybridTimeline(),\n                Pageable.HybridTimeline(withFiles = true)\n            ),\n            pages.map {\n                it.pageable()\n            }\n        )\n    }\n\n    @Test\n    fun disableLocalTimeline() = runTest {\n        val account = Account(\n            \"remoteId\",\n            \"https://misskey.io\",\n            \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            \"\",\n        )\n        val meta = Meta(\n            \"\",\n            disableGlobalTimeline = false,\n            disableLocalTimeline = true,\n        )\n        val nodeInfo = NodeInfo(\n            host = \"\", version = \"\", software = NodeInfo.Software(\n                name = \"misskey\",\n                version = \"\"\n            )\n        )\n        val makeDefaultPagesUseCase = MakeDefaultPagesUseCase(\n            PageDefaultStringsJp(),\n            mock() {\n                on {\n                    get(any())\n                } doReturn nodeInfo\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(nodeInfo)\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(meta)\n            },\n        )\n\n        val pages = makeDefaultPagesUseCase(account)\n        assertEquals(3, pages.size)\n        val types = pages.map {\n            it.pageParams.type\n        }.sorted()\n        assertEquals(listOf(PageType.GLOBAL, PageType.HOME, PageType.HOME).sorted(), types)\n        assertEquals(\n            listOf(\n                Pageable.HomeTimeline(),\n                Pageable.HomeTimeline(withFiles = true),\n                Pageable.GlobalTimeline()\n            ),\n            pages.map {\n                it.pageable()\n            }\n        )\n    }\n\n    @Test\n    fun onlyEnableHomeTimeline() = runTest {\n        val account = Account(\n            \"remoteId\",\n            \"https://misskey.io\",\n            \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            \"\",\n        )\n        val meta = Meta(\n            \"\",\n            disableGlobalTimeline = true,\n            disableLocalTimeline = true,\n        )\n        val nodeInfo = NodeInfo(\n            host = \"\", version = \"\", software = NodeInfo.Software(\n                name = \"misskey\",\n                version = \"\"\n            )\n        )\n        val makeDefaultPagesUseCase = MakeDefaultPagesUseCase(\n            PageDefaultStringsJp(),\n            mock() {\n                on {\n                    get(any())\n                } doReturn nodeInfo\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(nodeInfo)\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(meta)\n            },\n        )\n\n\n        val pages = makeDefaultPagesUseCase(account)\n        assertEquals(2, pages.size)\n        val types = pages.map {\n            it.pageParams.type\n        }.sorted()\n        assertEquals(listOf(PageType.HOME, PageType.HOME), types)\n        assertEquals(\n            listOf(Pageable.HomeTimeline(), Pageable.HomeTimeline(withFiles = true)),\n            pages.map {\n                it.pageable()\n            }\n        )\n    }\n\n    @Test\n    fun enabledAll() = runTest {\n        val meta = Meta(\n            \"\",\n            disableGlobalTimeline = false,\n            disableLocalTimeline = false,\n        )\n        val account = Account(\n            \"remoteId\",\n            \"https://misskey.io\",\n            \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            \"\",\n        )\n        val nodeInfo = NodeInfo(\n            host = \"\", version = \"\", software = NodeInfo.Software(\n                name = \"misskey\",\n                version = \"\"\n            )\n        )\n        val makeDefaultPagesUseCase = MakeDefaultPagesUseCase(\n            PageDefaultStringsJp(),\n            mock() {\n                on {\n                    get(any())\n                } doReturn nodeInfo\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(nodeInfo)\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(meta)\n            },\n        )\n        val pages = makeDefaultPagesUseCase(account)\n        assertEquals(4, pages.size)\n        val types = pages.map {\n            it.pageParams.type\n        }.sorted()\n        assertEquals(\n            listOf(\n                PageType.HOME,\n                PageType.SOCIAL,\n                PageType.GLOBAL,\n                PageType.SOCIAL\n            ).sorted(), types\n        )\n        assertEquals(\n            listOf(\n                Pageable.HomeTimeline(),\n                Pageable.HybridTimeline(),\n                Pageable.HybridTimeline(withFiles = true),\n                Pageable.GlobalTimeline()\n            ),\n            pages.map {\n                it.pageable()\n            }\n        )\n    }\n\n    @Test\n    fun weightIncrementedByOrder() = runTest {\n        val meta = Meta(\n            \"\",\n            disableGlobalTimeline = false,\n            disableLocalTimeline = false,\n        )\n        val account = Account(\n            \"remoteId\",\n            \"https://misskey.io\",\n            \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            \"\",\n        )\n        val nodeInfo = NodeInfo(\n            host = \"\", version = \"\", software = NodeInfo.Software(\n                name = \"misskey\",\n                version = \"\"\n            )\n        )\n        val makeDefaultPagesUseCase = MakeDefaultPagesUseCase(\n            PageDefaultStringsJp(),\n            mock() {\n                on {\n                    get(any())\n                } doReturn nodeInfo\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(nodeInfo)\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(meta)\n            },\n        )\n\n        val pages = makeDefaultPagesUseCase(account)\n        pages.forEachIndexed { index, page ->\n            assertEquals(index, page.weight)\n        }\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/account/TestAccountRepository.kt",
    "content": "package jp.panta.misskeyandroidclient.model.account\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountNotFoundException\nimport net.pantasystem.milktea.model.account.AccountRepository\n\nclass TestAccountRepository : AccountRepository {\n\n    val accounts = mutableMapOf(\n        1L to Account(\n            \"remote1\",\n            \"test.misskey.jp\",\n            \"test1\",\n            \"token\",\n            emptyList(),\n            Account.InstanceType.MISSKEY,\n            1\n        ),\n        2L to Account(\n            \"remote2\",\n            \"test.misskey.jp\",\n            \"test2\",\n            \"token\",\n            emptyList(),\n            Account.InstanceType.MISSKEY,\n            2\n        ),\n        3L to Account(\n            \"remote3\",\n            \"test.misskey.jp\",\n            \"test1\",\n            \"token\",\n            emptyList(),\n            Account.InstanceType.MISSKEY,\n            3\n        )\n    )\n\n    private var currentAccountId = 1L\n\n    override suspend fun add(account: Account, isUpdatePages: Boolean): Result<Account> {\n        val ac = account.copy(\n            accountId = accounts.size.toLong()\n        )\n        accounts[accounts.size.toLong()] = ac\n        return Result.success(ac)\n    }\n\n    override fun addEventListener(listener: AccountRepository.Listener) {\n\n    }\n\n    override fun removeEventListener(listener: AccountRepository.Listener) {\n\n    }\n\n    override suspend fun delete(account: Account) {\n        accounts.remove(account.accountId)\n    }\n\n    override suspend fun findAll(): Result<List<Account>> {\n        return runCancellableCatching {\n            accounts.values.toList()\n        }\n    }\n\n    override suspend fun get(accountId: Long): Result<Account> {\n        return runCancellableCatching {\n            accounts[accountId]?: throw AccountNotFoundException()\n        }\n    }\n\n    override suspend fun getCurrentAccount(): Result<Account> {\n        return get(currentAccountId)\n    }\n\n    override suspend fun setCurrentAccount(account: Account): Result<Account> {\n        currentAccountId = account.accountId\n        return Result.success(account)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/account/page/PageableChannelTimelineTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.account.page\n\nimport net.pantasystem.milktea.data.infrastructure.note.toNoteRequest\nimport net.pantasystem.milktea.model.account.page.PageType\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Assertions.assertNotNull\nimport org.junit.jupiter.api.Test\n\n\n\nclass PageableChannelTimelineTest {\n\n    @Test\n    fun toParams() {\n        val pageable = Pageable.ChannelTimeline(channelId = \"channelId\")\n        assertNotNull(pageable.toParams().channelId)\n        assertEquals(\"channelId\", pageable.toParams().channelId)\n        assertEquals(PageType.CHANNEL_TIMELINE, pageable.toParams().type)\n    }\n\n    @Test\n    fun makeNoteRequest() {\n        val pageable = Pageable.ChannelTimeline(channelId = \"channelId\")\n        val request = pageable.toParams().toNoteRequest(\"test\")\n        assertNotNull(request.channelId)\n        assertEquals(\"channelId\", request.channelId)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/api/GetUsersTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.api\n\nclass GetUsersTest {\n\n//    private lateinit var misskeyAPI: MisskeyAPI\n//    @Before\n//    fun setup(){\n//        misskeyAPI = MisskeyAPIServiceBuilder.build(\"https://misskey.m544.net\", Version(\"v10\"))\n//    }\n//\n//    @Test\n//    suspend fun ascFollower(){\n//        val res = misskeyAPI.getUsers(\n//            RequestUser(\n//                null,\n//                origin = RequestUser.Origin.LOCAL.origin,\n//                sort = RequestUser.Sort().follower().asc(),\n//                state = RequestUser.State.ALIVE.state\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//        val list = res.body()\n//        println(list?.map{\n//            it.displayName + \"\\n\"\n//\n//        })\n//        Assert.assertNotEquals(list, null)\n//    }\n//\n//    @Test\n//    suspend fun ascUpdatedAt(){\n//        val res = misskeyAPI.getUsers(\n//            RequestUser(\n//                null,\n//                origin = RequestUser.Origin.LOCAL.origin,\n//                sort = RequestUser.Sort().updatedAt().asc()\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//        val list = res.body()\n//        println(list?.map{\n//            it.displayName + \"\\n\"\n//\n//        })\n//        Assert.assertNotEquals(list, null)\n//    }\n//\n//    @Test\n//    suspend fun ascNewUser(){\n//\n//        val res = misskeyAPI.getUsers(\n//            RequestUser(\n//                null,\n//                origin = RequestUser.Origin.LOCAL.origin,\n//                sort = RequestUser.Sort().createdAt().asc(),\n//                state = RequestUser.State.ALIVE.state\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//        val list = res.body()\n//        println(list?.map{\n//            it.displayName + \"\\n\"\n//\n//        })\n//        Assert.assertNotEquals(list, null)\n//    }\n//\n//    @Test\n//    suspend fun remoteAscFollower(){\n//        val res = misskeyAPI.getUsers(\n//            RequestUser(\n//                null,\n//                origin = RequestUser.Origin.REMOTE.origin,\n//                sort = RequestUser.Sort().follower().asc(),\n//                state = RequestUser.State.ALIVE.state\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//        val list = res.body()\n//        println(list?.map{\n//            it.displayName + \"\\n\"\n//\n//        })\n//        Assert.assertNotEquals(list, null)\n//    }\n//\n//    @Test\n//    suspend fun remoteAscUpdatedAt(){\n//        val res = misskeyAPI.getUsers(\n//            RequestUser(\n//                null,\n//                origin = RequestUser.Origin.COMBINED.origin,\n//                sort = RequestUser.Sort().updatedAt().asc(),\n//                state = RequestUser.State.ALIVE.state\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//        val list = res.body()\n//        println(list?.map{\n//            it.displayName + \"\\n\"\n//\n//        })\n//        Assert.assertNotEquals(list, null)\n//    }\n//\n//    @Test\n//    suspend fun remoteNewUsers(){\n//        val res = misskeyAPI.getUsers(\n//            RequestUser(\n//                null,\n//                origin = RequestUser.Origin.COMBINED.origin,\n//                sort = RequestUser.Sort().createdAt().asc()\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//        val list = res.body()\n//        println(list?.map{\n//            it.displayName + \"\\n\"\n//        })\n//        Assert.assertNotEquals(list, null)\n//    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/api/HashTagListTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.api\n\nclass HashTagListTest {\n\n//    @Test\n//    suspend fun testM544(){\n//        val api  = MisskeyAPIServiceBuilder.build(\"https://misskey.m544.net\", Version(\"v10\"))\n//        val res = api.getHashTagList(\n//            RequestHashTagList(\n//                null,\n//                sort = RequestHashTagList.Sort().attachedLocalUsers().asc()\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//\n//        val list = res.body()\n//        println(list)\n//        Assert.assertNotEquals(list, null)\n//\n//\n//    }\n//\n//    @Test\n//    suspend fun testV11(){\n//        val api  = MisskeyAPIServiceBuilder.build(\"https://misskey.dev\", Version(\"v11\"))\n//        val res = api.getHashTagList(\n//            RequestHashTagList(\n//                null,\n//                sort = RequestHashTagList.Sort().attachedLocalUsers().asc()\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//\n//        val list = res.body()\n//        println(list)\n//        Assert.assertNotEquals(list, null)\n//\n//    }\n//\n//    @Test\n//    suspend fun testV12(){\n//        val api  = MisskeyAPIServiceBuilder.build(\"https://misskey.io\", Version(\"v12\"))\n//        val res = api.getHashTagList(\n//            RequestHashTagList(\n//                null,\n//                sort = RequestHashTagList.Sort().attachedLocalUsers().asc()\n//            )\n//        )\n//\n//        Assert.assertEquals(true, res.code() in 200 until 300)\n//\n//        val list = res.body()\n//        println(list)\n//        Assert.assertNotEquals(list, null)\n//    }\n\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/api/VersionTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.api\n\nimport net.pantasystem.milktea.model.instance.Version\nimport org.junit.jupiter.api.Test\n\n\nclass VersionTest{\n\n    @Test\n    fun comparisonVersionTest(){\n        val asSmallVersion = Version(\"11.45.14.30\")\n        val asLargeVersion = Version(\"11.46.18\")\n        assert(asSmallVersion < asLargeVersion)\n    }\n\n    @Test\n    fun equalSizeVersionTest(){\n        val version1 = Version(\"11.45.14\")\n        val version2 = Version(\"11.45.14\")\n        assert(version1 == version2)\n    }\n\n    @Test\n    fun rangeTest(){\n        val version = Version(\"12.00.1\")\n\n        assert(version > Version(\"12\") && version < Version(\"13\"))\n        assert(version.isUntilRange(Version(\"12\"), Version(\"13\")))\n\n    }\n\n\n    @Test\n    fun calendarVersionTest() {\n        val version = Version(\"2023.8.0\")\n        assert(version > Version(\"13.14.2\"))\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/channel/ChannelStateTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.channel\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.ChannelState\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\n\nclass ChannelStateTest {\n\n    @Test\n    fun add() {\n        var state = ChannelState(emptyMap())\n        val channel = generateChannel(Channel.Id(0, \"id\"), \"name\")\n        state = state.add(channel)\n        assertEquals(1, state.channels.size)\n\n    }\n\n    @Test\n    fun addAll() {\n        var state = ChannelState(\n            (0 until 10).associate {\n                Channel.Id(0, \"id$it\") to generateChannel(Channel.Id(0, \"id$it\"), it.toString())\n            }\n        )\n\n        val channels = (0 until 10).map {\n            generateChannel(Channel.Id(0, \"id-$it\"), it.toString())\n        }\n        state = state.addAll(channels)\n        assertEquals(20, state.channels.size)\n    }\n\n    @Test\n    fun remove() {\n        var state = ChannelState(\n            (0 until 10).associate {\n                Channel.Id(0, \"id$it\") to generateChannel(Channel.Id(0, \"id$it\"), it.toString())\n            }\n        )\n\n        assertNotNull(state.get(Channel.Id(0, \"id0\")))\n        state = state.remove(Channel.Id(0, \"id0\"))\n        assertNull(state.get(Channel.Id(0, \"id0\")))\n    }\n\n    @Test\n    fun get() {\n        var state = ChannelState(emptyMap())\n        val channel = generateChannel(Channel.Id(0, \"id\"), \"name\")\n        state = state.add(channel)\n        state = state.add(generateChannel(Channel.Id(0, \"id2\"), \"name\"))\n        assertEquals(channel, state.get(channel.id))\n    }\n\n    @Test\n    fun getIn() {\n        val state = ChannelState(\n            (0 until 10).associate {\n                Channel.Id(0, \"id$it\") to generateChannel(Channel.Id(0, \"id$it\"), it.toString())\n            }\n        )\n        val ids = listOf(\n            Channel.Id(0, \"id0\"),\n            Channel.Id(0, \"id2\")\n        )\n\n        val list = state.getIn(ids)\n        assertEquals(2, list.size)\n        assertTrue(list.any { it.id == ids[0] })\n        assertTrue(list.any { it.id == ids[1] })\n\n    }\n\n\n    private fun generateChannel(id: Channel.Id, name: String): Channel {\n        return Channel(\n            id = id,\n            name = name,\n            description = null,\n            bannerUrl = null,\n            createdAt = Clock.System.now(),\n            hasUnreadNote = null,\n            isFollowing = null,\n            lastNotedAt = null,\n            notesCount = 0,\n            usersCount = 0,\n            userId = User.Id(id.accountId, \"userId\"),\n            allowRenoteToExternal = true,\n        )\n    }\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/file/AppFileTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.file\n\nimport net.pantasystem.milktea.model.file.AppFile\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\n\nclass AppFileTest {\n\n    @Test\n    fun isAttributeSame() {\n        val file1 = AppFile.Local(\"test\", \"/test/test3\", \"image/jpeg\", null, false, null, 0, null)\n        val file2 = file1.copy()\n        assertTrue(file1.isAttributeSame(file2))\n\n        val file3 = file1.copy(name = \"test1\")\n        assertFalse(file3.isAttributeSame(file1))\n\n        assertFalse(file1.copy(path = \"/test/test\").isAttributeSame(file1))\n\n        assertFalse(file1.copy(type = \"video/mp4\").isAttributeSame(file1))\n        assertTrue(file1.copy(isSensitive = true).isAttributeSame(file1))\n        assertTrue(file1.copy(folderId = \"hoge\").isAttributeSame(file1))\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/instance/MetaCacheTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.instance\n\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.data.infrastructure.instance.MetaCache\nimport net.pantasystem.milktea.model.instance.Meta\nimport org.junit.jupiter.api.Assertions.assertNotNull\nimport org.junit.jupiter.api.Assertions.assertNull\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\n\nclass MetaCacheTest {\n\n    lateinit var metaCache: MetaCache\n\n    @BeforeEach\n    fun setup() {\n        metaCache = MetaCache()\n    }\n\n    @Test\n    fun put() {\n        runBlocking {\n            metaCache.put(\"https://misskey.io\", Meta(\"https://misskey.io\"))\n            assertNotNull(metaCache.get(\"https://misskey.io\"))\n        }\n    }\n\n    @Test\n    fun get() {\n        assertNull(metaCache.get(\"https://misskey.io\"))\n        runBlocking {\n            metaCache.put(\"https://misskey.io\", Meta(\"https://misskey.io\"))\n        }\n        assertNotNull(metaCache.get(\"https://misskey.io\"))\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/notes/impl/InMemoryNoteDataSourceTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.notes.impl\n\nimport jp.panta.misskeyandroidclient.logger.TestLogger\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.data.infrastructure.note.impl.InMemoryNoteDataSource\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.make\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass InMemoryNoteDataSourceTest {\n\n    private lateinit var loggerFactory: Logger.Factory\n    private lateinit var account: Account\n\n    @BeforeEach\n    fun setUp() {\n        loggerFactory = TestLogger.Factory()\n        account = Account(\n            remoteId = \"piyo\",\n            instanceDomain = \"\",\n            token = \"\",\n            userName = \"piyoName\",\n            instanceType = Account.InstanceType.MISSKEY\n        )\n    }\n\n    @Test\n    fun testAdd() {\n        val noteDataSource = InMemoryNoteDataSource(MemoryCacheCleaner())\n\n        val note = Note.make(\n            Note.Id(0L, \"\"),\n            userId = User.Id(0L, \"\"),\n        )\n        runBlocking {\n            val result = noteDataSource.add(\n                note\n            ).getOrThrow()\n            delay(10)\n\n            assertEquals(AddResult.Created, result)\n            delay(10)\n\n            assertEquals(AddResult.Updated, noteDataSource.add(note).getOrThrow())\n            delay(10)\n\n\n        }\n\n    }\n\n\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/notes/impl/NoteCaptureAPIAdapterTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.notes.impl\n\n\nimport jp.panta.misskeyandroidclient.logger.TestLogger\nimport jp.panta.misskeyandroidclient.model.account.TestAccountRepository\nimport jp.panta.misskeyandroidclient.streaming.TestSocketWithAccountProviderImpl\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.api_streaming.NoteCaptureAPIImpl\nimport net.pantasystem.milktea.api_streaming.NoteUpdated\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.data.infrastructure.note.NoteCaptureAPIWithAccountProviderImpl\nimport net.pantasystem.milktea.data.infrastructure.note.impl.InMemoryNoteDataSource\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.make\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass NoteCaptureAPIAdapterTest {\n\n    private lateinit var loggerFactory: Logger.Factory\n    private lateinit var accountRepository: AccountRepository\n    private lateinit var noteDataSource: NoteDataSource\n\n    @BeforeEach\n    fun setUp() {\n        loggerFactory = TestLogger.Factory()\n        accountRepository = TestAccountRepository()\n        noteDataSource = InMemoryNoteDataSource(MemoryCacheCleaner())\n    }\n\n    @ExperimentalCoroutinesApi\n    @Test\n    fun testCapture() {\n        val noteCaptureAPIWithAccountProvider =\n            NoteCaptureAPIWithAccountProviderImpl(\n                TestSocketWithAccountProviderImpl(),\n                loggerFactory\n            )\n\n\n//        val coroutineScope = CoroutineScope(Job())\n\n\n//        val noteCaptureAPIAdapter = NoteCaptureAPIAdapter(\n//            accountRepository = accountRepository,\n//            noteDataSource = noteDataSource,\n//            noteCaptureAPIWithAccountProvider = noteCaptureAPIWithAccountProvider,\n//            loggerFactory,\n//            coroutineScope\n//        )\n\n        runBlocking {\n\n            val account = accountRepository.getCurrentAccount().getOrThrow()\n            val noteCapture = noteCaptureAPIWithAccountProvider.get(account) as NoteCaptureAPIImpl\n\n            val note = Note.make(\n                id = Note.Id(account.accountId, \"note-1\"),\n                userId = User.Id(account.accountId, \"hoge\")\n            )\n            noteDataSource.add(\n                note\n            )\n\n            var counter = 1\n            noteDataSource.addEventListener {\n                if (it.noteId == note.id) {\n                    assertEquals(\n                        1,\n                        (it as NoteDataSource.Event.Updated).note.reactionCounts[0].count\n                    )\n                    counter++\n                }\n            }\n\n            noteCapture.onMessage(\n                NoteUpdated(\n                    NoteUpdated.Body.Reacted(\n                        id = note.id.noteId,\n                        body = NoteUpdated.Body.Reacted.Body(\n                            reaction = \"hoge\",\n                            account.remoteId\n                        )\n                    )\n                )\n            )\n            noteCapture.onMessage(\n                NoteUpdated(\n                    NoteUpdated.Body.Reacted(\n                        id = note.id.noteId,\n                        body = NoteUpdated.Body.Reacted.Body(\n                            reaction = \"hoge\",\n                            account.remoteId\n                        )\n                    )\n                )\n            )\n            noteCapture.onMessage(\n                NoteUpdated(\n                    NoteUpdated.Body.Reacted(\n                        id = note.id.noteId,\n                        body = NoteUpdated.Body.Reacted.Body(\n                            reaction = \"hoge\",\n                            account.remoteId\n                        )\n                    )\n                )\n            )\n\n\n        }\n\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/notes/poll/PollTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.notes.poll\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nimport kotlin.time.Duration.Companion.minutes\n\nclass PollTest {\n\n\n    @Test\n    fun totalVoteCount() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 15,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 8,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n            ),\n            expiresAt = null,\n            multiple = false\n        )\n        Assertions.assertEquals(53, poll.totalVoteCount)\n    }\n\n    @Test\n    fun canVoteMultiplePoll() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = true\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = true\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 15,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 8,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n            ),\n            expiresAt = null,\n            multiple = true\n        )\n        Assertions.assertTrue(poll.canVote)\n    }\n\n    @Test\n    fun canVote() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 15,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 8,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n            ),\n            expiresAt = null,\n            multiple = false\n        )\n        Assertions.assertTrue(poll.canVote)\n    }\n\n    @Test\n    fun canVoteWhenVoted() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = true\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 15,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 8,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n            ),\n            expiresAt = null,\n            multiple = false\n        )\n        Assertions.assertFalse(poll.canVote)\n    }\n\n    @Test\n    fun canVoteWithinExpiredAt() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 15,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 8,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n            ),\n            expiresAt = Clock.System.now() + 10.minutes,\n            multiple = false\n        )\n        Assertions.assertTrue(poll.canVote)\n    }\n    @Test\n    fun canVoteWhenExpired() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 15,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 8,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n            ),\n            expiresAt = Clock.System.now() - 1.minutes,\n            multiple = false\n        )\n        Assertions.assertFalse(poll.canVote)\n    }\n\n    @Test\n    fun canVoteVotedAndExpired() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = false\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = true\n                ),\n            ),\n            expiresAt = Clock.System.now() - 1.minutes,\n            multiple = false\n        )\n        Assertions.assertFalse(poll.canVote)\n    }\n\n    @Test\n    fun canVoteAllVotedAndMultiple() {\n        val poll = Poll(\n            choices = listOf(\n                Poll.Choice(\n                    index = 0,\n                    votes = 10,\n                    text = \"aaa\",\n                    isVoted = true\n                ),\n                Poll.Choice(\n                    index = 0,\n                    votes = 20,\n                    text = \"aaa\",\n                    isVoted = true\n                ),\n            ),\n            multiple = true,\n            expiresAt = null\n        )\n        Assertions.assertFalse(poll.canVote)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/reaction/impl/ReactionHistoryPaginatorImplTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.reaction.impl\n\n//import net.pantasystem.milktea.api.misskey.MisskeyAPIProvider\n//import net.pantasystem.milktea.data.api.misskey.RequestReactionHistoryDTO\n//import jp.panta.misskeyandroidclient.logger.TestLogger\n//import jp.panta.misskeyandroidclient.model.account.Account\n//import jp.panta.misskeyandroidclient.model.account.TestAccountRepository\n//import jp.panta.misskeyandroidclient.model.notes.Note\n//import jp.panta.misskeyandroidclient.model.notes.reaction.ReactionHistory\n//import jp.panta.misskeyandroidclient.model.notes.reaction.ReactionHistoryDataSource\n//import jp.panta.misskeyandroidclient.model.notes.reaction.ReactionHistoryPaginator\n//import jp.panta.misskeyandroidclient.model.notes.reaction.ReactionHistoryRequest\n//import jp.panta.misskeyandroidclient.model.notes.reaction.impl.ReactionHistoryPaginatorImpl\n//import jp.panta.misskeyandroidclient.model.users.impl.InMemoryUserDataSource\n//import jp.panta.misskeyandroidclient.util.EncryptionStub\n//import kotlinx.coroutines.flow.Flow\n//import kotlinx.coroutines.runBlocking\n//import org.junit.Assert.*\n//import org.junit.Before\n//import org.junit.Test\n//import org.junit.runner.RunWith\n//import org.junit.runners.JUnit4\n//\n//@RunWith(JUnit4::class)\n//class ReactionHistoryPaginatorImplTest {\n\n//    private lateinit var accountRepository: TestAccountRepository\n//    private val misskeyAPIProvider = MisskeyAPIProvider()\n//    private lateinit var reactionHistoryPaginatorFactory: ReactionHistoryPaginator.Factory\n//\n//    private lateinit var dataSource: DataSource\n//\n//\n//    class DataSource(\n//        var addAllListener: (list: List<ReactionHistory>)-> Unit = {}\n//    ) : ReactionHistoryDataSource {\n//        override fun findAll(): Flow<List<ReactionHistory>> {\n//            TODO(\"Not yet implemented\")\n//        }\n//\n//\n//\n//        override suspend fun add(reactionHistory: ReactionHistory) {\n//        }\n//\n//        override suspend fun addAll(reactionHistories: List<ReactionHistory>) {\n//            addAllListener.invoke(reactionHistories)\n//        }\n//\n//        override suspend fun clear(noteId: Note.Id) {\n//        }\n//\n//        override fun filter(noteId: Note.Id, type: String?): Flow<List<ReactionHistory>> {\n//            TODO(\"Not yet implemented\")\n//        }\n//\n//    }\n//    @Before\n//    fun setUp(): Unit = runBlocking {\n//        accountRepository = TestAccountRepository()\n//        accountRepository.accounts.clear()\n//        dataSource = DataSource()\n//        reactionHistoryPaginatorFactory = ReactionHistoryPaginatorImpl.Factory(\n//            dataSource,\n//            misskeyAPIProvider,\n//            accountRepository,\n//            EncryptionStub(),\n//            InMemoryUserDataSource(TestLogger.Factory())\n//        )\n//        // TODO テスト後必ずTokenを削除すること\n//        val account = Account(\n//            remoteId = \"\",\n//            instanceDomain = \"https://misskey.io\",\n//            userName = \"Panta\",\n//            encryptedToken = \"\"\n//        )\n//        accountRepository.setCurrentAccount(accountRepository.add(account))\n//\n//    }\n//\n//    @Test\n//    fun testLoad(): Unit = runBlocking{\n//\n//        val account = accountRepository.getCurrentAccount().getOrThrow()\n//        val req = ReactionHistoryRequest(Note.Id(account.accountId, \"7zzafqsm9a\"), null)\n//        val paginator = reactionHistoryPaginatorFactory.create(req)\n//        dataSource.addAllListener = {\n//            assertTrue(it.isNotEmpty())\n//        }\n//\n//        paginator.next()\n//\n//    }\n//\n//    @Test\n//    fun testPaginate(): Unit = runBlocking {\n//        val noteId = \"7zzafqsm9a\"\n//        val account = accountRepository.getCurrentAccount().getOrThrow()\n//        val req = ReactionHistoryRequest(Note.Id(account.accountId, noteId), null)\n//        val paginator = reactionHistoryPaginatorFactory.create(req)\n//\n//        val histories = mutableListOf<ReactionHistory>()\n//        dataSource.addAllListener = {\n//            assertTrue(it.isNotEmpty())\n//            histories.addAll(it)\n//        }\n//\n//        for(n in 0 until 5) {\n//            assertTrue(paginator.next())\n//        }\n//        val api = misskeyAPIProvider.get(account.instanceDomain)\n//        val body = api.reactions(RequestReactionHistoryDTO(i = account.getI(EncryptionStub()), noteId = noteId, limit = 5 * 20, type = null)).body()\n//\n//        assertNotNull(body)\n//        val except = body!!.map {\n//            it.id\n//        }\n//\n//        val ids = histories.map {\n//            it.id.reactionId\n//        }\n//        assertEquals(except, ids)\n//    }\n//}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/users/UserTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.users\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\n\nclass UserTest {\n\n    @Test\n    fun testGetProfileUrl() {\n\n        val user = User.Simple(\n            id = User.Id(0, \"id\"),\n            avatarUrl = \"\",\n            emojis = emptyList(),\n            host = \"\",\n            isBot = false,\n            isCat = false,\n            name = \"Panta\",\n            userName = \"Panta\",\n            nickname = null,\n            isSameHost = true,\n            instance = null,\n            avatarBlurhash = null,\n            badgeRoles = emptyList(),\n        )\n\n        val profileUrl = user.getProfileUrl(\n            Account(\n                instanceDomain = \"https://example.com\",\n                token = \"\",\n                remoteId = \"\",\n                userName = \"\",\n                instanceType = Account.InstanceType.MISSKEY\n            )\n        )\n        assertEquals(\"https://example.com/@Panta\", profileUrl)\n    }\n\n    @Test\n    fun testGetProfileUrlWhenRemoteHost() {\n\n        val user = User.Simple(\n            id = User.Id(0, \"id\"),\n            avatarUrl = \"\",\n            emojis = emptyList(),\n            host = \"misskey.io\",\n            isBot = false,\n            isCat = false,\n            name = \"Panta\",\n            userName = \"Panta\",\n            nickname = null,\n            isSameHost = false,\n            instance = null,\n            avatarBlurhash = null,\n            badgeRoles = emptyList(),\n        )\n\n        val profileUrl = user.getProfileUrl(\n            Account(\n                instanceDomain = \"https://example.com\",\n                token = \"\",\n                remoteId = \"\",\n                userName = \"\",\n                instanceType = Account.InstanceType.MISSKEY\n            )\n        )\n        assertEquals(\"https://example.com/@Panta@misskey.io\", profileUrl)\n    }\n\n    @Test\n    fun displayUserName_GiveSameHost() {\n        val user = User.Simple(\n            id = User.Id(0, \"id\"),\n            avatarUrl = \"\",\n            emojis = emptyList(),\n            host = \"misskey.io\",\n            isBot = false,\n            isCat = false,\n            name = \"Panta\",\n            userName = \"Panta\",\n            nickname = null,\n            isSameHost = true,\n            instance = null,\n            avatarBlurhash = null,\n            badgeRoles = emptyList(),\n        )\n        assertEquals(\"@Panta\", user.displayUserName)\n    }\n\n    @Test\n    fun displayUserName_GiveDifferentHost() {\n        val user = User.Simple(\n            id = User.Id(0, \"id\"),\n            avatarUrl = \"\",\n            emojis = emptyList(),\n            host = \"misskey.io\",\n            isBot = false,\n            isCat = false,\n            name = \"Panta\",\n            userName = \"Panta\",\n            nickname = null,\n            isSameHost = false,\n            instance = null,\n            avatarBlurhash = null,\n            badgeRoles = emptyList(),\n        )\n        assertEquals(\"@Panta@misskey.io\", user.displayUserName)\n    }\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/users/nickname/DeleteNicknameUseCaseTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.users.nickname\n\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.data.infrastructure.user.InMemoryUserDataSource\nimport net.pantasystem.milktea.data.infrastructure.user.UserNicknameRepositoryOnMemoryImpl\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.nickname.DeleteNicknameUseCase\nimport net.pantasystem.milktea.model.user.nickname.UserNickname\nimport net.pantasystem.milktea.model.user.nickname.UserNicknameRepository\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.BeforeEach\nimport org.junit.jupiter.api.Test\n\nclass DeleteNicknameUseCaseTest {\n\n    private lateinit var nicknameRepository: UserNicknameRepository\n    private lateinit var userDataSource: UserDataSource\n    private lateinit var user: User.Simple\n    private lateinit var deleteNicknameUseCase: DeleteNicknameUseCase\n    private lateinit var nicknameId: UserNickname.Id\n    @BeforeEach\n    fun setUp() {\n        val nicknameRepository = UserNicknameRepositoryOnMemoryImpl()\n        this.nicknameRepository = nicknameRepository\n        userDataSource = InMemoryUserDataSource(MemoryCacheCleaner())\n\n        user = User.Simple(\n            User.Id(1, \"remoteId\"),\n            \"name\",\n            \"name1\",\n            \"\",\n            emptyList(),\n            null,\n            null,\n            host = \"misskey.io\",\n            nickname = null,\n            isSameHost = true,\n            instance = null,\n            avatarBlurhash = null,\n            badgeRoles = emptyList(),\n        )\n        deleteNicknameUseCase = DeleteNicknameUseCase(\n            userDataSource = userDataSource,\n            userNicknameRepository = nicknameRepository\n        )\n\n        nicknameId = UserNickname.Id(userName = user.userName, host = \"misskey.io\")\n    }\n\n    @Test\n    fun deleteNickname() {\n        runBlocking {\n            val nickname = UserNickname(nicknameId, \"changed name\")\n            userDataSource.add(user.copy(nickname = nickname))\n            nicknameRepository.save(nickname)\n            assertEquals(\"changed name\", userDataSource.get(user.id).getOrThrow().displayName)\n            deleteNicknameUseCase.invoke(user)\n            assertEquals(\"name1\", userDataSource.get(user.id).getOrThrow().displayName)\n        }\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/model/users/nickname/UpdateNicknameUseCaseTest.kt",
    "content": "package jp.panta.misskeyandroidclient.model.users.nickname\n\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.data.infrastructure.user.InMemoryUserDataSource\nimport net.pantasystem.milktea.data.infrastructure.user.UserNicknameRepositoryOnMemoryImpl\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.nickname.UpdateNicknameUseCase\nimport net.pantasystem.milktea.model.user.nickname.UserNickname\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\n\nclass UpdateNicknameUseCaseTest {\n\n\n    @Test\n    fun testUpdate() {\n        runBlocking {\n            val nicknameRepository = UserNicknameRepositoryOnMemoryImpl()\n            val userDataSource = InMemoryUserDataSource(MemoryCacheCleaner())\n            val updateNicknameUseCase = UpdateNicknameUseCase(\n                userDataSource,\n                nicknameRepository\n            )\n            val targetId = UserNickname.Id(\"name\", \"misskey.io\")\n\n            val user = User.Simple(\n                User.Id(1, \"remoteId\"),\n                \"name\",\n                \"\",\n                \"\",\n                emptyList(),\n                null,\n                null,\n                host = \"misskey.io\",\n                nickname = null,\n                isSameHost = true,\n                instance = null,\n                avatarBlurhash = null,\n                badgeRoles = emptyList(),\n            )\n            userDataSource.add(user)\n\n            nicknameRepository.save(\n                UserNickname(targetId, \"nickname\")\n            )\n            val result = updateNicknameUseCase.invoke(user, \"updated nickname\")\n            assertEquals(\"updated nickname\", nicknameRepository.findOne(targetId).name)\n            assertEquals(\"updated nickname\", result.displayName)\n            assertEquals(\"updated nickname\", userDataSource.get(user.id).getOrThrow().displayName)\n        }\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/streaming/SendBodyTest.kt",
    "content": "package jp.panta.misskeyandroidclient.streaming\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.encodeToString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api_streaming.Send\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\n\nclass SendBodyTest {\n\n    @Test\n    fun testParseMain() {\n        val main: Send = Send.Connect(\n            Send.Connect.Body(channel = Send.Connect.Type.HOME_TIMELINE, id = \"hoge\"))\n\n        val h = Json.encodeToString(main)\n        println(h)\n        assertTrue(true)\n    }\n\n    @Test\n    fun testDecode() {\n        val json = \"\"\"{\"type\":\"connect\",\"body\":{\"id\":\"hoge\",\"channel\":\"homeTimeline\"}}\"\"\"\n        val main: Send = Json.decodeFromString(json)\n        println(main)\n        assertTrue(true)\n    }\n\n    @Test\n    fun testParseSubNote() {\n        val obj: Send = Send.SubscribeNote(\n            Send.SubscribeNote.Body(\"hogepiyo\"))\n        val h = Json.encodeToString(obj)\n\n        println(h)\n        assertTrue(true)\n    }\n\n    @Test\n    fun testDecodeSubNote() {\n        val json = \"\"\"{\"type\":\"subNote\",\"body\":{\"id\":\"hogepiyo\"}}\"\"\"\n        val h: Send = Json.decodeFromString(json)\n\n        println(h)\n        assertTrue(h is Send.SubscribeNote)\n    }\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/streaming/StreamingEventTest.kt",
    "content": "package jp.panta.misskeyandroidclient.streaming\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.ChannelEvent\nimport net.pantasystem.milktea.api_streaming.StreamingEvent\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\n\nclass StreamingEventTest {\n\n\n\n    @Test\n    fun testDecodeJson() {\n        val response = Json {\n            ignoreUnknownKeys = true\n        }\n        val json = \"\"\"{\"type\":\"channel\",\"body\":{\"id\":\"1\",\"type\":\"note\",\"body\":{\"id\":\"8ikcfyi666\",\"createdAt\":\"2021-02-22T16:13:38.286Z\",\"userId\":\"8gs6brks69\",\"user\":{\"id\":\"8gs6brks69\",\"name\":\"輩原にする\",\"username\":\"nisuru\",\"host\":\"misskey.haibala.com\",\"avatarUrl\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fmisskey-oj.ewr1.vultrobjects.com%2Fm%2Fwebpublic-718e33cf-0822-477d-a801-54cdcef1327d.jpg&thumbnail=1\",\"avatarBlurhash\":\"yGP@6Fxa%f?a^J?GM|xbkDaK%gWY-5W=RPM|kX_NIqVrt3WBR*RlR-oe%4Myt6xWt3t8M}Rij@n}WYbJj[R.\",\"avatarColor\":null,\"isCat\":true,\"instance\":{\"name\":\"haibaland\",\"softwareName\":\"misskey\",\"softwareVersion\":\"12.71.0\",\"iconUrl\":\"https://misskey.haibala.com/assets/icons/192.png\",\"faviconUrl\":\"https://misskey-oj.ewr1.vultrobjects.com/m/902557d0-1ca6-4568-b92a-eb6e195d0228.png\",\"themeColor\":\"#86b300\"},\"emojis\":[]},\"text\":null,\"cw\":null,\"visibility\":\"public\",\"renoteCount\":0,\"repliesCount\":0,\"reactions\":{},\"emojis\":[],\"fileIds\":[],\"files\":[],\"replyId\":null,\"renoteId\":\"8ikcdkmw19\",\"uri\":\"https://misskey.haibala.com/notes/8ikcfyi6np/activity\",\"renote\":{\"id\":\"8ikcdkmw19\",\"createdAt\":\"2021-02-22T16:11:47.000Z\",\"userId\":\"7rqb0rlaxm\",\"user\":{\"id\":\"7rqb0rlaxm\",\"name\":\"直さらだ🔞\",\"username\":\"nao_salad\",\"host\":\"pawoo.net\",\"avatarUrl\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fimg.pawoo.net%2Faccounts%2Favatars%2F000%2F186%2F181%2Foriginal%2F8a4cc93a0db29a81.png&thumbnail=1\",\"avatarBlurhash\":null,\"avatarColor\":null,\"instance\":{\"name\":\"Pawoo\",\"softwareName\":null,\"softwareVersion\":null,\"iconUrl\":\"https://pawoo.net/android-chrome-192x192.png\",\"faviconUrl\":\"https://pawoo.net/favicon.ico\",\"themeColor\":\"#282c37\"},\"emojis\":[]},\"text\":null,\"cw\":null,\"visibility\":\"public\",\"renoteCount\":2,\"repliesCount\":0,\"reactions\":{\"❤\":1},\"emojis\":[],\"fileIds\":[\"8ikcdm3p18\"],\"files\":[{\"id\":\"8ikcdm3p18\",\"createdAt\":\"2021-02-22T16:11:48.901Z\",\"name\":\"5b9c4b3fee5a3326.mp4\",\"type\":\"video/mp4\",\"md5\":\"064fb67a2b9add60b9c8b76673b8df02\",\"size\":0,\"isSensitive\":true,\"blurhash\":null,\"properties\":{},\"url\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fimg.pawoo.net%2Fmedia_attachments%2Ffiles%2F034%2F139%2F866%2Foriginal%2F5b9c4b3fee5a3326.mp4\",\"thumbnailUrl\":\"https://nos3.arkjp.net/?url=https%3A%2F%2Fimg.pawoo.net%2Fmedia_attachments%2Ffiles%2F034%2F139%2F866%2Foriginal%2F5b9c4b3fee5a3326.mp4&thumbnail=1\",\"comment\":null,\"folderId\":null,\"folder\":null,\"userId\":null,\"user\":null}],\"replyId\":null,\"renoteId\":null,\"uri\":\"https://pawoo.net/users/nao_salad/statuses/105775779506713178\",\"url\":\"https://pawoo.net/@nao_salad/105775779506713178\"}}}}\"\"\"\n        val s: StreamingEvent = response.decodeFromString(json)\n        println(s)\n        assertTrue(true)\n    }\n\n    @Test\n    fun testDecodeNoteUpdated() {\n        val json = \"\"\"{\"type\":\"noteUpdated\",\"body\":{\"id\":\"8ikbe058jm\",\"type\":\"reacted\",\"body\":{\"reaction\":\"🙌\",\"userId\":\"8g0o3hyk6r\"}}}\"\"\"\n        val s: StreamingEvent = Json.decodeFromString(json)\n        println(s)\n        assertTrue(true)\n    }\n\n    @Test\n    fun testDecodeUnreacted() {\n        val json = \"\"\"{\"type\":\"noteUpdated\",\"body\":{\"id\":\"8ikbs5qq5z\",\"type\":\"unreacted\",\"body\":{\"reaction\":\"😆\",\"userId\":\"7roinhytrr\"}}}\"\"\"\n        val s: StreamingEvent = Json.decodeFromString(json)\n        println(s)\n        assertTrue(true)\n    }\n\n    @Test\n    fun testNoteDeleted() {\n        val json  =\"\"\"{\"type\":\"noteUpdated\",\"body\":{\"id\":\"8ikcaxibzs\",\"type\":\"deleted\",\"body\":{\"deletedAt\":\"2021-02-22T16:09:47.568Z\"}}}\"\"\"\n        val s: StreamingEvent = Json.decodeFromString(json)\n        println(s)\n        assertTrue(true)\n    }\n\n\n\n    @Test\n    fun testDecodePollVoteNotification() {\n        val j = Json {\n            ignoreUnknownKeys = true\n        }\n        val json = \"\"\"{\"type\":\"channel\",\"body\":{\"id\":\"1\",\"type\":\"notification\",\"body\":{\"id\":\"8ikt10uewe\",\"createdAt\":\"2021-02-22T23:57:54.950Z\",\"type\":\"pollVote\",\"isRead\":false,\"userId\":\"88wqchigvf\",\"user\":{\"id\":\"88wqchigvf\",\"name\":\"Lily\",\"username\":\"Lily\",\"host\":null,\"avatarUrl\":\"https://s3.arkjp.net/misskey/thumbnail-e833da1c-c1ca-47cc-b845-05000621341d.jpg\",\"avatarBlurhash\":\"yPNI{oIn?|aK:Rxa#U00X-~DXR=zMx${'$'}+5PIAO;ozo}%goL^,xGRPi{nPoLjF-B%MwLn*sCR5R*aKnixts:a{aykCM{aKs;ofo3ozni\",\"avatarColor\":null,\"emojis\":[]},\"note\":{\"id\":\"8iksycgnyx\",\"createdAt\":\"2021-02-22T23:55:50.039Z\",\"userId\":\"7roinhytrr\",\"user\":{\"id\":\"7roinhytrr\",\"name\":\"パン太\",\"username\":\"Panta\",\"host\":null,\"avatarUrl\":\"https://s3.arkjp.net/misskey/thumbnail-76a33500-270f-4acb-8b59-a033bb9e9593.jpg\",\"avatarBlurhash\":\"yROpPl00AKk?9Gx]E3?^M|IVNfTJW=tRo}xuV@t7x]ofoL%2M{ENX9ozS2R*bcjFnhV[WXays.xtaeWXnhs.aeWVRkjYfkWAR*ofj?\",\"avatarColor\":null,\"emojis\":[]},\"text\":\"test\",\"cw\":null,\"visibility\":\"public\",\"renoteCount\":0,\"repliesCount\":0,\"reactions\":{},\"emojis\":[],\"fileIds\":[],\"files\":[],\"replyId\":null,\"renoteId\":null,\"poll\":{\"multiple\":false,\"expiresAt\":null,\"choices\":[{\"text\":\"t1\",\"votes\":0,\"isVoted\":false},{\"text\":\"t2\",\"votes\":1,\"isVoted\":false},{\"text\":\"t3\",\"votes\":1,\"isVoted\":false}]}},\"choice\":1}}}\"\"\"\n        val s: StreamingEvent =  j.decodeFromString(json)\n        println(s)\n        assertTrue(s is ChannelEvent && s.body is ChannelBody.Main.Notification)\n    }\n}\n\n"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/streaming/TestSocketImpl.kt",
    "content": "package jp.panta.misskeyandroidclient.streaming\n\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.api_streaming.SocketMessageEventListener\nimport net.pantasystem.milktea.api_streaming.SocketStateEventListener\n\n\nclass TestSocketImpl : Socket {\n\n    private var state: Socket.State = Socket.State.NeverConnected\n    private val messageListeners = mutableSetOf<SocketMessageEventListener>()\n    private val stateEventListeners = mutableSetOf<SocketStateEventListener>()\n\n    override fun connect(): Boolean {\n        state = Socket.State.Connected\n        return true\n\n    }\n\n    override fun disconnect(): Boolean {\n        state = Socket.State.Closed(1001, \"\")\n        return true\n    }\n\n    override fun send(msg: String, isAutoConnect: Boolean): Boolean {\n        println(\"send: $msg\")\n        return true\n    }\n\n    override fun state(): Socket.State {\n        return state\n\n    }\n\n    override fun addMessageEventListener(autoConnect: Boolean, listener: SocketMessageEventListener) {\n        messageListeners.add(listener)\n    }\n\n    override fun addStateEventListener(listener: SocketStateEventListener) {\n        stateEventListeners.add(listener)\n    }\n\n    override suspend fun blockingConnect(): Boolean {\n        return connect()\n    }\n\n    override fun removeMessageEventListener(listener: SocketMessageEventListener) {\n        messageListeners.remove(listener)\n    }\n\n    override fun removeStateEventListener(listener: SocketStateEventListener) {\n        stateEventListeners.remove(listener)\n    }\n\n\n    override fun onNetworkActive() {\n        throw Exception(\"未実装\")\n    }\n\n    override fun onNetworkInActive() {\n        throw Exception(\"未実装\")\n    }\n\n    override fun reconnect() {\n        throw Exception(\"未実装\")\n    }\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/streaming/TestSocketWithAccountProviderImpl.kt",
    "content": "package jp.panta.misskeyandroidclient.streaming\n\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider\nimport net.pantasystem.milktea.model.account.Account\n\nclass TestSocketWithAccountProviderImpl : SocketWithAccountProvider {\n\n    override fun get(account: Account): Socket {\n        return TestSocketImpl()\n    }\n\n    override fun get(accountId: Long): Socket {\n        return TestSocketImpl()\n    }\n\n    override fun all(): List<Socket> {\n        return listOf(TestSocketImpl())\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/streaming/channel/ChannelAPITest.kt",
    "content": "package jp.panta.misskeyandroidclient.streaming.channel\n\nimport jp.panta.misskeyandroidclient.logger.TestLogger\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.cancel\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.api.misskey.DefaultOkHttpClientProvider\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.api_streaming.channel.ChannelAPI\nimport net.pantasystem.milktea.api_streaming.network.SocketImpl\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\nclass ChannelAPITest {\n\n    @ExperimentalCoroutinesApi\n    @Test\n    fun connect(): Unit = runBlocking {\n        val wssURL = \"wss://misskey.io/streaming\"\n        val logger = TestLogger.Factory()\n        val socket =\n            SocketImpl(wssURL, {false}, logger, DefaultOkHttpClientProvider())\n        socket.blockingConnect()\n\n        var count = 0\n        launch {\n            ChannelAPI(socket, logger)\n                .connect(ChannelAPI.Type.Global).collect {\n                println(it)\n                assertTrue(it is ChannelBody.ReceiveNote)\n                count ++\n                if(count > 5) {\n                    cancel()\n                }\n            }\n        }.join()\n\n\n    }\n\n    @ExperimentalCoroutinesApi\n    @Test\n    fun testDisconnect() {\n        val wssURL = \"wss://misskey.io/streaming\"\n        val logger = TestLogger.Factory()\n        val socket =\n            SocketImpl(wssURL, {false}, logger, DefaultOkHttpClientProvider())\n        val channelAPI = ChannelAPI(socket, logger)\n        runBlocking {\n\n            val job1 = launch {\n                channelAPI.connect(ChannelAPI.Type.Main).collect ()\n            }\n\n            val job2 = launch {\n                channelAPI.connect(ChannelAPI.Type.Global).collect ()\n            }\n\n            val job3 = launch {\n                channelAPI.connect(ChannelAPI.Type.Global).collect ()\n            }\n\n            val closedRes: Socket.State = suspendCoroutine { continuation ->\n                var flag = true\n                socket.addStateEventListener { ev ->\n                    if(flag) {\n                        if(ev is Socket.State.Connected) {\n                            assertEquals(2, channelAPI.count())\n                            job1.cancel()\n                            job2.cancel()\n                            job3.cancel()\n                        }\n                        if(ev is Socket.State.Closed) {\n                            flag = false\n\n                            continuation.resume(ev)\n                        }\n                    }\n                }\n            }\n            assertTrue(closedRes is Socket.State.Closed)\n        }\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/streaming/network/SocketImplTest.kt",
    "content": "package jp.panta.misskeyandroidclient.streaming.network\n\nimport jp.panta.misskeyandroidclient.logger.TestLogger\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.api.misskey.DefaultOkHttpClientProvider\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.api_streaming.StreamingEvent\nimport net.pantasystem.milktea.api_streaming.network.SocketImpl\nimport net.pantasystem.milktea.data.infrastructure.streaming.stateEvent\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\n\nclass SocketImplTest {\n\n    @Test\n    fun testBlockingConnect() {\n        val wssURL = \"wss://misskey.io/streaming\"\n        val logger = TestLogger.Factory()\n        val socket = SocketImpl(wssURL, {false} ,logger, DefaultOkHttpClientProvider())\n\n        socket.addMessageEventListener(false) {\n            false\n        }\n        runBlocking {\n            socket.blockingConnect()\n            assertEquals(socket.state(), Socket.State.Connected)\n        }\n    }\n\n    @ExperimentalCoroutinesApi\n    @Test\n    fun testAddMessageListener() {\n\n        val wssURL = \"wss://misskey.io/streaming\"\n        val logger = TestLogger.Factory()\n        val socket = SocketImpl(wssURL, {false}, logger, DefaultOkHttpClientProvider())\n\n        runBlocking {\n\n            socket.addMessageEventListener {\n                false\n            }\n            val res = socket.stateEvent().first {\n                it == Socket.State.Connected\n            }\n\n            assertEquals(Socket.State.Connected, res)\n\n        }\n    }\n\n    @ExperimentalCoroutinesApi\n    @Test\n    fun testRemoveMessageListener() {\n        val wssURL = \"wss://misskey.io/streaming\"\n        val logger = TestLogger.Factory()\n        val socket: Socket =\n            SocketImpl(wssURL, {false}, logger, DefaultOkHttpClientProvider())\n\n        runBlocking {\n\n            val listener: (StreamingEvent)-> Boolean = {\n                false\n            }\n            socket.addMessageEventListener(true, listener)\n            val res: Socket.State = socket.stateEvent().first {\n                it == Socket.State.Connected\n            }\n            assertTrue(res is Socket.State.Connected)\n\n            socket.removeMessageEventListener(listener)\n            val closedRes: Socket.State = socket.stateEvent().first {\n                it is Socket.State.Closed\n            }\n            assertTrue(closedRes is Socket.State.Closed)\n\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/ui/users/viewmodel/search/SearchUserTest.kt",
    "content": "package jp.panta.misskeyandroidclient.ui.users.viewmodel.search\n\nimport net.pantasystem.milktea.user.search.SearchUser\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass SearchUserTest {\n\n    @Test\n    fun isUserName() {\n        val searchUser = SearchUser(\"harunon\", null)\n        Assertions.assertTrue(searchUser.isUserName)\n        Assertions.assertTrue(SearchUser(\"nocturne_db\", null).isUserName)\n    }\n\n    @Test\n    fun isUserNameGiveNotUserNameCases() {\n        val searchUser = SearchUser(\"はるのん\", null)\n        Assertions.assertFalse(searchUser.isUserName)\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/util/EncryptionStub.kt",
    "content": "package jp.panta.misskeyandroidclient.util\n\nimport net.pantasystem.milktea.common.Encryption\n\nclass EncryptionStub : Encryption {\n    override fun decrypt(alias: String, encryptedText: String): String {\n        return encryptedText\n    }\n\n    override fun encrypt(alias: String, plainText: String): String {\n        return plainText\n    }\n}"
  },
  {
    "path": "app/src/test/java/jp/panta/misskeyandroidclient/util/StringIndexTest.kt",
    "content": "package jp.panta.misskeyandroidclient.util\n\nimport org.junit.jupiter.api.Test\n\n\nclass StringIndexTest {\n\n    @Test\n    fun substringTest(){\n        val text = \"0123456789\"\n        println(text.substring(0, 9))\n        println(text.substring(0, text.length))\n    }\n\n    @Test\n    fun whileText(){\n        var counter = 0\n        while(counter < 10){\n            println(counter)\n            counter++\n        }\n        println(\"終了後:$counter\")\n    }\n\n    @Test\n    fun emojiCharTest(){\n        val text = \"☺️\"\n        println(text.length)\n        text.forEach{\n            println(it)\n        }\n    }\n}"
  },
  {
    "path": "app/src/test/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiInserterTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.EmojiWithAlias\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verifyBlocking\n\nclass CustomEmojiInserterTest {\n\n    @Test\n    fun convertAndReplaceAll() = runTest {\n        val dao = mock<CustomEmojiDAO>() {\n            onBlocking {\n                insertAll(any())\n            } doReturn listOf(1L, 2L, 3L)\n            onBlocking {\n                deleteByHost(any())\n            } doReturn Unit\n            onBlocking {\n                insertAliases(\n                    any(),\n                )\n            } doReturn listOf(1L, 2L, 3L)\n        }\n        val inserter = CustomEmojiInserter(\n            dao\n        )\n\n        val remoteEmojis = listOf(\n            EmojiWithAlias(\n                emoji = CustomEmoji(\n                    name = \"name\",\n                ),\n                aliases = listOf(\n                    \"alias1\",\n                    \"alias2\",\n                )\n            ),\n            EmojiWithAlias(\n                emoji = CustomEmoji(\n                    name = \"name1\",\n                ),\n                aliases = listOf(\n                    \"alias3\",\n                    \"alias4\",\n                )\n            ),\n            EmojiWithAlias(\n                emoji = CustomEmoji(\n                    name = \"name2\",\n                ),\n                aliases = listOf(\n                    \"alias5\",\n                    \"alias6\",\n                )\n            )\n        )\n\n        val result = inserter.convertAndReplaceAll(\"host\", remoteEmojis)\n        verifyBlocking(dao) {\n            deleteByHost(\"host\")\n            insertAll(\n                remoteEmojis.map {\n                    CustomEmojiRecord.from(\n                        it.emoji,\n                        \"host\",\n                    )\n                }\n            )\n            insertAliases(\n                listOf(\n                    CustomEmojiAliasRecord(\n                        \"alias1\",\n                        1L,\n                    ),\n                    CustomEmojiAliasRecord(\n                        \"alias2\",\n                        1L,\n                    ),\n                    CustomEmojiAliasRecord(\n                        \"alias3\",\n                        2L,\n                    ),\n                    CustomEmojiAliasRecord(\n                        \"alias4\",\n                        2L,\n                    ),\n                    CustomEmojiAliasRecord(\n                        \"alias5\",\n                        3L,\n                    ),\n                    CustomEmojiAliasRecord(\n                        \"alias6\",\n                        3L,\n                    ),\n                )\n            )\n        }\n        Assertions.assertEquals(\n            remoteEmojis.mapIndexed { index, it ->\n                CustomEmojiRecord.from(\n                    it.emoji,\n                    \"host\",\n                    id = index + 1L,\n                )\n            },\n            result,\n        )\n    }\n\n    @Test\n    fun replaceAll() = runTest {\n        val dao = mock<CustomEmojiDAO>() {\n            onBlocking {\n                insertAll(any())\n            } doReturn listOf(1L, 2L, 3L)\n            onBlocking {\n                deleteByHost(any())\n            } doReturn Unit\n        }\n        val inserter = CustomEmojiInserter(\n            dao\n        )\n        val records = listOf(\n            CustomEmojiRecord(\n                name = \"name\",\n                emojiHost = \"host\",\n                url = \"url\",\n                uri = \"uri\",\n                type = \"type\",\n                serverId = \"serverId\",\n                category = \"category\",\n                id = 0L,\n            ),\n            CustomEmojiRecord(\n                name = \"name1\",\n                emojiHost = \"host\",\n                url = \"url\",\n                uri = \"uri\",\n                type = \"type\",\n                serverId = \"serverId\",\n                category = \"category\",\n                id = 0L,\n            ),\n            CustomEmojiRecord(\n                name = \"name2\",\n                emojiHost = \"host\",\n                url = \"url\",\n                uri = \"uri\",\n                type = \"type\",\n                serverId = \"serverId\",\n                category = \"category\",\n                id = 0L,\n            )\n        )\n        inserter.replaceAll(\n            \"host\",\n            records,\n        )\n        verifyBlocking(dao) {\n            deleteByHost(\"host\")\n            insertAll(records)\n        }\n    }\n\n}"
  },
  {
    "path": "app/src/test/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/DraftNoteDTOTest.kt",
    "content": "import net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftNoteDTO\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftPollDTO\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass DraftNoteDTOTest {\n\n    @Test\n    fun makeChannelIdParamTest() {\n        val note = DraftNote(\n            accountId = 0,\n            text = null,\n            channelId = Channel.Id(0, \"id\")\n        )\n        val dto = DraftNoteDTO.make(note)\n        Assertions.assertNotNull(note.channelId)\n        Assertions.assertNotNull(dto.channelId)\n        Assertions.assertEquals(note.channelId?.channelId, dto.channelId)\n    }\n\n    @Test\n    fun toDraftNoteTest() {\n        val dto = DraftNoteDTO(\n            accountId = 1,\n            poll = DraftPollDTO(\n                multiple = true,\n            ),\n            channelId = \"channelId\",\n            cw = \"cw_test\",\n            text = \"text_test\",\n            renoteId = \"renote_id_test\",\n            replyId = \"reply_id_test\",\n            visibility = \"public\",\n        )\n        val entity = dto.toDraftNote(1L, null, null, null)\n        Assertions.assertEquals(1L, entity.accountId)\n        Assertions.assertEquals(dto.channelId, entity.channelId?.channelId)\n        Assertions.assertEquals(dto.cw, entity.cw)\n        Assertions.assertEquals(dto.text, entity.text)\n        Assertions.assertEquals(dto.renoteId, entity.renoteId)\n        Assertions.assertEquals(dto.replyId, entity.replyId)\n        Assertions.assertEquals(dto.visibility, entity.visibility)\n    }\n}"
  },
  {
    "path": "app/src/test/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorUiStateKtTest.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftPoll\nimport net.pantasystem.milktea.model.note.expiresAt\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport kotlin.time.Duration.Companion.days\n\nclass NoteEditorUiStateKtTest {\n\n    @Test\n    fun draftNote_toNoteEditingState_GiveHasExpiredPoll() {\n        val expiresAt = Clock.System.now() + 2.days\n        val draftNote = DraftNote(\n            accountId = 0,\n            visibility = \"public\",\n            visibleUserIds = listOf(),\n            text = null,\n            cw = null,\n            draftFiles = listOf(),\n            viaMobile = null,\n            localOnly = null,\n            noExtractMentions = null,\n            noExtractHashtags = null,\n            noExtractEmojis = null,\n            replyId = null,\n            renoteId = null,\n            draftPoll = DraftPoll(\n                choices = listOf(\n                    \"A\",\n                    \"B\",\n                    \"C\",\n                    \"D\"\n                ), multiple = false, expiresAt = expiresAt.toEpochMilliseconds()\n            ),\n            reservationPostingAt = null,\n            channelId = null,\n            isSensitive = null,\n            draftNoteId = 0\n\n        )\n        val state = draftNote.toNoteEditingState()\n        Assertions.assertEquals(\n            expiresAt.toEpochMilliseconds(),\n            state.poll?.expiresAt?.expiresAt()?.toEpochMilliseconds()\n        )\n        Assertions.assertEquals(listOf(\n            \"A\",\n            \"B\",\n            \"C\",\n            \"D\"\n        ), state.poll?.choices?.map {\n            it.text\n        })\n    }\n}"
  },
  {
    "path": "app/src/test/java/net/pantasystem/milktea/note/media/viewmodel/MediaViewDataTest.kt",
    "content": "package net.pantasystem.milktea.note.media.viewmodel\n\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.make\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.MediaDisplayMode\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass MediaViewDataTest {\n\n    @Test\n    fun initialFiles_GiveAlwaysShow() {\n\n        val config = DefaultConfig.config.copy(\n            mediaDisplayMode = MediaDisplayMode.ALWAYS_SHOW\n        )\n        val files = listOf(\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\"), isSensitive = true),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            )\n        )\n        val value = MediaViewData(files, config).files.value\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible\n            ),\n            value.map {\n                it.initialVisibleType\n            }\n        )\n    }\n\n    /**\n     * configのmediaDisplayModeがMediaDisplayMode.ALWAYS_HIDEの場合のテストコード\n     */\n    @Test\n    fun initialFiles_GiveAlwaysHide() {\n\n        val config = DefaultConfig.config.copy(\n            mediaDisplayMode = MediaDisplayMode.ALWAYS_HIDE\n        )\n        val files = listOf(\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\"), isSensitive = true),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            )\n        )\n        val value = MediaViewData(files, config).files.value\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            value.map {\n                it.initialVisibleType\n            }\n        )\n    }\n\n    /**\n     * configのmediaDisplayModeがMediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORKの場合のテストコード\n     */\n    @Test\n    fun initialFiles_GiveAlwaysHideWhenMobileNetwork() {\n\n        val config = DefaultConfig.config.copy(\n            mediaDisplayMode = MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK\n        )\n        val files = listOf(\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\"), isSensitive = true),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            )\n        )\n        val value = MediaViewData(files, config).files.value\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            value.map {\n                it.initialVisibleType\n            }\n        )\n    }\n\n    /**\n     * configのmediaDisplayModeがMediaDisplayMode.AUTOの場合のテストコード\n     */\n    @Test\n    fun initialFiles_GiveAuto() {\n\n        val config = DefaultConfig.config.copy(\n            mediaDisplayMode = MediaDisplayMode.AUTO\n        )\n        val files = listOf(\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\"), isSensitive = true),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            )\n        )\n        val value = MediaViewData(files, config).files.value\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.Visible\n            ),\n            value.map { it.initialVisibleType }\n        )\n    }\n\n    /**\n     * toggleVisibilityのテストコード\n     */\n    @Test\n    fun toggleVisibility_GiveConfigAsAuto() = runTest {\n        val config = DefaultConfig.config.copy(\n            mediaDisplayMode = MediaDisplayMode.AUTO\n        )\n        val files = listOf(\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\"), isSensitive = true),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(id = FileProperty.Id(0L, \"1\")),\n            )\n        )\n        val mediaViewData = MediaViewData(files, config)\n        mediaViewData.toggleVisibility(0, false, MediaDisplayMode.AUTO)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.Visible\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n\n        mediaViewData.toggleVisibility(2, false, MediaDisplayMode.AUTO)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n\n        mediaViewData.toggleVisibility(2, false, MediaDisplayMode.AUTO)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.Visible\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n\n    }\n\n    /**\n     * toggleVisibilityのテストコード、modeがALWAYS_HIDE_WHEN_MOBILE_NETWORKの時\n     */\n    @Test\n    fun toggleVisibility_GiveConfigAsAlwaysHideWhenMobileNetwork() = runTest {\n        val config = DefaultConfig.config.copy(\n            mediaDisplayMode = MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK\n        )\n        val files = listOf(\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = true\n                ),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = false\n                ),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = false\n                ),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = false\n                ),\n            )\n        )\n        val mediaViewData = MediaViewData(files, config)\n        mediaViewData.toggleVisibility(0, true, MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n\n        mediaViewData.toggleVisibility(1, true, MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n        mediaViewData.toggleVisibility(1, true, MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n\n    }\n\n    @Test\n    fun toggleVisibility_GiveConfigAsAlwaysHideWhenMobileNetworkAndNetworkIsWifi() = runTest {\n        val config = DefaultConfig.config.copy(\n            mediaDisplayMode = MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK\n        )\n        val files = listOf(\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = true\n                ),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = false\n                ),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = false\n                ),\n            ),\n            FilePreviewSource.Remote(\n                AppFile.Remote(id = FileProperty.Id(0L, \"1\")),\n                FileProperty.make(\n                    id = FileProperty.Id(0L, \"1\"),\n                    isSensitive = false\n                ),\n            )\n        )\n        val mediaViewData = MediaViewData(files, config)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n        mediaViewData.toggleVisibility(0, false, MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n\n        mediaViewData.toggleVisibility(1, false, MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.SensitiveHide,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n        mediaViewData.toggleVisibility(1, false, MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK)\n        Assertions.assertEquals(\n            listOf(\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.Visible,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork,\n                PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n            ),\n            mediaViewData.files.value.map { it.visibleType }\n        )\n\n    }\n\n\n}"
  },
  {
    "path": "benchmark/.gitignore",
    "content": "/build"
  },
  {
    "path": "benchmark/build.gradle",
    "content": "plugins {\n    id 'com.android.test'\n    id 'org.jetbrains.kotlin.android'\n}\n\nandroid {\n    namespace 'systems.panta.benchmark'\n    compileSdk 35\n\n    compileOptions {\n        sourceCompatibility = JavaVersion.VERSION_17\n        targetCompatibility = JavaVersion.VERSION_17\n    }\n\n    kotlinOptions {\n        jvmTarget = \"17\"\n    }\n\n    defaultConfig {\n        minSdk 28\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n\n        def properties = new Properties()\n        def propertyFile = project.rootProject.file('benchmark.properties')\n        if (propertyFile.exists()) {\n            properties.load(project.rootProject.file('benchmark.properties').newDataInputStream())\n        }\n        def REMOTE_ID = properties.getProperty('account.remote_id', '')\n        def INSTANCE_DOMAIN = properties.getProperty('account.instance_domain', '')\n        def USERNAME = properties.getProperty('account.username', '')\n        def TOKEN = properties.getProperty('account.token', '')\n        buildConfigField('String', 'ACCOUNT_REMOTE_ID', \"\\\"${REMOTE_ID}\\\"\")\n        buildConfigField('String', 'INSTANCE_DOMMAIN', \"\\\"${INSTANCE_DOMAIN}\\\"\")\n        buildConfigField('String', 'USERNAME', \"\\\"${USERNAME}\\\"\")\n        buildConfigField('String', 'TOKEN', \"\\\"${TOKEN}\\\"\")\n\n    }\n\n    buildTypes {\n        // This benchmark buildType is used for benchmarking, and should function like your\n        // release build (for example, with minification on). It's signed with a debug key\n        // for easy local/CI testing.\n        benchmark {\n            debuggable = true\n            signingConfig = debug.signingConfig\n            matchingFallbacks = [\"release\"]\n        }\n    }\n\n    targetProjectPath = \":app\"\n    experimentalProperties[\"android.experimental.self-instrumenting\"] = true\n}\n\ndependencies {\n    implementation libs.androidx.test.ext.junit\n    implementation libs.androidx.test.espresso.core\n    implementation 'androidx.test.uiautomator:uiautomator:2.3.0'\n    implementation 'androidx.benchmark:benchmark-macro-junit4:1.3.0'\n\n    implementation project(\":modules:data\")\n    implementation project(\":modules:model\")\n    implementation project(\":modules:common\")\n    implementation libs.room.runtime\n}\n\nandroidComponents {\n    beforeVariants(selector().all()) {\n        enable = buildType == \"benchmark\"\n    }\n}"
  },
  {
    "path": "benchmark/src/main/AndroidManifest.xml",
    "content": "<manifest />"
  },
  {
    "path": "benchmark/src/main/java/systems/panta/benchmark/ExampleStartupBenchmark.kt",
    "content": "package systems.panta.benchmark\n\nimport android.content.ComponentName\nimport android.content.Intent\nimport androidx.benchmark.macro.StartupMode\nimport androidx.benchmark.macro.StartupTimingMetric\nimport androidx.benchmark.macro.junit4.MacrobenchmarkRule\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n/**\n * This is an example startup benchmark.\n *\n * It navigates to the device's home screen, and launches the default activity.\n *\n * Before running this benchmark:\n * 1) switch your app's active build variant in the Studio (affects Studio runs only)\n * 2) add `<profileable android:shell=\"true\" />` to your app's manifest, within the `<application>` tag\n *\n * Run this benchmark from Studio to see startup measurements, and captured system traces\n * for investigating your app's performance.\n */\n@RunWith(AndroidJUnit4::class)\nclass ExampleStartupBenchmark {\n    @get:Rule\n    val benchmarkRule = MacrobenchmarkRule()\n\n\n    @Test\n    fun startup() = benchmarkRule.measureRepeated(\n        packageName = \"jp.panta.misskeyandroidclient\",\n        metrics = listOf(StartupTimingMetric()),\n        iterations = 5,\n        startupMode = StartupMode.COLD,\n        setupBlock = {\n        }\n    ) {\n        val intent = Intent(Intent.ACTION_MAIN).apply {\n            component = ComponentName(\"jp.panta.misskeyandroidclient\", \"jp.panta.misskeyandroidclient.MainActivity\")\n            putExtra(\"remoteId\", BuildConfig.ACCOUNT_REMOTE_ID)\n            putExtra(\"host\", BuildConfig.INSTANCE_DOMMAIN)\n            putExtra(\"token\", BuildConfig.TOKEN)\n            putExtra(\"username\", BuildConfig.USERNAME)\n        }\n\n        pressHome()\n        startActivityAndWait(intent)\n    }\n\n}"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\n\nbuildscript {\n    repositories {\n        google()\n        maven { url \"https://jitpack.io\" }\n        maven { url 'https://maven.google.com' }\n        mavenCentral()\n    }\n    dependencies {\n        classpath \"com.google.android.gms:oss-licenses-plugin:0.10.6\"\n        classpath 'com.google.gms:google-services:4.4.2'\n        classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.3'\n    }\n}\n\nplugins {\n    alias libs.plugins.kotlin.serialization.plugin apply false\n    //com.android.tools.build:gradle:8.1.3\n    alias(libs.plugins.android.application) apply false\n    // classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n    alias(libs.plugins.kotlin.android) apply false\n\n    //classpath 'com.google.dagger:hilt-android-gradle-plugin:2.48.1'\n    alias(libs.plugins.dagger.hilt.android) apply false\n    alias(libs.plugins.android.test) apply false\n\n    alias(libs.plugins.compose.compiler) apply false\n}\n\nallprojects {\n    repositories {\n        google()\n        mavenCentral()\n        maven { url \"https://jitpack.io\" }\n        maven { url 'https://maven.google.com' }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}"
  },
  {
    "path": "csae_policy_ja.md",
    "content": "# 児童の性的虐待・搾取（CSAE）に関するポリシー\n\nPantasystem（以下「開発者」）が開発・提供する Fediverse クライアントアプリ「Milktea」（以下「本アプリ」）は、児童の安全を最優先事項のひとつとして位置づけ、児童の性的虐待および搾取（CSAE: Child Sexual Abuse and Exploitation）を一切許容しません。\n\n---\n\n## 1. 禁止コンテンツ\n\n本アプリを通じた以下のコンテンツの閲覧・投稿・共有・拡散を禁止します。\n\n- 児童性的虐待素材（CSAM: Child Sexual Abuse Material）\n- 18歳未満の人物を性的に描写するコンテンツ（実写・イラスト・AI生成物を含む）\n- 児童を性的に誘惑・グルーミング・搾取することを目的としたコンテンツや行為\n- 児童の性的取引・人身売買を助長・促進するコンテンツ\n\n---\n\n## 2. 本アプリの性質について\n\nMilktea は Misskey・Mastodon・Calckey・Firefish などの分散型ソーシャルネットワーク（Fediverse）に接続するクライアントアプリです。コンテンツはユーザーが接続する各サーバー（インスタンス）によって管理されており、開発者はサーバー上のコンテンツを直接管理する立場にありません。\n\nただし、本アプリを通じて CSAE に該当するコンテンツに接触した場合は、以下の手順で報告してください。\n\n---\n\n## 3. 報告方法\n\n### アプリ内報告機能\n\n本アプリには投稿・ユーザーの報告機能が実装されています。報告はその投稿が存在するサーバーの管理者に送信されます。\n\n1. 問題のある投稿またはユーザーのメニューを開く\n2. 「報告する」を選択\n3. 報告理由を入力して送信\n\n### 開発者への直接連絡\n\nサーバー管理者への報告が困難な場合、または本アプリ自体に関する問題の場合は、以下のフォームにて開発者に連絡してください。\nhttps://docs.google.com/forms/d/e/1FAIpQLScbSPcTt4tvnKpkEkPex0y24ekAZVgBUEHFBT4DLaahzKcLaA/viewform?usp=dialog\n\n### 国内外の通報窓口\n\n- **警察庁 サイバー犯罪相談窓口**: https://www.npa.go.jp/cyber/soudan.htm\n- **インターネットホットラインセンター（IHC）**: https://www.internethotline.jp/\n- **NCMEC（National Center for Missing & Exploited Children）**: https://www.missingkids.org/gethelpnow/cybertipline\n\n---\n\n## 4. 対応方針\n\n開発者は CSAE に関する報告を受けた場合、以下の対応を行います。\n\n1. 報告内容を速やかに確認・調査する\n2. 必要に応じてサーバー管理者に通知する\n3. 法的に通報が必要と判断した場合、法執行機関および関係機関に通報する\n4. 本アプリの機能・設計上の問題が確認された場合、速やかに修正する\n\n---\n\n## 5. 改定\n\n本ポリシーは必要に応じて改定することがあります。重要な変更がある場合はリポジトリの更新履歴にて通知します。\n\n---\n\n最終更新日: 2026年4月6日\n開発者: Pantasystem\n"
  },
  {
    "path": "docs/mfm-decorator-implementation-guide.md",
    "content": "# MFM デコレーター 未実装構文 実装ガイド\n\n対象ファイル: `modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MFMDecorator.kt`\n\nMFM パーサーライブラリ: `com.github.pantasystem:mfm-kt:main-SNAPSHOT`\nパース結果の型: `List<MfmNode>`（`dev.misskey.mfm.node` パッケージ）\n\n`$[name.arg=val 内容]` 構文はすべて `Fn(name, args: Map<String, String?>, children)` ノードとして渡される。\n実装は `NodeDecorator.decorateNode()` 内の `is Fn ->` ブランチの `when (node.name)` に追加する。\n\n---\n\n## 実装済み構文（参考）\n\n| 構文 | Fn name | 実装済み処理 |\n|---|---|---|\n| `$[x2]` 〜 `$[x4]` | `\"x2\"` 〜 `\"x4\"` | `RelativeSizeSpan(2f〜4f)` |\n| `$[fg.color=fff ...]` | `\"fg\"` | `ForegroundColorSpan` |\n| `$[bg.color=fff ...]` | `\"bg\"` | `BackgroundColorSpan` |\n| `$[font.serif ...]` 等 | `\"font\"` | `TypefaceSpan(\"serif\")` 等 |\n\n---\n\n## 未実装構文の実装方針\n\n### 1. `$[unixtime 1701356400]`\n\n**難易度: 低**\n\n`Fn` ではなく専用ノードになる可能性があるが、パーサーの実装によっては `Fn(name=\"unixtime\", args={\"1701356400\": null})` か、あるいは `children` にテキストが入る形になる。実際には `children` の `MfmText.text` に数値文字列が入る。\n\n```kotlin\n\"unixtime\" -> {\n    val epochSec = node.children\n        .filterIsInstance<MfmText>()\n        .firstOrNull()?.text?.trim()?.toLongOrNull()\n    if (epochSec != null) {\n        val formatted = java.text.DateFormat\n            .getDateTimeInstance(java.text.DateFormat.SHORT, java.text.DateFormat.SHORT)\n            .format(java.util.Date(epochSec * 1000L))\n        SpannedString(formatted)\n    } else {\n        inner\n    }\n}\n```\n\n> **注意**: `unixtime` は `inner` を返さず、変換後のテキストを直接 `SpannedString` で返す。\n\n---\n\n### 2. `$[blur テキスト]`\n\n**難易度: 低**\n\nAndroid 標準の `MaskFilterSpan` + `BlurMaskFilter` で実現できる。\n`BlurMaskFilter` はぼかし半径（px）と種類（`NORMAL` / `OUTER` / `INNER` / `SOLID`）を指定する。\n\n```kotlin\n\"blur\" -> {\n    inner.setSpan(\n        android.text.style.MaskFilterSpan(\n            android.graphics.BlurMaskFilter(20f, android.graphics.BlurMaskFilter.Blur.NORMAL)\n        ),\n        0, inner.length, 0\n    )\n}\n```\n\n> **注意**: `MaskFilterSpan` はハードウェアアクセラレーション有効時に無視される場合がある。\n> `textView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)` を TextView 側に設定する必要がある。\n> `DecorateTextHelper.kt` 内の `decorate()` BindingAdapter で対応するのが適切。\n\n---\n\n### 3. `$[scale.x=2 テキスト]` / `$[scale.y=2 テキスト]`\n\n**難易度: 低〜中**\n\n- **横スケール (`scale.x`)**: Android 標準の `ScaleXSpan(factor)` で実現可能。\n- **縦スケール (`scale.y`)**: 標準 API にないため `RelativeSizeSpan` で代替するか、カスタム Span が必要。\n\n```kotlin\n\"scale\" -> {\n    val scaleX = node.args[\"x\"]?.toFloatOrNull()\n    val scaleY = node.args[\"y\"]?.toFloatOrNull()\n    if (scaleX != null) {\n        inner.setSpan(android.text.style.ScaleXSpan(scaleX), 0, inner.length, 0)\n    }\n    if (scaleY != null) {\n        // 縦スケールは RelativeSizeSpan で近似（正確ではない）\n        inner.setSpan(RelativeSizeSpan(scaleY), 0, inner.length, 0)\n    }\n}\n```\n\n---\n\n### 4. `$[border.style=solid,width=4 テキスト]`\n\n**難易度: 中**\n\n`ReplacementSpan` を継承したカスタム Span を作成し、`draw()` で `Canvas.drawRect()` を使って枠線を描画する。\n\n```kotlin\nclass MfmBorderSpan(\n    private val style: String,   // solid / dotted / dashed / double / groove / ridge / inset / outset\n    private val width: Int,      // px\n    private val color: Int,      // ARGB\n    private val radius: Float,   // 角丸 px\n) : ReplacementSpan() {\n\n    override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?) =\n        paint.measureText(text, start, end).toInt() + width * 2\n\n    override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int,\n                      x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {\n        val borderPaint = Paint(paint).apply {\n            this.color = this@MfmBorderSpan.color\n            this.style = Paint.Style.STROKE\n            strokeWidth = width.toFloat()\n            // dotted/dashed は PathEffect で対応\n            if (this@MfmBorderSpan.style == \"dotted\") {\n                pathEffect = DashPathEffect(floatArrayOf(4f, 4f), 0f)\n            } else if (this@MfmBorderSpan.style == \"dashed\") {\n                pathEffect = DashPathEffect(floatArrayOf(10f, 4f), 0f)\n            }\n        }\n        val rect = RectF(x, top.toFloat(), x + getSize(paint, text, start, end, null), bottom.toFloat())\n        canvas.drawRoundRect(rect, radius, radius, borderPaint)\n        canvas.drawText(text, start, end, x + width, y.toFloat(), paint)\n    }\n}\n```\n\n`Fn` 分岐での呼び出し:\n```kotlin\n\"border\" -> {\n    val style = node.args[\"style\"] ?: \"solid\"\n    val width = node.args[\"width\"]?.toIntOrNull() ?: 1\n    val color = parseMfmColor(node.args[\"color\"]) ?: Color.BLACK\n    val radius = node.args[\"radius\"]?.toFloatOrNull() ?: 0f\n    inner.setSpan(MfmBorderSpan(style, width, color, radius), 0, inner.length, 0)\n}\n```\n\n---\n\n### 5. `$[ruby 漢字 かんじ]`\n\n**難易度: 中**\n\n`ReplacementSpan` を継承して、本文の上部に小さいテキスト（ルビ）を描画する。\n`Fn(name=\"ruby\", args={}, children=[MfmText(\"漢字 かんじ\")])` の形でパースされる。\nスペースで区切って `children[0]` = 本文、`children[1]` = ルビとして扱う。\n\n```kotlin\nclass MfmRubySpan(\n    private val baseText: String,\n    private val rubyText: String,\n) : ReplacementSpan() {\n\n    override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int {\n        return maxOf(\n            paint.measureText(baseText),\n            paint.measureText(rubyText) * (paint.textSize * 0.5f / paint.textSize)\n        ).toInt()\n    }\n\n    override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int,\n                      x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {\n        // ルビ（上部小テキスト）\n        val rubyPaint = Paint(paint).apply { textSize *= 0.5f }\n        canvas.drawText(rubyText, x, top + rubyPaint.textSize, rubyPaint)\n        // 本文\n        canvas.drawText(baseText, x, y.toFloat(), paint)\n    }\n}\n```\n\n`Fn` 分岐での呼び出し:\n```kotlin\n\"ruby\" -> {\n    val raw = node.children.filterIsInstance<MfmText>().joinToString(\"\") { it.text }\n    val spaceIdx = raw.lastIndexOf(' ')\n    if (spaceIdx > 0) {\n        val base = raw.substring(0, spaceIdx)\n        val ruby = raw.substring(spaceIdx + 1)\n        val spanned = SpannableString(base)\n        spanned.setSpan(MfmRubySpan(base, ruby), 0, base.length, 0)\n        spanned\n    } else {\n        inner\n    }\n}\n```\n\n---\n\n### 6. `$[flip テキスト]` / `$[flip.v ...]` / `$[flip.h,v ...]`\n\n**難易度: 中**\n\n`ReplacementSpan` で `Canvas.scale(-1f, 1f)` (水平) または `Canvas.scale(1f, -1f)` (垂直) を使用。\n\n```kotlin\nclass MfmFlipSpan(\n    private val horizontal: Boolean,\n    private val vertical: Boolean,\n) : ReplacementSpan() {\n\n    override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?) =\n        paint.measureText(text, start, end).toInt()\n\n    override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int,\n                      x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {\n        val w = paint.measureText(text, start, end)\n        val cx = x + w / 2f\n        val cy = (top + bottom) / 2f\n        canvas.save()\n        canvas.scale(\n            if (horizontal) -1f else 1f,\n            if (vertical) -1f else 1f,\n            cx, cy\n        )\n        canvas.drawText(text, start, end, x, y.toFloat(), paint)\n        canvas.restore()\n    }\n}\n```\n\n`Fn` 分岐での呼び出し:\n```kotlin\n\"flip\" -> {\n    val h = !node.args.containsKey(\"v\") || node.args.containsKey(\"h\")\n    val v = node.args.containsKey(\"v\")\n    inner.setSpan(MfmFlipSpan(h, v), 0, inner.length, 0)\n}\n```\n\n---\n\n### 7. `$[rotate.deg=30 テキスト]`\n\n**難易度: 中〜高**\n\n`ReplacementSpan` で `Canvas.rotate(deg)` を使用。\n回転するとバウンディングボックスが変わるため、`getSize()` での幅計算が複雑になる。\n\n```kotlin\nclass MfmRotateSpan(private val degrees: Float) : ReplacementSpan() {\n\n    override fun getSize(paint: Paint, text: CharSequence, start: Int, end: Int, fm: Paint.FontMetricsInt?) =\n        paint.measureText(text, start, end).toInt()\n\n    override fun draw(canvas: Canvas, text: CharSequence, start: Int, end: Int,\n                      x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {\n        val w = paint.measureText(text, start, end)\n        val cx = x + w / 2f\n        val cy = (top + bottom) / 2f\n        canvas.save()\n        canvas.rotate(degrees, cx, cy)\n        canvas.drawText(text, start, end, x, y.toFloat(), paint)\n        canvas.restore()\n    }\n}\n```\n\n`Fn` 分岐での呼び出し:\n```kotlin\n\"rotate\" -> {\n    val deg = node.args[\"deg\"]?.toFloatOrNull() ?: 0f\n    inner.setSpan(MfmRotateSpan(deg), 0, inner.length, 0)\n}\n```\n\n---\n\n## 実装しない構文（理由）\n\n| 構文 | 理由 |\n|---|---|\n| `$[jelly]` `$[tada]` `$[jump]` `$[bounce]` `$[spin]` `$[shake]` `$[twitch]` `$[rainbow]` `$[sparkle]` | TextView の Span はアニメーション非対応。Compose や ObjectAnimator を使った別アーキテクチャが必要 |\n| `$[position.x=0.8,y=0.5 ...]` | フローレイアウト内の絶対座標オフセットは TextView の行レイアウト制約上ほぼ不可能 |\n\n---\n\n## カスタム Span を配置するファイルの推奨場所\n\n新規ファイルとして以下に作成する:\n\n```\nmodules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/mfm/\n  MfmBorderSpan.kt\n  MfmRubySpan.kt\n  MfmFlipSpan.kt\n  MfmRotateSpan.kt\n```\n\n`blur` 対応時の `LAYER_TYPE_SOFTWARE` 設定場所:\n`DecorateTextHelper.kt` の `TextView.decorate(result: LazyDecorateResult?)` 内で\n`LazyDecorateResult` にフラグを持たせるか、`Spanned` を検査して `MaskFilterSpan` があれば設定する。\n"
  },
  {
    "path": "docs/migrate-dynamic-feature-flag-plan.md",
    "content": "# 概要\n前提として当アプリは複数のSNSのAPIやそれらフォークをサポートしている。  \nSNSによって使える機能やAPIやエンドポイントが異なるため、  \nアプリではこれを識別し、ロジックの制御やUIの表示分けを行っていた。  \nより多くのソフトウェアやフォークをサポートしていくために、この仕組みを改善する。\n\n# 現状の問題点\n現状はサーバーから取得できるnodeinfoや/meta, /instance情報を元に機能の判別をしている。  \nこれ自体は問題ないが、このnodeinfo, meta, instanceなどの構造に深く依存してしまっている。  \nまた依存している箇所ごとに複雑な評価処理を行なっていて可読性が低くなってしまっている。\n```Kotlin\nwhen (account.instanceType) {\n                    Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                        postUnReaction(deleteReaction.noteId)\n                                && (noteCaptureAPIProvider.get(account)\n                            ?.isCaptured(deleteReaction.noteId.noteId) == true\n                                || (note.reactionCounts.any { it.me }\n                                && noteDataSource.add(note.onIUnReacted())\n                            .getOrThrow() != AddResult.Canceled))\n                    }\n                    Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                        val nodeInfo = nodeInfoRepository.find(account.getHost())\n                            .getOrThrow()\n                        if (nodeInfo.type !is NodeInfo.SoftwareType.Mastodon.Fedibird\n                            && nodeInfo.type !is NodeInfo.SoftwareType.Mastodon.Kmyblue\n                        ) {\n                            if (!note.isSupportEmojiReaction) {\n                                return@withContext false\n                            }\n                        }\n                        val res = mastodonAPIProvider.get(account)\n                            .deleteReaction(\n                                deleteReaction.noteId.noteId,\n                                Reaction(deleteReaction.reaction).getNameAndHost()\n                            )\n                            .throwIfHasError()\n                            .body()\n                        noteDataSourceAdder.addTootStatusDtoIntoDataSource(\n                            account,\n                            requireNotNull(res)\n                        )\n                        true\n                    }\n                }\n```\n\n# 解決策\n解決策として、アプリ内部に動的な機能フラグを構築し、  \n内部処理はこのフラグを元に使用できる機能や分岐を行うようにする。    \nまたこの機能はユーザーが設定画面などからフラグを操作できるようにし、  \nアプリが想定していないForkなどであっても、フラグをON/OFFできるようにしフォールバックが提供されるようにする。  \n今回は実施しないがこの機能フラグの状態をサーバーから取得できるようにし、  \nソースコードを直接改変することなくある程度のソフトウェアに対応できるようにする。  \n\n# 大まかな設計\n## 機能フラグオブジェクト\nプリミティブな値とenumのみサポートする。  \n実際に必要なフラグやenumは内部のnodeinfo, meta, instanceInfoを使った処理を洗い出す必要性がある。\n\n### プロパティ\napiType, apiVersionは大まかなAPIのスキーマを選択する。  \n内部的な処理としてはRetrofitのインターフェースの選択に使われることを想定。\n- apiType(misskey, mastodon, pleroma)\n- apiVersion\n- reaction\n  - isSupportReaction\n  - maxReactionsPerAccount\n  - unicodeFormatType\n    - needColon\n    - dontNeedColon\n- supportMisskeyAntenna\n- supportFireshRecommendTimeline\n- supportGlobalTimeline\n- supportLocalTimeline\n- supportMisskeyGallery   \n\n↑無数にあるので洗い出しを行なった上で合理性の検証を必ずしたい。  \n\n## 機能フラグRepository\n内部的にはNodeInfo, InstanceInfo, Metaなどの情報を用いて、  \n機能フラグのインスタンスを生成することになる。  \n確認したいこととして、機能フラグの構築に失敗してしまうと、  \n全機能が使用できなくなってしまう可能性があるのと、  \n構築が遅い場合は起動や一部処理が落ちる可能性がある。  \nそのため、構築するときに使用されるデータが存在しない可能性や遅延が起きる可能性を考慮したい。  \nインターフェースとしてはインスタンスのドメイン部を引数に受け取り、  \n対応する機能フラグオブジェクトを返すようにする。  \nまたユーザーがインスタンスごとに機能フラグを設定できるようにするために、  \nインスタンスのドメイン部ごとに機能フラグを永続化できるようにする必要性がある。  \n\n## 機能フラグテンプレート\nインスタンスやソフトウェアの種別ごとにデフォルトとして用意される機能フラグのデフォルト値集。  \n\n# 機能フラグ設定画面\n機能フラグをユーザーが手動で更新するための画面。\n\n- 機能フラグを有効にする(実際は必須でONになっているがユーザーが変更できるようにするという意味でON)\n  - 変更することで発生するリスクを明記\n    - 対象インスタンス選択DROPDOWN\n      - ログイン済みのアカウントのインスタンスのリスト + Intentで前の画面から値を貰えたあばいは追加表示\n    - 全ての設定項目を列挙\n\n\n\n\n```\nnodeinfoとmetaをmodelクラスに変換した構造に内部実装が依存した状態をやめる\n\n構造ベースの依存ではなく動的な機能フラグをベースとした基盤を作成する。\n\n動的な機能フラグの構築は自体はnodeinfoとmetaなどの情報から構築するようにする。\n\nまた機能フラグは原則としてプリミティブとenumをサポートするようにする。\n\n機能フラグはユーザーが認証画面や設定画面から編集できるようにし、\nアプリが想定していないフォークであってもある程度の機能が動作するようにする。\n\n\nこのためにデフォルトの挙動を表す機能フラグテンプレートを用意しnodeinfoの情報を元に\nこのテンプレートの判別をする。\n\nユーザーの設定はオーバーライドダイナミックフィーチャーフラグとしてDBに保存する。\n\n\n優先度は\nユーザーの設定>アプリのテンプレート\n\n将来手にはこのテンプレートをサーバーから配信できるようにするが今はしない\n```"
  },
  {
    "path": "docs/note-editor-compose-migration-plan.md",
    "content": "# NoteEditorActivity Jetpack Compose 移行計画\n\nこのドキュメントは Claude が作業を進めるための実装計画書です。\n完了したタスクは `- [ ]` を `- [x]` に変えてください。\n各フェーズに着手する前に「前提条件」を確認し、完了後は「完了確認」を実施してください。\n\n---\n\n## 基本方針\n\n`NoteEditorActivity` は現在、DataBinding を使う Fragment ベースのハイブリッド実装になっている。\nツールバー・ファイルプレビュー・ユーザーアクションメニュー・投票エディタなど約1,600行は既に Compose 化済み。\n残りの XML/Fragment 部分（約2,100行）を段階的に置き換える。\n\n**インクリメンタル戦略:** 内側から外側へ順に置き換え、各フェーズ終了後にビルド・動作確認できる状態を維持する。\n\n---\n\n## 現在のアーキテクチャ\n\n```\nNoteEditorActivity (AppCompatActivity + DataBinding)\n  └── NoteEditorFragment (Fragment + DataBinding)\n        ├── ComposeView: NoteEditorToolbar              ← 移行済み\n        ├── RecyclerView: addressUsersView              ← 要移行\n        ├── MultiAutoCompleteTextView: cw               ← 要移行（難）\n        ├── MultiAutoCompleteTextView: inputMain        ← 要移行（難）\n        ├── FrameLayout: edit_poll\n        │     └── PollEditorFragment (Compose inside)  ← 移行済み\n        ├── ComposeView: filePreview                    ← 移行済み\n        ├── ComposeView: noteEditorUserActionMenu       ← 移行済み\n        └── BottomSheetDialogFragment 群（多数）         ← 大半が移行済み\n```\n\n---\n\n## フェーズ一覧\n\n| フェーズ | 内容 | リスク | 完了後にリリース可能？ |\n|---------|------|--------|----------------------|\n| Phase 1 | Composable の骨格作成（未接続） | 低 | Yes |\n| Phase 2 | `EmojiAutoCompleteTextField`（AndroidView ラッパー） | 中 | Yes |\n| Phase 3 | `NoteEditorFragment` のレイアウトを Compose に置換 | 高 | Yes |\n| Phase 4 | Fragment を削除し Activity を `setContent` に移行 | 中 | Yes |\n| Phase 5 | ダイアログの純粋 Compose 化（任意） | 低 | Yes |\n\n---\n\n## Phase 1: Composable の骨格作成\n\n**ゴール:** ViewModel に接続せず、UI 構造だけを Compose で作る。Preview で確認できる状態にする。\n\n**前提条件:** なし（最初のフェーズ）\n\n### 作成するファイル\n\n#### `NoteEditorScreen.kt`\n最上位の stateful Composable。状態収集・コールバック受け渡しの責務のみを持つ。\n\n```kotlin\n@Composable\nfun NoteEditorScreen(\n    viewModel: NoteEditorViewModel,\n    onNavigateUp: () -> Unit,\n    onPickFileFromDrive: () -> Unit,\n    onPickFileFromLocal: () -> Unit,\n    onPickImageFromLocal: () -> Unit,\n    onSelectMentionUsers: () -> Unit,\n    onSelectAddressUsers: () -> Unit,\n    onShowEmojiPicker: () -> Unit,\n    onShowDraftPicker: () -> Unit,\n    onShowMediaPreview: (FilePreviewSource) -> Unit,\n    onEditFileCaption: (FilePreviewSource) -> Unit,\n    onEditFileName: (FilePreviewSource) -> Unit,\n)\n```\n\nViewModel から状態を collect し、子 Composable へ値として渡す。ダイアログのトリガーはラムダで上位に委譲する。\n\n#### `NoteEditorTextInputSection.kt`\nテキスト入力エリア全体（CW フィールド + 本文フィールド + 文字数カウント）。\nPhase 2 で実装する `EmojiAutoCompleteTextField` を組み込む。\n\n#### `NoteEditorAddressSection.kt`\n宛先ユーザーチップ + 追加ボタン。`FlowRow` または `LazyRow` で実装。\n`UserChipListAdapter` の RecyclerView を置き換える。\n\n#### `NoteEditorReplyPreview.kt`\nリプライ先ノートの簡易プレビューカード。\n`item_note_editor_reply_to_note.xml` の代替。DataBinding の複雑なバインディングは不要で、\nアバター・表示名・本文テキストだけを表示するシンプルな実装でよい。\n\n#### `NoteEditorScheduleSection.kt`\n予約投稿の日時表示 + クリア・編集ボタン行。\n\n### 設計上の注意\n\n- ViewModel のインスタンスを孫 Composable まで引き回さない。`NoteEditorScreen` で `uiState` を collect し、派生した値のみを子に渡す\n- `NoteEditorUiState` は既によく整理された構造になっているため、そのまま活用できる\n\n### チェックリスト\n\n- [x] `NoteEditorScreen.kt` を作成し、既存の Compose コンポーネント（`NoteEditorToolbar`、`NoteFilePreview`、`NoteEditorUserActionMenuLayout`）を組み込む\n- [x] `NoteEditorTextInputSection.kt` を作成（この時点では `AndroidView` なしのプレースホルダーでよい）\n- [x] `NoteEditorAddressSection.kt` を作成\n- [x] `NoteEditorReplyPreview.kt` を作成\n- [x] `NoteEditorScheduleSection.kt` を作成\n- [x] 各 Composable に `@Preview` を追加して確認\n- [x] `./gradlew :modules:features:note:compileDebugKotlin` でコンパイルエラーがないことを確認\n\n---\n\n## Phase 2: EmojiAutoCompleteTextField の実装\n\n**ゴール:** `MultiAutoCompleteTextView` を `AndroidView` でラップした Composable を作る。\n\n**前提条件:** Phase 1 完了\n\nこれが移行の最大難所。Compose の `TextField` / `BasicTextField` にはビルトインの補完機能がないため、\nまず `AndroidView` でブリッジし、安定後に純粋 Compose 実装に移行する（別フェーズ）。\n\n### `EmojiAutoCompleteTextField.kt`\n\n```kotlin\n@Composable\nfun EmojiAutoCompleteTextField(\n    value: String,\n    onValueChange: (String) -> Unit,\n    onFocused: () -> Unit,\n    account: Account?,\n    customEmojiRepository: CustomEmojiRepository,\n    modifier: Modifier = Modifier,\n    hint: String = \"\",\n    cursorPosition: Int? = null,  // ViewModel の textCursorPos flow から受け取る\n)\n```\n\n実装方針:\n- `AndroidView { MultiAutoCompleteTextView(ctx) }` で既存の `CustomEmojiCompleteAdapter` + `CustomEmojiTokenizer` をそのまま使う\n- `update` ブロックで `value` の変化を TextView に反映する（ループ防止のため `text.toString() != value` でガード）\n- `cursorPosition` が変化したら `setSelection()` を呼ぶ\n\n### フォーカス管理の置き換え\n\n現在 ViewModel に `var focusType: NoteEditorFocusEditTextType` という mutable var があり、Fragment がフォーカスイベントで書き換えている。\nCompose では `NoteEditorScreen` のローカル状態として持つ：\n\n```kotlin\nvar focusedField by remember { mutableStateOf(NoteEditorFocusEditTextType.Text) }\n```\n\n絵文字選択コールバックでこれを参照する。ViewModel の `focusType` は `SimpleEditorFragment` が移行されるまで残す。\n\n### 注意事項\n\n- `AndroidView` を `LazyColumn` の中に入れると再測定問題が起きる。テキスト入力エリアは `verticalScroll` + `Column` で実装する\n- `MultiAutoCompleteTextView` の `performFiltering` 内に `runBlocking` があるが、これは既存の問題なので今回は触らない\n- IME Insets は Activity 側の `enableEdgeToEdge()` + `ViewCompat.setOnApplyWindowInsetsListener` で既に処理済みなので競合に注意\n\n### チェックリスト\n\n- [x] `EmojiAutoCompleteTextField.kt` を作成し、`AndroidView` で `MultiAutoCompleteTextView` をラップする\n- [x] `CustomEmojiCompleteAdapter` + `CustomEmojiTokenizer` を `AndroidView` の `factory` ブロックで設定する\n- [x] `update` ブロックでテキスト同期とカーソル位置同期を実装する\n- [x] `NoteEditorTextInputSection.kt` を `EmojiAutoCompleteTextField` を使う実装に更新する\n- [x] `NoteEditorScreen` 内に `focusedField` ローカル状態を追加する\n- [x] `./gradlew :modules:features:note:compileDebugKotlin` でコンパイルエラーがないことを確認\n\n---\n\n## Phase 3: NoteEditorFragment を Compose に置換\n\n**ゴール:** `NoteEditorFragment` の DataBinding レイアウトを `NoteEditorScreen` に差し替える。Fragment と Activity は残す。\n\n**前提条件:** Phase 1・2 完了。**このフェーズが最もリスクが高い。着手前に必ず現在の動作を手元で確認すること。**\n\n### 変更手順\n\n1. `NoteEditorFragment` の `Fragment(R.layout.fragment_note_editor)` を `Fragment()` に変更し、`onCreateView` で `ComposeView` を返す\n\n```kotlin\noverride fun onCreateView(\n    inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?\n): View = ComposeView(requireContext()).apply {\n    setContent {\n        MilkteaStyleConfigApplyAndTheme(...) {\n            NoteEditorScreen(\n                viewModel = viewModel,\n                onPickFileFromDrive = { openDriveLauncher.launch(...) },\n                ...\n            )\n        }\n    }\n}\n```\n\n2. `ActivityResultContracts` のランチャーは Fragment に残す（ライフサイクルオーナーが必要なため）。ラムダとして `NoteEditorScreen` に渡す\n\n3. `PollEditorFragment` のトランザクションを削除し、`PollEditorLayout` を `NoteEditorScreen` 内で直接呼ぶ（`uiState.poll != null` の条件分岐）\n\n4. `ComposeView` の島（toolbar・filePreview・userActionMenu）を `NoteEditorScreen` 内に統合\n\n5. `UserChipListAdapter` + RecyclerView を `NoteEditorAddressSection` に置換\n\n### バックプレス処理\n\n現在 `requireActivity().onBackPressedDispatcher.addCallback(this)` で下書き保存確認を行っている。\nFragment が残っている間はこのまま維持する。Phase 4 で `BackHandler { }` に移行する。\n\n### `settingStore.isPostButtonAtTheBottom` の対応\n\n投稿ボタン位置の切り替えロジックを `NoteEditorScreen` 内で Compose の条件分岐に置き換える：\n\n```kotlin\nif (uiState.isPostButtonAtTheBottom) {\n    // アクションメニューを下部に配置\n} else {\n    // ツールバー内に配置\n}\n```\n\n### チェックリスト\n\n- [x] `NoteEditorFragment.onCreateView` を `ComposeView` を返す実装に変更する\n- [x] DataBinding 関連コード（`binding.*` の参照）を `NoteEditorFragment` からすべて削除する\n- [x] `ActivityResultContracts` ランチャー群をラムダとして `NoteEditorScreen` に渡す\n- [x] `PollEditorFragment` のトランザクションを削除し `PollEditorLayout` を直接呼ぶ\n- [x] 既存の `ComposeView` 島（toolbar・filePreview・userActionMenu）を `NoteEditorScreen` 内に統合する\n- [x] `UserChipListAdapter` + RecyclerView を `NoteEditorAddressSection` に置換する\n- [x] `fragment_note_editor.xml` を削除する\n- [ ] `PollEditorFragment.kt` を削除する（`SimpleEditorFragment` が参照しているため保留）\n- [x] `./gradlew :app:assembleDebug` BUILD SUCCESSFUL を確認\n- [ ] 実機またはエミュレータで以下の動作確認:\n  - [ ] テキスト入力・絵文字補完が動作する\n  - [ ] CW フィールドの表示/非表示が動作する\n  - [ ] ファイル添付が動作する\n  - [ ] 投票エディタが動作する\n  - [ ] 宛先ユーザー選択が動作する\n  - [ ] 予約投稿の設定が動作する\n  - [ ] バックプレスで下書き保存確認が出る\n  - [ ] 投稿が正常に完了する\n\n---\n\n## Phase 4: Activity を setContent に移行\n\n**ゴール:** `NoteEditorFragment` を削除し、Activity が直接 `setContent` する形に変える。\n\n**前提条件:** Phase 3 完了・動作確認済み\n\n### NoteEditorActivity の変更\n\n```kotlin\n@AndroidEntryPoint\nclass NoteEditorActivity : AppCompatActivity() {\n    // AppCompatActivity のまま継続（ComponentActivity にすると AppCompat 依存が壊れる可能性あり）\n\n    private val viewModel: NoteEditorViewModel by viewModels()\n\n    // ActivityResultContracts ランチャーを Fragment から Activity に移動\n    private val openDriveLauncher = registerForActivityResult(...) { ... }\n    private val pickMultipleMediaLauncher = registerForActivityResult(...) { ... }\n    // ...\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        applyTheme()\n\n        if (savedInstanceState == null) {\n            viewModel.initialize(parseNoteEditorArgs(intent))\n        }\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(...) {\n                NoteEditorScreen(\n                    viewModel = viewModel,\n                    onNavigateUp = { finish() },\n                    onPickFileFromDrive = { openDriveLauncher.launch(...) },\n                    ...\n                )\n            }\n        }\n    }\n}\n```\n\n**注意:** `ComponentActivity` への変更は避ける。`AppCompatActivity` は `ComponentActivity` を継承しており `setContent { }` も使えるため、互換性を保つために `AppCompatActivity` のままにする。\n\n### Intent API の維持\n\n`newBundle()` コンパニオン関数は呼び出し元が多数あるため変更不要。Activity の内部実装だけ変わる。\n\n### Window Insets の移行\n\nFragment が消えた後は `NoteEditorScreen` の Scaffold/Column 側で `WindowInsets` を処理する：\n\n```kotlin\nScaffold(\n    contentWindowInsets = WindowInsets.safeDrawing,\n    ...\n)\n```\n\n### バックプレス処理の移行\n\n```kotlin\n// NoteEditorScreen 内\nBackHandler(enabled = uiState.hasContent) {\n    showSaveAsDraftDialog = true\n}\n```\n\n### Intent 引数パース\n\n`parseNoteEditorArgs(intent: Intent): NoteEditorArgs` として独立関数に切り出す。\n\n### `isSaveNoteAsDraft` フローの処理\n\n現在 `Handler(Looper.getMainLooper()).post { finish() }` で処理している部分を `LaunchedEffect` に置き換える：\n\n```kotlin\nLaunchedEffect(Unit) {\n    viewModel.isSaveNoteAsDraft.collect { draftId ->\n        if (draftId != null) onNavigateUp()\n    }\n}\n```\n\n### チェックリスト\n\n- [x] `ActivityResultContracts` ランチャー群を `NoteEditorFragment` から `NoteEditorActivity` に移動する\n- [x] `NoteEditorActivity.onCreate` を `setContent { NoteEditorScreen(...) }` に変更する\n- [x] `NoteEditorScreen` の Scaffold に `contentWindowInsets = WindowInsets.safeDrawing` を設定する\n- [x] bottomBar に `imePadding()` を追加してキーボード表示時にアクションバーが上に移動するよう対応\n- [x] `NoteEditorFragment.kt` を削除する\n- [x] `activity_note_editor.xml` を削除する\n- [x] `./gradlew :app:assembleDebug` BUILD SUCCESSFUL を確認\n- [ ] 実機またはエミュレータで Phase 3 と同じ動作確認項目を再確認する\n\n---\n\n## Phase 5: ダイアログの純粋 Compose 化（任意）\n\n**ゴール:** Fragment ベースのダイアログを純粋 Compose の `Dialog { }` / `AlertDialog` composable に置き換える。\n\n**前提条件:** Phase 4 完了。優先度低・任意対応。\n\nほとんどのダイアログは既に Compose inside Fragment になっている。以下を完全 Compose 化する：\n\n| 現在 | 移行後 |\n|------|--------|\n| `ConfirmSaveAsDraftDialog` (Fragment) | `AlertDialog` composable（`showSaveAsDraftDialog: Boolean` state で制御） |\n| `NoteEditorFileSizeWarningDialog` | 同上 |\n| `ReservationPostDatePickerDialog` | `DatePickerDialog` composable |\n| `ReservationPostTimePickerDialog` | `TimePickerDialog` composable |\n| `PollDatePickerDialog` | 同上 |\n| `PollTimePickerDialog` | 同上 |\n\n`VisibilitySelectionDialogV2`・`NoteEditorSwitchAccountDialog`・`EditFileCaptionDialog`・`EditFileNameDialog` は既に Compose ベースなので、Fragment ラッパーを外して `Dialog { }` composable に変えるだけでよい。\n\n### チェックリスト\n\n- [ ] `ConfirmSaveAsDraftDialog` を `NoteEditorScreen` 内の `AlertDialog` composable に置き換える\n- [ ] `NoteEditorFileSizeWarningDialog` を `AlertDialog` composable に置き換える\n- [ ] `ReservationPostDatePickerDialog` / `ReservationPostTimePickerDialog` を `DatePickerDialog` / `TimePickerDialog` composable に置き換える\n- [ ] `PollDatePickerDialog` / `PollTimePickerDialog` を composable に置き換える\n- [ ] `VisibilitySelectionDialogV2` の Fragment ラッパーを外す\n- [ ] `NoteEditorSwitchAccountDialog` の Fragment ラッパーを外す\n- [ ] `EditFileCaptionDialog` / `EditFileNameDialog` の Fragment ラッパーを外す\n- [ ] `./gradlew :app:assembleDebug` BUILD SUCCESSFUL を確認\n\n---\n\n## 技術的難所まとめ\n\n### 1. MultiAutoCompleteTextView（Phase 2 で対処）\n\nCompose TextField には絵文字補完機能がないため `AndroidView` でブリッジ。\n将来的には `BasicTextField` + カスタムドロップダウンに置き換え可能だが初期移行では不要。\n\n### 2. ActivityResultContracts の配置（Phase 3→4 で対処）\n\n`rememberLauncherForActivityResult` は Composable 内でも使えるが、Activity/Fragment レベルで登録した方が\nライフサイクルの扱いが安全。今回は最終的に Activity に集約する。\n\n### 3. テーマ適用（Phase 4 で確認必要）\n\n`applyTheme()` が `AppCompatDelegate` に依存しているため、`AppCompatActivity` を維持することで解決する。\n`ComponentActivity` への変更は今回の範囲外とする。\n\n### 4. `isSaveNoteAsDraft` フローの処理（Phase 4 で対処）\n\n現在 `Handler(Looper.getMainLooper()).post { finish() }` で処理している。\nCompose 移行後は `LaunchedEffect` で監視する（詳細は Phase 4 参照）。\n\n---\n\n## SimpleEditorFragment について\n\n`SimpleEditorFragment` は `NoteEditorActivity` とは別のエントリーポイント（メインフィード画面に埋め込み）。\n`goToNormalEditor()` から `NoteEditorActivity.newBundle()` を使って遷移するため、今回の移行の影響を受けない。\n`SimpleEditorFragment` 自体の Compose 化は別タスクとして切り出す。\nPhase 2 で作成した `EmojiAutoCompleteTextField` を再利用できる。\n\n---\n\n## 参考ファイル\n\n| ファイル | パス |\n|---------|------|\n| NoteEditorActivity | `modules/features/note/src/main/java/net/pantasystem/milktea/note/NoteEditorActivity.kt` |\n| NoteEditorFragment | `modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorFragment.kt` |\n| SimpleEditorFragment | `modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/SimpleEditorFragment.kt` |\n| NoteEditorViewModel | `modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorViewModel.kt` |\n| NoteEditorUiState | `modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorUiState.kt` |\n| fragment_note_editor.xml | `modules/features/note/src/main/res/layout/fragment_note_editor.xml` |\n| item_note_editor_reply_to_note.xml | `modules/features/note/src/main/res/layout/item_note_editor_reply_to_note.xml` |\n| NoteEditorToolbar | `modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorToolbar.kt` |\n| NoteEditorUserActionMenuLayout | `modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorUserActionMenuLayout.kt` |\n| PollEditorLayout | `modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/poll/PollEditorLayout.kt` |\n"
  },
  {
    "path": "docs/note-editor-reply-preview-mfm-plan.md",
    "content": "# NoteEditorReplyPreview MFM リッチ表示 実装計画書\n\n## 概要\n\n`NoteEditorReplyPreview` のノート本文表示を、現在のプレーンテキストから MFM 構文対応のリッチ表示に変更する。\nCompose の `Text` コンポーザブル + `AnnotatedString` を主軸とし、`MFMDecorator`（TextView/Span ベース）を参考に Compose ネイティブな実装を行う。\n\n---\n\n## 実装方針\n\n### アーキテクチャ\n\n```\nMFMParser.parse(text)          // common_android: 既存\n    ↓ List<MfmNode>\nbuildMfmAnnotatedString()      // 【新規】common_android_ui: AnnotatedString を構築\n    ↓ AnnotatedString + Map<id, InlineTextContent>\nMfmText コンポーザブル          // 【新規】common_android_ui: Text + InlineTextContent でレンダリング\n    ↓\nNoteEditorReplyPreview.kt 更新 // 既存ファイル: MfmText に置き換え\n```\n\n### 配置モジュール\n\n新規ファイルは `modules/common_android_ui` に追加する。\n理由：\n- `MFMParser`（`common_android`）と mfm-kt ノード型への依存が必要\n- `common_android_ui` はすでに両者に依存しており、循環依存が発生しない\n- `note` モジュールはすでに `common_android_ui` に依存済み\n\n---\n\n## 新規ファイル\n\n### `MfmText.kt`（`common_android_ui` モジュール）\n\n```\nmodules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MfmText.kt\n```\n\n#### エントリーポイント\n\n```kotlin\n@Composable\nfun MfmText(\n    text: String,\n    modifier: Modifier = Modifier,\n    emojiNameMap: Map<String, CustomEmoji> = emptyMap(),\n    style: TextStyle = LocalTextStyle.current,\n    color: Color = Color.Unspecified,\n    maxLines: Int = Int.MAX_VALUE,\n    overflow: TextOverflow = TextOverflow.Clip,\n)\n```\n\n#### 内部関数\n\n```kotlin\n// MfmNode リストを AnnotatedString に変換するビルダー\n// InlineTextContent（カスタム絵文字用）の ID→コンテンツ も同時に収集する\nprivate fun AnnotatedString.Builder.appendMfmNodes(\n    nodes: List<MfmNode>,\n    baseStyle: SpanStyle,\n    inlineContents: MutableMap<String, InlineTextContent>,\n    emojiNameMap: Map<String, CustomEmoji>,\n    fontSize: TextUnit,\n)\n```\n\n---\n\n## MFM ノード対応表\n\n### Compose `AnnotatedString` で対応可能なノード\n\n| MfmNode | 対応方法 |\n|---|---|\n| `MfmText` | `append(text)` |\n| `Bold` | `SpanStyle(fontWeight = FontWeight.Bold)` |\n| `Italic` | `SpanStyle(fontStyle = FontStyle.Italic)` |\n| `Strike` | `SpanStyle(textDecoration = TextDecoration.LineThrough)` |\n| `Small` | `SpanStyle(fontSize = base * 0.6f)` |\n| `Center` | `ParagraphStyle(textAlign = TextAlign.Center)` |\n| `InlineCode` | `SpanStyle(fontFamily = FontFamily.Monospace, background = Color(0xFF1E1E1E), color = Color.White)` |\n| `CodeBlock` | InlineCode と同様（プレビュー用簡略表示） |\n| `Mention` | `SpanStyle(color = primary)` + テキスト `@user` |\n| `Hashtag` | `SpanStyle(color = primary)` + テキスト `#tag` |\n| `Url` | `SpanStyle(color = primary, textDecoration = Underline)` |\n| `Link` | `SpanStyle(color = primary, textDecoration = Underline)` |\n| `UnicodeEmoji` | `append(emoji)` (Compose ネイティブで表示) |\n| `EmojiCode` | `appendInlineContent(id)` + `InlineTextContent` に Coil 画像 |\n| `Plain` | `append(children.text)` |\n| `MathBlock` | `append(formula)` プレーンテキスト |\n| `MathInline` | `append(formula)` プレーンテキスト |\n| `Search` | `append(\"${query} Search\")` |\n| `Quote` | `SpanStyle(color = onSurfaceVariant)` + 先頭に `\"│ \"` プレフィックス |\n| `Fn(\"x2\")` | `SpanStyle(fontSize = base * 2f)` |\n| `Fn(\"x3\")` | `SpanStyle(fontSize = base * 3f)` |\n| `Fn(\"x4\")` | `SpanStyle(fontSize = base * 4f)` |\n| `Fn(\"fg\")` | `SpanStyle(color = parsedColor)` |\n| `Fn(\"bg\")` | `SpanStyle(background = parsedColor)` |\n| `Fn(\"font\")` | `SpanStyle(fontFamily = serif/monospace/cursive/fantasy)` |\n| `Fn(\"unixtime\")` | epoch 秒を日時文字列に変換して `append()` |\n| `Fn(\"scale\")` | `SpanStyle(fontSize = base * scaleY)` + 子ノードへ適用 |\n\n### Compose では再現困難なため省略（子ノードのプレーンテキストにフォールバック）\n\n| MfmNode | 理由 |\n|---|---|\n| `Fn(\"ruby\")` | `ReplacementSpan` 相当の Layout 操作が必要 |\n| `Fn(\"flip\")` | Canvas の scale(-1, 1) が必要 |\n| `Fn(\"rotate\")` | Canvas の rotate() が必要 |\n| `Fn(\"border\")` | カスタム描画が必要 |\n\n> 将来的に `drawBehind` + カスタム Layout で対応可能だが、プレビュー用途には不要。\n\n---\n\n## `NoteEditorReplyPreview.kt` の変更点\n\n### Before\n\n```kotlin\nval text = note.text\nif (!text.isNullOrEmpty()) {\n    Text(\n        text = text,\n        style = MaterialTheme.typography.bodySmall,\n        maxLines = 3,\n        overflow = TextOverflow.Ellipsis,\n        color = MaterialTheme.colorScheme.onSurfaceVariant,\n    )\n}\n```\n\n### After\n\n```kotlin\nval text = note.text\nif (!text.isNullOrEmpty()) {\n    MfmText(\n        text = text,\n        emojiNameMap = replyTo.toShowNote.note.emojiNameMap ?: emptyMap(),\n        style = MaterialTheme.typography.bodySmall,\n        maxLines = 3,\n        overflow = TextOverflow.Ellipsis,\n        color = MaterialTheme.colorScheme.onSurfaceVariant,\n    )\n}\n```\n\n---\n\n## カスタム絵文字の処理方針\n\n`CustomEmojiText.kt` と同じ方式：\n\n1. `EmojiCode` ノードを検出した際、一意な ID（`:emoji_name:`）を `appendInlineContent(id, altText)` でプレースホルダーとして埋め込む\n2. `emojiNameMap[name]` で `CustomEmoji` を解決し、URL を取得\n3. `InlineTextContent` に Coil の `rememberAsyncImagePainter` を使って画像を配置\n4. 解決できない場合は `:name:` テキストにフォールバック\n\n---\n\n## 注意事項\n\n- `maxLines = 3` は Compose の `Text` がそのまま処理するため、長文でも行数制限は機能する\n- `Fn(\"x2/x3/x4\")` は本文内の一部テキストが極端に大きくなるため、プレビューでは `coerceAtMost(base * 1.5f)` のようなキャップを設ける（視覚的に崩れにくくする）\n- `MFMParser.parse()` は IO でないが念のため `remember(text)` でキャッシュする\n- `Color.parseColor()` は `android.graphics.Color` のため Compose の `Color` への変換が必要（`Color(androidColor.toULong())` ではなく `Color(androidColor)` で OK）\n\n---\n\n## 変更ファイル一覧\n\n| ファイル | 変更種別 |\n|---|---|\n| `modules/common_android_ui/src/main/java/.../MfmText.kt` | **新規作成** |\n| `modules/features/note/src/main/java/.../editor/NoteEditorReplyPreview.kt` | **変更** |\n\n---\n\n## 実装チェックリスト\n\n- [ ] `MfmText.kt` 新規作成\n  - [ ] `buildMfmAnnotatedString` 内部関数（再帰ノード処理）\n  - [ ] テキスト装飾ノード対応（Bold / Italic / Strike / Small / Center）\n  - [ ] コードノード対応（InlineCode / CodeBlock）\n  - [ ] リンク系ノード対応（Mention / Hashtag / Url / Link）\n  - [ ] 絵文字ノード対応（UnicodeEmoji / EmojiCode + InlineTextContent）\n  - [ ] Fn ノード対応（x2/x3/x4 / fg / bg / font / unixtime / scale）\n  - [ ] フォールバック処理（ruby / flip / rotate / border → 子テキスト表示）\n  - [ ] `MfmText` コンポーザブル本体\n- [ ] `NoteEditorReplyPreview.kt` 更新\n  - [ ] `MfmText` に差し替え\n  - [ ] `emojiNameMap` を `toShowNote.note.emojiNameMap` から取得\n- [ ] ビルド確認（`./gradlew :modules:features:note:compileDebugKotlin`）\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Tue Jan 04 01:27:04 JST 2022\ndistributionBase=GRADLE_USER_HOME\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.9-bin.zip\ndistributionPath=wrapper/dists\nzipStorePath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\n"
  },
  {
    "path": "gradle.properties",
    "content": "## For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n#\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx1024m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n#\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n#Wed Apr 07 16:56:23 JST 2021\nandroid.useAndroidX=true\norg.gradle.caching=true\norg.gradle.configureondemand=true\norg.gradle.parallel=true\nkotlin.code.style=official\norg.gradle.jvmargs=-Xmx4096M -Dkotlin.daemon.jvm.options\\=\"-Xmx4096M\"\nVERSION_CODE=94\nVERSION_NAME=v2.16.8\nandroid.defaults.buildfeatures.buildconfig=true\nandroid.nonTransitiveRClass=false\nandroid.nonFinalResIds=false"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env sh\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn () {\n    echo \"$*\"\n}\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\n  NONSTOP* )\n    nonstop=true\n    ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" -a \"$nonstop\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Escape application args\nsave () {\n    for i do printf %s\\\\n \"$i\" | sed \"s/'/'\\\\\\\\''/g;1s/^/'/;\\$s/\\$/' \\\\\\\\/\" ; done\n    echo \" \"\n}\nAPP_ARGS=$(save \"$@\")\n\n# Collect all arguments for the java command, following the shell quoting and substitution rules\neval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS \"\\\"-Dorg.gradle.appname=$APP_BASE_NAME\\\"\" -classpath \"\\\"$CLASSPATH\\\"\" org.gradle.wrapper.GradleWrapperMain \"$APP_ARGS\"\n\n# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong\nif [ \"$(uname)\" = \"Darwin\" ] && [ \"$HOME\" = \"$PWD\" ]; then\n  cd \"$(dirname \"$0\")\"\nfi\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windows variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "libs.versions.toml",
    "content": "[versions]\nmfm-kt = \"0.2.3\"\nkotlin-version = \"2.0.0\"\ndate-time = \"0.6.1\"\ncompose = \"1.7.1\"\ncompose-material-icons = \"1.7.1\"\ncompose-material3 = \"1.3.1\"\nactivity-compose = \"1.9.2\"\ncoil = \"2.4.0\"\nhilt = \"2.56\"\nlifecycle = \"2.8.5\"\narch = \"2.2.0\"\nglide = \"4.14.2\"\nanimation-apng = \"3.0.5\"\nappcompat = \"1.7.0\"\nmaterial = \"1.12.0\"\ncore-ktx = \"1.13.1\"\nfragment-ktx = \"1.8.3\"\nactivity-ktx = \"1.9.2\"\nemoji2 = \"1.5.0\"\nconstraintlayout = \"2.1.4\"\nviewpager2 = \"1.1.0\"\nswiperefreshlayout = \"1.1.0\"\nflexbox = \"3.0.0\"\nokhttp3 = \"4.12.0\"\nwork = \"2.9.1\"\njunit = \"4.13.2\"\ntest-espresso = \"3.6.1\"\nappstartup = \"1.1.1\"\njunit-jupiter-api = \"5.9.3\"\njunit-jupiter-engine = \"5.9.3\"\nrobolectric = \"4.13\"\nserialization = \"1.7.3\"\nrecyclerview = \"1.3.2\"\nkonfetti = \"2.0.3\"\ncompose-constraintlayout = \"1.0.1\"\nroom = \"2.7.0\"\nretrofit = \"2.11.0\"\ncoroutines = \"1.8.1\"\nnav = \"2.8.0\"\nfirebase-bom = \"33.12.0\"\n\n[libraries]\nkotlin-datetime = { group = \"org.jetbrains.kotlinx\", name = \"kotlinx-datetime\", version.ref = \"date-time\" }\n# Compose libs\ncompose-ui-ui = { module = \"androidx.compose.ui:ui\", version.ref = \"compose\" }\ncompose-ui-ui-tooling = { module = \"androidx.compose.ui:ui-tooling\", version.ref = \"compose\" }\ncompose-foundation-foundation = { module = \"androidx.compose.foundation:foundation\", version.ref = \"compose\" }\ncompose-material-material = { module = \"androidx.compose.material:material\", version.ref = \"compose\" }\ncompose-material3 = { module = \"androidx.compose.material3:material3\", version.ref = \"compose-material3\" }\ncompose-material-material-icons-core = { module = \"androidx.compose.material:material-icons-core\", version.ref = \"compose-material-icons\" }\ncompose-material-material-icons-extended = { module = \"androidx.compose.material:material-icons-extended\", version.ref = \"compose-material-icons\" }\ncompose-ui-ui-test-junit4 = { module = \"androidx.compose.ui:ui-test-junit4\", version.ref = \"compose\" }\ncompose-runtime-runtime-livedata = { module = \"androidx.compose.runtime:runtime-livedata\", version.ref = \"compose\" }\n\n# Accompanist and other libraries\nactivity-compose = { module = \"androidx.activity:activity-compose\", version.ref = \"activity-compose\" }\ncoil-compose = { module = \"io.coil-kt:coil-compose\", version.ref = \"coil\" }\ncoil-gif = { module = \"io.coil-kt:coil-gif\", version.ref = \"coil\" }\ncoil-svg = { module = \"io.coil-kt:coil-svg\", version.ref = \"coil\" }\ncompose-constraintlayout = { module = \"androidx.constraintlayout:constraintlayout-compose\", version.ref = \"compose-constraintlayout\" }\n\n\n# Hilt\nhilt-android = { module = \"com.google.dagger:hilt-android\", version.ref = \"hilt\" }\nhilt-compiler = { module = \"com.google.dagger:hilt-compiler\", version.ref = \"hilt\" }\nhilt-android-testing = { module = \"com.google.dagger:hilt-android-testing\", version.ref = \"hilt\" }\n\n# Lifecycle and Arch\nlifecycle-runtime = { module = \"androidx.lifecycle:lifecycle-runtime\", version.ref = \"lifecycle\" }\nlifecycle-compiler = { module = \"androidx.lifecycle:lifecycle-compiler\", version.ref = \"lifecycle\" }\narch-core-testing = { module = \"androidx.arch.core:core-testing\", version.ref = \"arch\" }\nlifecycle-viewmodel = { module = \"androidx.lifecycle:lifecycle-viewmodel-ktx\", version = \"2.5.1\" }\nlifecycle-livedata = { module = \"androidx.lifecycle:lifecycle-livedata-ktx\", version = \"2.5.1\" }\n\n\n# Glide\nglide-glide = { module = \"com.github.bumptech.glide:glide\", version.ref = \"glide\" }\nglide-compiler = { module = \"com.github.bumptech.glide:compiler\", version.ref = \"glide\" }\n\n# Emoji2\nandroidx-emoji2 = { module = \"androidx.emoji2:emoji2\", version.ref = \"emoji2\" }\nandroidx-emoji2-bundled = { module = \"androidx.emoji2:emoji2-bundled\", version.ref = \"emoji2\" }\n\n# Additional libraries\nandroid-material-compose-theme-adapter = { module = \"com.google.android.material:compose-theme-adapter\", version = \"1.1.16\" }\nandroid-material-material = { module = \"com.google.android.material:material\", version.ref = \"material\" }\nandroidx-core-ktx = { module = \"androidx.core:core-ktx\", version.ref = \"core-ktx\" }\nappcompat-appcompat = { module = \"androidx.appcompat:appcompat\", version.ref = \"appcompat\" }\nfragment-ktx = { module = \"androidx.fragment:fragment-ktx\", version.ref = \"fragment-ktx\" }\nactivity-ktx = { module = \"androidx.activity:activity-ktx\", version.ref = \"activity-ktx\" }\nandroidx-constraintlayout = { module = \"androidx.constraintlayout:constraintlayout\", version.ref = \"constraintlayout\" }\nandroidx-viewpager2 = { module = \"androidx.viewpager2:viewpager2\", version.ref = \"viewpager2\" }\nandroidx-swiperefreshlayout = { module = \"androidx.swiperefreshlayout:swiperefreshlayout\", version.ref = \"swiperefreshlayout\" }\nflexbox = { module = \"com.google.android.flexbox:flexbox\", version.ref = \"flexbox\" }\nokhttp3-logging-inspector = { module = \"com.squareup.okhttp3:logging-interceptor\", version.ref = \"okhttp3\" }\nokhttp-sse = { module = \"com.squareup.okhttp3:okhttp-sse\", version.ref = \"okhttp3\" }\nandroidx-hilt-navigation-compose = { module = \"androidx.hilt:hilt-navigation-compose\", version = \"1.2.0\" }\nandroidx-work-ktx = { module = \"androidx.work:work-runtime-ktx\", version.ref = \"work\" }\nhilt-work = { module = \"androidx.hilt:hilt-work\", version = \"1.2.0\" }\nandroidx-hilt-compiler = { module = \"androidx.hilt:hilt-compiler\", version = \"1.2.0\" }\n\n# Test libraries\nandroidx-test-ext-junit = { module = \"androidx.test.ext:junit\", version = \"1.1.4\" }\njunit = { module = \"junit:junit\", version.ref = \"junit\" }\nandroidx-test-espresso-core = { module = \"androidx.test.espresso:espresso-core\", version.ref = \"test-espresso\" }\n\n# App Startup\nandroidx-appstartup = { module = \"androidx.startup:startup-runtime\", version.ref = \"appstartup\" }\n\n# JUnit Jupiter\njunit-jupiter-api = { module = \"org.junit.jupiter:junit-jupiter-api\", version.ref = \"junit-jupiter-api\" }\njunit-jupiter-engine = { module = \"org.junit.jupiter:junit-jupiter-engine\", version.ref = \"junit-jupiter-engine\" }\n\n# Additional dependencies\nkonfetti = { module = \"nl.dionsegijn:konfetti-xml\", version.ref = \"konfetti\" }\nanimation-apng = { module = \"com.github.penfeizhou.android.animation:apng\", version.ref = \"animation-apng\" }\n\nrecyclerview = { module = \"androidx.recyclerview:recyclerview\", version.ref = \"recyclerview\" }\nkotlin-serialization = { module = \"org.jetbrains.kotlinx:kotlinx-serialization-json\", version.ref = \"serialization\" }\nrobolectric = { module = \"org.robolectric:robolectric\", version.ref = \"robolectric\" }\n\naccompanist-glide = { module = \"com.google.accompanist:accompanist-glide\", version = \"0.14.0\" }\n\nwada811-databinding = { module = \"com.github.wada811:DataBinding-ktx\", version = \"5.0.2\" }\n\n# Room\nroom-runtime = { module = \"androidx.room:room-runtime\", version.ref = \"room\" }\nroom-compiler = { module = \"androidx.room:room-compiler\", version.ref = \"room\" }\nroom-ktx = { module = \"androidx.room:room-ktx\", version.ref = \"room\" }\nroom-testing = { module = \"androidx.room:room-testing\", version.ref = \"room\" }\n\n# Retrofit\nretrofit = { module = \"com.squareup.retrofit2:retrofit\", version.ref = \"retrofit\" }\nretrofit-serialization-converter = { module = \"com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter\", version = \"1.0.0\" }\n\n# Coroutines\ncoroutines-android = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-android\", version.ref = \"coroutines\" }\ncoroutines-test = { module = \"org.jetbrains.kotlinx:kotlinx-coroutines-test\", version.ref = \"coroutines\" }\n\n# Firebase\nfirebase-bom = { module = \"com.google.firebase:firebase-bom\", version.ref = \"firebase-bom\" }\n\n# Navigation\nnavigation-fragment-ktx = { module = \"androidx.navigation:navigation-fragment-ktx\", version.ref = \"nav\" }\nnavigation-ui-ktx = { module = \"androidx.navigation:navigation-ui-ktx\", version.ref = \"nav\" }\nnavigation-dynamic-features = { module = \"androidx.navigation:navigation-dynamic-features-fragment\", version.ref = \"nav\" }\nnavigation-testing = { module = \"androidx.navigation:navigation-testing\", version.ref = \"nav\" }\nnavigation-compose = { module = \"androidx.navigation:navigation-compose\", version.ref = \"nav\" }\n\n# MFM parser\nmfm-kt = { module = \"com.github.pantasystem:mfm-kt\", version.ref = \"mfm-kt\" }\n\n# Kotlin reflect\nkotlin-reflect = { module = \"org.jetbrains.kotlin:kotlin-reflect\", version.ref = \"kotlin-version\" }\n\n[plugins]\nkotlin-serialization-plugin = { id = \"org.jetbrains.kotlin.plugin.serialization\", version.ref = \"kotlin-version\" }\nandroid-application = { id = \"com.android.application\", version = \"8.7.3\" }\nkotlin-android = { id = \"org.jetbrains.kotlin.android\", version.ref = \"kotlin-version\" }\ndagger-hilt-android = { id = \"com.google.dagger.hilt.android\", version.ref = \"hilt\" }\nandroid-test = { id = \"com.android.test\", version = \"8.7.3\" }\ncompose-compiler = { id = \"org.jetbrains.kotlin.plugin.compose\", version.ref = \"kotlin-version\" }\n"
  },
  {
    "path": "modules/api/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/api/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    alias libs.plugins.kotlin.serialization.plugin\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n\n\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.api'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:common')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n    implementation libs.retrofit.serialization.converter\n    implementation libs.kotlin.serialization\n    implementation libs.kotlin.datetime\n\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/api/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/api/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/api/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/activitypub/NodeInfoAPI.kt",
    "content": "package net.pantasystem.milktea.api.activitypub\n\nimport retrofit2.Response\nimport retrofit2.http.GET\nimport retrofit2.http.Url\n\ninterface NodeInfoAPI {\n\n    @GET\n    suspend fun getNodeInfo(@Url url: String): Response<NodeInfoDTO>\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/activitypub/NodeInfoDTO.kt",
    "content": "package net.pantasystem.milktea.api.activitypub\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class NodeInfoDTO(\n    @SerialName(\"version\")\n    val version: String,\n\n    @SerialName(\"software\")\n    val software: SoftwareDTO\n) {\n    @kotlinx.serialization.Serializable\n    data class SoftwareDTO(\n        @SerialName(\"name\")\n        val name: String,\n\n        @SerialName(\"version\")\n        val version: String,\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/activitypub/WellKnownNodeInfo.kt",
    "content": "package net.pantasystem.milktea.api.activitypub\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class WellKnownNodeInfo(\n    @SerialName(\"links\")\n    val links: List<Link>\n) {\n    @kotlinx.serialization.Serializable\n    data class Link(\n        @SerialName(\"rel\")\n        val rel: String,\n\n        @SerialName(\"href\")\n        val href: String,\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/activitypub/WellKnownNodeInfoAPI.kt",
    "content": "package net.pantasystem.milktea.api.activitypub\n\nimport retrofit2.Response\nimport retrofit2.http.GET\n\ninterface WellKnownNodeInfoAPI {\n    @GET(\".well-known/nodeinfo\")\n    suspend fun getWellKnownNodeInfo(): Response<WellKnownNodeInfo>\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/MastodonAPI.kt",
    "content": "package net.pantasystem.milktea.api.mastodon\n\nimport net.pantasystem.milktea.api.mastodon.accounts.FollowParamsRequest\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountRelationshipDTO\nimport net.pantasystem.milktea.api.mastodon.accounts.MuteAccountRequest\nimport net.pantasystem.milktea.api.mastodon.apps.AccessToken\nimport net.pantasystem.milktea.api.mastodon.apps.App\nimport net.pantasystem.milktea.api.mastodon.apps.CreateApp\nimport net.pantasystem.milktea.api.mastodon.apps.ObtainToken\nimport net.pantasystem.milktea.api.mastodon.context.ContextDTO\nimport net.pantasystem.milktea.api.mastodon.emojis.TootEmojiDTO\nimport net.pantasystem.milktea.api.mastodon.filter.V1FilterDTO\nimport net.pantasystem.milktea.api.mastodon.instance.Instance\nimport net.pantasystem.milktea.api.mastodon.list.AddAccountsToList\nimport net.pantasystem.milktea.api.mastodon.list.CreateListRequest\nimport net.pantasystem.milktea.api.mastodon.list.ListDTO\nimport net.pantasystem.milktea.api.mastodon.list.RemoveAccountsFromList\nimport net.pantasystem.milktea.api.mastodon.marker.MarkersDTO\nimport net.pantasystem.milktea.api.mastodon.marker.SaveMarkersRequest\nimport net.pantasystem.milktea.api.mastodon.media.TootMediaAttachment\nimport net.pantasystem.milktea.api.mastodon.media.UpdateMediaAttachment\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api.mastodon.poll.TootPollDTO\nimport net.pantasystem.milktea.api.mastodon.report.CreateReportRequest\nimport net.pantasystem.milktea.api.mastodon.report.MstReportDTO\nimport net.pantasystem.milktea.api.mastodon.rule.RuleDTO\nimport net.pantasystem.milktea.api.mastodon.search.SearchResponse\nimport net.pantasystem.milktea.api.mastodon.status.CreateStatus\nimport net.pantasystem.milktea.api.mastodon.status.ScheduledStatus\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.mastodon.subscription.SubscribePushNotification\nimport net.pantasystem.milktea.api.mastodon.subscription.WebPushSubscription\nimport net.pantasystem.milktea.api.mastodon.suggestion.SuggestionDTO\nimport net.pantasystem.milktea.api.mastodon.tag.MastodonTagDTO\nimport retrofit2.Response\nimport retrofit2.http.*\n\ninterface MastodonAPI {\n\n    @GET(\"api/v1/instance\")\n    suspend fun getInstance(): Instance\n\n    @GET(\"api/v1/custom_emojis\")\n    suspend fun getCustomEmojis(): Response<List<TootEmojiDTO>>\n\n    @POST(\"api/v1/apps\")\n    suspend fun createApp(@Body body: CreateApp): Response<App>\n\n    @POST(\"oauth/token\")\n    suspend fun obtainToken(@Body body: ObtainToken): Response<AccessToken>\n\n\n    @GET(\"api/v1/accounts/verify_credentials\")\n    suspend fun verifyCredentials(): Response<MastodonAccountDTO>\n\n    /**\n     * @param visibilities fedibirdの独自パラメータ\n     */\n    @GET(\"api/v1/timelines/public\")\n    suspend fun getPublicTimeline(\n        @Query(\"local\") local: Boolean = false,\n        @Query(\"remote\") remote: Boolean = false,\n        @Query(\"only_media\") onlyMedia: Boolean = false,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"limit\") limit: Int = 20,\n        @Query(\"visibilities[]\", encoded = true) visibilities: List<String>? = null,\n    ): Response<List<TootStatusDTO>>\n\n    @GET(\"api/v1/timelines/tag/{tag}\")\n    suspend fun getHashtagTimeline(\n        @Path(\"tag\") tag: String,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"only_media\") onlyMedia: Boolean = false,\n    ): Response<List<TootStatusDTO>>\n\n    /**\n     * @param visibilities fedibirdの独自パラメータ\n     */\n    @GET(\"api/v1/timelines/home\")\n    suspend fun getHomeTimeline(\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"visibilities[]\", encoded = true) visibilities: List<String>? = null,\n    ): Response<List<TootStatusDTO>>\n\n    @GET(\"api/v1/timelines/list/{listId}\")\n    suspend fun getListTimeline(\n        @Path(\"listId\") listId: String,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n    ): Response<List<TootStatusDTO>>\n\n    @POST(\"api/v1/statuses/{statusId}/reblog\")\n    suspend fun reblog(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/unreblog\")\n    suspend fun unreblog(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @GET(\"api/v1/accounts/{accountId}/followers\")\n    suspend fun getFollowers(\n        @Path(\"accountId\") accountId: String,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int = 40,\n    ): Response<List<MastodonAccountDTO>>\n\n    @GET(\"api/v1/accounts/{accountId}/following\")\n    suspend fun getFollowing(\n        @Path(\"accountId\") accountId: String,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int = 40,\n    ): Response<List<MastodonAccountDTO>>\n\n    @GET(\"api/v1/accounts/{accountId}\")\n    suspend fun getAccount(@Path(\"accountId\") accountId: String): Response<MastodonAccountDTO>\n\n    @GET(\"api/v1/accounts/relationships\")\n    suspend fun getAccountRelationships(\n        @Query(\n            \"id[]\",\n            encoded = true\n        ) ids: List<String>,\n    ): Response<List<MastodonAccountRelationshipDTO>>\n\n    @POST(\"api/v1/accounts/{accountId}/follow\")\n    suspend fun follow(@Path(\"accountId\") accountId: String, @Body params: FollowParamsRequest): Response<MastodonAccountRelationshipDTO>\n\n    @POST(\"api/v1/accounts/{accountId}/unfollow\")\n    suspend fun unfollow(@Path(\"accountId\") accountId: String): Response<MastodonAccountRelationshipDTO>\n\n    @PUT(\"api/v1/statuses/{statusId}/emoji_reactions/{emoji}\")\n    suspend fun reaction(\n        @Path(\"statusId\") statusId: String,\n        @Path(\"emoji\") emoji: String,\n    ): Response<TootStatusDTO>\n\n    @DELETE(\"api/v1/statuses/{statusId}/emoji_reactions/{emoji}\")\n    suspend fun deleteReaction(\n        @Path(\"statusId\") statusId: String,\n        @Path(\"emoji\") emoji: String,\n    ): Response<TootStatusDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/emoji_unreaction\")\n    suspend fun unreaction(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/favourite\")\n    suspend fun favouriteStatus(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/unfavourite\")\n    suspend fun unfavouriteStatus(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/bookmark\")\n    suspend fun bookmarkStatus(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/unbookmark\")\n    suspend fun unbookmarkStatus(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @GET(\"api/v1/favourites\")\n    suspend fun getFavouriteStatuses(\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n    ): Response<List<TootStatusDTO>>\n\n    @POST(\"api/v1/accounts/{accountId}/mute\")\n    suspend fun muteAccount(\n        @Path(\"accountId\") accountId: String,\n        @Body body: MuteAccountRequest,\n    ): Response<MastodonAccountRelationshipDTO>\n\n    @POST(\"api/v1/accounts/{accountId}/unmute\")\n    suspend fun unmuteAccount(@Path(\"accountId\") accountId: String): Response<MastodonAccountRelationshipDTO>\n\n    @POST(\"api/v1/accounts/{accountId}/block\")\n    suspend fun blockAccount(@Path(\"accountId\") accountId: String): Response<MastodonAccountRelationshipDTO>\n\n    @POST(\"api/v1/accounts/{accountId}/unblock\")\n    suspend fun unblockAccount(@Path(\"accountId\") accountId: String): Response<MastodonAccountRelationshipDTO>\n\n\n    @GET(\"api/v1/notifications\")\n    suspend fun getNotifications(\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"types[]\", encoded = true) types: List<String>? = null,\n        @Query(\"exclude_types[]\", encoded = true) excludeTypes: List<String>? = null,\n        @Query(\"account_id\") accountId: String? = null,\n    ): Response<List<MstNotificationDTO>>\n\n\n    @POST(\"api/v1/push/subscription\")\n    suspend fun subscribePushNotification(@Body body: SubscribePushNotification): Response<WebPushSubscription>\n\n    @DELETE(\"api/v1/push/subscription\")\n    suspend fun unSubscribePushNotification(): Response<Unit>\n\n    @POST(\"api/v1/statuses\")\n    suspend fun createStatus(\n        @Body body: CreateStatus,\n    ): Response<TootStatusDTO>\n\n    @POST(\"api/v1/status\")\n    suspend fun createScheduledStatus(\n        @Body body: CreateStatus,\n    ): Response<ScheduledStatus>\n\n\n    @GET(\"api/v1/statuses/{statusId}\")\n    suspend fun getStatus(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @DELETE(\"api/v1/statuses/{statusId}\")\n    suspend fun deleteStatus(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @POST(\"api/v1/polls/{pollId}/votes\")\n    suspend fun voteOnPoll(\n        @Path(\"pollId\") pollId: String,\n        @Field(\"choices[]\", encoded = true) choices: List<Int>,\n    ): Response<TootPollDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/mute\")\n    suspend fun muteConversation(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n    @POST(\"api/v1/statuses/{statusId}/unmute\")\n    suspend fun unmuteConversation(@Path(\"statusId\") statusId: String): Response<TootStatusDTO>\n\n\n    @GET(\"api/v1/accounts/{accountId}/statuses\")\n    suspend fun getAccountTimeline(\n        @Path(\"accountId\") accountId: String,\n        @Query(\"only_media\") onlyMedia: Boolean? = false,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"limit\") limit: Int = 20,\n        @Query(\"exclude_reblogs\") excludeReblogs: Boolean? = null,\n        @Query(\"exclude_replies\") excludeReplies: Boolean? = null,\n    ): Response<List<TootStatusDTO>>\n\n    @GET(\"api/v1/bookmarks\")\n    suspend fun getBookmarks(\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"limit\") limit: Int = 20,\n    ): Response<List<TootStatusDTO>>\n\n\n    @GET(\"api/v1/lists\")\n    suspend fun getMyLists(): Response<List<ListDTO>>\n\n    @POST(\"api/v1/lists\")\n    suspend fun createList(@Body body: CreateListRequest): Response<ListDTO>\n\n    @GET(\"api/v1/lists/{listId}\")\n    suspend fun getList(@Path(\"listId\") listId: String): Response<ListDTO>\n\n    @POST(\"api/v1/lists/{listId}/accounts\")\n    suspend fun addAccountsToList(\n        @Path(\"listId\") listId: String,\n        @Body body: AddAccountsToList,\n    ): Response<Unit>\n\n    @DELETE(\"api/v1/lists/{listId}/accounts\")\n    suspend fun removeAccountsFromList(\n        @Path(\"listId\") listId: String,\n        @Body body: RemoveAccountsFromList,\n    ): Response<Unit>\n\n    @GET(\"api/v1/lists/{listId}\")\n    suspend fun getAccountsInList(\n        @Path(\"listId\") listId: String,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n    ): Response<List<MastodonAccountDTO>>\n\n    @GET(\"api/v1/statuses/{statusId}/context\")\n    suspend fun getStatusesContext(@Path(\"statusId\") statusId: String): Response<ContextDTO>\n\n    @PUT(\"api/v1/media/{mediaId}\")\n    suspend fun updateMediaAttachment(\n        @Path(\"mediaId\") mediaId: String,\n        @Body body: UpdateMediaAttachment,\n    ): Response<TootMediaAttachment>\n\n    @GET(\"api/v2/search\")\n    suspend fun search(\n        @Query(\"q\") q: String,\n        @Query(\"type\") type: String? = null,\n        @Query(\"resolve\") resolve: Boolean = true,\n        @Query(\"following\") following: Boolean = false,\n        @Query(\"account_id\") accountId: String? = null,\n        @Query(\"exclude_unreviewed\") excludeUnreviewed: String? = null,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"offset\") offset: Int? = null,\n    ): Response<SearchResponse>\n\n    @POST(\"api/v1/follow_requests/{accountId}/authorize\")\n    suspend fun acceptFollowRequest(@Path(\"accountId\") accountId: String): Response<MastodonAccountRelationshipDTO>\n\n    @POST(\"api/v1/follow_requests/{accountId}/reject\")\n    suspend fun rejectFollowRequest(@Path(\"accountId\") accountId: String): Response<MastodonAccountRelationshipDTO>\n\n    @GET(\"api/v1/follow_requests\")\n    suspend fun getFollowRequests(\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n    ): Response<List<MastodonAccountDTO>>\n\n    @GET(\"api/v1/markers\")\n    suspend fun getMarkers(\n        @Query(\"timeline[]\", encoded = true) timeline: List<String>,\n    ): Response<MarkersDTO>\n\n    @POST(\"api/v1/markers\")\n    suspend fun saveMarkers(\n        @Body markers: SaveMarkersRequest,\n    ): Response<MarkersDTO>\n\n    @GET(\"api/v1/filters\")\n    suspend fun getFilters(): Response<List<V1FilterDTO>>\n\n    @POST(\"api/v1/reports\")\n    suspend fun createReport(@Body request: CreateReportRequest): Response<MstReportDTO>\n\n    @GET(\"api/v1/instance/rules\")\n    suspend fun getRules(): Response<List<RuleDTO>>\n\n    @GET(\"api/v1/statuses/{id}/reblogged_by\")\n    suspend fun getRebloggedBy(\n        @Path(\"id\") id: String,\n        @Query(\"max_id\") maxId: String? = null,\n        @Query(\"since_id\") sinceId: String? = null,\n        @Query(\"min_id\") minId: String? = null,\n    ): Response<List<MastodonAccountDTO>>\n\n    @GET(\"api/v1/trends/statuses\")\n    suspend fun getTrendStatuses(\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"offset\") offset: Int? = null,\n    ): Response<List<TootStatusDTO>>\n\n    @GET(\"api/v1/trends/tags\")\n    suspend fun getTagTrends(\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"offset\") offset: Int? = null,\n    ): Response<List<MastodonTagDTO>>\n\n    @GET(\"api/v2/suggestions\")\n    suspend fun getSuggestionUsers(\n        @Query(\"limit\") limit: Int? = null\n    ): Response<List<SuggestionDTO>>\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/accounts/FollowParamsRequest.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.accounts\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class FollowParamsRequest(\n    @SerialName(\"reblogs\") val reblogs: Boolean? = null,\n    @SerialName(\"notify\") val notify: Boolean? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/accounts/MastodonAccountDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.accounts\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.mastodon.emojis.TootEmojiDTO\n\n@Serializable\ndata class MastodonAccountDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"username\")\n    val username: String,\n\n    @SerialName(\"acct\")\n    val acct: String,\n\n    @SerialName(\"display_name\")\n    val displayName: String,\n\n    @SerialName(\"locked\")\n    val locked: Boolean,\n\n    @SerialName(\"bot\")\n    val bot: Boolean,\n\n    @SerialName(\"created_at\")\n    val createdAt: Instant,\n\n    @SerialName(\"note\")\n    val note: String,\n\n    @SerialName(\"url\")\n    val url: String,\n\n    @SerialName(\"avatar\")\n    val avatar: String,\n\n    @SerialName(\"avatar_static\")\n    val avatarStatic: String,\n\n    @SerialName(\"header\")\n    val header: String,\n\n    @SerialName(\"header_static\")\n    val headerStatic: String,\n\n    @SerialName(\"emojis\")\n    val emojis: List<TootEmojiDTO>,\n\n    @SerialName(\"followers_count\")\n    val followersCount: Long,\n\n    @SerialName(\"following_count\")\n    val followingCount: Long,\n\n    @SerialName(\"statuses_count\")\n    val statusesCount: Long,\n)\n\n\n@Serializable\ndata class MastodonAccountRelationshipDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"following\")\n    val following: Boolean,\n\n    @SerialName(\"showing_reblogs\")\n    val showingReblogs: Boolean? = null,\n\n    @SerialName(\"notifying\")\n    val notifying: Boolean? = null,\n\n\n    @SerialName(\"followed_by\")\n    val followedBy: Boolean,\n\n    @SerialName(\"blocking\")\n    val blocking: Boolean,\n\n    @SerialName(\"blocked_by\")\n    val blockedBy: Boolean,\n\n    @SerialName(\"muting\")\n    val muting: Boolean,\n\n    @SerialName(\"muting_notifications\")\n    val mutingNotifications: Boolean,\n\n    @SerialName(\"requested\")\n    val requested: Boolean,\n\n    @SerialName(\"domain_blocking\")\n    val domainBlocking: Boolean,\n\n    @SerialName(\"endorsed\")\n    val endorsed: Boolean,\n\n    @SerialName(\"note\")\n    val note: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/accounts/MuteAccountRequest.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.accounts\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class MuteAccountRequest(\n    @SerialName(\"duration\")\n    val duration: Long = 0L,\n\n    @SerialName(\"notifications\")\n    val notifications: Boolean = true\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/apps/App.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.apps\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.app.AppType\n\n@Serializable\ndata class CreateApp(\n    @SerialName(\"client_name\")\n    val clientName: String,\n\n    @SerialName(\"redirect_uris\")\n    val redirectUris: String,\n\n    @SerialName(\"scopes\")\n    val scopes: String\n)\n\n@Serializable\ndata class App(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"client_id\")\n    val clientId: String,\n\n    @SerialName(\"redirect_uri\")\n    val redirectUri: String,\n\n    @SerialName(\"client_secret\")\n    val clientSecret: String,\n\n) {\n    fun toModel(): AppType.Mastodon {\n        return AppType.Mastodon(\n            id = id,\n            name = name,\n            clientSecret = clientSecret,\n            clientId = clientId,\n            redirectUri = redirectUri,\n        )\n    }\n\n    fun toPleromaModel() : AppType.Pleroma {\n        return AppType.Pleroma(\n            id = id,\n            name = name,\n            clientSecret = clientSecret,\n            clientId = clientId,\n            redirectUri = redirectUri,\n        )\n    }\n}\n\n@Serializable\ndata class ObtainToken(\n    @SerialName(\"client_id\")\n    val clientId: String,\n\n    @SerialName(\"client_secret\")\n    val clientSecret: String,\n\n    @SerialName(\"redirect_uri\")\n    val redirectUri: String,\n\n    @SerialName(\"scope\")\n    val scope: String,\n\n    @SerialName(\"code\")\n    val code: String,\n\n    @SerialName(\"grant_type\")\n    val grantType: String,\n)\n\n@Serializable\ndata class AccessToken(\n    @SerialName(\"access_token\")\n    val accessToken: String,\n\n    @SerialName(\"token_type\")\n    val tokenType: String,\n\n    @SerialName(\"scope\")\n    val scope: String,\n\n    @SerialName(\"created_at\")\n    val createdAt: Long\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/context/ContextDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.context\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\n\n@kotlinx.serialization.Serializable\ndata class ContextDTO (\n    @SerialName(\"ancestors\")\n    val ancestors: List<TootStatusDTO>,\n\n    @SerialName(\"descendants\")\n    val descendants: List<TootStatusDTO>\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/emojis/TootEmojiDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.emojis\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.EmojiWithAlias\n\n@Serializable\ndata class TootEmojiDTO(\n    @SerialName(\"shortcode\")\n    val shortcode: String,\n\n    @SerialName(\"url\")\n    val url: String,\n\n    @SerialName(\"static_url\")\n    val staticUrl: String,\n\n    @SerialName(\"category\")\n    val category: String? = null,\n\n    @SerialName(\"visible_in_picker\")\n    val visibleInPicker: Boolean = true,\n\n    @SerialName(\"width\")\n    val width: Int? = null,\n\n    @SerialName(\"height\")\n    val height: Int? = null,\n\n    @SerialName(\"aliases\")\n    val aliases: List<String?>? = null,\n) {\n\n    fun toEmojiWithAlias(cachePath: String? = null): EmojiWithAlias {\n        val emoji = toEmoji(cachePath)\n        return EmojiWithAlias(\n            emoji = emoji,\n            aliases = aliases?.filterNotNull(),\n        )\n    }\n\n    fun toEmoji(cachePath: String? = null): CustomEmoji {\n        return CustomEmoji(\n            name = shortcode,\n            url = url,\n            category = category,\n            aspectRatio = if (width == null || height == null) null else (width.toFloat() / height),\n            cachePath = cachePath,\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/filter/FilterContext.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.filter\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\nenum class FilterContext {\n    @SerialName(\"home\") Home,\n    @SerialName(\"notifications\") Notifications,\n    @SerialName(\"public\") Public,\n    @SerialName(\"thread\") Thread,\n    @SerialName(\"account\") Account,\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/filter/FilterResultDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.filter\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class FilterResultDTO(\n    @SerialName(\"filter\")\n    val filter: HitFilter,\n\n    @SerialName(\"keyword_matches\")\n    val keywordMatches: List<String>? = null,\n\n    @SerialName(\"status_matches\")\n    val statusMatches: List<String>? = null,\n) {\n    @kotlinx.serialization.Serializable\n    data class HitFilter(\n        @SerialName(\"id\")\n        val id: String,\n\n        @SerialName(\"title\")\n        val title: String,\n\n        @SerialName(\"context\")\n        val context: List<FilterContext>,\n\n        @SerialName(\"filter_action\")\n        val filterAction: V2FilterDTO.FilterAction,\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/filter/V1FilterDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.filter\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.filter.MastodonWordFilter\n\n@kotlinx.serialization.Serializable\ndata class V1FilterDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"phrase\")\n    val phrase: String,\n\n    @SerialName(\"context\")\n    val context: List<FilterContext>,\n\n    @SerialName(\"whole_word\")\n    val wholeWord: Boolean,\n\n    @SerialName(\"expires_at\")\n    val expiresAt: Instant? = null,\n\n    @SerialName(\"irreversible\")\n    val irreversible: Boolean,\n) {\n\n    fun toModel(account: Account): MastodonWordFilter {\n        return MastodonWordFilter(\n            MastodonWordFilter.Id(account.accountId, id),\n            phrase,\n            context = context.map {\n                when(it) {\n                    FilterContext.Home -> MastodonWordFilter.FilterContext.Home\n                    FilterContext.Notifications -> MastodonWordFilter.FilterContext.Notifications\n                    FilterContext.Public -> MastodonWordFilter.FilterContext.Public\n                    FilterContext.Thread -> MastodonWordFilter.FilterContext.Thread\n                    FilterContext.Account -> MastodonWordFilter.FilterContext.Account\n                }\n            },\n            wholeWord,\n            expiresAt,\n            irreversible\n        )\n\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/filter/V2FilterDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.filter\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class V2FilterDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"title\")\n    val title: String,\n\n    @SerialName(\"context\")\n    val context: List<FilterContext>,\n\n    @SerialName(\"expires_at\")\n    val expiresAt: Instant? = null,\n\n    @SerialName(\"filter_action\")\n    val filterAction: FilterAction,\n\n    @SerialName(\"keywords\")\n    val keywords: List<FilterKeyword>,\n\n    @SerialName(\"statuses\")\n    val statuses: List<FilterStatus>,\n) {\n    @kotlinx.serialization.Serializable\n    enum class FilterAction {\n        @SerialName(\"warn\")\n        Warn,\n        @SerialName(\"hide\")\n        Hide\n    }\n\n    @kotlinx.serialization.Serializable\n    data class FilterKeyword(\n        @SerialName(\"id\")\n        val id: String,\n\n        @SerialName(\"keyword\")\n        val keyword: String,\n\n        @SerialName(\"whole_word\")\n        val wholeWord: Boolean,\n    )\n\n    @kotlinx.serialization.Serializable\n    data class FilterStatus(\n        @SerialName(\"id\")\n        val id: String,\n\n        @SerialName(\"status_id\")\n        val statusId: String\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/instance/Instance.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.instance\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class Instance(\n    @SerialName(\"uri\")\n    val uri: String,\n\n    @SerialName(\"title\")\n    val title: String,\n\n    @SerialName(\"description\")\n    val description: String,\n\n    @SerialName(\"email\")\n    val email: String,\n\n    @SerialName(\"version\")\n    val version: String,\n\n    @SerialName(\"urls\")\n    val urls: Urls,\n\n    @SerialName(\"configuration\")\n    val configuration: Configuration? = null,\n\n    @SerialName(\"fedibird_capabilities\")\n    val fedibirdCapabilities: List<String>? = null,\n\n    @SerialName(\"pleroma\")\n    val pleroma: Pleroma? = null,\n\n    @SerialName(\"feature_quote\")\n    val featureQuote: Boolean? = null,\n) {\n    @Serializable\n    data class Configuration(\n        @SerialName(\"statuses\")\n        val statuses: Statuses? = null,\n\n        @SerialName(\"polls\")\n        val polls: Polls? = null,\n\n        @SerialName(\"emoji_reactions\")\n        val emojiReactions: EmojiReactions? = null,\n    ) {\n\n        @Serializable\n        data class Statuses(\n            @SerialName(\"max_characters\") val maxCharacters: Int? = null,\n            @SerialName(\"max_media_attachments\") val maxMediaAttachments: Int? = null,\n        )\n\n        @Serializable\n        data class Polls(\n            @SerialName(\"max_options\") val maxOptions: Int? = null,\n            @SerialName(\"max_characters_per_option\") val maxCharactersPerOption: Int? = null,\n            @SerialName(\"min_expiration\") val minExpiration: Int? = null,\n            @SerialName(\"max_expiration\") val maxExpiration: Int? = null,\n        )\n\n        @Serializable\n        data class EmojiReactions(\n            @SerialName(\"max_reactions\") val maxReactions: Int? = null,\n            @SerialName(\"max_reactions_per_account\") val maxReactionsPerAccount: Int? = null,\n        )\n\n    }\n\n\n    @Serializable\n    data class Urls(\n        @SerialName(\"streaming_api\") val streamingApi: String\n    )\n\n    @Serializable\n    data class Pleroma(\n        @SerialName(\"metadata\") val metadata: Metadata,\n\n    ) {\n        @Serializable\n        data class Metadata(\n            @SerialName(\"features\") val features: List<String>,\n        )\n    }\n}\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/list/AddAccountsToList.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.list\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class AddAccountsToList(\n    @SerialName(\"account_ids\") val accountIds: List<String>\n)\n\ntypealias RemoveAccountsFromList = AddAccountsToList"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/list/CreateListRequest.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.list\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class CreateListRequest(\n    @SerialName(\"title\") val title: String,\n    @SerialName(\"replies_policy\") val repliesPolicy: ListDTO.RepliesPolicyType\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/list/ListDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.list\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.list.UserList\n\n@kotlinx.serialization.Serializable\ndata class ListDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"title\")\n    val title: String,\n\n    @SerialName(\"replies_policy\")\n    val repliesPolicy: RepliesPolicyType\n)  {\n    @kotlinx.serialization.Serializable\n    enum class RepliesPolicyType {\n        @SerialName(\"followed\") Followed,\n        @SerialName(\"list\") List,\n        @SerialName(\"none\") None,\n    }\n\n    fun toModel(account: Account): UserList {\n        return UserList(\n            id = UserList.Id(accountId = account.accountId, id),\n            createdAt = Instant.fromEpochMilliseconds(Long.MAX_VALUE),\n            name = title,\n            userIds = emptyList()\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/marker/MarkerDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.marker\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.model.markers.Marker\n\n@kotlinx.serialization.Serializable\ndata class MarkerDTO(\n    @SerialName(\"last_read_id\") val lastReadId: String,\n    @SerialName(\"version\") val version: Long,\n    @SerialName(\"updated_at\") val updatedAt: Instant\n) {\n    fun toModel(): Marker {\n        return Marker(\n            lastReadId = lastReadId,\n            version = version,\n            updatedAt = updatedAt\n        )\n    }\n}\n\n@kotlinx.serialization.Serializable\ndata class MarkersDTO(\n    @SerialName(\"home\")\n    val home: MarkerDTO? = null,\n\n    @SerialName(\"notifications\")\n    val notifications: MarkerDTO? = null,\n)\n\n@kotlinx.serialization.Serializable\ndata class SaveMarkersRequest(\n    @SerialName(\"home\")\n    val home: SaveParams? = null,\n\n    @SerialName(\"notifications\")\n    val notifications: SaveParams? = null,\n) {\n    @kotlinx.serialization.Serializable\n    data class SaveParams(\n        @SerialName(\"last_read_id\") val lastReadId: String\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/media/TootMediaAttachment.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.media\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class TootMediaAttachment(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"type\")\n    val type: String,\n\n    @SerialName(\"url\")\n    val url: String?,\n\n    @SerialName(\"preview_url\")\n    val previewUrl: String? = null,\n\n    @SerialName(\"remote_url\")\n    val remoteUrl: String? = null,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n\n    @SerialName(\"blurhash\")\n    val blurhash: String? = null,\n\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/media/UpdateMediaAttachment.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.media\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class UpdateMediaAttachment(\n    @SerialName(\"description\")\n    val description: String,\n\n    @SerialName(\"focus\")\n    val focus: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/notification/MstNotificationDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.notification\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.mastodon.report.MstReportDTO\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\n\n@kotlinx.serialization.Serializable\ndata class MstNotificationDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"type\")\n    val type: NotificationType,\n\n    @SerialName(\"created_at\")\n    val createdAt: Instant,\n\n    @SerialName(\"account\")\n    val account: MastodonAccountDTO,\n\n    @SerialName(\"status\")\n    val status: TootStatusDTO? = null,\n\n    @SerialName(\"report\")\n    val report: MstReportDTO? = null,\n\n    @SerialName(\"emoji_reaction\")\n    val emojiReaction: EmojiReaction? = null,\n) {\n    @kotlinx.serialization.Serializable\n    enum class NotificationType(\n        val value: String\n    ) {\n        @SerialName(\"mention\")\n        Mention(\"mention\"),\n\n        @SerialName(\"status\")\n        Status(\"status\"),\n\n        @SerialName(\"reblog\")\n        Reblog(\"reblog\"),\n\n        @SerialName(\"follow\")\n        Follow(\"follow\"),\n\n        @SerialName(\"follow_request\")\n        FollowRequest(\"follow_request\"),\n\n        @SerialName(\"favourite\")\n        Favourite(\"favourite\"),\n\n        @SerialName(\"poll\")\n        Poll(\"poll\"),\n\n        @SerialName(\"update\")\n        Update(\"update\"),\n\n        @SerialName(\"admin.sign_up\")\n        AdminSingUp(\"admin.sign_up\"),\n\n        @SerialName(\"admin.report\")\n        AdminReport(\"admin.report\"),\n\n        @SerialName(\"emoji_reaction\")\n        EmojiReaction(\"emoji_reaction\"),\n    }\n\n    @kotlinx.serialization.Serializable\n    data class EmojiReaction(\n        @SerialName(\"name\")\n        val name: String,\n\n        @SerialName(\"count\")\n        val count: Int,\n\n        @SerialName(\"me\")\n        val me: Boolean? = null,\n\n        @SerialName(\"url\")\n        val url: String? = null,\n\n        @SerialName(\"domain\")\n        val domain: String?  = null,\n\n        @SerialName(\"static_url\")\n        val staticUrl: String? = null,\n    ) {\n        private val isCustomEmoji = url != null || staticUrl != null\n\n        val reaction = if (isCustomEmoji) {\n            if (domain == null) {\n                \":$name@.:\"\n            } else {\n                \":$name@$domain:\"\n            }\n        } else {\n            name\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/poll/TootPollDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.poll\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.emojis.TootEmojiDTO\n\n@kotlinx.serialization.Serializable\ndata class TootPollDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"expires_at\")\n    val expiresAt: Instant? = null,\n\n    @SerialName(\"expired\")\n    val expired: Boolean? = null,\n\n    @SerialName(\"multiple\")\n    val multiple: Boolean? = null,\n\n    @SerialName(\"votes_count\")\n    val votesCount: Int? = null,\n\n    @SerialName(\"voters_count\")\n    val votersCount: Int? = null,\n\n    @SerialName(\"options\")\n    val options: List<Option>,\n\n    @SerialName(\"emojis\")\n    val emojis: List<TootEmojiDTO>,\n\n    @SerialName(\"voted\")\n    val voted: Boolean? = null,\n\n    @SerialName(\"own_votes\")\n    val ownVotes: List<Int>? = null,\n) {\n\n    @kotlinx.serialization.Serializable\n    data class Option(\n        @SerialName(\"title\")\n        val title: String,\n\n        @SerialName(\"votes_count\")\n        val votesCount: Int? = null,\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/report/CreateReportRequest.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.report\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class CreateReportRequest(\n    @SerialName(\"account_id\") val accountId: String,\n    @SerialName(\"status_ids\") val statusIds: List<String>,\n    @SerialName(\"comment\") val comment: String? = null,\n    @SerialName(\"forward\") val forward: Boolean = false,\n    @SerialName(\"category\") val category: Category = Category.Other,\n    @SerialName(\"rule_ids\") val ruleIds: List<String>? = null,\n) {\n\n    @kotlinx.serialization.Serializable\n    enum class Category {\n        @SerialName(\"spam\") Spam,\n        @SerialName(\"violation\") Violation,\n        @SerialName(\"other\") Other,\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/report/MstReportDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.report\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\n\n@kotlinx.serialization.Serializable\ndata class MstReportDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"action_taken\")\n    val actionTaken: Boolean? = null,\n\n    @SerialName(\"action_taken_at\")\n    val actionTakenAt: Instant? = null,\n\n    @SerialName(\"category\")\n    val category: String? = null,\n\n    @SerialName(\"comment\")\n    val comment: String? = null,\n\n    @SerialName(\"forwarded\")\n    val forwarded: Boolean? = null,\n\n    @SerialName(\"created_at\")\n    val createdAt: Instant? = null,\n\n    @SerialName(\"status_ids\")\n    val statusIds: List<String>? = null,\n\n    @SerialName(\"rule_ids\")\n    val ruleIds: List<String>? = null,\n\n    @SerialName(\"target_account\")\n    val targetAccount: MastodonAccountDTO? = null\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/rule/RuleDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.rule\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class RuleDTO(\n    @SerialName(\"id\") val id: String,\n    @SerialName(\"text\") val text: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/search/SearchResponse.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.search\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.mastodon.tag.MastodonTagDTO\n\n@kotlinx.serialization.Serializable\ndata class SearchResponse(\n    @SerialName(\"accounts\")\n    val accounts: List<MastodonAccountDTO>,\n\n    @SerialName(\"statuses\")\n    val statuses: List<TootStatusDTO>,\n\n    @SerialName(\"hashtags\")\n    val hashtags: List<MastodonTagDTO>,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/status/CreateStatus.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.status\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class CreateStatus(\n    @SerialName(\"status\")\n    val status: String,\n\n    @SerialName(\"media_ids\")\n    val mediaIds: List<String>,\n\n    @SerialName(\"poll\")\n    val poll: CreatePoll? = null,\n\n    @SerialName(\"in_reply_to_id\")\n    val inReplyToId: String? = null,\n\n    @SerialName(\"sensitive\")\n    val sensitive: Boolean = false,\n\n    @SerialName(\"spoiler_text\")\n    val spoilerText: String? = null,\n\n    @SerialName(\"visibility\")\n    val visibility: String = \"public\",\n\n    @SerialName(\"language\")\n    val language: String? = null,\n\n    @SerialName(\"scheduled_at\")\n    val scheduledAt: Instant? = null,\n\n    @SerialName(\"quote_id\")\n    val quoteId: String? = null,\n) {\n\n    @kotlinx.serialization.Serializable\n    data class CreatePoll(\n        @SerialName(\"options\")\n        val options: List<String>,\n\n        @SerialName(\"expires_in\")\n        val expiresIn: Int,\n\n        @SerialName(\"multiple\")\n        val multiple: Boolean = false,\n\n        @SerialName(\"hide_totals\")\n        val hideTotals: Boolean = false,\n\n    )\n}\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/status/ScheduledStatus.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.status\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.media.TootMediaAttachment\n\n@kotlinx.serialization.Serializable\ndata class ScheduledStatus(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"scheduled_at\")\n    val scheduledAt: Instant,\n\n    @SerialName(\"params\")\n    val params: Params,\n\n    @SerialName(\"media_attachments\")\n    val mediaAttachments: List<TootMediaAttachment>? = null\n) {\n\n    @kotlinx.serialization.Serializable\n    data class Params(\n        @SerialName(\"text\")\n        val text: String,\n\n        @SerialName(\"poll\")\n        val poll: CreateStatus.CreatePoll? = null,\n\n        @SerialName(\"media_ids\")\n        val mediaIds: List<String>? = null,\n\n        @SerialName(\"sensitive\")\n        val sensitive: Boolean? = null,\n\n        @SerialName(\"spoiler_text\")\n        val spoilerText: String? = null,\n\n        @SerialName(\"visibility\")\n        val visibility: String,\n\n        @SerialName(\"in_reply_to_id\")\n        val inReplyToId: String? = null,\n\n        @SerialName(\"language\")\n        val language: String? = null,\n\n        @SerialName(\"application_id\")\n        val applicationId: Int? = null,\n\n        @SerialName(\"scheduled_at\")\n        val scheduledAt: Instant? = null,\n\n        @SerialName(\"with_rate_limit\")\n        val withRateLimit: Boolean? = null,\n    )\n}\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/status/TootPreviewCardDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.status\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class TootPreviewCardDTO(\n    @SerialName(\"url\")\n    val url: String,\n\n    @SerialName(\"title\")\n    val title: String,\n\n    @SerialName(\"type\")\n    val type: String,\n\n    @SerialName(\"description\")\n    val description: String,\n\n    @SerialName(\"author_name\")\n    val authorName: String? = null,\n\n    @SerialName(\"author_url\")\n    val authorUrl: String? = null,\n\n    @SerialName(\"provider_url\")\n    val providerUrl: String,\n\n    @SerialName(\"html\")\n    val html: String? = null,\n\n    @SerialName(\"width\")\n    val width: Int? = null,\n\n    @SerialName(\"height\")\n    val height: Int? = null,\n\n    @SerialName(\"image\")\n    val image: String?,\n\n    @SerialName(\"embed_url\")\n    val embedUrl: String? = null,\n\n    @SerialName(\"blurhash\")\n    val blurhash: String? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/status/TootStatusDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.status\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.mastodon.emojis.TootEmojiDTO\nimport net.pantasystem.milktea.api.mastodon.filter.FilterResultDTO\nimport net.pantasystem.milktea.api.mastodon.media.TootMediaAttachment\nimport net.pantasystem.milktea.api.mastodon.poll.TootPollDTO\nimport net.pantasystem.milktea.common.serializations.EnumIgnoreUnknownSerializer\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\n\n@kotlinx.serialization.Serializable\ndata class TootStatusDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"uri\")\n    val uri: String,\n\n    @SerialName(\"created_at\")\n    val createdAt: Instant,\n\n    @SerialName(\"account\")\n    val account: MastodonAccountDTO,\n\n    @SerialName(\"content\")\n    val content: String? = null,\n\n    @SerialName(\"visibility\")\n    val visibility: StatusVisibilityType,\n\n    @SerialName(\"sensitive\")\n    val sensitive: Boolean,\n\n    @SerialName(\"spoiler_text\")\n    val spoilerText: String,\n\n    @SerialName(\"media_attachments\")\n    val mediaAttachments: List<TootMediaAttachment>,\n\n    @SerialName(\"mentions\")\n    val mentions: List<Mention>? = null,\n\n    @SerialName(\"tags\")\n    val tags: List<Tag>? = null,\n\n    @SerialName(\"emojis\")\n    val emojis: List<TootEmojiDTO>,\n\n    @SerialName(\"reblogs_count\")\n    val reblogsCount: Int,\n\n    @SerialName(\"favourites_count\")\n    val favouritesCount: Int? = null,\n\n    @SerialName(\"replies_count\")\n    val repliesCount: Int,\n\n    @SerialName(\"url\")\n    val url: String? = null,\n\n    @SerialName(\"in_reply_to_id\")\n    val inReplyToId: String? = null,\n\n    @SerialName(\"in_reply_account_id\")\n    val inReplyAccountId: String? = null,\n\n    @SerialName(\"reblog\")\n    val reblog: TootStatusDTO? = null,\n\n    @SerialName(\"poll\")\n    val poll: TootPollDTO? = null,\n\n    @SerialName(\"card\")\n    val card: TootPreviewCardDTO? = null,\n\n    @SerialName(\"language\")\n    val language: String? = null,\n\n    @SerialName(\"text\")\n    val text: String? = null,\n\n    @SerialName(\"edited_at\")\n    val editedAt: Instant? = null,\n\n    @SerialName(\"favourited\")\n    val favourited: Boolean? = null,\n\n    @SerialName(\"reblogged\")\n    val reblogged: Boolean? = null,\n\n    @SerialName(\"muted\")\n    val muted: Boolean? = null,\n\n    @SerialName(\"bookmarked\")\n    val bookmarked: Boolean? = null,\n\n    @SerialName(\"pinned\")\n    val pinned: Boolean? = null,\n\n    @SerialName(\"filtered\")\n    val filtered: List<FilterResultDTO>? = null,\n\n    @SerialName(\"emoji_reactions\")\n    val emojiReactions: List<EmojiReactionCount>? = null,\n\n    @SerialName(\"quote\")\n    val quote: TootStatusDTO? = null,\n\n    @SerialName(\"circle_id\")\n    val circleId: String? = null,\n\n    @SerialName(\"visibility_ex\")\n    val visibilityEx: String? = null,\n) {\n    @kotlinx.serialization.Serializable\n    data class Mention(\n        @SerialName(\"id\")\n        val id: String,\n\n        @SerialName(\"username\")\n        val username: String,\n\n        @SerialName(\"url\")\n        val url: String,\n\n        @SerialName(\"acct\")\n        val acct: String,\n    ) {\n        fun toModel(): Note.Type.Mastodon.Mention {\n            return Note.Type.Mastodon.Mention(\n                id = id,\n                username = username,\n                url = url,\n                acct = acct\n            )\n        }\n    }\n\n    @kotlinx.serialization.Serializable\n    data class Tag(\n        @SerialName(\"name\")\n        val name: String,\n\n        @SerialName(\"url\")\n        val url: String,\n    ) {\n        fun toModel(): Note.Type.Mastodon.Tag {\n            return Note.Type.Mastodon.Tag(\n                name = name,\n                url = url,\n            )\n        }\n    }\n\n\n    @kotlinx.serialization.Serializable\n    data class EmojiReactionCount(\n        @SerialName(\"name\")\n        val name: String,\n\n        @SerialName(\"count\")\n        val count: Int,\n\n        @SerialName(\"account_ids\")\n        val accountIds: List<String>,\n\n        @SerialName(\"me\")\n        val me: Boolean? = null,\n\n        @SerialName(\"url\")\n        val url: String? = null,\n\n        @SerialName(\"domain\")\n        val domain: String?  = null,\n\n        @SerialName(\"static_url\")\n        val staticUrl: String? = null,\n\n        @SerialName(\"width\")\n        val width: Float? = null,\n\n        @SerialName(\"height\")\n        val height: Float? = null,\n    ) {\n        val isCustomEmoji = url != null || staticUrl != null\n\n        val reaction = if (isCustomEmoji) {\n            if (domain == null) {\n                \":$name@.:\"\n            } else {\n                \":$name@$domain:\"\n            }\n        } else {\n            name\n        }\n        \n        fun getEmoji(cachePath: String? = null): CustomEmoji? {\n            if (!isCustomEmoji) {\n                return null\n            }\n            return CustomEmoji(\n                name = if (domain == null) {\n                    \"$name@.\"\n                } else {\n                    \"$name@$domain\"\n                },\n                url = url,\n                host = domain,\n                aspectRatio = if (width == null || height == null) {\n                    null\n                } else {\n                    width / height\n                },\n                cachePath = cachePath,\n            )\n        }\n\n        fun myReaction(): String? {\n            return reaction.takeIf {\n                me == true\n            }\n        }\n    }\n}\n\nobject TootStatusVisibilityTypeSerializer : EnumIgnoreUnknownSerializer<StatusVisibilityType>(StatusVisibilityType.values(), StatusVisibilityType.Public)\n\n@kotlinx.serialization.Serializable(with = TootStatusVisibilityTypeSerializer::class)\nenum class StatusVisibilityType {\n    @SerialName(\"private\") Private,\n    @SerialName(\"unlisted\") Unlisted,\n    @SerialName(\"public\") Public,\n    @SerialName(\"direct\") Direct\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/subscription/SubscribePushNotification.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.subscription\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class SubscribePushNotification(\n    @SerialName(\"subscription\") val subscription: Subscription,\n    @SerialName(\"data\") val data: Data,\n) {\n    @Serializable\n    data class Subscription(\n        @SerialName(\"endpoint\") val endpoint: String,\n        @SerialName(\"keys\") val keys: Keys,\n\n        ) {\n        @Serializable\n        data class Keys(\n            @SerialName(\"p256dh\") val p256dh: String,\n            @SerialName(\"auth\") val auth: String,\n        )\n    }\n\n    @Serializable\n    data class Data(\n        @SerialName(\"alerts\") val alerts: WebPushSubscriptionAlerts,\n        @SerialName(\"policy\") val policy: String? = null,\n    )\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/subscription/WebPushSubscription.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.subscription\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class WebPushSubscription(\n    @SerialName(\"id\") val id: String,\n    @SerialName(\"endpoint\") val endpoint: String,\n    @SerialName(\"alerts\") val alerts: WebPushSubscriptionAlerts,\n    @SerialName(\"server_key\") val serverKey: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/subscription/WebPushSubscriptionAlerts.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.subscription\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class WebPushSubscriptionAlerts(\n    @SerialName(\"mention\") val mention: Boolean? = null,\n    @SerialName(\"status\") val status: Boolean? = null,\n    @SerialName(\"reblog\") val reblog: Boolean? = null,\n    @SerialName(\"follow\") val follow: Boolean? = null,\n    @SerialName(\"follow_request\") val followRequest: Boolean? = null,\n    @SerialName(\"favourite\") val favourite: Boolean? = null,\n    @SerialName(\"poll\") val poll: Boolean? = null,\n    @SerialName(\"update\") val update: Boolean? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/suggestion/SuggestionDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.suggestion\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\n\n@kotlinx.serialization.Serializable\ndata class SuggestionDTO(\n    @SerialName(\"source\")\n    val source: String,\n\n    @SerialName(\"account\")\n    val account: MastodonAccountDTO\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/mastodon/tag/MastodonTagDTO.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.tag\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.model.hashtag.HashTag\n\n@kotlinx.serialization.Serializable\ndata class MastodonTagDTO(\n    @SerialName(\"name\") val name: String,\n    @SerialName(\"url\") val url: String,\n    @SerialName(\"history\") val history: List<History>,\n) {\n    @kotlinx.serialization.Serializable\n    data class History(\n        @SerialName(\"day\") val day: Long,\n        @SerialName(\"uses\") val uses: Int,\n        @SerialName(\"accounts\") val accounts: Int,\n    )\n\n    fun toModel(): HashTag {\n        return HashTag(\n            name,\n            history.sumOf { it.uses },\n            history.map { it.uses }\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/milktea/CreateInstanceRequest.kt",
    "content": "package net.pantasystem.milktea.api.milktea\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class CreateInstanceRequest(@SerialName(\"host\") val host: String)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/milktea/InstanceInfoResponse.kt",
    "content": "package net.pantasystem.milktea.api.milktea\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class InstanceInfoResponse(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"host\")\n    val host: String,\n\n    @SerialName(\"name\")\n    val name: String? = null,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n\n    @SerialName(\"clientMaxBodyByteSize\")\n    val clientMaxBodyByteSize: Long? = null,\n\n    @SerialName(\"iconUrl\")\n    val iconUrl: String? = null,\n\n    @SerialName(\"themeColor\")\n    val themeColor: String? = null,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/milktea/MilkteaAPIService.kt",
    "content": "package net.pantasystem.milktea.api.milktea\n\nimport retrofit2.Response\nimport retrofit2.http.Body\nimport retrofit2.http.GET\nimport retrofit2.http.POST\n\ninterface MilkteaAPIService {\n\n    @GET(\"/api/instances\")\n    suspend fun getInstances(): Response<List<InstanceInfoResponse>>\n\n    @POST(\"/api/instances\")\n    suspend fun createInstance(@Body body: CreateInstanceRequest): Response<Unit>\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/milktea/MilkteaAPIServiceBuilder.kt",
    "content": "package net.pantasystem.milktea.api.milktea\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport okhttp3.MediaType.Companion.toMediaType\nimport retrofit2.Retrofit\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MilkteaAPIServiceBuilder @Inject constructor(\n    val okHttpClientProvider: OkHttpClientProvider\n) {\n\n    val json = Json {\n        ignoreUnknownKeys = true\n    }\n\n    @OptIn(ExperimentalSerializationApi::class)\n    fun build(baseUrl: String): MilkteaAPIService {\n        return Retrofit.Builder()\n            .baseUrl(baseUrl)\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttpClientProvider.get())\n            .build()\n            .create(MilkteaAPIService::class.java)\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/milktea/instance/ticker/InstanceTickerAPIService.kt",
    "content": "package net.pantasystem.milktea.api.milktea.instance.ticker\n\nimport net.pantasystem.milktea.api.misskey.infos.SimpleInstanceInfo\nimport retrofit2.Response\nimport retrofit2.http.GET\nimport retrofit2.http.Query\n\ninterface InstanceTickerAPIService {\n\n    @GET(\"/instances\")\n    suspend fun getInstanceInfo(@Query(\"host\") host: String): Response<InstanceTickerNetworkDTO>\n\n    @GET(\"instances-search\")\n    suspend fun getInstances(\n        @Query(\"query\") name: String? = null,\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"offset\") offset: Int? = null,\n    ): Response<List<SimpleInstanceInfo>>\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/milktea/instance/ticker/InstanceTickerAPIServiceBuilder.kt",
    "content": "package net.pantasystem.milktea.api.milktea.instance.ticker\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport okhttp3.MediaType.Companion.toMediaType\nimport retrofit2.Retrofit\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass InstanceTickerAPIServiceBuilder @Inject constructor(\n    val okHttpClientProvider: OkHttpClientProvider\n) {\n\n    val json = Json {\n        ignoreUnknownKeys = true\n    }\n\n    fun build(baseUrl: String): InstanceTickerAPIService {\n        return Retrofit.Builder()\n            .baseUrl(baseUrl)\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttpClientProvider.get())\n            .build()\n            .create(InstanceTickerAPIService::class.java)\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/milktea/instance/ticker/InstanceTickerNetworkDTO.kt",
    "content": "package net.pantasystem.milktea.api.milktea.instance.ticker\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.instance.ticker.InstanceTicker\n\n@Serializable\ndata class InstanceTickerNetworkDTO(\n    @SerialName(\"uri\") val uri: String,\n    @SerialName(\"faviconUrl\") val faviconUrl: String?,\n    @SerialName(\"iconUrl\") val iconUrl: String?,\n    @SerialName(\"name\") val name: String?,\n    @SerialName(\"softwareName\") val softwareName: String?,\n    @SerialName(\"softwareVersion\") val softwareVersion: String?,\n    @SerialName(\"themeColor\") val themeColor: String?,\n) {\n    fun toModel(): InstanceTicker {\n        return InstanceTicker(\n            uri = uri,\n            faviconUrl = faviconUrl,\n            iconUrl = iconUrl,\n            name = name,\n            softwareName = softwareName,\n            softwareVersion = softwareVersion,\n            themeColor = themeColor,\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/EmptyRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey\n\nimport androidx.annotation.Keep\n\n@kotlinx.serialization.Serializable\n@Keep\nobject EmptyRequest"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/I.kt",
    "content": "package net.pantasystem.milktea.api.misskey\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class I(@SerialName(\"i\") val i: String?)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/InstanceInfosAPI.kt",
    "content": "package net.pantasystem.milktea.api.misskey\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.infos.SimpleInstanceInfo\nimport okhttp3.MediaType.Companion.toMediaType\nimport retrofit2.Response\nimport retrofit2.Retrofit\nimport retrofit2.http.GET\nimport retrofit2.http.Query\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\ninterface InstanceInfosAPI {\n\n    @GET(\"instances\")\n    suspend fun getInstances(\n        @Query(\"name\") name: String? = null,\n        @Query(\"limit\") limit: Int? = null,\n        @Query(\"offset\") offset: Int? = null,\n        @Query(\"lang\") lang: String? = null,\n    ): Response<List<SimpleInstanceInfo>>\n}\n\n@Singleton\nclass InstanceInfoAPIBuilder @Inject constructor(val okHttpClientProvider: OkHttpClientProvider) {\n    private val json = Json {\n        ignoreUnknownKeys = true\n    }\n    @OptIn(ExperimentalSerializationApi::class)\n    private val retrofitBuilder by lazy {\n        Retrofit.Builder()\n            .baseUrl(\"https://milktea-instance-suggestions.milktea.workers.dev\")\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttpClientProvider.get())\n            .build()\n    }\n\n\n    fun build(): InstanceInfosAPI {\n        return retrofitBuilder.create(InstanceInfosAPI::class.java)\n    }\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/MisskeyAPI.kt",
    "content": "package net.pantasystem.milktea.api.misskey\n\nimport kotlinx.serialization.json.JsonObject\nimport net.pantasystem.milktea.api.misskey.ap.ApResolveRequest\nimport net.pantasystem.milktea.api.misskey.ap.ApResolveResult\nimport net.pantasystem.milktea.api.misskey.app.CreateApp\nimport net.pantasystem.milktea.api.misskey.auth.App\nimport net.pantasystem.milktea.api.misskey.clip.*\nimport net.pantasystem.milktea.api.misskey.drive.*\nimport net.pantasystem.milktea.api.misskey.favorite.Favorite\nimport net.pantasystem.milktea.api.misskey.groups.AcceptInvitationDTO\nimport net.pantasystem.milktea.api.misskey.groups.CreateGroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.DeleteGroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.GroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.InviteUserDTO\nimport net.pantasystem.milktea.api.misskey.groups.RejectInvitationDTO\nimport net.pantasystem.milktea.api.misskey.groups.RemoveUserDTO\nimport net.pantasystem.milktea.api.misskey.groups.ShowGroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.TransferGroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.UpdateGroupDTO\nimport net.pantasystem.milktea.api.misskey.hashtag.SearchHashtagRequest\nimport net.pantasystem.milktea.api.misskey.instance.MetaNetworkDTO\nimport net.pantasystem.milktea.api.misskey.instance.RequestMeta\nimport net.pantasystem.milktea.api.misskey.list.*\nimport net.pantasystem.milktea.api.misskey.messaging.MessageAction\nimport net.pantasystem.milktea.api.misskey.messaging.MessageDTO\nimport net.pantasystem.milktea.api.misskey.messaging.RequestMessage\nimport net.pantasystem.milktea.api.misskey.messaging.RequestMessageHistory\nimport net.pantasystem.milktea.api.misskey.notes.*\nimport net.pantasystem.milktea.api.misskey.notes.favorite.CreateFavorite\nimport net.pantasystem.milktea.api.misskey.notes.favorite.DeleteFavorite\nimport net.pantasystem.milktea.api.misskey.notes.mute.ToggleThreadMuteRequest\nimport net.pantasystem.milktea.api.misskey.notes.reaction.ReactionHistoryDTO\nimport net.pantasystem.milktea.api.misskey.notes.reaction.RequestReactionHistoryDTO\nimport net.pantasystem.milktea.api.misskey.notes.translation.Translate\nimport net.pantasystem.milktea.api.misskey.notes.translation.TranslationResult\nimport net.pantasystem.milktea.api.misskey.notification.NotificationDTO\nimport net.pantasystem.milktea.api.misskey.notification.NotificationRequest\nimport net.pantasystem.milktea.api.misskey.online.user.OnlineUserCount\nimport net.pantasystem.milktea.api.misskey.register.Subscription\nimport net.pantasystem.milktea.api.misskey.register.SubscriptionStateNetworkDTO\nimport net.pantasystem.milktea.api.misskey.register.UnSubscription\nimport net.pantasystem.milktea.api.misskey.register.WebClientBaseRequest\nimport net.pantasystem.milktea.api.misskey.register.WebClientRegistries\nimport net.pantasystem.milktea.api.misskey.trend.HashtagTrend\nimport net.pantasystem.milktea.api.misskey.users.*\nimport net.pantasystem.milktea.api.misskey.users.follow.FollowUserRequest\nimport net.pantasystem.milktea.api.misskey.users.follow.UnFollowUserRequest\nimport net.pantasystem.milktea.api.misskey.users.follow.UpdateUserFollowRequest\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.CreateRenoteMuteRequest\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.DeleteRenoteMuteRequest\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMutesRequest\nimport net.pantasystem.milktea.api.misskey.users.report.ReportDTO\nimport net.pantasystem.milktea.api.misskey.v10.FollowFollowerUsers\nimport net.pantasystem.milktea.api.misskey.v10.RequestFollowFollower\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaDTO\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaQuery\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaToAdd\nimport net.pantasystem.milktea.api.misskey.v12.channel.ChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.CreateChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.FindPageable\nimport net.pantasystem.milktea.api.misskey.v12.channel.FollowChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.ShowChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.UnFollowChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.UpdateChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReaction\nimport net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReactionRequest\nimport net.pantasystem.milktea.api.misskey.v12_75_0.CreateGallery\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Delete\nimport net.pantasystem.milktea.api.misskey.v12_75_0.GalleryPost\nimport net.pantasystem.milktea.api.misskey.v12_75_0.GetPosts\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Like\nimport net.pantasystem.milktea.api.misskey.v12_75_0.LikedGalleryPost\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Show\nimport net.pantasystem.milktea.api.misskey.v12_75_0.UnLike\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Update\nimport net.pantasystem.milktea.api.misskey.v13.EmojisResponse\nimport retrofit2.Response\nimport retrofit2.http.Body\nimport retrofit2.http.Headers\nimport retrofit2.http.POST\n\ninterface MisskeyAPI {\n\n\n    @POST(\"api/app/create\")\n    suspend fun createApp(@Body createApp: CreateApp): Response<App>\n\n\n    @POST(\"api/blocking/create\")\n    suspend fun blockUser(@Body requestUser: RequestUser): Response<Unit>\n\n    @POST(\"api/blocking/delete\")\n    suspend fun unblockUser(@Body requestUser: RequestUser): Response<Unit>\n\n\n    @POST(\"api/i\")\n    suspend fun i(@Body i: I): Response<UserDTO>\n\n    //users\n    @POST(\"api/users\")\n    suspend fun getUsers(@Body requestUser: RequestUser): Response<List<UserDTO>>\n\n    @POST(\"api/users/show\")\n    suspend fun showUser(@Body requestUser: RequestUser): Response<UserDTO>\n\n    @POST(\"api/users/show\")\n    suspend fun showUsers(@Body requestUser: RequestUser): Response<List<UserDTO>>\n\n    @POST(\"api/users/search\")\n    suspend fun searchUser(@Body requestUser: RequestUser): Response<List<UserDTO>>\n\n    @POST(\"api/users/lists/list\")\n    suspend fun userList(@Body i: I): Response<List<UserListDTO>>\n\n    @POST(\"api/users/lists/show\")\n    suspend fun showList(@Body listId: ListId): Response<UserListDTO>\n\n    @POST(\"api/users/lists/create\")\n    suspend fun createList(@Body createList: CreateList): Response<UserListDTO>\n\n    @POST(\"api/lists/delete\")\n    suspend fun deleteList(@Body listId: ListId): Response<Unit>\n\n    @POST(\"api/users/lists/update\")\n    suspend fun updateList(@Body createList: UpdateList): Response<Unit>\n\n    @POST(\"api/users/lists/push\")\n    suspend fun pushUserToList(@Body listUserOperation: ListUserOperation): Response<Unit>\n\n    @POST(\"api/users/lists/pull\")\n    suspend fun pullUserFromList(@Body listUserOperation: ListUserOperation): Response<Unit>\n\n    @POST(\"api/following/delete\")\n    suspend fun unFollowUser(@Body requestUser: UnFollowUserRequest): Response<UserDTO>\n\n    @POST(\"api/following/create\")\n    suspend fun followUser(@Body requestUser: FollowUserRequest): Response<UserDTO>\n\n    @POST(\"api/following/update\")\n    suspend fun updateFollowUser(@Body request: UpdateUserFollowRequest): Response<UserDTO>\n\n    @POST(\"api/following/requests/accept\")\n    suspend fun acceptFollowRequest(@Body followRequest: AcceptFollowRequest) : Response<Unit>\n\n    @POST(\"api/following/requests/reject\")\n    suspend fun rejectFollowRequest(@Body rejectFollowRequest: RejectFollowRequest) : Response<Unit>\n\n    @POST(\"api/following/requests/list\")\n    suspend fun getFollowRequestsList(@Body body: GetFollowRequest): Response<List<FollowRequestDTO>>\n    //account\n    @POST(\"api/i/favorites\")\n    suspend fun favorites(@Body noteRequest: NoteRequest): Response<List<Favorite>?>\n\n    @POST(\"api/notes/favorites/create\")\n    suspend fun createFavorite(@Body noteRequest: CreateFavorite): Response<Unit>\n\n    @POST(\"api/notes/favorites/delete\")\n    suspend fun deleteFavorite(@Body noteRequest: DeleteFavorite): Response<Unit>\n\n    @POST(\"api/i/notifications\")\n    suspend fun notification(@Body notificationRequest: NotificationRequest): Response<List<NotificationDTO>?>\n\n    @POST(\"api/notifications/mark-all-as-read\")\n    suspend fun markAllAsReadNotifications(i: I): Response<Unit>\n\n    @POST(\"api/notes/create\")\n    suspend fun create(@Body createNote: CreateNote): Response<CreateNote.Response>\n\n    @POST(\"api/notes/delete\")\n    suspend fun delete(@Body deleteNote: DeleteNote): Response<Unit>\n\n    @POST(\"api/notes/reactions\")\n    suspend fun reactions(@Body body: RequestReactionHistoryDTO): Response<List<ReactionHistoryDTO>>\n\n    @POST(\"api/notes/reactions/create\")\n    suspend fun createReaction(@Body reaction: CreateReactionDTO): Response<Unit>\n    @POST(\"api/notes/reactions/delete\")\n    suspend fun deleteReaction(@Body deleteNote: DeleteNote): Response<Unit>\n\n    @POST(\"api/notes/unrenote\")\n    suspend fun unrenote(@Body deleteNote: DeleteNote): Response<Unit>\n\n    @POST(\"api/notes/search\")\n    suspend fun searchNote(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/notes/state\")\n    suspend fun noteState(@Body noteRequest: NoteRequest): Response<NoteStateResponse>\n\n    @POST(\"api/notes/show\")\n    suspend fun showNote(@Body requestNote: NoteRequest): Response<NoteDTO>\n\n    @POST(\"api/notes/children\")\n    suspend fun children(@Body req: GetNoteChildrenRequest): Response<List<NoteDTO>>\n\n    @POST(\"api/notes/conversation\")\n    suspend fun conversation(@Body noteRequest: NoteRequest): Response<List<NoteDTO>>\n\n    @POST(\"api/notes/featured\")\n    suspend fun featured(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    //timeline\n    @POST(\"api/notes/timeline\")\n    suspend fun homeTimeline(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n\n    @POST(\"api/notes/hybrid-timeline\")\n    suspend fun hybridTimeline(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/notes/local-timeline\")\n    suspend fun localTimeline(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/notes/global-timeline\")\n    suspend fun globalTimeline(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/notes/polls/vote\")\n    suspend fun vote(@Body vote: Vote) : Response<Unit>\n\n    @POST(\"api/notes/search-by-tag\")\n    suspend fun searchByTag(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/notes/user-list-timeline\")\n    suspend fun userListTimeline(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n    //user\n    @POST(\"api/users/notes\")\n    suspend fun userNotes(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/notes/mentions\")\n    suspend fun mentions(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/notes/recommended-timeline\")\n    suspend fun getCalckeyRecommendedTimeline(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    //drive\n    @POST(\"api/drive/files\")\n    suspend fun getFiles(@Body fileRequest: RequestFile): Response<List<FilePropertyDTO>>\n\n    @POST(\"api/drive/files/update\")\n    suspend fun updateFile(@Body updateFileRequest: JsonObject): Response<FilePropertyDTO>\n\n    @POST(\"api/drive/files/delete\")\n    suspend fun deleteFile(@Body req: DeleteFileDTO): Response<Unit>\n\n    @POST(\"api/drive/files/show\")\n    suspend fun showFile(@Body req: ShowFile) : Response<FilePropertyDTO>\n\n    @POST(\"api/drive/folders\")\n    suspend fun getFolders(@Body folderRequest: RequestFolder): Response<List<DirectoryNetworkDTO>>\n\n    @POST(\"api/drive/folders/create\")\n    suspend fun createFolder(@Body createFolder: CreateFolder): Response<DirectoryNetworkDTO>\n\n    @POST(\"api/drive/folders/show\")\n    suspend fun showFolder(@Body req: ShowFolderRequest): Response<DirectoryNetworkDTO>\n\n\n    //meta\n    @POST(\"api/meta\")\n    suspend fun getMeta(@Body requestMeta: RequestMeta): Response<MetaNetworkDTO>\n\n\n    //message\n    @POST(\"api/messaging/history\")\n    suspend fun getMessageHistory(@Body requestMessageHistory: RequestMessageHistory): Response<List<MessageDTO>>\n\n    @POST(\"api/messaging/messages\")\n    suspend fun getMessages(@Body requestMessage: RequestMessage): Response<List<MessageDTO>>\n\n    @POST(\"api/messaging/messages/create\")\n    suspend fun createMessage(@Body messageAction: MessageAction): Response<MessageDTO>\n\n    @POST(\"api/messaging/messages/delete\")\n    suspend fun deleteMessage(@Body messageAction: MessageAction): Response<Unit>\n\n    @POST(\"api/messaging/messages/read\")\n    suspend fun readMessage(@Body messageAction: MessageAction): Response<Unit>\n\n    @POST(\"api/mute/create\")\n    suspend fun muteUser(@Body createMuteRequest: CreateMuteUserRequest): Response<Unit>\n\n    @POST(\"api/mute/delete\")\n    suspend fun unmuteUser(@Body requestUser: RequestUser): Response<Unit>\n\n\n    @POST(\"api/sw/register\")\n    suspend fun swRegister(@Body subscription: Subscription) : Response<SubscriptionStateNetworkDTO>\n\n    @POST(\"api/sw/unregister\")\n    suspend fun swUnRegister(@Body unSub: UnSubscription) : Response<Unit>\n\n    @POST(\"api/following/requests/cancel\")\n    suspend fun cancelFollowRequest(@Body req: CancelFollow) : Response<UserDTO>\n\n    @POST(\"api/notes/renotes\")\n    suspend fun renotes(@Body req: FindRenotes) : Response<List<NoteDTO>>\n\n    @POST(\"api/notes/translate\")\n    @Headers(\"Content-Type: application/json\")\n    suspend fun translate(@Body req: Translate) : Response<TranslationResult>\n\n    @POST(\"api/users/report-abuse\")\n    suspend fun report(@Body req: ReportDTO) : Response<Unit>\n\n    @POST(\"api/ap/show\")\n    suspend fun resolve(@Body req: ApResolveRequest) : Response<ApResolveResult>\n\n    @POST(\"api/notes/thread-muting/create\")\n    suspend fun createThreadMute(@Body req: ToggleThreadMuteRequest) : Response<Unit>\n\n    @POST(\"api/notes/thread-muting/delete\")\n    suspend fun deleteThreadMute(@Body req: ToggleThreadMuteRequest) : Response<Unit>\n\n    @POST(\"api/hashtags/search\")\n    suspend fun searchHashtag(@Body req: SearchHashtagRequest) : Response<List<String>>\n\n    @POST(\"api/emojis\")\n    suspend fun getEmojis(@Body req: EmptyRequest) : Response<EmojisResponse>\n\n    @POST(\"api/i/registry/get-all\")\n    suspend fun getReactionsFromGetAll(@Body req: WebClientBaseRequest): Response<WebClientRegistries>\n\n    @POST(\"api/clips/create\")\n    suspend fun createClip(@Body req: CreateClipRequest): Response<ClipDTO>\n\n    @POST(\"api/clips/update\")\n    suspend fun updateClip(@Body req: UpdateClipRequest): Response<ClipDTO>\n\n    @POST(\"api/clips/delete\")\n    suspend fun deleteClip(@Body req: DeleteClipRequest): Response<Unit>\n\n    @POST(\"api/users/clips\")\n    suspend fun findByUsersClip(@Body req: FindUsersClipRequest): Response<List<ClipDTO>>\n\n    @POST(\"api/notes/clips\")\n    suspend fun findByNotesClip(@Body req: FindNotesClip): Response<List<ClipDTO>>\n\n\n    @POST(\"api/clips/add-note\")\n    suspend fun addNoteToClip(@Body req: AddNoteToClipRequest): Response<Unit>\n\n    @POST(\"api/clips/remove-note\")\n    suspend fun removeNoteToClip(@Body req: RemoveNoteToClipRequest): Response<Unit>\n\n    @POST(\"api/clips/show\")\n    suspend fun showClip(@Body req: ShowClipRequest): Response<ClipDTO>\n\n    @POST(\"api/clips/list\")\n    suspend fun findMyClips(@Body req: I): Response<List<ClipDTO>>\n\n    @POST(\"api/clips/notes\")\n    suspend fun getClipNotes(@Body req: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/renote-mute/list\")\n    suspend fun getRenoteMutes(@Body req: RenoteMutesRequest): Response<List<RenoteMuteDTO>>\n\n    @POST(\"api/renote-mute/create\")\n    suspend fun createRenoteMute(@Body req: CreateRenoteMuteRequest): Response<Unit>\n\n    @POST(\"api/renote-mute/delete\")\n    suspend fun deleteRenoteMute(@Body req: DeleteRenoteMuteRequest): Response<Unit>\n\n    @POST(\"api/hashtags/trend\")\n    suspend fun getTrendingHashtags(@Body body: EmptyRequest): Response<List<HashtagTrend>>\n\n    @POST(\"api/get-online-users-count\")\n    suspend fun getOnlineUsersCount(@Body body: EmptyRequest): Response<OnlineUserCount>\n\n\n    @POST(\"api/users/followers\")\n    suspend fun followers4V10(@Body request: RequestFollowFollower): Response<FollowFollowerUsers>\n\n    @POST(\"api/users/following\")\n    suspend fun following4V10(@Body request: RequestFollowFollower): Response<FollowFollowerUsers>\n\n\n    @POST(\"/api/gallery/featured\")\n    suspend fun featuredGalleries(@Body i: I) : Response<List<GalleryPost>>\n\n    @POST(\"/api/gallery/popular\")\n    suspend fun popularGalleries(@Body i: I) : Response<List<GalleryPost>>\n\n    @POST(\"/api/gallery/posts\")\n    suspend fun galleryPosts(@Body getGalleryPost: GetPosts) : Response<List<GalleryPost>>\n\n    @POST(\"/api/gallery/posts/create\")\n    suspend fun createGallery(@Body createGallery: CreateGallery) : Response<GalleryPost>\n\n    @POST(\"/api/gallery/posts/delete\")\n    suspend fun deleteGallery(@Body deleteGallery: Delete) : Response<Unit>\n\n    @POST(\"/api/gallery/posts/like\")\n    suspend fun likeGallery(@Body like: Like) : Response<Unit>\n\n    @POST(\"/api/gallery/posts/unlike\")\n    suspend fun unlikeGallery(@Body unlike: UnLike) : Response<Unit>\n\n    @POST(\"/api/gallery/posts/show\")\n    suspend fun showGallery(@Body show: Show) : Response<GalleryPost>\n\n    @POST(\"/api/gallery/posts/update\")\n    suspend fun updateGallery(@Body update: Update) : Response<GalleryPost>\n\n    @POST(\"/api/i/gallery/posts\")\n    suspend fun myGalleryPosts(@Body request: GetPosts) : Response<List<GalleryPost>>\n\n    @POST(\"/api/i/gallery/likes\")\n    suspend fun likedGalleryPosts(@Body request: GetPosts) : Response<List<LikedGalleryPost>>\n\n    @POST(\"/api/users/gallery/posts\")\n    suspend fun userPosts(@Body request: GetPosts) : Response<List<GalleryPost>>\n\n\n    @POST(\"api/antennas/create\")\n    suspend fun createAntenna(@Body antennaToAdd: AntennaToAdd): Response<AntennaDTO>\n\n    @POST(\"api/antennas/delete\")\n    suspend fun deleteAntenna(@Body query: AntennaQuery): Response<Unit>\n\n    @POST(\"api/antennas/notes\")\n    suspend fun antennasNotes(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/antennas/show\")\n    suspend fun showAntenna(@Body antennaQuery: AntennaQuery): Response<AntennaDTO>\n\n    @POST(\"api/antennas/update\")\n    suspend fun updateAntenna(@Body antennaToAdd: AntennaToAdd): Response<AntennaDTO>\n\n    @POST(\"api/antennas/list\")\n    suspend fun getAntennas(@Body query: AntennaQuery): Response<List<AntennaDTO>>\n\n    @POST(\"api/users/search-by-username-and-host\")\n    suspend fun searchByUserNameAndHost(@Body requestUser: RequestUser): Response<List<UserDTO>>\n\n    @POST(\"api/channels/create\")\n    suspend fun createChannel(@Body dto: CreateChannelDTO): Response<ChannelDTO>\n\n    @POST(\"api/channels/featured\")\n    suspend fun featuredChannels(@Body i: I): Response<List<ChannelDTO>>\n\n    @POST(\"api/channels/follow\")\n    suspend fun followChannel(@Body dto: FollowChannelDTO): Response<Unit>\n\n    @POST(\"api/channels/unfollow\")\n    suspend fun unFollowChannel(@Body dto: UnFollowChannelDTO): Response<Unit>\n\n    @POST(\"api/channels/followed\")\n    suspend fun followedChannels(@Body dto: FindPageable): Response<List<ChannelDTO>>\n\n    @POST(\"api/channels/owned\")\n    suspend fun ownedChannels(@Body dto: FindPageable): Response<List<ChannelDTO>>\n\n    @POST(\"api/channels/show\")\n    suspend fun showChannel(@Body dto: ShowChannelDTO): Response<ChannelDTO>\n\n    @POST(\"api/channels/update\")\n    suspend fun updateChannel(@Body dto: UpdateChannelDTO): Response<ChannelDTO>\n\n    @POST(\"api/channels/timeline\")\n    suspend fun channelTimeline(@Body dto: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/users/reactions\")\n    suspend fun getUserReactions(@Body request: UserReactionRequest): Response<List<UserReaction>>\n\n\n\n    @POST(\"api/users/followers\")\n    suspend fun followers(@Body userRequest: RequestUser) : Response<List<FollowFollowerUser>>\n\n    @POST(\"api/users/following\")\n    suspend fun following(@Body userRequest: RequestUser) : Response<List<FollowFollowerUser>>\n\n    @POST(\"api/users/groups/create\")\n    suspend fun createGroup(@Body body: CreateGroupDTO) : Response<GroupDTO>\n\n    @POST(\"api/users/groups/delete\")\n    suspend fun deleteGroup(@Body body: DeleteGroupDTO) : Response<Unit>\n\n    @POST(\"api/users/groups/invitations/accept\")\n    suspend fun acceptInvitation(@Body body: AcceptInvitationDTO) : Response<Unit>\n\n    @POST(\"api/users/groups/invitations/reject\")\n    suspend fun rejectInvitation(@Body body: RejectInvitationDTO) : Response<Unit>\n\n    @POST(\"api/users/groups/invite\")\n    suspend fun invite(@Body body: InviteUserDTO) : Response<Unit>\n\n    @POST(\"api/users/groups/joined\")\n    suspend fun joinedGroups(@Body body: I) : Response<List<GroupDTO>>\n\n    @POST(\"api/users/groups/owned\")\n    suspend fun ownedGroups(@Body body: I) : Response<List<GroupDTO>>\n\n    @POST(\"api/users/groups/owned\")\n    suspend fun pullUser(@Body body: RemoveUserDTO) : Response<Unit>\n\n    @POST(\"api/users/groups/show\")\n    suspend fun showGroup(@Body body: ShowGroupDTO) : Response<GroupDTO>\n\n    @POST(\"api/users/groups/transfer\")\n    suspend fun transferGroup(@Body body: TransferGroupDTO) : Response<GroupDTO>\n\n    @POST(\"api/users/groups/update\")\n    suspend fun updateGroup(@Body body: UpdateGroupDTO) : Response<GroupDTO>\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/MisskeyAPIServiceBuilder.kt",
    "content": "package net.pantasystem.milktea.api.misskey\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.Json\nimport okhttp3.MediaType.Companion.toMediaType\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\nconst val READ_TIMEOUT_S = 30L\nconst val CONNECTION_TIMEOUT_S = 30L\nconst val WRITE_TIMEOUT_S = 30L\n\ninterface OkHttpClientProvider {\n    fun get(): OkHttpClient\n    fun create(): OkHttpClient\n}\n\nclass DefaultOkHttpClientProvider : OkHttpClientProvider {\n    val client = OkHttpClient.Builder()\n    .connectTimeout(CONNECTION_TIMEOUT_S, TimeUnit.SECONDS)\n    .writeTimeout(WRITE_TIMEOUT_S, TimeUnit.SECONDS)\n    .readTimeout(READ_TIMEOUT_S, TimeUnit.SECONDS)\n    .build()\n    override fun get(): OkHttpClient {\n        return client\n    }\n\n    override fun create(): OkHttpClient {\n        return OkHttpClient.Builder()\n            .build()\n    }\n}\n@OptIn(ExperimentalSerializationApi::class)\n@Singleton\nclass MisskeyAPIServiceBuilder @Inject constructor(\n    private val okHttpClientProvider: OkHttpClientProvider\n){\n\n    private val okHttpClient by lazy {\n        okHttpClientProvider.get()\n    }\n\n    val json = Json {\n        ignoreUnknownKeys = true\n    }\n\n\n    fun build(baseUrl: String): MisskeyAPI =\n        Retrofit.Builder()\n            .baseUrl(baseUrl)\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttpClient)\n            .build()\n            .create(MisskeyAPI::class.java)\n\n    fun buildAuthAPI(url: String): MisskeyAuthAPI =\n        Retrofit.Builder()\n            .baseUrl(url)\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttpClient)\n            .build()\n            .create(MisskeyAuthAPI::class.java)\n\n\n}\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/MisskeyAuthAPI.kt",
    "content": "package net.pantasystem.milktea.api.misskey\n\nimport net.pantasystem.milktea.api.misskey.auth.*\nimport retrofit2.Response\nimport retrofit2.http.Body\nimport retrofit2.http.POST\n\ninterface MisskeyAuthAPI {\n    //auth\n    @POST(\"api/auth/session/generate\")\n    suspend fun generateSession(@Body appSecret: AppSecret): Response<Session>\n\n    @POST(\"api/auth/session/userkey\")\n    suspend fun getAccessToken(@Body userKey: UserKey): Response<AccessToken>\n\n    @POST(\"/api/signin\")\n    suspend fun signIn(@Body body: SignInRequest): Response<SignInResponse>\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/ap/ApResolveRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.ap\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class ApResolveRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"uri\")\n    val uri: String,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/ap/ApResolveResult.kt",
    "content": "package net.pantasystem.milktea.api.misskey.ap\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@kotlinx.serialization.Serializable\nsealed class ApResolveResult {\n    @SerialName(\"User\")\n    @kotlinx.serialization.Serializable\n    data class TypeUser(\n        @SerialName(\"object\") val user: UserDTO\n    ) : ApResolveResult()\n\n    @kotlinx.serialization.Serializable\n    @SerialName(\"Note\")\n    data class TypeNote(\n        @SerialName(\"object\") val note: NoteDTO\n    ) : ApResolveResult()\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/app/CreateApp.kt",
    "content": "package net.pantasystem.milktea.api.misskey.app\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class CreateApp(\n    @SerialName(\"i\")\n    val i: String?,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"description\")\n    val description: String,\n\n    @SerialName(\"callbackUrl\")\n    val callbackUrl: String,\n\n    @SerialName(\"permission\")\n    val permission: List<String>\n)\n\n//api/app/create\n//api/my/apps\n\n//api/app/show\n\n/*\n0: \"write:user-groups\"\n1: \"read:user-groups\"\n2: \"read:page-likes\"\n3: \"write:page-likes\"\n4: \"write:pages\"\n5: \"read:pages\"\n6: \"write:votes\"\n7: \"write:reactions\"\n8: \"read:reactions\"\n9: \"write:notifications\"\n10: \"read:notifications\"\n11: \"write:notes\"\n12: \"write:mutes\"\n13: \"read:mutes\"\n14: \"read:account\"\n15: \"write:account\"\n16: \"read:blocks\"\n17: \"write:blocks\"\n18: \"read:drive\"\n19: \"write:drive\"\n20: \"read:favorites\"\n21: \"write:favorites\"\n22: \"read:following\"\n23: \"write:following\"\n24: \"read:messaging\"\n25: \"write:messaging\"\n */"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/app/ShowApp.kt",
    "content": "package net.pantasystem.milktea.api.misskey.app\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class ShowApp(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"appId\")\n    val appId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/auth/AccessToken.kt",
    "content": "package net.pantasystem.milktea.api.misskey.auth\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@Serializable\ndata class AccessToken(\n    @SerialName(\"accessToken\")\n    val accessToken: String,\n\n    @SerialName(\"user\")\n    val user: UserDTO,\n)\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/auth/App.kt",
    "content": "package net.pantasystem.milktea.api.misskey.auth\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.apps.ObtainToken\nimport net.pantasystem.milktea.model.app.AppType\nimport java.io.Serializable\nimport java.net.URLEncoder\n\n@kotlinx.serialization.Serializable\ndata class App(\n    @SerialName(\"id\")\n    val id: String? = null,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"callbackUrl\")\n    val callbackUrl: String? = null,\n\n    @SerialName(\"isAuthorized\")\n    val isAuthorized: Boolean? = null,\n\n    @SerialName(\"permission\")\n    val permission: List<String>? = emptyList(),\n\n    @SerialName(\"secret\")\n    val secret: String? = null\n) : Serializable {\n    fun toModel(): AppType.Misskey {\n        return AppType.Misskey(\n            id = id,\n            name = name,\n            callbackUrl = callbackUrl,\n            isAuthorized = isAuthorized,\n            permission = permission ?: emptyList(),\n            secret = secret\n        )\n    }\n\n    fun toFirefishModel(): AppType.Firefish {\n        return AppType.Firefish(\n            id = id,\n            name = name,\n            callbackUrl = callbackUrl,\n            isAuthorized = isAuthorized,\n            permission = permission ?: emptyList(),\n            secret = secret\n        )\n    }\n}\n\n\nfun AppType.Companion.fromDTO(app: App): AppType {\n    return app.toModel()\n}\n\nfun AppType.Companion.fromFirefishDTO(app: App): AppType {\n    return app.toFirefishModel()\n}\n\nfun AppType.Companion.fromDTO(app: net.pantasystem.milktea.api.mastodon.apps.App): AppType {\n    return app.toModel()\n}\n\nfun AppType.Companion.fromPleromaDTO(app: net.pantasystem.milktea.api.mastodon.apps.App): AppType {\n    return app.toPleromaModel()\n}\n\nfun AppType.Mastodon.generateAuthUrl(baseURL: String, scope: String): String {\n    val encodedClientId = URLEncoder.encode(clientId, \"utf-8\")\n    val encodedRedirectUri = URLEncoder.encode(redirectUri, \"utf-8\")\n    val encodedResponseType = URLEncoder.encode(\"code\", \"utf-8\")\n    val encodedScope = URLEncoder.encode(scope, \"utf-8\")\n    return \"$baseURL/oauth/authorize?client_id=${encodedClientId}&redirect_uri=$encodedRedirectUri&response_type=$encodedResponseType&scope=$encodedScope\"\n}\n\nfun AppType.Pleroma.generateAuthUrl(baseURL: String, scope: String): String {\n    val encodedClientId = URLEncoder.encode(clientId, \"utf-8\")\n    val encodedRedirectUri = URLEncoder.encode(redirectUri, \"utf-8\")\n    val encodedResponseType = URLEncoder.encode(\"code\", \"utf-8\")\n    val encodedScope = URLEncoder.encode(scope, \"utf-8\")\n    return \"$baseURL/oauth/authorize?client_id=${encodedClientId}&redirect_uri=$encodedRedirectUri&response_type=$encodedResponseType&scope=$encodedScope\"\n}\n\n/**\n * @param scope アプリ作成時に指定したscope\n * @param code redirectUrl+codeで帰ってきたコード\n */\nfun AppType.Mastodon.createObtainToken(scope: String, code: String): ObtainToken {\n    return ObtainToken(\n        clientId = clientId,\n        clientSecret = clientSecret,\n        scope = scope,\n        redirectUri = redirectUri,\n        code = code,\n        grantType = \"authorization_code\"\n    )\n}\n\nfun AppType.Pleroma.createObtainToken(scope: String, code: String): ObtainToken {\n    return ObtainToken(\n        clientId = clientId,\n        clientSecret = clientSecret,\n        scope = scope,\n        redirectUri = redirectUri,\n        code = code,\n        grantType = \"authorization_code\"\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/auth/AppSecret.kt",
    "content": "package net.pantasystem.milktea.api.misskey.auth\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable data class AppSecret(\n    @SerialName(\"appSecret\")\n    val appSecret: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/auth/Session.kt",
    "content": "package net.pantasystem.milktea.api.misskey.auth\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable data class Session(\n    @SerialName(\"token\")\n    val token: String,\n\n    @SerialName(\"url\")\n    val url: String,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/auth/SignInRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.auth\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class SignInRequest(\n    @SerialName(\"username\")\n    val username: String,\n\n    @SerialName(\"password\")\n    val password: String,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/auth/SignInResponse.kt",
    "content": "package net.pantasystem.milktea.api.misskey.auth\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class SignInResponse(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"i\")\n    val i: String,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/auth/UserKey.kt",
    "content": "package net.pantasystem.milktea.api.misskey.auth\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class UserKey(\n    @SerialName(\"appSecret\")\n    val appSecret: String,\n\n    @SerialName(\"token\")\n    val token: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/clip/AddNoteToClipRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.clip\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class AddNoteToClipRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"clipId\")\n    val clipId: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String\n)\n\n\ntypealias RemoveNoteToClipRequest = AddNoteToClipRequest"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/clip/ClipDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.clip\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@kotlinx.serialization.Serializable\ndata class ClipDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    val createdAt: Instant,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"user\")\n    val user: UserDTO,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n\n    @SerialName(\"isPublic\")\n    val isPublic: Boolean\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/clip/CreateClipRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.clip\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class CreateClipRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"isPublic\")\n    val isPublic: Boolean,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n)\n\n@kotlinx.serialization.Serializable\ndata class UpdateClipRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"clipId\")\n    val clipId: String,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"isPublic\")\n    val isPublic: Boolean,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/clip/DeleteClipRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.clip\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class DeleteClipRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"clipId\")\n    val clipId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/clip/FindNotesClip.kt",
    "content": "package net.pantasystem.milktea.api.misskey.clip\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class FindNotesClip(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/clip/FindUsersClipRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.clip\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class FindUsersClipRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"limit\")\n    val limit: Int,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/clip/ShowClipRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.clip\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class ShowClipRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"clipId\")\n    val clipId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/CreateFolder.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class CreateFolder(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"parentId\")\n    val parentId: String?\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/DeleteFileReq.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class DeleteFileDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"fileId\")\n    val fileId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/DirectoryNetworkDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.Directory\nimport net.pantasystem.milktea.model.drive.DirectoryId\n\n@Serializable\ndata class DirectoryNetworkDTO(\n    @SerialName(\"id\") val id: String,\n    @SerialName(\"createdAt\") val createdAt: String,\n    @SerialName(\"name\") val name: String,\n    @SerialName(\"foldersCount\") val foldersCount: Int? = null,\n    @SerialName(\"filesCount\") val filesCount: Int? = null,\n    @SerialName(\"parentId\") val parentId: String? = null,\n    @SerialName(\"parent\") val parent: DirectoryNetworkDTO? = null\n) {\n    fun toModel(account: Account): Directory {\n        return Directory(\n            id = DirectoryId(\n                accountId = account.accountId,\n                directoryId = id\n            ),\n            createdAt = createdAt,\n            name = name,\n            foldersCount = foldersCount,\n            filesCount = filesCount,\n            parentId = parentId?.let {\n                DirectoryId(\n                    accountId = account.accountId,\n                    directoryId = it\n                )\n            },\n            parent = parent?.toModel(account)\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/FilePropertyDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.serializers.InstantIso8601Serializer\nimport kotlinx.serialization.SerialName\nimport java.io.Serializable\n\n@kotlinx.serialization.Serializable\ndata class FilePropertyDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    @kotlinx.serialization.Serializable(with = InstantIso8601Serializer::class)\n    val createdAt: Instant,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"type\")\n    val type: String,\n\n    @SerialName(\"md5\")\n    val md5: String,\n\n    @SerialName(\"size\")\n    val size: Int? = null,\n\n    @SerialName(\"userId\")\n    val userId: String? = null,\n\n    @SerialName(\"folderId\")\n    val folderId: String? = null,\n\n    @SerialName(\"comment\")\n    val comment: String? = null,\n\n    @SerialName(\"isSensitive\")\n    val isSensitive: Boolean? = null,\n\n    @SerialName(\"url\")\n    val url: String,\n\n    @SerialName(\"thumbnailUrl\")\n    val thumbnailUrl: String? = null,\n\n    @SerialName(\"attachedNoteIds\")\n    val attachedNoteIds: List<String>? = null,\n\n    @SerialName(\"properties\")\n    val properties: Properties? = null,\n\n    @SerialName(\"blurhash\")\n    val blurhash: String? = null,\n)\n    : Serializable {\n\n    @kotlinx.serialization.Serializable\n    data class Properties(\n        @SerialName(\"width\")\n        val width: Float? = null,\n\n        @SerialName(\"height\")\n        val height: Float? = null\n    ) : Serializable\n\n    fun getThumbnailUrl(instanceBaseUrl: String): String {\n        return getUrl(instanceBaseUrl, thumbnailUrl ?: url)\n    }\n\n    fun getUrl(instanceBaseUrl: String): String {\n        return getUrl(instanceBaseUrl, url)\n    }\n\n    fun getUrl(instanceBaseUrl: String, url: String): String {\n        val hostUrl = if (instanceBaseUrl.endsWith(\"/\")) {\n            instanceBaseUrl.substring(0, instanceBaseUrl.length - 1)\n        } else {\n            instanceBaseUrl\n        }\n\n        return when {\n            url.startsWith(\"https://\") -> {\n                url\n            }\n            url.startsWith(\"/\") -> {\n                hostUrl + url\n            }\n            else -> {\n                \"$hostUrl/$url\"\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/RequestFile.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class RequestFile (\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"limit\")\n    val limit: Int? = null,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"folderId\")\n    val folderId: String? = null,\n\n    @SerialName(\"type\")\n    val type: String? = null\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/RequestFolder.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class RequestFolder(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"limit\")\n    val limit: Int? = null,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"folderId\")\n    val folderId: String? = null,\n\n    @SerialName(\"name\")\n    val name: String? = null,\n\n    @SerialName(\"parentId\")\n    val parentId: String? = null\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/ShowFile.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class ShowFile(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"fileId\")\n    val fileId: String?,\n\n    @SerialName(\"url\")\n    val url: String?\n) {\n  constructor(fileId: String, i: String) : this(fileId = fileId, i = i, url = null)\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/ShowFolderRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class ShowFolderRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"folderId\") val folderId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/drive/UpdateFileDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.drive\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.JsonObject\nimport kotlinx.serialization.json.JsonPrimitive\nimport kotlinx.serialization.json.buildJsonObject\nimport net.pantasystem.milktea.model.drive.UpdateFileProperty\nimport net.pantasystem.milktea.model.drive.ValueType\n\n//@Serializable\n//data class UpdateFileDTO(\n//    @SerialName(\"i\")\n//    val i: String,\n//\n//    @SerialName(\"fileId\")\n//    val fileId: String,\n//\n//    @SerialName(\"folderId\")\n//    val folderId: String?,\n//\n//    @SerialName(\"name\")\n//    val name: String,\n//\n//    @SerialName(\"comment\")\n//    val comment: String?,\n//\n//    @SerialName(\"isSensitive\")\n//    val isSensitive: Boolean,\n//) {\n//    companion object\n//}\n\n//fun UpdateFileDTO.Companion.from(token: String, model: UpdateFileProperty): UpdateFileDTO {\n//    return UpdateFileDTO(\n//        i = token,\n//        comment = model.comment,\n//        fileId = model.fileId.fileId,\n//        folderId = model.folderId,\n//        isSensitive = model.isSensitive,\n//        name = model.name\n//    )\n//}\n\n@OptIn(ExperimentalSerializationApi::class)\nfun UpdateFileProperty.toJsonObject(token: String): JsonObject {\n    return buildJsonObject {\n        put(\"i\", JsonPrimitive(token))\n        put(\"fileId\", JsonPrimitive(fileId.fileId))\n\n        when(val v = comment) {\n            is ValueType.Empty -> put(\"comment\", JsonPrimitive(null))\n            is ValueType.Some -> put(\"comment\", JsonPrimitive(v.value))\n            null -> Unit\n        }\n\n        when(val v = folderId) {\n            is ValueType.Empty -> put(\"folderId\", JsonPrimitive(null))\n            is ValueType.Some -> put(\"folderId\", JsonPrimitive(v.value))\n            null -> Unit\n        }\n\n        when(val v = name) {\n            is ValueType.Empty -> put(\"name\", JsonPrimitive(null))\n            is ValueType.Some -> put(\"name\", JsonPrimitive(v.value))\n            null -> Unit\n        }\n\n        when(val v = isSensitive) {\n            is ValueType.Empty -> put(\"isSensitive\", JsonPrimitive(null))\n            is ValueType.Some -> put(\"isSensitive\", JsonPrimitive(v.value))\n            null -> Unit\n        }\n\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/emoji/CustomEmojiNetworkDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.emoji\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.EmojiWithAlias\n\n@kotlinx.serialization.Serializable\ndata class CustomEmojiNetworkDTO(\n    @SerialName(\"id\") val id: String? = null,\n    @SerialName(\"name\") val name: String,\n    @SerialName(\"host\") val host: String? = null,\n    @SerialName(\"url\") val url: String? = null,\n    @SerialName(\"uri\") val uri: String? = null,\n    @SerialName(\"type\") val type: String? = null,\n    @SerialName(\"category\") val category: String? = null,\n    @SerialName(\"aliases\") val aliases: List<String>? = null,\n    @SerialName(\"width\") val width: Int? = null,\n    @SerialName(\"height\") val height: Int? = null,\n) {\n    fun toModelWithAlias(aspectRatio: Float? = null, cachePath: String? = null): EmojiWithAlias {\n        val emoji = CustomEmoji(\n            id = id,\n            name = name,\n            host = host,\n            url = url,\n            uri = uri,\n            type = type,\n            category = category,\n            aspectRatio = aspectRatio ?: if (width == null || height == null || height <= 0) null else width.toFloat() / height,\n            cachePath = cachePath,\n        )\n        return EmojiWithAlias(\n            emoji = emoji,\n            aliases = aliases,\n        )\n    }\n\n    fun toModel(aspectRatio: Float? = null, cachePath: String? = null): CustomEmoji {\n        return CustomEmoji(\n            id = id,\n            name = name,\n            host = host,\n            url = url,\n            uri = uri,\n            type = type,\n            category = category,\n            aspectRatio = aspectRatio ?: if (width == null || height == null || height <= 0) null else width.toFloat() / height,\n            cachePath = cachePath,\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/emoji/EmojisType.kt",
    "content": "package net.pantasystem.milktea.api.misskey.emoji\n\nimport kotlinx.serialization.DeserializationStrategy\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.builtins.ListSerializer\nimport kotlinx.serialization.builtins.MapSerializer\nimport kotlinx.serialization.builtins.serializer\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport kotlinx.serialization.json.JsonArray\nimport kotlinx.serialization.json.JsonContentPolymorphicSerializer\nimport kotlinx.serialization.json.JsonElement\nimport kotlinx.serialization.json.JsonObject\n\n\n@kotlinx.serialization.Serializable(with = CustomEmojisTypeSerializer::class)\nsealed interface EmojisType {\n    @kotlinx.serialization.Serializable(with = TypeArraySerializer::class)\n    data class TypeArray(val emojis: List<CustomEmojiNetworkDTO>) : EmojisType\n\n    @kotlinx.serialization.Serializable(with = TypeObjectSerializer::class)\n    data class TypeObject(val emojis: Map<String, String>) : EmojisType\n\n    @kotlinx.serialization.Serializable\n    data object None : EmojisType\n}\n\n@kotlinx.serialization.Serializable\ndata class TestNoteObject(\n    @kotlinx.serialization.Serializable(with = CustomEmojisTypeSerializer::class) val emojis: EmojisType\n)\n\n\n\nclass CustomEmojisTypeSerializer : JsonContentPolymorphicSerializer<EmojisType>(EmojisType::class) {\n    override fun selectDeserializer(element: JsonElement): DeserializationStrategy<out EmojisType> {\n        if (element is JsonArray) {\n            return TypeArraySerializer()\n        }\n        if (element is JsonObject) {\n            return TypeObjectSerializer\n        }\n\n        return EmojisType.None.serializer()\n    }\n\n}\n\nobject TypeObjectSerializer : KSerializer<EmojisType.TypeObject> {\n    private val mapSerializer = MapSerializer(String.serializer(), String.serializer())\n    override val descriptor: SerialDescriptor = mapSerializer.descriptor\n    override fun deserialize(decoder: Decoder): EmojisType.TypeObject {\n        return EmojisType.TypeObject(mapSerializer.deserialize(decoder))\n    }\n\n    override fun serialize(encoder: Encoder, value: EmojisType.TypeObject) {\n        mapSerializer.serialize(encoder, value.emojis)\n    }\n}\n\nclass TypeArraySerializer : KSerializer<EmojisType.TypeArray> {\n    private val listSerializer = ListSerializer(CustomEmojiNetworkDTO.serializer())\n    override val descriptor: SerialDescriptor = listSerializer.descriptor\n\n    override fun deserialize(decoder: Decoder): EmojisType.TypeArray {\n        return EmojisType.TypeArray(listSerializer.deserialize(decoder))\n    }\n\n    override fun serialize(encoder: Encoder, value: EmojisType.TypeArray) {\n        return listSerializer.serialize(encoder, value.emojis)\n    }\n}\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/favorite/Favorite.kt",
    "content": "package net.pantasystem.milktea.api.misskey.favorite\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\n\n@Serializable\ndata class Favorite(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    val createdAt: String,\n\n    @SerialName(\"note\")\n    val note: NoteDTO,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/groups/Actions.kt",
    "content": "package net.pantasystem.milktea.api.misskey.groups\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class DeleteGroupDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"groupId\")\n    val groupId: String\n)\n\n@Serializable\ndata class CreateGroupDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"name\")\n    val name: String\n)\n\n@Serializable\ndata class AcceptInvitationDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"invitationId\")\n    val invitationId: String\n)\n\n@Serializable\ndata class RejectInvitationDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"invitationId\")\n    val invitationId: String\n)\n\n@Serializable\ndata class InviteUserDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"groupId\")\n    val groupId: String,\n)\n\n@Serializable\ndata class RemoveUserDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"groupId\")\n    val groupId: String\n)\n\n@Serializable\ndata class ShowGroupDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"groupId\")\n    val groupId: String\n)\n\n@Serializable\ndata class TransferGroupDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"groupId\")\n    val groupId: String,\n\n    @SerialName(\"userId\")\n    val userId: String\n)\n\n@Serializable\ndata class UpdateGroupDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"groupId\")\n    val groupId: String,\n\n    @SerialName(\"name\")\n    val name: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/groups/GroupDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.groups\n\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.serializers.InstantIso8601Serializer\nimport kotlinx.serialization.SerialName\nimport java.io.Serializable\n\n@kotlinx.serialization.Serializable\ndata class GroupDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    @kotlinx.serialization.Serializable(InstantIso8601Serializer::class)\n    val createdAt: Instant,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"ownerId\")\n    val ownerId: String,\n\n    @SerialName(\"userIds\")\n    val userIds: List<String>\n): Serializable\n\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/groups/InvitationDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.groups\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class InvitationDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"group\")\n    val group: GroupDTO\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/hashtag/RequestHashTagList.kt",
    "content": "package net.pantasystem.milktea.api.misskey.hashtag\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\nclass RequestHashTagList(\n    @SerialName(\"i\")\n    val i: String?,\n\n    @SerialName(\"sort\")\n    val sort: String,\n\n    @SerialName(\"limit\")\n    val limit: Int = 30\n){\n\n//    class Sort {\n////        fun mentionedUsers() = OrderBy(\"mentionedUsers\")\n////        fun mentionedLocalUsers() = OrderBy(\"mentionedLocalUsers\")\n////        fun mentionedRemoteUsers() = OrderBy(\"mentionedRemoteUsers\")\n////        fun attachedUsers() = OrderBy(\"attachedUsers\")\n//        fun attachedLocalUsers() = OrderBy(\"attachedLocalUsers\")\n//        fun attachedRemoteUsers() = OrderBy(\"attachedRemoteUsers\")\n//    }\n\n//    class OrderBy(private val sort: String){\n//        fun asc(): String{\n//            return \"+$sort\"\n//        }\n//\n//        fun desc(): String{\n//            return \"-$sort\"\n//        }\n//    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/hashtag/SearchHashtagRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.hashtag\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class SearchHashtagRequest(\n    @SerialName(\"query\")\n    val query: String,\n\n    @SerialName(\"limit\")\n    val limit: Int = 10,\n\n    @SerialName(\"offset\")\n    val offset: Int = 0\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/infos/InstanceInfosResponse.kt",
    "content": "package net.pantasystem.milktea.api.misskey.infos\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.activitypub.NodeInfoDTO\nimport net.pantasystem.milktea.model.instance.Meta\n\n@kotlinx.serialization.Serializable\ndata class InstanceInfosResponse(\n    @SerialName(\"instancesInfos\")\n    val instancesInfos: List<InstanceInfo>\n) {\n\n//    @kotlinx.serialization.Serializable\n//    data class Stats(\n//        val notesCount: Long,\n//        val usersCount: Long,\n//        val mau: Long,\n//        val instancesCount: Long\n//    )\n\n    @kotlinx.serialization.Serializable\n    data class InstanceInfo(\n        @SerialName(\"url\")\n        val url: String,\n\n//        @SerialName(\"value\")\n//        val value: Double,\n\n        @SerialName(\"meta\")\n        val meta: Meta,\n\n        @SerialName(\"nodeinfo\") val nodeInfo: NodeInfoDTO,\n\n        @SerialName(\"name\")\n        val name: String,\n\n        @SerialName(\"description\")\n        val description: String? = null,\n//        val langs: Map<String, String?>,\n        @SerialName(\"isAlive\")\n        val isAlive: Boolean,\n\n//        @SerialName(\"banner\")\n//        val banner: Boolean,\n\n//        @SerialName(\"icon\")\n//        val icon: Boolean,\n//\n//        @SerialName(\"background\")\n//        val background: Boolean\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/infos/SimpleInstanceInfo.kt",
    "content": "package net.pantasystem.milktea.api.misskey.infos\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class SimpleInstanceInfo(\n    @SerialName(\"uri\") val url: String,\n    @SerialName(\"name\") val name: String? = null,\n    @SerialName(\"description\") val description: String? = null,\n    @SerialName(\"iconUrl\") val iconUrl: String? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/instance/MetaNetworkDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.instance\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\nimport net.pantasystem.milktea.model.instance.Meta\n\n@Serializable\ndata class MetaNetworkDTO(\n    @SerialName(\"uri\") var uri: String,\n    @SerialName(\"bannerUrl\") var bannerUrl: String? = null,\n    @SerialName(\"cacheRemoteFiles\") var cacheRemoteFiles: Boolean? = null,\n    @SerialName(\"description\") var description: String? = null,\n    @SerialName(\"disableGlobalTimeline\") var disableGlobalTimeline: Boolean? = null,\n    @SerialName(\"disableLocalTimeline\") var disableLocalTimeline: Boolean? = null,\n    @SerialName(\"disableRegistration\") var disableRegistration: Boolean? = null,\n    @SerialName(\"driveCapacityPerLocalUserMb\") var driveCapacityPerLocalUserMb: Int? = null,\n    @SerialName(\"driveCapacityPerRemoteUserMb\") var driveCapacityPerRemoteUserMb: Int? = null,\n    @SerialName(\"enableDiscordIntegration\") var enableDiscordIntegration: Boolean? = null,\n    @SerialName(\"enableEmail\") var enableEmail: Boolean? = null,\n    @SerialName(\"enableEmojiReaction\") var enableEmojiReaction: Boolean? = null,\n    @SerialName(\"enableGithubIntegration\") var enableGithubIntegration: Boolean? = null,\n    @SerialName(\"enableRecaptcha\") var enableRecaptcha: Boolean? = null,\n    @SerialName(\"enableServiceWorker\") var enableServiceWorker: Boolean? = null,\n    @SerialName(\"enableTwitterIntegration\") var enableTwitterIntegration: Boolean? = null,\n    @SerialName(\"errorImageUrl\") var errorImageUrl: String? = null,\n    @SerialName(\"feedbackUrl\") var feedbackUrl: String? = null,\n    @SerialName(\"iconUrl\") var iconUrl: String? = null,\n    @SerialName(\"maintainerEmail\") var maintainerEmail: String? = null,\n    @SerialName(\"maintainerName\") var maintainerName: String? = null,\n    @SerialName(\"mascotImageUrl\") var mascotImageUrl: String? = null,\n    @SerialName(\"maxNoteTextLength\") var maxNoteTextLength: Int? = null,\n    @SerialName(\"name\") var name: String? = null,\n    @SerialName(\"recaptchaSiteKey\") var recaptchaSiteKey: String? = null,\n    @SerialName(\"secure\") var secure: Boolean? = null,\n    @SerialName(\"swPublickey\") var swPublicKey: String? = null,\n    @SerialName(\"ToSUrl\") var toSUrl: String? = null,\n    @SerialName(\"version\") var version: String = \"\",\n    @SerialName(\"emojis\") var emojis: List<CustomEmojiNetworkDTO>? = null\n) {\n    fun toModel(): Meta {\n        return Meta(\n            uri = uri,\n            bannerUrl = bannerUrl,\n            cacheRemoteFiles = cacheRemoteFiles,\n            description = description,\n            disableGlobalTimeline = disableGlobalTimeline,\n            disableLocalTimeline = disableLocalTimeline,\n            disableRegistration = disableRegistration,\n            driveCapacityPerLocalUserMb = driveCapacityPerLocalUserMb,\n            driveCapacityPerRemoteUserMb = driveCapacityPerRemoteUserMb,\n            enableDiscordIntegration = enableDiscordIntegration,\n            enableEmail = enableEmail,\n            enableEmojiReaction = enableEmojiReaction,\n            enableGithubIntegration = enableGithubIntegration,\n            enableRecaptcha = enableRecaptcha,\n            enableServiceWorker = enableServiceWorker,\n            enableTwitterIntegration = enableTwitterIntegration,\n            errorImageUrl = errorImageUrl,\n            feedbackUrl = feedbackUrl,\n            iconUrl = iconUrl,\n            maintainerEmail = maintainerEmail,\n            maintainerName = maintainerName,\n            mascotImageUrl = mascotImageUrl,\n            maxNoteTextLength = maxNoteTextLength,\n            name = name,\n            recaptchaSiteKey = recaptchaSiteKey,\n            secure = secure,\n            swPublicKey = swPublicKey,\n            toSUrl = toSUrl,\n            version = version,\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/instance/RequestMeta.kt",
    "content": "package net.pantasystem.milktea.api.misskey.instance\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class RequestMeta(@SerialName(\"detail\") val detail: Boolean = true)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/list/CreateList.kt",
    "content": "package net.pantasystem.milktea.api.misskey.list\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class CreateList(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"name\")\n    val name: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/list/ListId.kt",
    "content": "package net.pantasystem.milktea.api.misskey.list\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class ListId (\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"listId\")\n    val listId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/list/ListUserOperation.kt",
    "content": "package net.pantasystem.milktea.api.misskey.list\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class ListUserOperation(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"listId\")\n    val listId: String,\n\n    @SerialName(\"userId\")\n    val userId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/list/UpdateList.kt",
    "content": "package net.pantasystem.milktea.api.misskey.list\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class UpdateList(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"listId\")\n    val listId: String,\n\n    @SerialName(\"name\")\n    val name: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/list/UserListDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.list\n\n\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.serializers.InstantIso8601Serializer\nimport kotlinx.serialization.SerialName\nimport java.io.Serializable\n\n@kotlinx.serialization.Serializable\ndata class UserListDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @kotlinx.serialization.Serializable(with = InstantIso8601Serializer::class)\n    @SerialName(\"createdAt\")\n    val createdAt: Instant,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"userIds\")\n    val userIds: List<String>\n) : Serializable"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/messaging/MessageAction.kt",
    "content": "package net.pantasystem.milktea.api.misskey.messaging\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport java.io.Serializable as JavaSerializable\n\n@Serializable\ndata class MessageAction(\n    @SerialName(\"i\")\n    val i: String?,\n\n    @SerialName(\"userId\")\n    val userId: String? = null,\n\n    @SerialName(\"groupId\")\n    val groupId: String? = null,\n\n    @SerialName(\"text\")\n    val text: String? = null,\n\n    @SerialName(\"fileId\")\n    val fileId: String? = null,\n\n    @SerialName(\"messageId\")\n    val messageId: String? = null\n): JavaSerializable"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/messaging/MessageDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.messaging\n\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.serializers.InstantIso8601Serializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.drive.FilePropertyDTO\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\nimport net.pantasystem.milktea.api.misskey.groups.GroupDTO\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport java.io.Serializable as JavaSerializable\n\n@Serializable\ndata class MessageDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    @Serializable(with = InstantIso8601Serializer::class) val createdAt: Instant,\n\n    @SerialName(\"text\")\n    val text: String? = null,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"user\")\n    val user: UserDTO,\n\n    @SerialName(\"recipientId\")\n    val recipientId: String? = null,\n\n    @SerialName(\"recipient\")\n    val recipient: UserDTO? = null,\n\n    @SerialName(\"groupId\")\n    val groupId: String? = null,\n\n    @SerialName(\"group\")\n    val group: GroupDTO? = null,\n\n    @SerialName(\"fileId\")\n    val fileId: String? = null,\n\n    @SerialName(\"file\")\n    val file: FilePropertyDTO? = null,\n\n    @SerialName(\"isRead\")\n    val isRead: Boolean,\n\n    @SerialName(\"emojis\")\n    val emojis: List<CustomEmojiNetworkDTO>? = null,\n\n    @SerialName(\"reads\")\n    val reads: List<String>? = null,\n): JavaSerializable\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/messaging/RequestMessage.kt",
    "content": "package net.pantasystem.milktea.api.misskey.messaging\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class RequestMessage(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String? = null,\n\n    @SerialName(\"groupId\")\n    val groupId: String? = null,\n\n    @SerialName(\"limit\")\n    val limit: Int? = 20,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"markAsRead\")\n    val markAsRead: Boolean? = null\n\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/messaging/RequestMessageHistory.kt",
    "content": "package net.pantasystem.milktea.api.misskey.messaging\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class RequestMessageHistory(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"limit\") val limit: Int? = null,\n    @SerialName(\"group\") val group: Boolean? = null\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/CreateNote.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.note.poll.CreatePoll\n\n@Serializable\ndata class CreateNote(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"visibility\")\n    val visibility: String = \"public\",\n\n    @SerialName(\"visibleUserIds\")\n    val visibleUserIds: List<String>? = null,\n\n    @SerialName(\"text\")\n    val text: String? = null,\n\n    @SerialName(\"cw\")\n    val cw: String? = null,\n\n    @SerialName(\"viaMobile\")\n    val viaMobile: Boolean? = null,\n\n    @SerialName(\"localOnly\")\n    val localOnly: Boolean? = null,\n\n    @SerialName(\"noExtractMentions\")\n    val noExtractMentions: Boolean? = null,\n\n    @SerialName(\"noExtractHashtags\")\n    val noExtractHashtags: Boolean? = null,\n\n    @SerialName(\"noExtractEmojis\")\n    val noExtractEmojis: Boolean? = null,\n\n    @SerialName(\"fileIds\")\n    var fileIds: List<String>? = null,\n\n    @SerialName(\"replyId\")\n    val replyId: String? = null,\n\n    @SerialName(\"renoteId\")\n    val renoteId: String? = null,\n\n    @SerialName(\"poll\")\n    val poll: CreatePoll? = null,\n\n    @SerialName(\"channelId\")\n    val channelId: String? = null,\n\n    @SerialName(\"reactionAcceptance\")\n    val reactionAcceptance: ReactionAcceptanceType? = null,\n) {\n\n    @Serializable\n    data class Response(val createdNote: NoteDTO)\n\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/CreateReactionDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class CreateReactionDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n\n    @SerialName(\"reaction\")\n    val reaction: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/DeleteNote.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class DeleteNote(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/FindRenotes.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class FindRenotes(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/GetNoteChildrenRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class GetNoteChildrenRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"noteId\") val noteId: String,\n    @SerialName(\"limit\") val limit: Int,\n    @SerialName(\"depth\") val depth: Int,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/NoteDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\n\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.serializers.InstantIso8601Serializer\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.misskey.auth.App\nimport net.pantasystem.milktea.api.misskey.drive.FilePropertyDTO\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojisTypeSerializer\nimport net.pantasystem.milktea.api.misskey.emoji.EmojisType\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.common.serializations.EnumIgnoreUnknownSerializer\nimport java.io.Serializable\n\n@kotlinx.serialization.Serializable\ndata class NoteDTO(\n    @SerialName(\"id\")\n    val id: String,\n    //@JsonProperty(\"createdAt\") @JsonFormat(pattern = REMOTE_DATE_FORMAT) val createdAt: Date,\n    @kotlinx.serialization.Serializable(with = InstantIso8601Serializer::class)\n    @SerialName(\"createdAt\")\n    val createdAt: Instant,\n\n    @SerialName(\"text\")\n    val text: String? = null,\n\n    @SerialName(\"cw\")\n    val cw: String? = null,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"replyId\")\n    val replyId: String? = null,\n\n    @SerialName(\"renoteId\")\n    val renoteId: String? = null,\n\n    @SerialName(\"viaMobile\")\n    val viaMobile: Boolean? = null,\n\n    @SerialName(\"visibility\")\n    val visibility: NoteVisibilityType? = null,\n\n    @SerialName(\"localOnly\")\n    val localOnly: Boolean? = null,\n\n    @SerialName(\"visibleUserIds\")\n    val visibleUserIds: List<String>? = null,\n\n    @kotlinx.serialization.Serializable(with = CustomEmojisTypeSerializer::class)\n    @SerialName(\"reactionEmojis\")\n    val rawReactionEmojis: EmojisType? = null,\n\n    @SerialName(\"url\")\n    val url: String? = null,\n\n    @SerialName(\"uri\")\n    val uri: String? = null,\n\n    @SerialName(\"renoteCount\")\n    val renoteCount: Int,\n\n    @SerialName(\"reactions\")\n    val reactionCounts: LinkedHashMap<String, Int>? = null,\n\n    @kotlinx.serialization.Serializable(with = CustomEmojisTypeSerializer::class)\n    @SerialName(\"emojis\")\n    val rawEmojis: EmojisType? = null,\n\n    @SerialName(\"repliesCount\")\n    val replyCount: Int,\n\n    @SerialName(\"user\")\n    val user: UserDTO,\n\n    @SerialName(\"files\")\n    val files: List<FilePropertyDTO>? = null,\n\n    @SerialName(\"fileIds\")\n    val fileIds: List<String>? = null,\n\n    @SerialName(\"poll\")\n    val poll: PollDTO? = null,\n\n    @SerialName(\"renote\")\n    val reNote: NoteDTO? = null,\n\n    @SerialName(\"reply\")\n    val reply: NoteDTO? = null,\n\n    @SerialName(\"myReaction\")\n    val myReaction: String? = null,\n\n\n    @SerialName(\"_featuredId_\")\n    val tmpFeaturedId: String? = null,\n\n    @SerialName(\"_prId_\")\n    val promotionId: String? = null,\n\n    @SerialName(\"channelId\")\n    val channelId: String? = null,\n\n    @SerialName(\"app\")\n    val app: App? = null,\n\n    @SerialName(\"channel\")\n    val channel: ChannelInfo? = null,\n\n    @SerialName(\"reactionAcceptance\")\n    val reactionAcceptance: ReactionAcceptanceType? = null,\n) : Serializable {\n\n    @kotlinx.serialization.Serializable\n    data class ChannelInfo(\n        @SerialName(\"id\")\n        val id: String,\n\n        @SerialName(\"name\")\n        val name: String,\n    ) : Serializable\n\n    val reactionEmojiList = when(val emojis = rawReactionEmojis) {\n        EmojisType.None -> emptyList()\n        is EmojisType.TypeArray -> emojis.emojis\n        is EmojisType.TypeObject -> emojis.emojis.map {\n            CustomEmojiNetworkDTO(name = it.key, url = it.value)\n        }\n        null -> emptyList()\n    }\n    val emojiList: List<CustomEmojiNetworkDTO> = when(rawEmojis) {\n        EmojisType.None -> emptyList()\n        is EmojisType.TypeArray -> rawEmojis.emojis\n        is EmojisType.TypeObject -> (rawEmojis.emojis).map {\n            CustomEmojiNetworkDTO(name = it.key, url = it.value, uri = it.value)\n        }\n        null -> emptyList()\n    } + reactionEmojiList\n}\n\n\n@kotlinx.serialization.Serializable(with = NoteVisibilityTypeSerializer::class)\nenum class NoteVisibilityType {\n    @SerialName(\"public\") Public,\n    @SerialName(\"home\") Home,\n    @SerialName(\"followers\") Followers,\n    @SerialName(\"specified\") Specified\n}\n\nobject NoteVisibilityTypeSerializer : EnumIgnoreUnknownSerializer<NoteVisibilityType>(NoteVisibilityType.values(), NoteVisibilityType.Public)\n\n@kotlinx.serialization.Serializable\nenum class ReactionAcceptanceType {\n    @SerialName(\"likeOnly\") LikeOnly,\n    @SerialName(\"likeOnlyForRemote\") LikeOnly4Remote,\n    @SerialName(\"nonSensitiveOnly\") NonSensitiveOnly,\n    @SerialName(\"nonSensitiveOnlyForLocalLikeOnlyForRemote\") NonSensitiveOnly4LocalOnly4Remote\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/NoteRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport java.io.Serializable as JavaSerializable\n\n@Serializable\ndata class NoteRequest(\n    @SerialName(\"i\")\n    val i: String? = null,\n\n    @SerialName(\"userId\")\n    val userId: String? = null,\n\n    @SerialName(\"withFiles\")\n    val withFiles: Boolean? = null,\n\n    @SerialName(\"fileType\")\n    val fileType: String? = null,\n\n    @SerialName(\"excludeNsfw\")\n    val excludeNsfw: Boolean? = null,\n\n    @SerialName(\"limit\")\n    val limit: Int? = 20,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"sinceDate\")\n    val sinceDate: Long? = null,\n\n    @SerialName(\"untilDate\")\n    val untilDate: Long? = null,\n\n    @SerialName(\"query\")\n    val query: String? = null,\n\n    @SerialName(\"tag\")\n    val tag: String? = null,\n\n    @SerialName(\"includeLocalRenotes\")\n    val includeLocalRenotes: Boolean? = null,\n\n    @SerialName(\"includeMyRenotes\")\n    val includeMyRenotes: Boolean? = null,\n\n    @SerialName(\"includeRenotedMyNotes\")\n    val includeRenotedMyNotes: Boolean? = null,\n\n    @SerialName(\"noteId\")\n    val noteId: String? = null,\n\n    @SerialName(\"antennaId\")\n    val antennaId: String? = null,\n\n    @SerialName(\"listId\")\n    val listId: String? = null,\n\n    @SerialName(\"following\")\n    val following: Boolean? = null,\n\n    @SerialName(\"visibility\")\n    val visibility: String? = null,\n\n    @SerialName(\"reply\")\n    val reply: Boolean? = null,\n\n    @SerialName(\"renote\")\n    val renote: Boolean? = null,\n\n    @SerialName(\"poll\")\n    val poll: Boolean? = null,\n\n    @SerialName(\"offset\")\n    val offset: Int? = null,\n\n    @SerialName(\"includeReplies\")\n    val includeReplies: Boolean? = null,\n\n    @SerialName(\"host\")\n    val host: String? = null,\n\n    @SerialName(\"markAsRead\")\n    val markAsRead: Boolean? = null,\n\n    @SerialName(\"channelId\")\n    val channelId: String? = null,\n\n    @SerialName(\"clipId\")\n    val clipId: String? = null,\n\n    @SerialName(\"withReplies\")\n    val withReplies: Boolean? = null,\n\n    @SerialName(\"withRenotes\")\n    val withRenotes: Boolean? = null,\n) : JavaSerializable {\n\n\n    class Builder(\n        val pageable: Pageable,\n        var i: String?,\n        var includes: Include? = null,\n        var limit: Int = 20\n    ) {\n\n        fun build(conditions: Conditions?): NoteRequest {\n            val params = pageable.toParams()\n            return NoteRequest(\n                i = i,\n                userId = params.userId,\n                withFiles = params.withFiles,\n                excludeNsfw = params.excludeNsfw,\n                limit = limit,\n                sinceId = conditions?.sinceId,\n                untilId = conditions?.untilId,\n                untilDate = conditions?.untilDate,\n                sinceDate = conditions?.sinceDate,\n                query = params.query,\n                tag = params.tag,\n                includeRenotedMyNotes = includes?.includeRenotedMyNotes\n                    ?: params.includeRenotedMyRenotes,\n                includeMyRenotes = includes?.includeMyRenotes ?: params.includeMyRenotes,\n                includeReplies = params.includeReplies,\n                includeLocalRenotes = includes?.includeLocalRenotes ?: params.includeLocalRenotes,\n                following = params.following,\n                poll = params.poll,\n                offset = params.offset,\n                visibility = params.visibility,\n                host = params.host,\n                antennaId = params.antennaId,\n                markAsRead = params.markAsRead,\n                renote = params.renote,\n                reply = params.reply,\n                listId = params.listId,\n                noteId = params.noteId,\n                channelId = params.channelId,\n                clipId = params.clipId,\n                withRenotes = params.excludeReposts?.not(),\n                withReplies = params.excludeReplies?.not(),\n            )\n        }\n\n    }\n\n\n    data class Conditions(\n        @SerialName(\"sinceId\") val sinceId: String? = null,\n        @SerialName(\"untilId\") val untilId: String? = null,\n        @SerialName(\"sinceDate\") val sinceDate: Long? = null,\n        @SerialName(\"untilDate\") val untilDate: Long? = null\n    )\n\n    data class Include(\n        val includeLocalRenotes: Boolean? = null,\n        val includeMyRenotes: Boolean? = null,\n        val includeRenotedMyNotes: Boolean? = null\n    )\n\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/NoteStateResponse.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class NoteStateResponse(\n    @SerialName(\"isFavorited\")\n    val isFavorited: Boolean,\n\n    @SerialName(\"isWatching\")\n    val isWatching: Boolean? = null,\n\n    @SerialName(\"isMutedThread\")\n    val isMutedThread: Boolean? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/PollDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport java.io.Serializable\n\n@kotlinx.serialization.Serializable\ndata class PollDTO(\n    @SerialName(\"choices\")\n    val choices: List<ChoiceDTO>,\n\n    @SerialName(\"expiresAt\")\n    val expiresAt: Instant? = null,\n\n    @SerialName(\"multiple\")\n    val multiple: Boolean,\n) : Serializable {\n\n    @kotlinx.serialization.Serializable\n    data class ChoiceDTO(\n        @SerialName(\"text\")\n        val text: String,\n\n        @SerialName(\"votes\")\n        val votes: Int,\n\n        @SerialName(\"isVoted\")\n        val isVoted: Boolean = false,\n    ) : Serializable\n}\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/Vote.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class Vote(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"choice\") val choice: Int,\n    @SerialName(\"noteId\") val noteId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/favorite/CreateFavorite.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes.favorite\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class CreateFavorite(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/favorite/DeleteFavorite.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes.favorite\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class DeleteFavorite(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/mute/ToggleThreadMuteRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes.mute\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class ToggleThreadMuteRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/reaction/ReactionHistoryDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes.reaction\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@Serializable\ndata class ReactionHistoryDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    val createdAt: Instant,\n\n    @SerialName(\"user\")\n    val user: UserDTO,\n\n    @SerialName(\"type\")\n    val type: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/reaction/RequestReactionHistoryDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes.reaction\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class RequestReactionHistoryDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n\n    @SerialName(\"type\")\n    val type: String?,\n\n    @SerialName(\"limit\")\n    val limit: Int = 20,\n\n    @SerialName(\"offset\")\n    val offset: Int? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/translation/Translate.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes.translation\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class Translate(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"noteId\")\n    val noteId: String,\n\n    @SerialName(\"targetLang\")\n    val targetLang: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notes/translation/TranslationResult.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes.translation\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class TranslationResult(\n    @SerialName(\"sourceLang\")\n    val sourceLang: String,\n\n    @SerialName(\"text\")\n    val text: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notification/NotificationDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notification\n\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.serializers.InstantIso8601Serializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.groups.InvitationDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@Serializable\ndata class NotificationDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    @kotlinx.serialization.Serializable(with = InstantIso8601Serializer::class) val createdAt: Instant,\n\n    @SerialName(\"type\")\n    val type: String,\n\n    @SerialName(\"userId\")\n    val userId: String? = null,\n\n    @SerialName(\"user\")\n    val user: UserDTO? = null,\n\n    @SerialName(\"note\")\n    val note: NoteDTO? = null,\n\n    @SerialName(\"noteId\")\n    val noteId: String? = null,\n\n    @SerialName(\"reaction\")\n    val reaction: String? = null,\n\n    @SerialName(\"isRead\")\n    val isRead: Boolean? = null,\n\n    @SerialName(\"choice\")\n    val choice: Int? = null,\n\n    @SerialName(\"invitation\")\n    val invitation: InvitationDTO? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/notification/NotificationRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notification\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class NotificationRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"limit\")\n    val limit: Int? = null,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"following\")\n    val following: Boolean? = null,\n\n    @SerialName(\"markAsRead\")\n    val markAsRead: Boolean? = null,\n\n    @SerialName(\"includeTypes\")\n    val includeTypes: List<String>? = null,\n\n    @SerialName(\"excludeTypes\")\n    val excludeTypes: List<String>? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/online/user/OnlineUserCount.kt",
    "content": "package net.pantasystem.milktea.api.misskey.online.user\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class OnlineUserCount(\n    @SerialName(\"count\") val count: Int\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/register/WebConfigReactions.kt",
    "content": "package net.pantasystem.milktea.api.misskey.register\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class WebClientRegistries(\n    @SerialName(\"reactions\")\n    val reactions: List<String>\n)\n\n@kotlinx.serialization.Serializable\ndata class WebClientBaseRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"scope\")\n    val scope: List<String>\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/register/subscription.kt",
    "content": "package net.pantasystem.milktea.api.misskey.register\n\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport java.io.Serializable as JSerializable\n\n@Serializable\ndata class SubscriptionStateNetworkDTO(\n    @SerialName(\"state\") val state: String,\n    @SerialName(\"key\") val key: String? = null,\n)\n\n@Serializable\ndata class Subscription(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"endpoint\")\n    val endpoint: String,\n\n    @SerialName(\"auth\")\n    val auth: String,\n\n    @SerialName(\"publickey\")\n    val publicKey: String\n) : JSerializable\n\n\n\n@Serializable\ndata class UnSubscription(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"endpoint\")\n    val endpoint: String\n) : JSerializable"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/trend/HashtagTrend.kt",
    "content": "package net.pantasystem.milktea.api.misskey.trend\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.model.hashtag.HashTag\n\n@kotlinx.serialization.Serializable\ndata class HashtagTrend(\n    @SerialName(\"tag\") val tag: String,\n    @SerialName(\"chart\") val chart: List<Int>,\n    @SerialName(\"usersCount\") val usersCount: Int,\n) {\n    fun toModel(): HashTag {\n        return HashTag(\n            tag,\n            usersCount,\n            chart\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/AcceptFollowRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class AcceptFollowRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/CancelFollow.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class CancelFollow(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/CreateMuteUserRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class CreateMuteUserRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"expiresAt\")\n    val expiresAt: Long? = null,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/FollowFollowerUser.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.common.serializations.DateSerializer\nimport java.util.*\n\n@Serializable\ndata class FollowFollowerUser @OptIn(ExperimentalSerializationApi::class) constructor(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    @Serializable(with = DateSerializer::class) val createdAt: Date,\n\n    @SerialName(\"followeeId\")\n    val followeeId: String? = null,\n\n    @SerialName(\"followee\")\n    val followee: UserDTO? = null,\n\n    @SerialName(\"followerId\")\n    val followerId: String? = null,\n\n    @SerialName(\"follower\")\n    val follower: UserDTO? = null\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/FollowRequestDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\nclass FollowRequestDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"follower\")\n    val follower: UserDTO,\n\n    @SerialName(\"followee\")\n    val followee: UserDTO\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/GetFollowRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class GetFollowRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"limit\")\n    val limit: Int? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/RejectFollowRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n\n@Serializable\ndata class RejectFollowRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"userId\")\n    val userId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/RequestUser.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.user.query.FindUsersQuery4Misskey\n\n@Serializable\ndata class RequestUser(\n    @SerialName(\"i\")\n    val i: String?,\n\n    @SerialName(\"userId\")\n    val userId: String? = null,\n\n    @SerialName(\"username\")\n    val userName: String? = null,\n\n    @SerialName(\"host\")\n    val host: String? = null,\n\n    @SerialName(\"sort\")\n    val sort: String? = null,\n\n    @SerialName(\"state\")\n    val state: String? = null,\n\n    @SerialName(\"origin\")\n    val origin: String? = null,\n\n    @SerialName(\"userIds\")\n    val userIds: List<String>? = null,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"limit\")\n    val limit: Int? = null,\n\n    @SerialName(\"query\")\n    val query: String? = null,\n\n    @SerialName(\"detail\")\n    val detail: Boolean? = null,\n) {\n\n    companion object\n\n\n}\n\nfun RequestUser.Companion.from(query: FindUsersQuery4Misskey, i: String): RequestUser {\n    return RequestUser(\n        i = i,\n        origin = query.origin?.origin,\n        sort = query.sort?.str(),\n        state = query.state?.state\n    )\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/SearchByUserAndHost.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport net.pantasystem.milktea.api.misskey.MisskeyAPI\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.Version\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.nodeinfo.getVersion\nimport retrofit2.Response\n\nclass SearchByUserAndHost(\n    val misskeyAPI: MisskeyAPI,\n    private val nodeInfoRepository: NodeInfoRepository,\n    val account: Account,\n) {\n\n\n    suspend fun search(reqUser: RequestUser): Response<List<UserDTO>> {\n        val requestUser = reqUser.copy(\n            host = reqUser.host ?: \"\"\n        )\n\n\n        val type = nodeInfoRepository.find(account.getHost()).getOrThrow().type\n        val isLegacyApi = type is NodeInfo.SoftwareType.Misskey.Meisskey\n                || (type is NodeInfo.SoftwareType.Misskey.Normal\n                && type.getVersion() < Version(\"12.0\"))\n\n        return if (isLegacyApi) {\n            misskeyAPI.searchUser(\n                requestUser.copy(\n                    host = \"\",\n                    userName = null,\n                    query = requestUser.userName\n                )\n            ).throwIfHasError()\n        } else {\n            misskeyAPI.searchByUserNameAndHost(requestUser).throwIfHasError()\n        }\n\n    }\n\n\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/UserDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\n\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.LocalDate\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.builtins.nullable\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojisTypeSerializer\nimport net.pantasystem.milktea.api.misskey.emoji.EmojisType\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.common.serializations.FallbackDefaultValueSerializer\nimport java.io.Serializable\n\n/**\n * @param isLocked フォロー承認制\n */\n@kotlinx.serialization.Serializable\ndata class UserDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"username\")\n    val userName: String,\n\n    @SerialName(\"name\")\n    val name: String? = null,\n\n    @SerialName(\"host\")\n    val host: String? = null,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n\n    @SerialName(\"followersCount\")\n    val followersCount: Int? = null,\n\n    @SerialName(\"followingCount\")\n    val followingCount: Int? = null,\n\n    @SerialName(\"hostLower\")\n    val hostLower: String? = null,\n\n    @SerialName(\"notesCount\")\n    val notesCount: Int? = null,\n\n    @SerialName(\"email\")\n    val email: String? = null,\n\n    @SerialName(\"isBot\")\n    val isBot: Boolean? = null,\n\n    @SerialName(\"isCat\")\n    val isCat: Boolean? = null,\n\n    @SerialName(\"pinnedNoteIds\")\n    val pinnedNoteIds: List<String>? = null,\n\n    @SerialName(\"pinnedNotes\")\n    val pinnedNotes: List<NoteDTO>? = null,\n\n    @SerialName(\"twoFactorEnabled\")\n    val twoFactorEnabled: Boolean? = null,\n\n    @SerialName(\"isAdmin\")\n    val isAdmin: Boolean? = null,\n\n    @SerialName(\"avatarUrl\")\n    val avatarUrl: String? = null,\n\n    @SerialName(\"bannerUrl\")\n    val bannerUrl: String? = null,\n\n    @kotlinx.serialization.Serializable(with = CustomEmojisTypeSerializer::class)\n    @SerialName(\"emojis\")\n    val rawEmojis: EmojisType? = null,\n\n    @SerialName(\"isFollowing\")\n    val isFollowing: Boolean? = null,\n\n    @SerialName(\"isFollowed\")\n    val isFollowed: Boolean? = null,\n\n    @SerialName(\"isBlocking\")\n    val isBlocking: Boolean? = null,\n\n    @SerialName(\"isMuted\")\n    val isMuted: Boolean? = null,\n\n    @SerialName(\"url\")\n    val url: String? = null,\n\n    @SerialName(\"hasPendingFollowRequestFromYou\")\n    val hasPendingFollowRequestFromYou: Boolean? = null,\n\n    @SerialName(\"hasPendingFollowRequestToYou\")\n    val hasPendingFollowRequestToYou: Boolean? = null,\n\n    @SerialName(\"isLocked\")\n    val isLocked: Boolean? = null,\n\n    @SerialName(\"instance\")\n    val instance: InstanceInfo? = null,\n\n    @SerialName(\"fields\")\n    val fields: List<FieldDTO>? = null,\n\n    @SerialName(\"birthday\")\n    @kotlinx.serialization.Serializable(with = BirthdaySerializer::class)\n    val birthday: LocalDate? = null,\n\n    @SerialName(\"createdAt\")\n    val createdAt: Instant? = null,\n\n    @SerialName(\"updatedAt\")\n    val updatedAt: Instant? = null,\n\n    @SerialName(\"publicReactions\")\n    val publicReactions: Boolean? = null,\n\n    @SerialName(\"avatarBlurhash\")\n    val avatarBlurhash: String? = null,\n\n    @SerialName(\"notify\")\n    val notifyState: String? = null,\n\n    @SerialName(\"badgeRoles\")\n    val badgeRoles: List<BadgeRoleDTO>? = null,\n\n    @SerialName(\"ffVisibility\")\n    @Transient\n    val followFollowerVisibility: FollowFollowerVisibility? = null,\n) : Serializable {\n\n    @kotlinx.serialization.Serializable\n    data class InstanceInfo(\n        @SerialName(\"faviconUrl\")\n        val faviconUrl: String? = null,\n\n        @SerialName(\"iconUrl\")\n        val iconUrl: String? = null,\n\n        @SerialName(\"name\")\n        val name: String? = null,\n\n        @SerialName(\"softwareName\")\n        val softwareName: String? = null,\n\n        @SerialName(\"softwareVersion\")\n        val softwareVersion: String? = null,\n\n        @SerialName(\"themeColor\")\n        val themeColor: String? = null,\n    )\n\n    val emojiList: List<CustomEmojiNetworkDTO>? = when(rawEmojis) {\n        EmojisType.None -> null\n        is EmojisType.TypeArray -> rawEmojis.emojis\n        is EmojisType.TypeObject -> rawEmojis.emojis.map {\n            CustomEmojiNetworkDTO(name = it.key, url = it.value, uri = it.value)\n        }\n        null -> null\n    }\n\n    @kotlinx.serialization.Serializable\n    data class FieldDTO(\n        @SerialName(\"name\")\n        val name: String,\n\n        @SerialName(\"value\")\n        val value: String)\n\n    @kotlinx.serialization.Serializable\n    data class BadgeRoleDTO(\n        @SerialName(\"name\")\n        val name: String,\n\n        @SerialName(\"iconUrl\")\n        val iconUrl: String?,\n\n        @SerialName(\"displayOrder\")\n        val displayOrder: Int? = null,\n    )\n\n    @kotlinx.serialization.Serializable\n    enum class FollowFollowerVisibility {\n        @SerialName(\"public\") Public, @SerialName(\"followers\") Followers, @SerialName(\"private\") Private,\n    }\n}\n\nprivate object BirthdaySerializer : FallbackDefaultValueSerializer<LocalDate?>(LocalDate.serializer().nullable, null)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/follow/FollowUserRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users.follow\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\nclass FollowUserRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"userId\") val userId: String,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/follow/UnFollowUserRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users.follow\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\nclass UnFollowUserRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"userId\") val userId: String,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/follow/UpdateUserFollowRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users.follow\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\nclass UpdateUserFollowRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"userId\") val userId: String,\n    @SerialName(\"notify\") val notify: String? = null,\n    @SerialName(\"withReplies\") val withReplies: Boolean? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/renote/mute/CreateRenoteMuteRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users.renote.mute\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class CreateRenoteMuteRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"userId\") val userId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/renote/mute/DeleteRenoteMuteRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users.renote.mute\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class DeleteRenoteMuteRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"userId\") val userId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/renote/mute/RenoteMuteDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users.renote.mute\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@kotlinx.serialization.Serializable\ndata class RenoteMuteDTO(\n    @SerialName(\"id\") val id: String,\n    @SerialName(\"createdAt\") val createdAt: Instant,\n    @SerialName(\"mutee\") val mutee: UserDTO,\n    @SerialName(\"muteeId\") val muteeId: String,\n)\n\n@kotlinx.serialization.Serializable\ndata class RenoteMutesRequest(\n    @SerialName(\"i\") val i: String,\n    @SerialName(\"sinceId\") val sinceId: String? = null,\n    @SerialName(\"untilId\") val untilId: String? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/users/report/ReportDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users.report\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class ReportDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"comment\")\n    val comment: String,\n\n    @SerialName(\"userId\")\n    val userId: String\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v10/FollowFollowerUsers.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v10\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@Serializable\ndata class FollowFollowerUsers(\n    @SerialName(\"users\")\n    val users: List<UserDTO>,\n\n    @SerialName(\"next\")\n    val next: String? = null,\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v10/RequestFollowFollower.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v10\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class RequestFollowFollower(\n    @SerialName(\"i\")\n    val i: String?,\n\n    @SerialName(\"userId\")\n    val userId: String?,\n\n    @SerialName(\"cursor\")\n    val cursor: String? = null,\n\n    @SerialName(\"username\")\n    val username: String? = null,\n\n    @SerialName(\"host\")\n    val host: String? = null,\n\n    @SerialName(\"limit\")\n    val limit: Int = 20,\n\n    @SerialName(\"iknow\")\n    val iknow: Boolean? = null,\n\n    @SerialName(\"diff\")\n    val diff: Boolean? = null\n\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/MisskeyAPIV12.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12\n\n//import net.pantasystem.milktea.api.misskey.I\n//import net.pantasystem.milktea.api.misskey.MisskeyAPI\n//import net.pantasystem.milktea.api.misskey.notes.NoteDTO\n//import net.pantasystem.milktea.api.misskey.notes.NoteRequest\n//import net.pantasystem.milktea.api.misskey.users.RequestUser\n//import net.pantasystem.milktea.api.misskey.v11.MisskeyAPIV11\n//import net.pantasystem.milktea.api.misskey.v11.MisskeyAPIV11Diff\n//import net.pantasystem.milktea.api.misskey.v12.antenna.AntennaDTO\n//import net.pantasystem.milktea.api.misskey.v12.antenna.AntennaQuery\n//import net.pantasystem.milktea.api.misskey.v12.antenna.AntennaToAdd\n//import net.pantasystem.milktea.api.misskey.v12.channel.*\n//import net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReaction\n//import net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReactionRequest\n//import retrofit2.Response\n//\n//open class MisskeyAPIV12(misskey: MisskeyAPI, private val misskeyAPIV12Diff: MisskeyAPIV12Diff, misskeyAPIV11Diff: MisskeyAPIV11Diff) : MisskeyAPIV11(misskey, misskeyAPIV11Diff),\n//    MisskeyAPIV12Diff {\n//\n//\n//\n//    override suspend fun antennasNotes(noteRequest: NoteRequest): Response<List<NoteDTO>?> = misskeyAPIV12Diff.antennasNotes(noteRequest)\n//\n//    override suspend fun createAntenna(antennaToAdd: AntennaToAdd): Response<AntennaDTO> = misskeyAPIV12Diff.createAntenna(antennaToAdd)\n//\n//    override suspend fun deleteAntenna(query: AntennaQuery): Response<Unit> = misskeyAPIV12Diff.deleteAntenna(query)\n//\n//    override suspend fun getAntennas(query: AntennaQuery): Response<List<AntennaDTO>> = misskeyAPIV12Diff.getAntennas(query)\n//\n//    override suspend fun showAntenna(antennaQuery: AntennaQuery): Response<AntennaDTO> = misskeyAPIV12Diff.showAntenna(antennaQuery)\n//\n//    override suspend fun updateAntenna(antennaToAdd: AntennaToAdd): Response<AntennaDTO> = misskeyAPIV12Diff.updateAntenna(antennaToAdd)\n//\n//\n//\n//    override suspend fun searchByUserNameAndHost(requestUser: RequestUser) = misskeyAPIV12Diff.searchByUserNameAndHost(requestUser)\n//\n//    override suspend fun createChannel(dto: CreateChannelDTO): Response<ChannelDTO> = misskeyAPIV12Diff.createChannel(dto)\n//    override suspend fun featuredChannels(i: I): Response<List<ChannelDTO>> = misskeyAPIV12Diff.featuredChannels(i)\n//\n//    override suspend fun followChannel(dto: FollowChannelDTO): Response<Unit> = misskeyAPIV12Diff.followChannel(dto)\n//\n//    override suspend fun unFollowChannel(dto: UnFollowChannelDTO): Response<Unit> = misskeyAPIV12Diff.unFollowChannel(dto)\n//\n//    override suspend fun ownedChannels(dto: FindPageable): Response<List<ChannelDTO>> = misskeyAPIV12Diff.ownedChannels(dto)\n//    override suspend fun showChannel(dto: ShowChannelDTO): Response<ChannelDTO> = misskeyAPIV12Diff.showChannel(dto)\n//\n//    override suspend fun updateChannel(dto: UpdateChannelDTO): Response<ChannelDTO> = misskeyAPIV12Diff.updateChannel(dto)\n//\n//    override suspend fun channelTimeline(dto: NoteRequest): Response<List<NoteDTO>?> = misskeyAPIV12Diff.channelTimeline(dto)\n//\n//    override suspend fun followedChannels(dto: FindPageable): Response<List<ChannelDTO>> = misskeyAPIV12Diff.followedChannels(dto)\n//\n//    override suspend fun getUserReactions(request: UserReactionRequest): Response<List<UserReaction>> = misskeyAPIV12Diff.getUserReactions(request)\n//}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/MisskeyAPIV12Diff.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12\n\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteRequest\nimport net.pantasystem.milktea.api.misskey.users.RequestUser\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaDTO\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaQuery\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaToAdd\nimport net.pantasystem.milktea.api.misskey.v12.channel.*\nimport net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReaction\nimport net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReactionRequest\nimport retrofit2.Response\nimport retrofit2.http.Body\nimport retrofit2.http.POST\n\ninterface MisskeyAPIV12Diff {\n\n    @POST(\"api/antennas/create\")\n    suspend fun createAntenna(@Body antennaToAdd: AntennaToAdd): Response<AntennaDTO>\n\n    @POST(\"api/antennas/delete\")\n    suspend fun deleteAntenna(@Body query: AntennaQuery): Response<Unit>\n\n    @POST(\"api/antennas/notes\")\n    suspend fun antennasNotes(@Body noteRequest: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/antennas/show\")\n    suspend fun showAntenna(@Body antennaQuery: AntennaQuery): Response<AntennaDTO>\n\n    @POST(\"api/antennas/update\")\n    suspend fun updateAntenna(@Body antennaToAdd: AntennaToAdd): Response<AntennaDTO>\n\n    @POST(\"api/antennas/list\")\n    suspend fun getAntennas(@Body query: AntennaQuery): Response<List<AntennaDTO>>\n\n    @POST(\"api/users/search-by-username-and-host\")\n    suspend fun searchByUserNameAndHost(@Body requestUser: RequestUser): Response<List<UserDTO>>\n\n    @POST(\"api/channels/create\")\n    suspend fun createChannel(@Body dto: CreateChannelDTO): Response<ChannelDTO>\n\n    @POST(\"api/channels/featured\")\n    suspend fun featuredChannels(@Body i: I): Response<List<ChannelDTO>>\n\n    @POST(\"api/channels/follow\")\n    suspend fun followChannel(@Body dto: FollowChannelDTO): Response<Unit>\n\n    @POST(\"api/channels/unfollow\")\n    suspend fun unFollowChannel(@Body dto: UnFollowChannelDTO): Response<Unit>\n\n    @POST(\"api/channels/followed\")\n    suspend fun followedChannels(@Body dto: FindPageable): Response<List<ChannelDTO>>\n\n    @POST(\"api/channels/owned\")\n    suspend fun ownedChannels(@Body dto: FindPageable): Response<List<ChannelDTO>>\n\n    @POST(\"api/channels/show\")\n    suspend fun showChannel(@Body dto: ShowChannelDTO): Response<ChannelDTO>\n\n    @POST(\"api/channels/update\")\n    suspend fun updateChannel(@Body dto: UpdateChannelDTO): Response<ChannelDTO>\n\n    @POST(\"api/channels/timeline\")\n    suspend fun channelTimeline(@Body dto: NoteRequest): Response<List<NoteDTO>?>\n\n    @POST(\"api/users/reactions\")\n    suspend fun getUserReactions(@Body request: UserReactionRequest): Response<List<UserReaction>>\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/antenna/AntennaDTO.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12.antenna\n\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport net.pantasystem.milktea.model.antenna.AntennaSource\nimport net.pantasystem.milktea.model.antenna.from\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.list.UserList\nimport java.io.Serializable as JSerializable\n\n/**\n * @param users @userName, @userName@hostの形式のデータが入る\n */\n@Serializable\ndata class AntennaDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"src\")\n    val src: String,\n\n    @SerialName(\"userListId\")\n    val userListId: String? = null,\n\n    @SerialName(\"userGroupId\")\n    val userGroupId: String? = null,\n\n    @SerialName(\"keywords\")\n    val keywords: List<List<String>>,\n\n    @SerialName(\"excludeKeywords\")\n    val excludeKeywords: List<List<String>>,\n\n    @SerialName(\"users\")\n    val users: List<String>,\n\n    @SerialName(\"caseSensitive\")\n    val caseSensitive: Boolean,\n\n    @SerialName(\"withFile\")\n    val withFile: Boolean,\n\n    @SerialName(\"withReplies\")\n    val withReplies: Boolean,\n\n    @SerialName(\"notify\")\n    val notify: Boolean,\n\n    @SerialName(\"hasUnreadNote\")\n    val hasUnreadNote: Boolean? = null\n) : JSerializable {\n\n    fun toEntity(account: Account): Antenna {\n        return Antenna(\n            Antenna.Id(account.accountId, id),\n            name,\n            AntennaSource.from(src),\n            userListId?.let { userListId ->\n                UserList.Id(account.accountId, userListId)\n            },\n            userGroupId?.let{\n                Group.Id(account.accountId, it)\n            },\n            keywords,\n            excludeKeywords,\n            users,\n            caseSensitive,\n            withFile,\n            withReplies,\n            notify,\n            hasUnreadNote?: false\n        )\n\n    }\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/antenna/AntennaQuery.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12.antenna\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class AntennaQuery(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"antennaId\")\n    val antennaId: String?,\n\n    @SerialName(\"limit\")\n    val limit: Int?\n)"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/antenna/AntennaToAdd.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12.antenna\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.antenna.SaveAntennaParam\nimport net.pantasystem.milktea.model.antenna.str\n\n/**\n * @param i ユーザーのの認証\n * @param antennaId updateのときはUpdate対象のアンテナのIdを指定します\n * @param withReplies 返信を含むのか\n * @param name アンテナの名称\n * @param src 受信するソース \"home\" \"all\" \"users\" \"list\" \"group\"\n * @param userListId ユーザーのリストのユーザーのノートを取得リソースにする\n * @param userGroupId 指定したグループのユーザーのノートを取得ソースにする\n * @param keywords 受信キーワード [[\"key\", \"words\"]] \"key\" & \"words\"になる[[\"key\", \"words\"], [\"source\"]]の場合は \"key\" and \"words\" or \"source\"になる\n * @param excludeKeywords 除外ワード 指定方式は受信キーワードと同じ\n * @param users ユーザーを指定する\n * @param caseSensitive\n * @param withFile ファイルが添付されたーノートのみ\n * @param notify 新しいノートを通知する\n */\n@Serializable\ndata class AntennaToAdd(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"antennaId\")\n    val antennaId: String? = null,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"src\")\n    val src: String,\n\n    @SerialName(\"userListId\")\n    val userListId: String? = null,\n\n    @SerialName(\"userGroupId\")\n    val userGroupId: String? = null,\n\n    @SerialName(\"keywords\")\n    val keywords: List<List<String>>,\n\n    @SerialName(\"excludeKeywords\")\n    val excludeKeywords: List<List<String>>,\n\n    @SerialName(\"users\")\n    val users: List<String>,\n\n    @SerialName(\"caseSensitive\")\n    val caseSensitive: Boolean,\n\n    @SerialName(\"withFile\")\n    val withFile: Boolean,\n\n    @SerialName(\"withReplies\")\n    val withReplies: Boolean,\n\n    @SerialName(\"notify\")\n    val notify: Boolean,\n\n    @SerialName(\"hasUnreadNote\")\n    val hasUnreadNote: Boolean = false\n\n) {\n    companion object\n}\n\n\nfun AntennaToAdd.Companion.from(\n    i: String,\n    params: SaveAntennaParam,\n    antennaId: String? = null\n): AntennaToAdd {\n    return AntennaToAdd(\n        i,\n        antennaId,\n        params.name,\n        params.src.str(),\n        params.userListId?.userListId,\n        params.userGroupId?.groupId,\n        params.keywords,\n        params.excludeKeywords,\n        params.users,\n        params.caseSensitive,\n        params.withFile,\n        params.withReplies,\n        params.notify,\n        params.hasUnreadNote,\n    )\n}"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/channel/channels.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12.channel\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.user.User\n\n/**\n * APIから降ってきたJSONを直接的に変換するためのDTO\n * @param isFollowing followしているとtrue,未認証の場合はnullになる\n * @param hasUnreadNote 未読ノートが存在する場合trueになる,未認証の場合はnullになる\n */\n@Serializable\ndata class ChannelDTO(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    val createdAt: Instant,\n\n    @SerialName(\"lastNotedAt\")\n    val lastNotedAt: Instant? = null,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n\n    @SerialName(\"bannerUrl\")\n    val bannerUrl: String? = null,\n\n    @SerialName(\"notesCount\")\n    val notesCount: Int,\n\n    @SerialName(\"usersCount\")\n    val usersCount: Int,\n\n    @SerialName(\"userId\")\n    val userId: String?,\n\n    @SerialName(\"hasUnreadNote\")\n    val hasUnreadNote: Boolean? = null,\n\n    @SerialName(\"isFollowing\")\n    val isFollowing: Boolean? = null,\n\n    // この値が含まれていなかった時は合わせてtrueにする（本体側のDB定義側はデフォルト値がtrueになっている）\n    @SerialName(\"allowRenoteToExternal\")\n    val allowRenoteToExternal: Boolean = true\n) {\n    fun toModel(account: Account): Channel {\n        return Channel(\n            id = Channel.Id(account.accountId, id),\n            createdAt = createdAt,\n            lastNotedAt = lastNotedAt,\n            name = name,\n            description = description,\n            bannerUrl = bannerUrl,\n            notesCount = notesCount,\n            usersCount = usersCount,\n            userId = userId?.let { User.Id(account.accountId, it) },\n            hasUnreadNote = hasUnreadNote,\n            isFollowing = isFollowing,\n            allowRenoteToExternal = allowRenoteToExternal,\n        )\n    }\n}\n\n@Serializable\ndata class ShowChannelDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"channelId\")\n    val channelId: String,\n)\n\n@Serializable\ndata class CreateChannelDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"description\")\n    val description: String?,\n\n    @SerialName(\"bannerId\")\n    val bannerId: String?,\n)\n\n@Serializable\ndata class UpdateChannelDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"description\")\n    val description: String?,\n\n    @SerialName(\"bannerId\")\n    val bannerId: String?,\n)\n\n@Serializable\ndata class FollowChannelDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"channelId\")\n    val channelId: String,\n)\n\n@Serializable\ndata class UnFollowChannelDTO(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"channelId\")\n    val channelId: String,\n)\n\n\n@Serializable\ndata class FindPageable(\n    @SerialName(\"i\")\n    val i: String?,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"limit\")\n    val limit: Int = 5\n)\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/user/reaction/UserReaction.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12.user.reaction\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n@kotlinx.serialization.Serializable\ndata class UserReaction(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"type\")\n    val type: String,\n\n    @SerialName(\"user\")\n    val user: UserDTO,\n\n    @SerialName(\"note\")\n    val note: NoteDTO,\n\n    @SerialName(\"createdAt\")\n    val createdAt: Instant,\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12/user/reaction/UserReactionRequest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12.user.reaction\n\nimport kotlinx.serialization.SerialName\n\n@kotlinx.serialization.Serializable\ndata class UserReactionRequest(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"limit\")\n    val limit: Int,\n\n    @SerialName(\"userId\")\n    val userId: String\n)\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v12_75_0/gallery.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v12_75_0\n\nimport kotlinx.datetime.Instant\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.drive.FilePropertyDTO\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\n\n\n@Serializable\ndata class CreateGallery(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"title\")\n    val title: String,\n\n    @SerialName(\"description\")\n    val description: String?,\n\n    @SerialName(\"fileIds\")\n    val fileIds: List<String>,\n\n    @SerialName(\"isSensitive\")\n    val isSensitive: Boolean,\n)\n\n@Serializable\ndata class GetPosts(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"limit\")\n    val limit: Int = 10,\n\n    @SerialName(\"sinceId\")\n    val sinceId: String? = null,\n\n    @SerialName(\"untilId\")\n    val untilId: String? = null,\n\n    @SerialName(\"userId\")\n    val userId: String? = null\n)\n\n@Serializable\ndata class GalleryPost(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"createdAt\")\n    val createdAt: Instant,\n\n    @SerialName(\"updatedAt\")\n    val updatedAt: Instant,\n\n    @SerialName(\"title\")\n    val title: String,\n\n    @SerialName(\"description\")\n    val description: String? = null,\n\n    @SerialName(\"userId\")\n    val userId: String,\n\n    @SerialName(\"user\")\n    val user: UserDTO,\n\n    @SerialName(\"files\")\n    val files: List<FilePropertyDTO>,\n\n    @SerialName(\"tags\")\n    val tags: List<String>? = null,\n\n    @SerialName(\"isSensitive\")\n    val isSensitive: Boolean,\n\n    @SerialName(\"likedCount\")\n    val likedCount: Int? = null,\n\n    @SerialName(\"isLiked\")\n    val isLiked: Boolean? = null\n)\n\n@Serializable\ndata class LikedGalleryPost(\n    @SerialName(\"id\")\n    val id: String,\n\n    @SerialName(\"post\")\n    val post: GalleryPost\n)\n\n@Serializable\ndata class Like(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"postId\")\n    val postId: String\n)\n\n@Serializable\ndata class UnLike(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"postId\")\n    val postId: String\n)\n\n@Serializable\ndata class Show(\n    @SerialName(\"i\")\n    val i: String?,\n\n    @SerialName(\"postId\")\n    val postId: String\n)\n\n@Serializable\ndata class Update(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"postId\")\n    val postId: String,\n\n    @SerialName(\"title\")\n    val title: String,\n\n    @SerialName(\"description\")\n    val description: String?,\n\n    @SerialName(\"fileIds\")\n    val fileIds: List<String>,\n\n    @SerialName(\"isSensitive\")\n    val isSensitive: Boolean\n)\n\n\n@Serializable\ndata class Delete(\n    @SerialName(\"i\")\n    val i: String,\n\n    @SerialName(\"postId\")\n    val postId: String\n)\n\n\n"
  },
  {
    "path": "modules/api/src/main/java/net/pantasystem/milktea/api/misskey/v13/EmojisResponse.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v13\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\n\n@kotlinx.serialization.Serializable\ndata class EmojisResponse(\n    @SerialName(\"emojis\")\n    val emojis: List<CustomEmojiNetworkDTO>\n)"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/CurrentClassLoader.kt",
    "content": "package net.pantasystem.milktea.api\n\nobject CurrentClassLoader {\n\n    private var _classLoader: ClassLoader? = null\n    operator fun invoke(): ClassLoader? {\n        return (_classLoader ?: javaClass.classLoader).also {\n            _classLoader = it\n        }\n    }\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/mastodon/instance/InstanceTest.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.instance\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.CurrentClassLoader\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport java.io.BufferedInputStream\nimport java.io.BufferedReader\nimport java.io.File\nimport java.io.InputStreamReader\n\nclass InstanceTest {\n\n    @Test\n    fun decodeFromStringGiveFedibird() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(CurrentClassLoader()!!.getResource(\"fedibird_instance_info.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<Instance>(text)\n    }\n\n    @Test\n    fun decodeFromStringGiveMstdnJp() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(CurrentClassLoader()!!.getResource(\"mstdnjp_instance_info.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<Instance>(text)\n    }\n\n    @Test\n    fun decodeFromStringGiveMastodonSocial() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(CurrentClassLoader()!!.getResource(\"mastodonsocial_instance_info.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        val instance = json.decodeFromString<Instance>(text)\n        Assertions.assertEquals(4, instance.configuration?.polls?.maxOptions)\n        Assertions.assertEquals(50, instance.configuration?.polls?.maxCharactersPerOption)\n        Assertions.assertEquals(300, instance.configuration?.polls?.minExpiration)\n        Assertions.assertEquals(2629746, instance.configuration?.polls?.maxExpiration)\n\n        Assertions.assertNotNull(instance.configuration)\n        Assertions.assertEquals(500, instance.configuration?.statuses?.maxCharacters)\n        Assertions.assertEquals(4, instance.configuration?.statuses?.maxMediaAttachments)\n    }\n\n\n    @Test\n    fun decodeFromStringGivePawooNet() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(CurrentClassLoader()!!.getResource(\"pawoonet_instance_info.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<Instance>(text)\n    }\n\n\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/mastodon/status/TootStatusDTOTest.kt",
    "content": "package net.pantasystem.milktea.api.mastodon.status\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport java.io.BufferedInputStream\nimport java.io.BufferedReader\nimport java.io.File\nimport java.io.InputStreamReader\n\nclass TootStatusDTOTest {\n\n    @Test\n    fun decodeTest() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n\n    }\n\n\n    @Test\n    fun decodeTest2() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline_2.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n\n    }\n\n\n    @Test\n    fun decodeTest3() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline_3.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n\n    }\n\n\n    @Test\n    fun decodeTest4() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline_4.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n\n\n    }\n\n\n    @Test\n    fun decodeTest5() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline_5.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n\n\n    }\n\n\n    @Test\n    fun decodeTest6() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline_6.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n\n    }\n\n\n\n    @Test\n    fun decodeTest7() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline_7.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n\n    }\n\n\n    @Test\n    fun decodeTest8() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_timeline_8.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n    }\n\n    @Test\n    fun decodeMstdnJpTimeline() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_mstdn_jp_public_timeline.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        json.decodeFromString<List<TootStatusDTO>>(text)\n    }\n\n    @Test\n    fun decode_GiveFedibirdHasQuoteTimeline() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(javaClass.classLoader!!.getResource(\"toot_fedibird_com_home_has_quote_timeline.json\").file)\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        val decoded = json.decodeFromString<List<TootStatusDTO>>(text)\n        Assertions.assertNull(decoded[0].quote)\n        Assertions.assertNotNull(decoded[1].quote)\n        Assertions.assertNull(decoded[2].quote)\n\n    }\n\n\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/misskey/ap/ApResolveResultTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.ap\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass ApResolveResultTest {\n\n    @Test\n    fun decodeGiveTypeNote() {\n        val json = \"\"\"\n            {\n                \"type\": \"Note\",\n                \"object\": {\n                    \"id\": \"7wkp7bjzl1\",\n                    \"createdAt\": \"2019-08-18T15:37:18.911Z\",\n                    \"userId\": \"919yl2fdkn\",\n                    \"user\": {\n                        \"id\": \"919yl2fdkn\",\n                        \"name\": \"harunon:keybase:さんをフォローしている人はこんな投稿もいいねしています\",\n                        \"username\": \"harunon\",\n                        \"host\": \"misskey.io\",\n                        \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n                        \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n                        \"avatarColor\": null,\n                        \"isCat\": true,\n                        \"instance\": {\n                            \"name\": \"Misskey.io\",\n                            \"softwareName\": \"misskey\",\n                            \"softwareVersion\": \"12.119.0\",\n                            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n                            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n                            \"themeColor\": \"#86b300\"\n                        },\n                        \"emojis\": [\n                            {\n                                \"name\": \"keybase\",\n                                \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n                            }\n                        ],\n                        \"onlineStatus\": \"unknown\",\n                        \"driveCapacityOverrideMb\": null\n                    },\n                    \"text\": \"ヒモを養うかきくけこ\\n\\nカードにゃらいくらでも使っていいよ\\n聞いたこと無いよ、この請求書\\n苦しいときは、私にいってね\\n計画的にお金は使ってね\\n今月のお小遣い、ここにおいておくから\",\n                    \"cw\": null,\n                    \"visibility\": \"public\",\n                    \"renoteCount\": 2,\n                    \"repliesCount\": 0,\n                    \"reactions\": {\n                        \"💛\": 1,\n                        \":ijo@misskey.io:\": 1\n                    },\n                    \"emojis\": [\n                        {\n                            \"name\": \"ijo@misskey.io\",\n                            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-085c1e56-1157-4c7a-9b93-b43be4f7d7ef.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-085c1e56-1157-4c7a-9b93-b43be4f7d7ef.png\"\n                        }\n                    ],\n                    \"fileIds\": [],\n                    \"files\": [],\n                    \"replyId\": null,\n                    \"renoteId\": null,\n                    \"uri\": \"https://misskey.io/notes/7wkp7bjzdz\"\n                }\n            }\n        \"\"\".trimIndent()\n\n        val decoder = Json {\n            ignoreUnknownKeys = true\n        }\n        val result: ApResolveResult = decoder.decodeFromString(json)\n        Assertions.assertEquals(\n            \"ヒモを養うかきくけこ\\n\" +\n                    \"\\n\" +\n                    \"カードにゃらいくらでも使っていいよ\\n\" +\n                    \"聞いたこと無いよ、この請求書\\n\" +\n                    \"苦しいときは、私にいってね\\n\" +\n                    \"計画的にお金は使ってね\\n\" +\n                    \"今月のお小遣い、ここにおいておくから\", (result as ApResolveResult.TypeNote).note.text\n        )\n    }\n\n    @Test\n    fun decodeGiveTypeUser() {\n        val json = \"\"\"\n            {\n                \"type\": \"User\",\n                \"object\": {\n                    \"id\": \"919zdqcdzy\",\n                    \"name\": \"まりふぁいあ🔥\",\n                    \"username\": \"refia\",\n                    \"host\": \"misskey.io\",\n                    \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-114586c2-bf89-4d68-8f8c-a0882b4c3f65\",\n                    \"avatarBlurhash\": \"yOQ*u^pGEKR6TI%LEf}[R+OXtQRQR*jEWFsnoyofR*RPWXxuofM|RPf,ofWWIoWBxat7snxZj[wdV@R+t7ofbboftRs:V@RjWCR*WU\",\n                    \"avatarColor\": null,\n                    \"isAdmin\": false,\n                    \"isModerator\": false,\n                    \"isBot\": false,\n                    \"isCat\": true,\n                    \"instance\": {\n                        \"name\": \"Misskey.io\",\n                        \"softwareName\": \"misskey\",\n                        \"softwareVersion\": \"12.119.0\",\n                        \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n                        \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n                        \"themeColor\": \"#86b300\"\n                    },\n                    \"emojis\": [],\n                    \"onlineStatus\": \"unknown\",\n                    \"driveCapacityOverrideMb\": null,\n                    \"url\": \"https://misskey.io/@refia\",\n                    \"uri\": \"https://misskey.io/users/8df0ejllc7\",\n                    \"createdAt\": \"2022-06-09T02:44:42.013Z\",\n                    \"updatedAt\": \"2022-10-17T04:16:42.541Z\",\n                    \"lastFetchedAt\": \"2022-10-17T04:16:42.739Z\",\n                    \"bannerUrl\": \"https://misskey.pantasystem.com/files/aa419c60-cf98-4d6e-b65a-6e68d3a73903\",\n                    \"bannerBlurhash\": \"yUK_a@=:01oN^%xtIV?vOGXSNLoyxat7xARjxtM|WVIoR%~nIVIUM{Myt6xs?ZN1xut8Rloft6-oRRjFabHR.oeNHt6RjM{WCoJ\",\n                    \"bannerColor\": null,\n                    \"isLocked\": false,\n                    \"isSilenced\": false,\n                    \"isSuspended\": false,\n                    \"description\": \"しなちに人生をくるくるにされた\\n\\n\\n優しい藍につつまれて\",\n                    \"location\": \"mi\",\n                    \"birthday\": \"2002-10-11\",\n                    \"lang\": null,\n                    \"fields\": [\n                        {\n                            \"name\": \"ついったー\",\n                            \"value\": \"https://twitter.com/ref1a\"\n                        },\n                        {\n                            \"name\": \"ついったー（おえかき）\",\n                            \"value\": \"https://twitter.com/shiromamashiro\"\n                        },\n                        {\n                            \"name\": \"ぴくしぶ\",\n                            \"value\": \"https://www.pixiv.net/users/18753741\"\n                        },\n                        {\n                            \"name\": \"いほーげーむ\",\n                            \"value\": \"https://osu.ppy.sh/users/refia\"\n                        }\n                    ],\n                    \"followersCount\": 1,\n                    \"followingCount\": 1,\n                    \"notesCount\": 9,\n                    \"pinnedNoteIds\": [\n                        \"8srogmvk06\",\n                        \"8t4e4mp107\",\n                        \"8to6vcfb08\",\n                        \"8tmbitam0a\"\n                    ],\n                    \"pinnedNotes\": [\n                        {\n                            \"id\": \"8srogmvk06\",\n                            \"createdAt\": \"2021-11-06T18:01:31.856Z\",\n                            \"userId\": \"919zdqcdzy\",\n                            \"user\": {\n                                \"id\": \"919zdqcdzy\",\n                                \"name\": \"まりふぁいあ🔥\",\n                                \"username\": \"refia\",\n                                \"host\": \"misskey.io\",\n                                \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-114586c2-bf89-4d68-8f8c-a0882b4c3f65\",\n                                \"avatarBlurhash\": \"yOQ*u^pGEKR6TI%LEf}[R+OXtQRQR*jEWFsnoyofR*RPWXxuofM|RPf,ofWWIoWBxat7snxZj[wdV@R+t7ofbboftRs:V@RjWCR*WU\",\n                                \"avatarColor\": null,\n                                \"isCat\": true,\n                                \"instance\": {\n                                    \"name\": \"Misskey.io\",\n                                    \"softwareName\": \"misskey\",\n                                    \"softwareVersion\": \"12.119.0\",\n                                    \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n                                    \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n                                    \"themeColor\": \"#86b300\"\n                                },\n                                \"emojis\": [],\n                                \"onlineStatus\": \"unknown\",\n                                \"driveCapacityOverrideMb\": null\n                            },\n                            \"text\": \"優ちゃん\",\n                            \"cw\": null,\n                            \"visibility\": \"public\",\n                            \"renoteCount\": 0,\n                            \"repliesCount\": 0,\n                            \"reactions\": {\n                                \"❤\": 1\n                            },\n                            \"emojis\": [],\n                            \"fileIds\": [\n                                \"919zdrsj05\"\n                            ],\n                            \"files\": [\n                                {\n                                    \"id\": \"919zdrsj05\",\n                                    \"createdAt\": \"2022-06-09T02:44:43.891Z\",\n                                    \"name\": \"webpublic-bdfd8efe-f46b-4685-9617-5b2c4b571fe8.png\",\n                                    \"type\": \"image/png\",\n                                    \"md5\": \"2c9e0ea0f97ded19373b54922201ecee\",\n                                    \"size\": 1938393,\n                                    \"isSensitive\": false,\n                                    \"blurhash\": \"yRHeR;t7~ot7_1xu-ptnj]x[a}%Loft7XAa}-QoeNHofRkbvWC%LocWVoeR*?aRj%Lf6%Ls:kD%MaekCWBs:j[WBRjWBWXazNGa{RQ\",\n                                    \"properties\": {\n                                        \"width\": 1449,\n                                        \"height\": 2048\n                                    },\n                                    \"url\": \"https://misskey.pantasystem.com/files/c693773b-af33-458c-a6ee-f2bc7a3c1f4c\",\n                                    \"thumbnailUrl\": \"https://misskey.pantasystem.com/files/thumbnail-84a9fffd-40bd-485e-96ca-c57832aa17ad\",\n                                    \"comment\": null,\n                                    \"folderId\": null,\n                                    \"folder\": null,\n                                    \"userId\": null,\n                                    \"user\": null\n                                }\n                            ],\n                            \"replyId\": null,\n                            \"renoteId\": null,\n                            \"uri\": \"https://misskey.io/notes/8srogmvk0h\"\n                        },\n                        {\n                            \"id\": \"8t4e4mp107\",\n                            \"createdAt\": \"2021-11-15T15:33:15.877Z\",\n                            \"userId\": \"919zdqcdzy\",\n                            \"user\": {\n                                \"id\": \"919zdqcdzy\",\n                                \"name\": \"まりふぁいあ🔥\",\n                                \"username\": \"refia\",\n                                \"host\": \"misskey.io\",\n                                \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-114586c2-bf89-4d68-8f8c-a0882b4c3f65\",\n                                \"avatarBlurhash\": \"yOQ*u^pGEKR6TI%LEf}[R+OXtQRQR*jEWFsnoyofR*RPWXxuofM|RPf,ofWWIoWBxat7snxZj[wdV@R+t7ofbboftRs:V@RjWCR*WU\",\n                                \"avatarColor\": null,\n                                \"isCat\": true,\n                                \"instance\": {\n                                    \"name\": \"Misskey.io\",\n                                    \"softwareName\": \"misskey\",\n                                    \"softwareVersion\": \"12.119.0\",\n                                    \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n                                    \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n                                    \"themeColor\": \"#86b300\"\n                                },\n                                \"emojis\": [],\n                                \"onlineStatus\": \"unknown\",\n                                \"driveCapacityOverrideMb\": null\n                            },\n                            \"text\": \"かわいい\",\n                            \"cw\": null,\n                            \"visibility\": \"public\",\n                            \"renoteCount\": 0,\n                            \"repliesCount\": 0,\n                            \"reactions\": {},\n                            \"emojis\": [],\n                            \"fileIds\": [\n                                \"919zdrsf04\"\n                            ],\n                            \"files\": [\n                                {\n                                    \"id\": \"919zdrsf04\",\n                                    \"createdAt\": \"2022-06-09T02:44:43.887Z\",\n                                    \"name\": \"webpublic-ffa1024b-f7b2-4063-a6a5-cbada5b0fc0b.png\",\n                                    \"type\": \"image/png\",\n                                    \"md5\": \"7d653157812efbd49cda1824bb1aae76\",\n                                    \"size\": 1001892,\n                                    \"isSensitive\": false,\n                                    \"blurhash\": \"yAODtg-;.A-=R${'$'}.8MxyXofrqV@S3oys;yFWXMcs.o}Rkt7xuWCjut6tRWYRPxbofS1RjRjogxarWn~yEX9Mxads:nNjFS9xasmM|\",\n                                    \"properties\": {\n                                        \"width\": 1449,\n                                        \"height\": 2048\n                                    },\n                                    \"url\": \"https://misskey.pantasystem.com/files/656d99b2-595d-49a5-a60b-82420e4fe7a9\",\n                                    \"thumbnailUrl\": \"https://misskey.pantasystem.com/files/thumbnail-c0518245-1b66-43d2-94bd-ec4b61d8b1c1\",\n                                    \"comment\": null,\n                                    \"folderId\": null,\n                                    \"folder\": null,\n                                    \"userId\": null,\n                                    \"user\": null\n                                }\n                            ],\n                            \"replyId\": null,\n                            \"renoteId\": null,\n                            \"uri\": \"https://misskey.io/notes/8t4e4mp18o\"\n                        },\n                        {\n                            \"id\": \"8to6vcfb08\",\n                            \"createdAt\": \"2021-11-29T12:05:28.871Z\",\n                            \"userId\": \"919zdqcdzy\",\n                            \"user\": {\n                                \"id\": \"919zdqcdzy\",\n                                \"name\": \"まりふぁいあ🔥\",\n                                \"username\": \"refia\",\n                                \"host\": \"misskey.io\",\n                                \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-114586c2-bf89-4d68-8f8c-a0882b4c3f65\",\n                                \"avatarBlurhash\": \"yOQ*u^pGEKR6TI%LEf}[R+OXtQRQR*jEWFsnoyofR*RPWXxuofM|RPf,ofWWIoWBxat7snxZj[wdV@R+t7ofbboftRs:V@RjWCR*WU\",\n                                \"avatarColor\": null,\n                                \"isCat\": true,\n                                \"instance\": {\n                                    \"name\": \"Misskey.io\",\n                                    \"softwareName\": \"misskey\",\n                                    \"softwareVersion\": \"12.119.0\",\n                                    \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n                                    \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n                                    \"themeColor\": \"#86b300\"\n                                },\n                                \"emojis\": [],\n                                \"onlineStatus\": \"unknown\",\n                                \"driveCapacityOverrideMb\": null\n                            },\n                            \"text\": \"絵のおまとめクリップです\\n\\nhttps://misskey.io/clips/8tjexjvuqw\",\n                            \"cw\": null,\n                            \"visibility\": \"public\",\n                            \"renoteCount\": 0,\n                            \"repliesCount\": 0,\n                            \"reactions\": {},\n                            \"emojis\": [],\n                            \"fileIds\": [],\n                            \"files\": [],\n                            \"replyId\": null,\n                            \"renoteId\": null,\n                            \"uri\": \"https://misskey.io/notes/8to6vcfbpu\"\n                        },\n                        {\n                            \"id\": \"8tmbitam0a\",\n                            \"createdAt\": \"2021-11-28T04:40:09.934Z\",\n                            \"userId\": \"919zdqcdzy\",\n                            \"user\": {\n                                \"id\": \"919zdqcdzy\",\n                                \"name\": \"まりふぁいあ🔥\",\n                                \"username\": \"refia\",\n                                \"host\": \"misskey.io\",\n                                \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-114586c2-bf89-4d68-8f8c-a0882b4c3f65\",\n                                \"avatarBlurhash\": \"yOQ*u^pGEKR6TI%LEf}[R+OXtQRQR*jEWFsnoyofR*RPWXxuofM|RPf,ofWWIoWBxat7snxZj[wdV@R+t7ofbboftRs:V@RjWCR*WU\",\n                                \"avatarColor\": null,\n                                \"isCat\": true,\n                                \"instance\": {\n                                    \"name\": \"Misskey.io\",\n                                    \"softwareName\": \"misskey\",\n                                    \"softwareVersion\": \"12.119.0\",\n                                    \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n                                    \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n                                    \"themeColor\": \"#86b300\"\n                                },\n                                \"emojis\": [],\n                                \"onlineStatus\": \"unknown\",\n                                \"driveCapacityOverrideMb\": null\n                            },\n                            \"text\": \"にゃらべるとかわいい\",\n                            \"cw\": null,\n                            \"visibility\": \"public\",\n                            \"renoteCount\": 6,\n                            \"repliesCount\": 0,\n                            \"reactions\": {\n                                \":otoku@mewl.me:\": 1\n                            },\n                            \"emojis\": [\n                                {\n                                    \"name\": \"otoku@mewl.me\",\n                                    \"url\": \"https://misskey.pantasystem.com/proxy/%2Ffiles%2Fwebpublic-09416d2c-3737-4c42-b0b2-7a71e56214e7.png?url=https%3A%2F%2Fobjects.misskey.mewl.me%2Ffiles%2Fwebpublic-09416d2c-3737-4c42-b0b2-7a71e56214e7.png\"\n                                },\n                                {\n                                    \"name\": \"kawaiii@misskey.io\",\n                                    \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-59da0cdd-4071-4573-bf58-a9a07f9ba2fc.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-59da0cdd-4071-4573-bf58-a9a07f9ba2fc.png\"\n                                }\n                            ],\n                            \"fileIds\": [\n                                \"919zdsiy09\"\n                            ],\n                            \"files\": [\n                                {\n                                    \"id\": \"919zdsiy09\",\n                                    \"createdAt\": \"2022-06-09T02:44:44.842Z\",\n                                    \"name\": \"webpublic-133a9349-5006-409d-a804-2f3aa2d748b6.png\",\n                                    \"type\": \"image/png\",\n                                    \"md5\": \"f2ef31587030548060eb989da7685219\",\n                                    \"size\": 582934,\n                                    \"isSensitive\": false,\n                                    \"blurhash\": \"ysRfUsg4NanPa}WCW?_Nn~s.ozj?t6jYozoJofW;jZa{jYs:W=R*nibHj[bIbbaykCj[jtafa|-;oLjuW;a{j[jskCayjsj@jZbHfQ\",\n                                    \"properties\": {\n                                        \"width\": 2048,\n                                        \"height\": 573\n                                    },\n                                    \"url\": \"https://misskey.pantasystem.com/files/d47f4149-9613-452e-a7d9-bdd5d4508e4e\",\n                                    \"thumbnailUrl\": \"https://misskey.pantasystem.com/files/thumbnail-b92645dd-f4d7-491b-8bac-53b21d81eb55\",\n                                    \"comment\": null,\n                                    \"folderId\": null,\n                                    \"folder\": null,\n                                    \"userId\": null,\n                                    \"user\": null\n                                }\n                            ],\n                            \"replyId\": null,\n                            \"renoteId\": null,\n                            \"uri\": \"https://misskey.io/notes/8tmbitamso\"\n                        }\n                    ],\n                    \"pinnedPageId\": null,\n                    \"pinnedPage\": null,\n                    \"publicReactions\": false,\n                    \"ffVisibility\": \"public\",\n                    \"twoFactorEnabled\": false,\n                    \"usePasswordLessLogin\": false,\n                    \"securityKeys\": false,\n                    \"isFollowing\": true,\n                    \"isFollowed\": true,\n                    \"hasPendingFollowRequestFromYou\": false,\n                    \"hasPendingFollowRequestToYou\": false,\n                    \"isBlocking\": false,\n                    \"isBlocked\": false,\n                    \"isMuted\": false\n                }\n            }\n        \"\"\".trimIndent()\n\n        val decoder = Json {\n            ignoreUnknownKeys = true\n        }\n        val result: ApResolveResult = decoder.decodeFromString(json)\n        Assertions.assertEquals(\n            \"まりふぁいあ\\uD83D\\uDD25\",\n            (result as ApResolveResult.TypeUser).user.name\n        )\n    }\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/misskey/infos/InstanceInfosResponseTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.infos\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Test\nimport java.io.BufferedInputStream\nimport java.io.BufferedReader\nimport java.io.InputStreamReader\nimport java.net.URL\n\nclass InstanceInfosResponseTest {\n\n    @Test\n    fun decode() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n\n        val url = URL(\"https://instanceapp.misskey.page/instances.json\")\n\n        val text = BufferedReader(InputStreamReader(BufferedInputStream(url.openStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n        json.decodeFromString<InstanceInfosResponse>(text)\n    }\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/misskey/users/BaseUserDTOTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.emoji.EmojisType\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass BaseUserDTOTest {\n\n    val parser = Json {\n        ignoreUnknownKeys = true\n        this.useArrayPolymorphism\n    }\n\n\n    @Test\n    fun decodeFromV13() {\n        val json = \"\"\"\n            {\n                \"id\": \"93p88dgkeb\",\n                \"name\": \"テスト:blobcatgooglypencil:\",\n                \"username\": \"ringoringo\",\n                \"host\": null,\n                \"avatarUrl\": \"https://media.sushi.ski/files/thumbnail-31cd1772-507b-468d-9885-5f1f1b9fec1e.webp\",\n                \"avatarBlurhash\": \"\",\n                \"isBot\": false,\n                \"isCat\": false,\n                \"emojis\": {},\n                \"onlineStatus\": \"online\"\n            }\n        \"\"\".trimIndent()\n\n        val result = parser.decodeFromString<UserDTO>(json)\n        Assertions.assertEquals(EmojisType.TypeObject(emptyMap()), result.rawEmojis)\n    }\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/misskey/users/UserDTOTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.users\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.CurrentClassLoader\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport java.io.BufferedInputStream\nimport java.io.BufferedReader\nimport java.io.File\nimport java.io.InputStreamReader\n\nclass UserDTOTest {\n\n    @Test\n    fun convertFromJson() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(CurrentClassLoader()!!.getResource(\"user_dto_list_case1.json\").file)\n        val testData = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n        val userDTOList = json.decodeFromString<List<UserDTO>>(testData)\n        Assertions.assertNotNull(userDTOList.getOrNull(0))\n        Assertions.assertEquals(\"harunon\", userDTOList[0].userName)\n\n    }\n\n    @Test\n    fun convertFromJson_GiveHarunon() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(CurrentClassLoader()!!.getResource(\"user_dto_give_harunon_case1.json\").file)\n        val testData = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n\n        val harunon = json.decodeFromString<UserDTO>(testData)\n        Assertions.assertEquals(\"keybase\", harunon.fields?.get(0)?.name)\n        Assertions.assertEquals(\"https://keybase.io/harunon\", harunon.fields?.get(0)?.value)\n        Assertions.assertEquals(\"ぢすこ\", harunon.fields?.get(1)?.name)\n\n    }\n\n    @Test\n    fun convertFromJson_GiveV10Harunon() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val file = File(CurrentClassLoader()!!.getResource(\"v10_user_dto_give_harunon_case1.json\").file)\n        val testData = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use {\n            it.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        }\n        val harunon = json.decodeFromString<UserDTO>(testData)\n        Assertions.assertEquals(\"keybase\", harunon.fields?.get(0)?.name)\n        Assertions.assertEquals(\"https://keybase.io/harunon\", harunon.fields?.get(0)?.value)\n        Assertions.assertEquals(\"ぢすこ\", harunon.fields?.get(1)?.name)\n\n    }\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/misskey/v10/FollowFollowerUsersTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v10\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport java.io.BufferedInputStream\nimport java.io.BufferedReader\nimport java.io.File\nimport java.io.InputStreamReader\n\nclass FollowFollowerUsersTest {\n\n    @Test\n    fun decodeJsonTest() {\n        val file = File(javaClass.classLoader!!.getResource(\"v10_followers_case1.json\").file)\n        BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream()))).use { reader ->\n            val textJson = reader.readLines().reduce { acc, s -> acc + s }.trimIndent()\n            val decoder = Json {\n                ignoreUnknownKeys = true\n            }\n            val dto = decoder.decodeFromString<FollowFollowerUsers>(textJson)\n            Assertions.assertEquals(100, dto.users.size)\n            println(dto)\n        }\n    }\n}"
  },
  {
    "path": "modules/api/src/test/java/net/pantasystem/milktea/api/misskey/v10/RequestFollowFollowerTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.v10\n\nimport kotlinx.serialization.encodeToString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass RequestFollowFollowerTest {\n\n    private val encoder by lazy {\n        Json {\n            ignoreUnknownKeys = true\n        }\n    }\n    @Test\n    fun encodeJsonTest() {\n        val req = RequestFollowFollower(\n            i = \"test\",\n            cursor = null,\n            userId = \"5acddf5fcd7aebd97984769a\"\n        )\n        val strJson = encoder.encodeToString(req)\n        println(strJson)\n        Assertions.assertEquals(\"\"\"{\"i\":\"test\",\"userId\":\"5acddf5fcd7aebd97984769a\"}\"\"\", strJson)\n\n    }\n\n    @Test\n    fun encodeJsonTestGiveCursor() {\n        val req = RequestFollowFollower(\n            i = \"test\",\n            cursor = \"nextId\",\n            userId = \"5acddf5fcd7aebd97984769a\"\n        )\n        val strJson = encoder.encodeToString(req)\n        println(strJson)\n        Assertions.assertEquals(\n            \"\"\"{\"i\":\"test\",\"userId\":\"5acddf5fcd7aebd97984769a\",\"cursor\":\"nextId\"}\"\"\",\n            strJson\n        )\n\n    }\n}"
  },
  {
    "path": "modules/api/src/test/resources/fedibird_instance_info.json",
    "content": "{\n  \"uri\": \"fedibird.com\",\n  \"title\": \"Fedibird\",\n  \"short_description\": \"様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。\",\n  \"description\": \"様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。\",\n  \"email\": \"support@fedibird.com\",\n  \"version\": \"3.4.1\",\n  \"urls\": {\n    \"streaming_api\": \"wss://streaming.fedibird.com\"\n  },\n  \"stats\": {\n    \"user_count\": 26299,\n    \"status_count\": 7413419,\n    \"domain_count\": 21627\n  },\n  \"thumbnail\": \"https://s3.fedibird.com/site_uploads/files/000/000/001/original/fedibird_hero_image.png\",\n  \"max_toot_chars\": 560,\n  \"languages\": [\n    \"ja\"\n  ],\n  \"registrations\": true,\n  \"approval_required\": false,\n  \"invites_enabled\": true,\n  \"configuration\": {\n    \"accounts\": {\n      \"max_favourite_tags\": 10,\n      \"max_featured_tags\": 10\n    },\n    \"statuses\": {\n      \"max_characters\": 560,\n      \"max_media_attachments\": 4,\n      \"characters_reserved_per_url\": 23,\n      \"min_expiration\": 60,\n      \"max_expiration\": 37152000,\n      \"supported_expires_actions\": [\n        \"delete\",\n        \"mark\"\n      ]\n    },\n    \"media_attachments\": {\n      \"supported_mime_types\": [\n        \"image/jpeg\",\n        \"image/png\",\n        \"image/gif\",\n        \"image/webp\",\n        \"image/heif\",\n        \"image/heic\",\n        \"video/webm\",\n        \"video/mp4\",\n        \"video/quicktime\",\n        \"video/ogg\",\n        \"audio/wave\",\n        \"audio/wav\",\n        \"audio/x-wav\",\n        \"audio/x-pn-wave\",\n        \"audio/ogg\",\n        \"audio/mpeg\",\n        \"audio/mp3\",\n        \"audio/webm\",\n        \"audio/flac\",\n        \"audio/aac\",\n        \"audio/m4a\",\n        \"audio/x-m4a\",\n        \"audio/mp4\",\n        \"audio/3gpp\",\n        \"video/x-ms-asf\"\n      ],\n      \"image_size_limit\": 10485760,\n      \"image_matrix_limit\": 16777216,\n      \"video_size_limit\": 41943040,\n      \"video_frame_rate_limit\": 60,\n      \"video_matrix_limit\": 3061440\n    },\n    \"polls\": {\n      \"max_options\": 4,\n      \"max_characters_per_option\": 50,\n      \"min_expiration\": 300,\n      \"max_expiration\": 2629746\n    },\n    \"emoji_reactions\": {\n      \"max_reactions\": 20\n    },\n    \"status_references\": {\n      \"max_references\": 100\n    }\n  },\n  \"feature_quote\": true,\n  \"fedibird_capabilities\": [\n    \"favourite_hashtag\",\n    \"favourite_domain\",\n    \"favourite_list\",\n    \"status_expire\",\n    \"follow_no_delivery\",\n    \"follow_hashtag\",\n    \"subscribe_account\",\n    \"subscribe_domain\",\n    \"subscribe_keyword\",\n    \"timeline_home_visibility\",\n    \"timeline_no_local\",\n    \"timeline_domain\",\n    \"timeline_group\",\n    \"timeline_group_directory\",\n    \"visibility_mutual\",\n    \"visibility_limited\",\n    \"visibility_personal\",\n    \"emoji_reaction\",\n    \"misskey_birthday\",\n    \"misskey_location\",\n    \"status_reference\",\n    \"searchability\",\n    \"status_compact_mode\",\n    \"account_conversations\"\n  ],\n  \"contact_account\": {\n    \"id\": \"1\",\n    \"username\": \"noellabo\",\n    \"acct\": \"noellabo\",\n    \"display_name\": \"のえる\",\n    \"locked\": false,\n    \"bot\": false,\n    \"cat\": false,\n    \"discoverable\": true,\n    \"group\": false,\n    \"created_at\": \"2019-08-15T00:00:00.000Z\",\n    \"note\": \"<p>主に、Fediverseへの関心に基づいた投稿を行うアカウントです。DTP・印刷に関する話をしたり、同人の話をしたり、カレーをブーストしたりします。</p><p>Mastodonのcollaborator（開発者の一員）です。また、独自機能を盛り込んだFedibirdを管理・開発しています！</p><p>Mastodonサーバ『fedibird.com』の管理者アカウントでもあります。ご連絡は当アカウントへ、サーバインフォメーションについては <a href=\\\"https://fedibird.com/about/more\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/about/more</span><span class=\\\"invisible\\\"></span></a> と <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@info\\\" class=\\\"u-url mention\\\">@<span>info</span></a></span> を参照してください。</p><p><a href=\\\"https://fedibird.com/tags/webdev\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>webdev</span></a> <a href=\\\"https://fedibird.com/tags/fedi22\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>fedi22</span></a></p>\",\n    \"url\": \"https://fedibird.com/@noellabo\",\n    \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n    \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n    \"header\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n    \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n    \"searchability\": \"public\",\n    \"followers_count\": 6345,\n    \"following_count\": 956,\n    \"subscribing_count\": 58,\n    \"statuses_count\": 85226,\n    \"last_status_at\": \"2023-01-27\",\n    \"emojis\": [\n      {\n        \"shortcode\": \"liberapay\",\n        \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/original/5b8620742973f844.png\",\n        \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/static/5b8620742973f844.png\",\n        \"visible_in_picker\": true\n      },\n      {\n        \"shortcode\": \"mastodon\",\n        \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n        \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n        \"visible_in_picker\": true\n      },\n      {\n        \"shortcode\": \"misskey12_67\",\n        \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/original/8f8aab6fd3a4c214.png\",\n        \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/static/8f8aab6fd3a4c214.png\",\n        \"visible_in_picker\": true\n      }\n    ],\n    \"fields\": [\n      {\n        \"name\": \":liberapay: Liberapay\",\n        \"value\": \"<a href=\\\"https://liberapay.com/noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">liberapay.com/noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n        \"verified_at\": \"2020-10-22T03:04:43.206+00:00\"\n      },\n      {\n        \"name\": \":mastodon: DTP-Mstdn.jp\",\n        \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@dtp-mstdn.jp\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"55\\\" href=\\\"https://dtp-mstdn.jp/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">dtp-mstdn.jp/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n        \"verified_at\": \"2020-05-23T00:14:02.232+00:00\"\n      },\n      {\n        \"name\": \":mastodon: 別宅\",\n        \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@gorone.xyz\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"14504\\\" href=\\\"https://gorone.xyz/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">gorone.xyz/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n        \"verified_at\": \"2021-08-11T07:48:53.479+00:00\"\n      },\n      {\n        \"name\": \":misskey12_67: misskey.cloud\",\n        \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@misskey.cloud\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"108409794834880061\\\" href=\\\"https://misskey.cloud/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">misskey.cloud/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n        \"verified_at\": \"2022-07-12T00:51:11.984+00:00\"\n      }\n    ],\n    \"other_settings\": {\n      \"birthday\": null,\n      \"location\": \"埼玉県\",\n      \"cat_ears_color\": \"#d5c6c0\",\n      \"noindex\": true,\n      \"hide_network\": false,\n      \"hide_statuses_count\": false,\n      \"hide_following_count\": false,\n      \"hide_followers_count\": false,\n      \"enable_reaction\": true\n    }\n  },\n  \"rules\": [\n    {\n      \"id\": \"2\",\n      \"text\": \"日本の法律と社会規範に従った行動を心がけてください\"\n    },\n    {\n      \"id\": \"3\",\n      \"text\": \"不快や脅威に対してはブロック・ミュート・フィルターで距離をとってください\"\n    },\n    {\n      \"id\": \"1\",\n      \"text\": \"投稿する際は、適切な公開範囲・CW・閲覧注意を使用してください\"\n    }\n  ]\n}"
  },
  {
    "path": "modules/api/src/test/resources/mastodonsocial_instance_info.json",
    "content": "{\n  \"uri\": \"mastodon.social\",\n  \"title\": \"Mastodon\",\n  \"short_description\": \"The original server operated by the Mastodon gGmbH non-profit\",\n  \"description\": \"\",\n  \"email\": \"staff@mastodon.social\",\n  \"version\": \"4.0.2\",\n  \"urls\": {\n    \"streaming_api\": \"wss://mastodon.social\"\n  },\n  \"stats\": {\n    \"user_count\": 924178,\n    \"status_count\": 49221002,\n    \"domain_count\": 49536\n  },\n  \"thumbnail\": \"https://files.mastodon.social/site_uploads/files/000/000/001/@1x/57c12f441d083cde.png\",\n  \"languages\": [\n    \"en\"\n  ],\n  \"registrations\": false,\n  \"approval_required\": false,\n  \"invites_enabled\": true,\n  \"configuration\": {\n    \"accounts\": {\n      \"max_featured_tags\": 10\n    },\n    \"statuses\": {\n      \"max_characters\": 500,\n      \"max_media_attachments\": 4,\n      \"characters_reserved_per_url\": 23\n    },\n    \"media_attachments\": {\n      \"supported_mime_types\": [\n        \"image/jpeg\",\n        \"image/png\",\n        \"image/gif\",\n        \"image/heic\",\n        \"image/heif\",\n        \"image/webp\",\n        \"image/avif\",\n        \"video/webm\",\n        \"video/mp4\",\n        \"video/quicktime\",\n        \"video/ogg\",\n        \"audio/wave\",\n        \"audio/wav\",\n        \"audio/x-wav\",\n        \"audio/x-pn-wave\",\n        \"audio/vnd.wave\",\n        \"audio/ogg\",\n        \"audio/vorbis\",\n        \"audio/mpeg\",\n        \"audio/mp3\",\n        \"audio/webm\",\n        \"audio/flac\",\n        \"audio/aac\",\n        \"audio/m4a\",\n        \"audio/x-m4a\",\n        \"audio/mp4\",\n        \"audio/3gpp\",\n        \"video/x-ms-asf\"\n      ],\n      \"image_size_limit\": 10485760,\n      \"image_matrix_limit\": 16777216,\n      \"video_size_limit\": 41943040,\n      \"video_frame_rate_limit\": 60,\n      \"video_matrix_limit\": 2304000\n    },\n    \"polls\": {\n      \"max_options\": 4,\n      \"max_characters_per_option\": 50,\n      \"min_expiration\": 300,\n      \"max_expiration\": 2629746\n    }\n  },\n  \"contact_account\": {\n    \"id\": \"1\",\n    \"username\": \"Gargron\",\n    \"acct\": \"Gargron\",\n    \"display_name\": \"Eugen Rochko\",\n    \"locked\": false,\n    \"bot\": false,\n    \"discoverable\": true,\n    \"group\": false,\n    \"created_at\": \"2016-03-16T00:00:00.000Z\",\n    \"note\": \"<p>Founder, CEO and lead developer <span class=\\\"h-card\\\"><a href=\\\"https://mastodon.social/@Mastodon\\\" class=\\\"u-url mention\\\">@<span>Mastodon</span></a></span>, Germany.</p>\",\n    \"url\": \"https://mastodon.social/@Gargron\",\n    \"avatar\": \"https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg\",\n    \"avatar_static\": \"https://files.mastodon.social/accounts/avatars/000/000/001/original/dc4286ceb8fab734.jpg\",\n    \"header\": \"https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg\",\n    \"header_static\": \"https://files.mastodon.social/accounts/headers/000/000/001/original/3b91c9965d00888b.jpeg\",\n    \"followers_count\": 290749,\n    \"following_count\": 351,\n    \"statuses_count\": 73120,\n    \"last_status_at\": \"2023-01-26\",\n    \"noindex\": false,\n    \"emojis\": [],\n    \"fields\": [\n      {\n        \"name\": \"Patreon\",\n        \"value\": \"<a href=\\\"https://www.patreon.com/mastodon\\\" target=\\\"_blank\\\" rel=\\\"nofollow noopener noreferrer me\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">patreon.com/mastodon</span><span class=\\\"invisible\\\"></span></a>\",\n        \"verified_at\": null\n      }\n    ]\n  },\n  \"rules\": [\n    {\n      \"id\": \"1\",\n      \"text\": \"Sexually explicit or violent media must be marked as sensitive when posting\"\n    },\n    {\n      \"id\": \"2\",\n      \"text\": \"No racism, sexism, homophobia, transphobia, xenophobia, or casteism\"\n    },\n    {\n      \"id\": \"3\",\n      \"text\": \"No incitement of violence or promotion of violent ideologies\"\n    },\n    {\n      \"id\": \"4\",\n      \"text\": \"No harassment, dogpiling or doxxing of other users\"\n    },\n    {\n      \"id\": \"5\",\n      \"text\": \"No content illegal in Germany\"\n    },\n    {\n      \"id\": \"7\",\n      \"text\": \"Do not share intentionally false or misleading information\"\n    }\n  ]\n}"
  },
  {
    "path": "modules/api/src/test/resources/mstdnjp_instance_info.json",
    "content": "{\n  \"uri\": \"mstdn.jp\",\n  \"title\": \"mstdn.jp\",\n  \"short_description\": \"Mastodon日本鯖です．\\r\\nよろしくお願いいたします。\\r\\n\\r\\n(Maintained by Sujitech, LLC)\",\n  \"description\": \"Mastodon日本鯖です．\",\n  \"email\": \"info@sujitech.com\",\n  \"version\": \"3.5.1\",\n  \"urls\": {\n    \"streaming_api\": \"wss://mstdn.jp\"\n  },\n  \"stats\": {\n    \"user_count\": 312141,\n    \"status_count\": 63932041,\n    \"domain_count\": 50265\n  },\n  \"thumbnail\": \"https://mstdn.jp/packs/media/images/preview-5df98290371ead9a70bc3cd4733bbfa7.jpg\",\n  \"languages\": [\n    \"en\"\n  ],\n  \"registrations\": true,\n  \"approval_required\": false,\n  \"invites_enabled\": true,\n  \"configuration\": {\n    \"statuses\": {\n      \"max_characters\": 500,\n      \"max_media_attachments\": 4,\n      \"characters_reserved_per_url\": 23\n    },\n    \"media_attachments\": {\n      \"supported_mime_types\": [\n        \"image/jpeg\",\n        \"image/png\",\n        \"image/gif\",\n        \"video/webm\",\n        \"video/mp4\",\n        \"video/quicktime\",\n        \"video/ogg\",\n        \"audio/wave\",\n        \"audio/wav\",\n        \"audio/x-wav\",\n        \"audio/x-pn-wave\",\n        \"audio/ogg\",\n        \"audio/vorbis\",\n        \"audio/mpeg\",\n        \"audio/mp3\",\n        \"audio/webm\",\n        \"audio/flac\",\n        \"audio/aac\",\n        \"audio/m4a\",\n        \"audio/x-m4a\",\n        \"audio/mp4\",\n        \"audio/3gpp\",\n        \"video/x-ms-asf\"\n      ],\n      \"image_size_limit\": 10485760,\n      \"image_matrix_limit\": 16777216,\n      \"video_size_limit\": 41943040,\n      \"video_frame_rate_limit\": 60,\n      \"video_matrix_limit\": 2304000\n    },\n    \"polls\": {\n      \"max_options\": 4,\n      \"max_characters_per_option\": 50,\n      \"min_expiration\": 300,\n      \"max_expiration\": 2629746\n    }\n  },\n  \"contact_account\": {\n    \"id\": \"261312\",\n    \"username\": \"mstdn_jp\",\n    \"acct\": \"mstdn_jp\",\n    \"display_name\": \"mstdn.jp お知らせ【公式】\",\n    \"locked\": false,\n    \"bot\": false,\n    \"discoverable\": false,\n    \"group\": false,\n    \"created_at\": \"2017-06-22T00:00:00.000Z\",\n    \"note\": \"<p>合同会社分散型ソーシャルネットワーク機構 ( <span class=\\\"h-card\\\"><a href=\\\"https://mstdn.jp/@dsno\\\" class=\\\"u-url mention\\\">@<span>dsno</span></a></span> ) が運営しているアカウントです。<br />mstdn.jpのメンテナンス情報等をトゥートします。</p><p>当部署では技術的な対応のみを実施しております。<br />お問い合わせ・ご質問等は、 EMAIL: sns@bunsan.social までお願いします。</p>\",\n    \"url\": \"https://mstdn.jp/@mstdn_jp\",\n    \"avatar\": \"https://media.mstdn.jp/accounts/avatars/000/261/312/original/ccc3ba5a66381e6f.png\",\n    \"avatar_static\": \"https://media.mstdn.jp/accounts/avatars/000/261/312/original/ccc3ba5a66381e6f.png\",\n    \"header\": \"https://mstdn.jp/headers/original/missing.png\",\n    \"header_static\": \"https://mstdn.jp/headers/original/missing.png\",\n    \"followers_count\": 64053,\n    \"following_count\": 6,\n    \"statuses_count\": 136,\n    \"last_status_at\": \"2022-07-19\",\n    \"emojis\": [],\n    \"fields\": []\n  },\n  \"rules\": []\n}"
  },
  {
    "path": "modules/api/src/test/resources/pawoonet_instance_info.json",
    "content": "{\n  \"uri\": \"pawoo.net\",\n  \"title\": \"Pawoo\",\n  \"short_description\": \"\",\n  \"description\": \"Pawoo（パウー）はdimension.imが運営するMastodonのインスタンス（サーバー）です。\\r\\n「創作活動や自由なコミュニケーションを楽しめる場」として、どなたにも幅広く使っていただけます。\\r\\nお問い合わせはこちらinfo@sujitech.com\",\n  \"email\": \"\",\n  \"version\": \"3.3.3\",\n  \"urls\": {\n    \"streaming_api\": \"wss://pawoo.net\"\n  },\n  \"stats\": {\n    \"user_count\": 814479,\n    \"status_count\": 68498129,\n    \"domain_count\": 28551\n  },\n  \"thumbnail\": \"https://img.pawoo.net/site_uploads/files/000/000/001/original/pawoo_ogp2.png\",\n  \"languages\": [\n    \"en\"\n  ],\n  \"registrations\": true,\n  \"approval_required\": false,\n  \"invites_enabled\": false,\n  \"contact_account\": {\n    \"id\": \"1179421\",\n    \"username\": \"pawoo_russel\",\n    \"acct\": \"pawoo_russel\",\n    \"display_name\": \"pawoo-russell\",\n    \"locked\": false,\n    \"bot\": false,\n    \"discoverable\": null,\n    \"group\": false,\n    \"created_at\": \"2019-11-28T12:26:48.668Z\",\n    \"note\": \"<p>Pawoo（パウー）は、ラッセルが運営するMastodonのインスタンス（サーバー）です。<br />2019年12月2日よりラッセルが運営引継致しました。<br />Pawooのご利用方法、不具合等のお問い合わせは、<span class=\\\"h-card\\\"><a href=\\\"https://pawoo.net/@pawoo_support\\\" class=\\\"u-url mention\\\">@<span>pawoo_support</span></a></span> までDMでご連絡ください。</p>\",\n    \"url\": \"https://pawoo.net/@pawoo_russel\",\n    \"avatar\": \"https://img.pawoo.net/accounts/avatars/001/179/421/original/9a72fa75ef4d2f21.png\",\n    \"avatar_static\": \"https://img.pawoo.net/accounts/avatars/001/179/421/original/9a72fa75ef4d2f21.png\",\n    \"header\": \"https://pawoo.net/headers/original/missing.png\",\n    \"header_static\": \"https://pawoo.net/headers/original/missing.png\",\n    \"followers_count\": 237877,\n    \"following_count\": 2,\n    \"statuses_count\": 4,\n    \"last_status_at\": \"2021-07-15\",\n    \"emojis\": [],\n    \"oauth_authentications\": [],\n    \"fields\": []\n  }\n}"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_has_quote_timeline.json",
    "content": "[\n  {\n    \"id\": \"109736662293493653\",\n    \"created_at\": \"2023-01-23T04:36:22.364Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109736662293493653\",\n    \"url\": \"https://fedibird.com/@Panta/109736662293493653\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"pinned\": false,\n    \"content\": \"<p>引用もできるんだ</p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"パン太 :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p>アプリ開発のために登録しました</p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 4,\n      \"following_count\": 9,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 24,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"\",\n        \"cat_ears_color\": \"#d8c0b2\",\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736661401994267\",\n    \"created_at\": \"2023-01-23T04:36:08.760Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109736661401994267\",\n    \"url\": \"https://fedibird.com/@Panta/109736661401994267\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [\n      \"109736660067874105\"\n    ],\n    \"status_references_count\": 1,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"pinned\": false,\n    \"content\": \"<p>test<span class=\\\"quote-inline\\\"><br/>QT: <a class=\\\"status-url-link\\\" data-status-account-acct=\\\"Panta\\\" data-status-id=\\\"109736660067874105\\\" href=\\\"https://fedibird.com/@Panta/109736660067874105\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">fedibird.com/@Panta/1097366600</span><span class=\\\"invisible\\\">67874105</span></a></span><span class=\\\"reference-link-inline\\\"> <a href=\\\"https://fedibird.com/@Panta/109736661401994267/references\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\" class=\\\"status-link unhandled-link\\\" data-status-id=\\\"109736661401994267\\\">[参照]</a></span></p>\",\n    \"quote_id\": \"109736660067874105\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"パン太 :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p>アプリ開発のために登録しました</p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 4,\n      \"following_count\": 9,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 24,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"\",\n        \"cat_ears_color\": \"#d8c0b2\",\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": {\n      \"id\": \"109736660067874105\",\n      \"created_at\": \"2023-01-23T04:35:48.402Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/Panta/statuses/109736660067874105\",\n      \"url\": \"https://fedibird.com/@Panta/109736660067874105\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 0,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 1,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"pinned\": false,\n      \"content\": \"<p>なるほどcardに参照先の投稿の情報を入れつつstatus_reference_idsに参照先の投稿のIdを入れてるのか</p>\",\n      \"account\": {\n        \"id\": \"106243276260829420\",\n        \"username\": \"Panta\",\n        \"acct\": \"Panta\",\n        \"display_name\": \"パン太 :mastodon:\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2021-05-16T00:00:00.000Z\",\n        \"note\": \"<p>アプリ開発のために登録しました</p>\",\n        \"url\": \"https://fedibird.com/@Panta\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n        \"header\": \"https://fedibird.com/headers/original/missing.png\",\n        \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 4,\n        \"following_count\": 9,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 24,\n        \"last_status_at\": \"2023-01-23\",\n        \"emojis\": [\n          {\n            \"shortcode\": \"mastodon\",\n            \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n            \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n            \"visible_in_picker\": true\n          }\n        ],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#d8c0b2\",\n          \"noindex\": false,\n          \"hide_network\": false,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": false,\n          \"hide_followers_count\": false,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"quote_muted\": false,\n      \"application\": {\n        \"name\": \"Web\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": {\n      \"url\": \"https://fedibird.com/@Panta/109736661401994267/references\",\n      \"title\": \"投稿の参照（1件） by パン太 :mastodon: (@Panta@fedibird.com)\",\n      \"description\": \"なるほどcardに参照先の投稿の情報を入れつつstatus_reference_idsに参照先の投稿のIdを入れてるのか\",\n      \"type\": \"link\",\n      \"author_name\": \"\",\n      \"author_url\": \"\",\n      \"provider_name\": \"\",\n      \"provider_url\": \"\",\n      \"html\": \"\",\n      \"width\": 400,\n      \"height\": 400,\n      \"image\": \"https://s3.fedibird.com/cache/preview_cards/images/009/787/006/original/47faa7e4a383345c.png\",\n      \"embed_url\": \"\",\n      \"blurhash\": \"URO.~;?Y9vt6}%aLbKog9{X:XAb_aL$gNLWB\",\n      \"status_id\": \"109736661401994267\",\n      \"account_id\": \"106243276260829420\"\n    },\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736660067874105\",\n    \"created_at\": \"2023-01-23T04:35:48.402Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109736660067874105\",\n    \"url\": \"https://fedibird.com/@Panta/109736660067874105\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 1,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"pinned\": false,\n    \"content\": \"<p>なるほどcardに参照先の投稿の情報を入れつつstatus_reference_idsに参照先の投稿のIdを入れてるのか</p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"パン太 :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p>アプリ開発のために登録しました</p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 4,\n      \"following_count\": 9,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 24,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"\",\n        \"cat_ears_color\": \"#d8c0b2\",\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736653284907641\",\n    \"created_at\": \"2023-01-23T04:34:04.903Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109736653284907641\",\n    \"url\": \"https://fedibird.com/@Panta/109736653284907641\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [\n      \"109736652587684707\"\n    ],\n    \"status_references_count\": 1,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"pinned\": false,\n    \"content\": \"<p>test<span class=\\\"reference-link-inline\\\"> <a href=\\\"https://fedibird.com/@Panta/109736653284907641/references\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\" class=\\\"status-link unhandled-link\\\" data-status-id=\\\"109736653284907641\\\">[参照]</a></span></p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"パン太 :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p>アプリ開発のために登録しました</p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 4,\n      \"following_count\": 9,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 24,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"\",\n        \"cat_ears_color\": \"#d8c0b2\",\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": {\n      \"url\": \"https://fedibird.com/@Panta/109736653284907641/references\",\n      \"title\": \"投稿の参照（1件） by パン太 :mastodon: (@Panta@fedibird.com)\",\n      \"description\": \"aaa\",\n      \"type\": \"link\",\n      \"author_name\": \"\",\n      \"author_url\": \"\",\n      \"provider_name\": \"\",\n      \"provider_url\": \"\",\n      \"html\": \"\",\n      \"width\": 400,\n      \"height\": 400,\n      \"image\": \"https://s3.fedibird.com/cache/preview_cards/images/009/786/984/original/93da76fe7f5fda92.png\",\n      \"embed_url\": \"\",\n      \"blurhash\": \"URO.~;?Y9vt6}%aLbKog9{X:XAb_aL$gNLWB\",\n      \"status_id\": \"109736653284907641\",\n      \"account_id\": \"106243276260829420\"\n    },\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736652587684707\",\n    \"created_at\": \"2023-01-23T04:33:54.281Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109736652587684707\",\n    \"url\": \"https://fedibird.com/@Panta/109736652587684707\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 1,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"pinned\": false,\n    \"content\": \"<p>aaa</p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"パン太 :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p>アプリ開発のために登録しました</p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 4,\n      \"following_count\": 9,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 24,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"\",\n        \"cat_ears_color\": \"#d8c0b2\",\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736644363687504\",\n    \"created_at\": \"2023-01-23T04:31:48.780Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/noellabo/statuses/109736644363687504\",\n    \"url\": \"https://fedibird.com/@noellabo/109736644363687504\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"public\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>参照、パブリックページからみるといろいろ不便なので、ActivityPubにのせたネイティブ対応にしていかないとねぇ。</p><p>独自機能……別の言い方をすれば、先行実装ゆえの難しさ。</p>\",\n    \"account\": {\n      \"id\": \"1\",\n      \"username\": \"noellabo\",\n      \"acct\": \"noellabo\",\n      \"display_name\": \"のえる\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>主に、Fediverseへの関心に基づいた投稿を行うアカウントです。DTP・印刷に関する話をしたり、同人の話をしたり、カレーをブーストしたりします。</p><p>Mastodonのcollaborator（開発者の一員）です。また、独自機能を盛り込んだFedibirdを管理・開発しています！</p><p>Mastodonサーバ『fedibird.com』の管理者アカウントでもあります。ご連絡は当アカウントへ、サーバインフォメーションについては <a href=\\\"https://fedibird.com/about/more\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/about/more</span><span class=\\\"invisible\\\"></span></a> と <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@info\\\" class=\\\"u-url mention\\\">@<span>info</span></a></span> を参照してください。</p><p><a href=\\\"https://fedibird.com/tags/webdev\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>webdev</span></a> <a href=\\\"https://fedibird.com/tags/fedi22\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>fedi22</span></a></p>\",\n      \"url\": \"https://fedibird.com/@noellabo\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n      \"header\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n      \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n      \"searchability\": \"public\",\n      \"followers_count\": 6224,\n      \"following_count\": 956,\n      \"subscribing_count\": 58,\n      \"statuses_count\": 84948,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"liberapay\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/original/5b8620742973f844.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/static/5b8620742973f844.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"misskey12_67\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/original/8f8aab6fd3a4c214.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/static/8f8aab6fd3a4c214.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [\n        {\n          \"name\": \":liberapay: Liberapay\",\n          \"value\": \"<a href=\\\"https://liberapay.com/noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">liberapay.com/noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2020-10-22T03:04:43.206+00:00\"\n        },\n        {\n          \"name\": \":mastodon: DTP-Mstdn.jp\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@dtp-mstdn.jp\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"55\\\" href=\\\"https://dtp-mstdn.jp/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">dtp-mstdn.jp/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2020-05-23T00:14:02.232+00:00\"\n        },\n        {\n          \"name\": \":mastodon: 別宅\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@gorone.xyz\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"14504\\\" href=\\\"https://gorone.xyz/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">gorone.xyz/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2021-08-11T07:48:53.479+00:00\"\n        },\n        {\n          \"name\": \":misskey12_67: misskey.cloud\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@misskey.cloud\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"108409794834880061\\\" href=\\\"https://misskey.cloud/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">misskey.cloud/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2022-07-12T00:51:11.984+00:00\"\n        }\n      ],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"埼玉県\",\n        \"cat_ears_color\": \"#d5c6c0\",\n        \"noindex\": true,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736641841624466\",\n    \"created_at\": \"2023-01-23T04:31:09.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109736641794569340\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109736641794569340\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>コーヒー飲みたいと思いながらコーヒー飲んでるバグ発生</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩(多血)\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/bec2af3575137f62.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/bec2af3575137f62.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 855,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71561,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#ecdddb\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736628422259506\",\n    \"created_at\": \"2023-01-23T04:27:45.528Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/noellabo/statuses/109736628422259506\",\n    \"url\": \"https://fedibird.com/@noellabo/109736628422259506\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 5,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"public\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>カレーブーストを安心してオフにしてもらうためでもありますが、いわゆるBT言及は使わないようにしてます。</p><p>リプライか、引用か、参照が基本。</p><p>関連をもたせたくないときは、投稿以外には何もしない。</p>\",\n    \"account\": {\n      \"id\": \"1\",\n      \"username\": \"noellabo\",\n      \"acct\": \"noellabo\",\n      \"display_name\": \"のえる\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>主に、Fediverseへの関心に基づいた投稿を行うアカウントです。DTP・印刷に関する話をしたり、同人の話をしたり、カレーをブーストしたりします。</p><p>Mastodonのcollaborator（開発者の一員）です。また、独自機能を盛り込んだFedibirdを管理・開発しています！</p><p>Mastodonサーバ『fedibird.com』の管理者アカウントでもあります。ご連絡は当アカウントへ、サーバインフォメーションについては <a href=\\\"https://fedibird.com/about/more\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/about/more</span><span class=\\\"invisible\\\"></span></a> と <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@info\\\" class=\\\"u-url mention\\\">@<span>info</span></a></span> を参照してください。</p><p><a href=\\\"https://fedibird.com/tags/webdev\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>webdev</span></a> <a href=\\\"https://fedibird.com/tags/fedi22\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>fedi22</span></a></p>\",\n      \"url\": \"https://fedibird.com/@noellabo\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n      \"header\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n      \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n      \"searchability\": \"public\",\n      \"followers_count\": 6224,\n      \"following_count\": 956,\n      \"subscribing_count\": 58,\n      \"statuses_count\": 84948,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"liberapay\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/original/5b8620742973f844.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/static/5b8620742973f844.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"misskey12_67\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/original/8f8aab6fd3a4c214.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/static/8f8aab6fd3a4c214.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [\n        {\n          \"name\": \":liberapay: Liberapay\",\n          \"value\": \"<a href=\\\"https://liberapay.com/noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">liberapay.com/noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2020-10-22T03:04:43.206+00:00\"\n        },\n        {\n          \"name\": \":mastodon: DTP-Mstdn.jp\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@dtp-mstdn.jp\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"55\\\" href=\\\"https://dtp-mstdn.jp/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">dtp-mstdn.jp/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2020-05-23T00:14:02.232+00:00\"\n        },\n        {\n          \"name\": \":mastodon: 別宅\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@gorone.xyz\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"14504\\\" href=\\\"https://gorone.xyz/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">gorone.xyz/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2021-08-11T07:48:53.479+00:00\"\n        },\n        {\n          \"name\": \":misskey12_67: misskey.cloud\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@misskey.cloud\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"108409794834880061\\\" href=\\\"https://misskey.cloud/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">misskey.cloud/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2022-07-12T00:51:11.984+00:00\"\n        }\n      ],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"埼玉県\",\n        \"cat_ears_color\": \"#d5c6c0\",\n        \"noindex\": true,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736614419783007\",\n    \"created_at\": \"2023-01-23T04:24:11.873Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/yamako/statuses/109736614419783007\",\n    \"url\": \"https://fedibird.com/@yamako/109736614419783007\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>実際オフした人にはもうバレてますけど人に会うとキョドります</p>\",\n    \"account\": {\n      \"id\": \"174159\",\n      \"username\": \"yamako\",\n      \"acct\": \"yamako\",\n      \"display_name\": \"やまこ_2/19コミティア143\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2020-10-16T00:00:00.000Z\",\n      \"note\": \"<p>好きなものを、マイペースに。<br />猫とお絵かきと珈琲とおバイクが好きです。<br />大人のハートフル百合まんが <a href=\\\"https://fedibird.com/tags/%E3%81%AA%E3%81%8B%E3%82%88%E3%81%97%E3%81%8A%E3%81%AD%E3%81%88%E3%81%95%E3%82%93%E3%81%9F%E3%81%A1\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>なかよしおねえさんたち</span></a><br />:nakayosi_mako: マコさん :nakayosi_natuko: ナツコさん<br />猫 <a href=\\\"https://fedibird.com/tags/%E3%82%AD%E3%83%A5%E3%82%A6%E3%81%A1%E3%82%83%E3%82%93\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>キュウちゃん</span></a><br />ヘッダ画像は <span class=\\\"h-card\\\"><a href=\\\"https://misskey.io/@makeitquote\\\" class=\\\"u-url mention\\\">@<span>makeitquote</span></a></span> で生成しました。<br />絵以外の投稿も多いのでご注意ください。<br />Metatextの熊のアイコンを描きました。</p><p>I love cat, coffee, motorcycle, and drawing Japanese Yuri or cute images.<br />Japanese(native)<br />English(using machine translation)<br />Nakayoshi Onee-sans <br />:nakayosi_mako: Mako :nakayosi_natuko: Natsuko<br />I drew the icon of Mallow the bear for Metatext.<br />she/her</p>\",\n      \"url\": \"https://fedibird.com/@yamako\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/174/159/original/e426c26c267befa9.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/174/159/original/e426c26c267befa9.png\",\n      \"header\": \"https://s3.fedibird.com/accounts/headers/000/174/159/original/4adca5035c0bfc8a.png\",\n      \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/174/159/original/4adca5035c0bfc8a.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 0,\n      \"following_count\": 0,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 0,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"nakayosi_mako\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/090/699/original/751f96ffd465ab0a.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/090/699/static/751f96ffd465ab0a.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"nakayosi_natuko\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/090/701/original/ef3a97d6425c5eff.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/090/701/static/ef3a97d6425c5eff.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [\n        {\n          \"name\": \"おねえさま\",\n          \"value\": \"概念\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"人生\",\n          \"value\": \"はねろ！コイキング\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"猫さま\",\n          \"value\": \"ご主人\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"裏方\",\n          \"value\": \"<a href=\\\"https://www.operationvr.info/\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">operationvr.info/</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"個人サイト\",\n          \"value\": \"<a href=\\\"https://prof.yamako-ya.com\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">prof.yamako-ya.com</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2022-11-30T09:57:27.956+00:00\"\n        }\n      ],\n      \"other_settings\": {\n        \"birthday\": \"2022-02-15\",\n        \"location\": \"Kanagawa, Japan\",\n        \"cat_ears_color\": \"#e7c19e\",\n        \"noindex\": true,\n        \"hide_network\": true,\n        \"hide_statuses_count\": true,\n        \"hide_following_count\": true,\n        \"hide_followers_count\": true,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736584090627360\",\n    \"created_at\": \"2023-01-23T04:16:26.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://oransns.com/users/nacika/statuses/109736583945258444\",\n    \"url\": \"https://oransns.com/@nacika/109736583945258444\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>実用ですね〜<br>Ruby技術者とか</p>\",\n    \"account\": {\n      \"id\": \"107\",\n      \"username\": \"nacika\",\n      \"acct\": \"nacika@oransns.com\",\n      \"display_name\": \"なちか＠大吉\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-13T00:00:00.000Z\",\n      \"note\": \"<p>アイコンはxanacさんです🐈背景は <span class=\\\"h-card\\\"><a href=\\\"https://oransns.com/@CotTheta\\\" class=\\\"u-url mention\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>CotTheta</span></a></span> ですー！<br>🔑 <a href=\\\"https://keybase.io/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">keybase.io/nacika</span><span class=\\\"invisible\\\"></span></a><br>干芋: <a href=\\\"https://amzn.to/3yQuni9\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">amzn.to/3yQuni9</span><span class=\\\"invisible\\\"></span></a><br>Steam: <a href=\\\"http://bit.ly/2AluV3z\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">bit.ly/2AluV3z</span><span class=\\\"invisible\\\"></span></a><br>Kyash: nacikaVRChat: nacika</p>\",\n      \"url\": \"https://oransns.com/@nacika\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/original/aff8df5bc3375751.gif\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/static/aff8df5bc3375751.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 1824,\n      \"following_count\": 1568,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 263563,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"patreon\",\n          \"value\": \"<a href=\\\"https://www.patreon.com/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">patreon.com/nacika</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"discord\",\n          \"value\": \"nacika#0050\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ニンテンドー\",\n          \"value\": \"SW-7781-2029-3706\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ブログ\",\n          \"value\": \"<a href=\\\"https://nacika.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">nacika.com</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736582881374828\",\n    \"created_at\": \"2023-01-23T04:16:09.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://oransns.com/users/nacika/statuses/109736582787049863/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@awu\\\" class=\\\"u-url mention\\\">@<span>awu</span></a></span> 実用性なのか、転職用なのか、見栄えなのかによりますよねー</p>\",\n    \"account\": {\n      \"id\": \"107\",\n      \"username\": \"nacika\",\n      \"acct\": \"nacika@oransns.com\",\n      \"display_name\": \"なちか＠大吉\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-13T00:00:00.000Z\",\n      \"note\": \"<p>アイコンはxanacさんです🐈背景は <span class=\\\"h-card\\\"><a href=\\\"https://oransns.com/@CotTheta\\\" class=\\\"u-url mention\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>CotTheta</span></a></span> ですー！<br>🔑 <a href=\\\"https://keybase.io/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">keybase.io/nacika</span><span class=\\\"invisible\\\"></span></a><br>干芋: <a href=\\\"https://amzn.to/3yQuni9\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">amzn.to/3yQuni9</span><span class=\\\"invisible\\\"></span></a><br>Steam: <a href=\\\"http://bit.ly/2AluV3z\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">bit.ly/2AluV3z</span><span class=\\\"invisible\\\"></span></a><br>Kyash: nacikaVRChat: nacika</p>\",\n      \"url\": \"https://oransns.com/@nacika\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/original/aff8df5bc3375751.gif\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/static/aff8df5bc3375751.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 1824,\n      \"following_count\": 1568,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 263563,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"patreon\",\n          \"value\": \"<a href=\\\"https://www.patreon.com/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">patreon.com/nacika</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"discord\",\n          \"value\": \"nacika#0050\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ニンテンドー\",\n          \"value\": \"SW-7781-2029-3706\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ブログ\",\n          \"value\": \"<a href=\\\"https://nacika.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">nacika.com</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": {\n      \"id\": \"109736580480913929\",\n      \"created_at\": \"2023-01-23T04:15:33.999Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/awu/statuses/109736580480913929\",\n      \"url\": \"https://fedibird.com/@awu/109736580480913929\",\n      \"replies_count\": 1,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>実用性なのか、転職用なのか、見栄えなのかによりますよねー</p>\",\n      \"account\": {\n        \"id\": \"108072517102886117\",\n        \"username\": \"awu\",\n        \"acct\": \"awu\",\n        \"display_name\": \"ぁぅ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": true,\n        \"group\": false,\n        \"created_at\": \"2022-04-04T00:00:00.000Z\",\n        \"note\": \"<p></p>\",\n        \"url\": \"https://fedibird.com/@awu\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/072/517/102/886/117/original/2107f6b74f5fc6ae.jpg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/072/517/102/886/117/original/2107f6b74f5fc6ae.jpg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/108/072/517/102/886/117/original/e06c9c8ffccd2c43.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/108/072/517/102/886/117/original/e06c9c8ffccd2c43.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 279,\n        \"following_count\": 120,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 21968,\n        \"last_status_at\": \"2023-01-23\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#d6954d\",\n          \"noindex\": false,\n          \"hide_network\": false,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": false,\n          \"hide_followers_count\": false,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"Web\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736570695920971\",\n    \"created_at\": \"2023-01-23T04:13:02.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://oransns.com/users/nacika/statuses/109736570578855916\",\n    \"url\": \"https://oransns.com/@nacika/109736570578855916\",\n    \"replies_count\": 1,\n    \"reblogs_count\": 3,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 1,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>緩募</p>\\n<p>エンジニアだったらこの資格とっておけみたいなやつありますか？<br>例: AWS Certified Developer - Associate</p>\",\n    \"account\": {\n      \"id\": \"107\",\n      \"username\": \"nacika\",\n      \"acct\": \"nacika@oransns.com\",\n      \"display_name\": \"なちか＠大吉\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-13T00:00:00.000Z\",\n      \"note\": \"<p>アイコンはxanacさんです🐈背景は <span class=\\\"h-card\\\"><a href=\\\"https://oransns.com/@CotTheta\\\" class=\\\"u-url mention\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>CotTheta</span></a></span> ですー！<br>🔑 <a href=\\\"https://keybase.io/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">keybase.io/nacika</span><span class=\\\"invisible\\\"></span></a><br>干芋: <a href=\\\"https://amzn.to/3yQuni9\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">amzn.to/3yQuni9</span><span class=\\\"invisible\\\"></span></a><br>Steam: <a href=\\\"http://bit.ly/2AluV3z\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">bit.ly/2AluV3z</span><span class=\\\"invisible\\\"></span></a><br>Kyash: nacikaVRChat: nacika</p>\",\n      \"url\": \"https://oransns.com/@nacika\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/original/aff8df5bc3375751.gif\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/static/aff8df5bc3375751.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 1824,\n      \"following_count\": 1568,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 263563,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"patreon\",\n          \"value\": \"<a href=\\\"https://www.patreon.com/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">patreon.com/nacika</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"discord\",\n          \"value\": \"nacika#0050\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ニンテンドー\",\n          \"value\": \"SW-7781-2029-3706\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ブログ\",\n          \"value\": \"<a href=\\\"https://nacika.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">nacika.com</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736561542946889\",\n    \"created_at\": \"2023-01-23T04:10:45.029Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109736561542946889/activity\",\n    \"url\": \"https://fedibird.com/users/Panta/statuses/109736561542946889/activity\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>よきでしたね</p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"パン太 :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p>アプリ開発のために登録しました</p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 4,\n      \"following_count\": 9,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 24,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"\",\n        \"cat_ears_color\": \"#d8c0b2\",\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109736561411887308\",\n      \"created_at\": \"2023-01-23T04:10:42.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://best-friends.chat/users/tasomaru/statuses/109736561364237600\",\n      \"url\": \"https://best-friends.chat/@tasomaru/109736561364237600\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": true,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>よきでしたね</p>\",\n      \"account\": {\n        \"id\": \"8517\",\n        \"username\": \"tasomaru\",\n        \"acct\": \"tasomaru@best-friends.chat\",\n        \"display_name\": \"たそまる\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": true,\n        \"group\": false,\n        \"created_at\": \"2019-09-04T00:00:00.000Z\",\n        \"note\": \"<p>ギャン泣き限界人類</p>\",\n        \"url\": \"https://best-friends.chat/@tasomaru\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/008/517/original/d2a7e2bac026d67f.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/008/517/original/d2a7e2bac026d67f.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/008/517/original/e787fbba1ca2aad5.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/008/517/original/e787fbba1ca2aad5.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 173,\n        \"following_count\": 143,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 69079,\n        \"last_status_at\": \"2023-01-23\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"ついった\",\n            \"value\": \"<a href=\\\"https://twitter.com/Gyxxv\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/Gyxxv</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"でぃすこ\",\n            \"value\": \"たそまる＃3726\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"APEX\",\n            \"value\": \"Rlzxy\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"Twich\",\n            \"value\": \"<a href=\\\"https://www.twitch.tv/Rlzxy\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">twitch.tv/Rlzxy</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#c2ccd3\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"application\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736553508587851\",\n    \"created_at\": \"2023-01-23T04:08:41.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://mstdn.maud.io/users/musashino205/statuses/109736553472892240\",\n    \"url\": \"https://mstdn.maud.io/@musashino205/109736553472892240\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>もしかしたらU-Bootでネットワーク使う操作しない場合、RESET下りたままになる可能性もある</p>\",\n    \"account\": {\n      \"id\": \"150\",\n      \"username\": \"musashino205\",\n      \"acct\": \"musashino205@mstdn.maud.io\",\n      \"display_name\": \"大破\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-11T00:00:00.000Z\",\n      \"note\": \"<p>アイコンは適当に保存してあったもの<br>OpenWrtデバイスサポート / LuCI 翻訳参加</p>\",\n      \"url\": \"https://mstdn.maud.io/@musashino205\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 491,\n      \"following_count\": 164,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 94162,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Web\",\n          \"value\": \"<a href=\\\"https://taiha.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">taiha.net</span><span class=\\\"invisible\\\"></span></a> / <a href=\\\"https://大破.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">大破.net</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"@musashino_205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Github\",\n          \"value\": \"musashino205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Amazon（干し芋）\",\n          \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/2LBIA1S8QGIAL\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/2LBIA</span><span class=\\\"invisible\\\">1S8QGIAL</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736550999540352\",\n    \"created_at\": \"2023-01-23T04:08:02.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://mstdn.maud.io/users/musashino205/statuses/109736550915808468\",\n    \"url\": \"https://mstdn.maud.io/@musashino205/109736550915808468\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>あー、AQR113CのRESETに繋がってるGPIO特定しておきたさあるな</p>\",\n    \"account\": {\n      \"id\": \"150\",\n      \"username\": \"musashino205\",\n      \"acct\": \"musashino205@mstdn.maud.io\",\n      \"display_name\": \"大破\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-11T00:00:00.000Z\",\n      \"note\": \"<p>アイコンは適当に保存してあったもの<br>OpenWrtデバイスサポート / LuCI 翻訳参加</p>\",\n      \"url\": \"https://mstdn.maud.io/@musashino205\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 491,\n      \"following_count\": 164,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 94162,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Web\",\n          \"value\": \"<a href=\\\"https://taiha.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">taiha.net</span><span class=\\\"invisible\\\"></span></a> / <a href=\\\"https://大破.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">大破.net</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"@musashino_205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Github\",\n          \"value\": \"musashino205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Amazon（干し芋）\",\n          \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/2LBIA1S8QGIAL\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/2LBIA</span><span class=\\\"invisible\\\">1S8QGIAL</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736547951143611\",\n    \"created_at\": \"2023-01-23T04:07:16.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://mstdn.maud.io/users/musashino205/statuses/109736547878353076\",\n    \"url\": \"https://mstdn.maud.io/@musashino205/109736547878353076\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>うなしが節分verになってることに今更気付いた</p>\",\n    \"account\": {\n      \"id\": \"150\",\n      \"username\": \"musashino205\",\n      \"acct\": \"musashino205@mstdn.maud.io\",\n      \"display_name\": \"大破\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-11T00:00:00.000Z\",\n      \"note\": \"<p>アイコンは適当に保存してあったもの<br>OpenWrtデバイスサポート / LuCI 翻訳参加</p>\",\n      \"url\": \"https://mstdn.maud.io/@musashino205\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 491,\n      \"following_count\": 164,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 94162,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Web\",\n          \"value\": \"<a href=\\\"https://taiha.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">taiha.net</span><span class=\\\"invisible\\\"></span></a> / <a href=\\\"https://大破.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">大破.net</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"@musashino_205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Github\",\n          \"value\": \"musashino205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Amazon（干し芋）\",\n          \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/2LBIA1S8QGIAL\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/2LBIA</span><span class=\\\"invisible\\\">1S8QGIAL</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736541992654675\",\n    \"created_at\": \"2023-01-23T04:05:46.724Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109736541992654675\",\n    \"url\": \"https://fedibird.com/@Panta/109736541992654675\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": true,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"pinned\": false,\n    \"content\": \"<p>test<br /><span class=\\\"h-card\\\"><a href=\\\"https://misskey.pantasystem.com/@Panta\\\" class=\\\"u-url mention\\\">@<span>Panta@misskey.pantasystem.com</span></a></span></p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"パン太 :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p>アプリ開発のために登録しました</p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/106/243/276/260/829/420/original/096ea03d4433841e.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 4,\n      \"following_count\": 9,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 24,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"\",\n        \"cat_ears_color\": \"#d8c0b2\",\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [\n      {\n        \"id\": \"108445115735130457\",\n        \"username\": \"Panta\",\n        \"url\": \"https://misskey.pantasystem.com/@Panta\",\n        \"acct\": \"Panta@misskey.pantasystem.com\",\n        \"group\": false\n      }\n    ],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736493899032002\",\n    \"created_at\": \"2023-01-23T03:53:31.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://oransns.com/users/nacika/statuses/109736493820607828\",\n    \"url\": \"https://oransns.com/@nacika/109736493820607828\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>特茶をコーヒーメーカーのプレートであたためたんだけど うめぇ、よくよく考えたら伊右衛門だからうまいわ</p>\",\n    \"account\": {\n      \"id\": \"107\",\n      \"username\": \"nacika\",\n      \"acct\": \"nacika@oransns.com\",\n      \"display_name\": \"なちか＠大吉\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-13T00:00:00.000Z\",\n      \"note\": \"<p>アイコンはxanacさんです🐈背景は <span class=\\\"h-card\\\"><a href=\\\"https://oransns.com/@CotTheta\\\" class=\\\"u-url mention\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>CotTheta</span></a></span> ですー！<br>🔑 <a href=\\\"https://keybase.io/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">keybase.io/nacika</span><span class=\\\"invisible\\\"></span></a><br>干芋: <a href=\\\"https://amzn.to/3yQuni9\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">amzn.to/3yQuni9</span><span class=\\\"invisible\\\"></span></a><br>Steam: <a href=\\\"http://bit.ly/2AluV3z\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">bit.ly/2AluV3z</span><span class=\\\"invisible\\\"></span></a><br>Kyash: nacikaVRChat: nacika</p>\",\n      \"url\": \"https://oransns.com/@nacika\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/original/aff8df5bc3375751.gif\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/107/static/aff8df5bc3375751.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/107/original/1d1903efb4146a7e.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 1824,\n      \"following_count\": 1568,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 263563,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"patreon\",\n          \"value\": \"<a href=\\\"https://www.patreon.com/nacika\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">patreon.com/nacika</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"discord\",\n          \"value\": \"nacika#0050\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ニンテンドー\",\n          \"value\": \"SW-7781-2029-3706\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ブログ\",\n          \"value\": \"<a href=\\\"https://nacika.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">nacika.com</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736473714559799\",\n    \"created_at\": \"2023-01-23T03:48:24.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://mstdn.maud.io/users/musashino205/statuses/109736473666649969\",\n    \"url\": \"https://mstdn.maud.io/@musashino205/109736473666649969\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>BUFFALOの法人向けルータのVR-U500XもIPQ807xっぽい</p>\",\n    \"account\": {\n      \"id\": \"150\",\n      \"username\": \"musashino205\",\n      \"acct\": \"musashino205@mstdn.maud.io\",\n      \"display_name\": \"大破\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2017-04-11T00:00:00.000Z\",\n      \"note\": \"<p>アイコンは適当に保存してあったもの<br>OpenWrtデバイスサポート / LuCI 翻訳参加</p>\",\n      \"url\": \"https://mstdn.maud.io/@musashino205\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/150/original/2e401cf29b2fa39f.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/150/original/fd619c296c2931b8.jpeg\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 491,\n      \"following_count\": 164,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 94162,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Web\",\n          \"value\": \"<a href=\\\"https://taiha.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">taiha.net</span><span class=\\\"invisible\\\"></span></a> / <a href=\\\"https://大破.net\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">大破.net</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"@musashino_205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Github\",\n          \"value\": \"musashino205\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Amazon（干し芋）\",\n          \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/2LBIA1S8QGIAL\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/2LBIA</span><span class=\\\"invisible\\\">1S8QGIAL</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {}\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109736419782861094\",\n    \"created_at\": \"2023-01-23T03:34:41.926Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"unlisted\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/noellabo/statuses/109736419782861094\",\n    \"url\": \"https://fedibird.com/@noellabo/109736419782861094\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 2,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [\n      \"109736333800267437\"\n    ],\n    \"status_references_count\": 1,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"private\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>おっ、NEEDY GIRL OVERDOSEの記事だ。<span class=\\\"quote-inline\\\"><br/>QT: <a class=\\\"status-url-link\\\" data-status-account-acct=\\\"akibablog@pawoo.net\\\" data-status-id=\\\"109736333800267437\\\" href=\\\"https://pawoo.net/@akibablog/109736333746948364\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">pawoo.net/@akibablog/109736333</span><span class=\\\"invisible\\\">746948364</span></a></span><span class=\\\"reference-link-inline\\\"> <a href=\\\"https://fedibird.com/@noellabo/109736419782861094/references\\\" target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\" class=\\\"status-link unhandled-link\\\" data-status-id=\\\"109736419782861094\\\">[参照]</a></span></p>\",\n    \"quote_id\": \"109736333800267437\",\n    \"account\": {\n      \"id\": \"1\",\n      \"username\": \"noellabo\",\n      \"acct\": \"noellabo\",\n      \"display_name\": \"のえる\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>主に、Fediverseへの関心に基づいた投稿を行うアカウントです。DTP・印刷に関する話をしたり、同人の話をしたり、カレーをブーストしたりします。</p><p>Mastodonのcollaborator（開発者の一員）です。また、独自機能を盛り込んだFedibirdを管理・開発しています！</p><p>Mastodonサーバ『fedibird.com』の管理者アカウントでもあります。ご連絡は当アカウントへ、サーバインフォメーションについては <a href=\\\"https://fedibird.com/about/more\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/about/more</span><span class=\\\"invisible\\\"></span></a> と <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@info\\\" class=\\\"u-url mention\\\">@<span>info</span></a></span> を参照してください。</p><p><a href=\\\"https://fedibird.com/tags/webdev\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>webdev</span></a> <a href=\\\"https://fedibird.com/tags/fedi22\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>fedi22</span></a></p>\",\n      \"url\": \"https://fedibird.com/@noellabo\",\n      \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/000/001/original/198f101fdf1d7750.png\",\n      \"header\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n      \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/000/001/original/6a5a51722c094835.jpg\",\n      \"searchability\": \"public\",\n      \"followers_count\": 6224,\n      \"following_count\": 956,\n      \"subscribing_count\": 58,\n      \"statuses_count\": 84948,\n      \"last_status_at\": \"2023-01-23\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"liberapay\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/original/5b8620742973f844.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/025/634/static/5b8620742973f844.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/original/1317b6f8efcf8318.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/008/396/static/1317b6f8efcf8318.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"misskey12_67\",\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/original/8f8aab6fd3a4c214.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/101/204/static/8f8aab6fd3a4c214.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [\n        {\n          \"name\": \":liberapay: Liberapay\",\n          \"value\": \"<a href=\\\"https://liberapay.com/noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">liberapay.com/noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2020-10-22T03:04:43.206+00:00\"\n        },\n        {\n          \"name\": \":mastodon: DTP-Mstdn.jp\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@dtp-mstdn.jp\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"55\\\" href=\\\"https://dtp-mstdn.jp/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">dtp-mstdn.jp/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2020-05-23T00:14:02.232+00:00\"\n        },\n        {\n          \"name\": \":mastodon: 別宅\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@gorone.xyz\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"14504\\\" href=\\\"https://gorone.xyz/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">gorone.xyz/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2021-08-11T07:48:53.479+00:00\"\n        },\n        {\n          \"name\": \":misskey12_67: misskey.cloud\",\n          \"value\": \"<a class=\\\"account-url-link\\\" data-account-acct=\\\"noellabo@misskey.cloud\\\" data-account-actor-type=\\\"Person\\\" data-account-id=\\\"108409794834880061\\\" href=\\\"https://misskey.cloud/@noellabo\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">misskey.cloud/@noellabo</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2022-07-12T00:51:11.984+00:00\"\n        }\n      ],\n      \"other_settings\": {\n        \"birthday\": null,\n        \"location\": \"埼玉県\",\n        \"cat_ears_color\": \"#d5c6c0\",\n        \"noindex\": true,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": {\n      \"id\": \"109736333800267437\",\n      \"created_at\": \"2023-01-23T03:12:49.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/akibablog/statuses/109736333746948364\",\n      \"url\": \"https://pawoo.net/@akibablog/109736333746948364\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 3,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 1,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>ゲーム開発未経験、たった4人のチームがなぜ全世界75万本のゲームを作り上げるに至ったのか？──病み系女子育成ADV『NEEDY GIRL OVERDOSE』のはじまりからおわりまで。<br><a href=\\\"https://news.denfaminicogamer.jp/interview/230123a\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">news.denfaminicogamer.jp/inter</span><span class=\\\"invisible\\\">view/230123a</span></a></p>\",\n      \"account\": {\n        \"id\": \"388\",\n        \"username\": \"akibablog\",\n        \"acct\": \"akibablog@pawoo.net\",\n        \"display_name\": \"アキバBlog\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-15T00:00:00.000Z\",\n        \"note\": \"<p>アキバBlogの中の人（pawoo）。主にマンガ・同人の記事更新通知と、たまに他の何か</p>\",\n        \"url\": \"https://pawoo.net/@akibablog\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/000/388/original/7646c058546e5450.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/000/388/original/7646c058546e5450.jpeg\",\n        \"header\": \"https://fedibird.com/headers/original/missing.png\",\n        \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1777,\n        \"following_count\": 110,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 63468,\n        \"last_status_at\": \"2023-01-23\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"quote_muted\": false,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": {\n        \"url\": \"https://news.denfaminicogamer.jp/interview/230123a\",\n        \"title\": \"ゲーム開発未経験、たった4人のチームがなぜ全世界75万本のゲームを作り上げるに至ったのか？──病み系女子育成ADV『NEEDY GIRL OVERDOSE』のはじまりからおわりまで。\",\n        \"description\": \"日本発・全世界75万本のヒット作『NEEDY GIRL OVERDOSE』、開発当初は「ゲームになっていなかった」。紆余曲折の開発過程で生まれた、「ゲームになった瞬間」とは？\",\n        \"type\": \"link\",\n        \"author_name\": \"\",\n        \"author_url\": \"\",\n        \"provider_name\": \"電ファミニコゲーマー – ゲームの面白い記事読んでみない？\",\n        \"provider_url\": \"https://news.denfaminicogamer.jp\",\n        \"html\": \"\",\n        \"width\": 400,\n        \"height\": 225,\n        \"image\": \"https://s3.fedibird.com/cache/preview_cards/images/009/785/546/original/36f8e19bb2bc5228.jpg\",\n        \"embed_url\": \"\",\n        \"blurhash\": \"UqOz49WB01t7ayj[oya|WVofRkRkW+j[M_WB\"\n      },\n      \"poll\": null\n    },\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": {\n      \"url\": \"https://fedibird.com/@noellabo/109736419782861094/references\",\n      \"title\": \"投稿の参照（1件） by のえる (@noellabo@fedibird.com)\",\n      \"description\": \"ゲーム開発未経験、たった4人のチームがなぜ全世界75万本のゲームを作り上げるに至ったのか？──病み系女子育成ADV『NEEDY GIRL OVERDOSE』のはじまりからおわりまで。\\nhttps://news.denfaminicogamer.jp/interview/230123a\",\n      \"type\": \"link\",\n      \"author_name\": \"\",\n      \"author_url\": \"\",\n      \"provider_name\": \"\",\n      \"provider_url\": \"\",\n      \"html\": \"\",\n      \"width\": 120,\n      \"height\": 120,\n      \"image\": \"https://s3.fedibird.com/cache/preview_cards/images/009/786/012/original/b2dc5db83ffc3d59.jpeg\",\n      \"embed_url\": \"\",\n      \"blurhash\": \"UENwWPPl}h}?GR^^EJt%I;,t^64V%WRh$IS*\",\n      \"status_id\": \"109736419782861094\",\n      \"account_id\": \"1\"\n    },\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline.json",
    "content": "[\n  {\n    \"id\": \"109707725486774538\",\n    \"created_at\": \"2023-01-18T01:57:21.728Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109707725486774538\",\n    \"url\": \"https://fedibird.com/@Panta/109707725486774538\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"pinned\": false,\n    \"content\": \"<p><span class=\\\"h-card\\\"><a href=\\\"https://misskey.io/@Panta\\\" class=\\\"u-url mention\\\">@<span>Panta@misskey.io</span></a></span> test</p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": null,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p></p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://fedibird.com/avatars/original/missing.png\",\n      \"avatar_static\": \"https://fedibird.com/avatars/original/missing.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 0,\n      \"following_count\": 6,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 2,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [],\n      \"other_settings\": {\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [\n      {\n        \"id\": \"6367\",\n        \"username\": \"Panta\",\n        \"url\": \"https://misskey.io/@Panta\",\n        \"acct\": \"Panta@misskey.io\",\n        \"group\": false\n      }\n    ],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109707693792252275\",\n    \"created_at\": \"2023-01-18T01:49:18.114Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Panta/statuses/109707693792252275\",\n    \"url\": \"https://fedibird.com/@Panta/109707693792252275\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 1,\n    \"emoji_reactions\": [\n      {\n        \"name\": \"arms_ai\",\n        \"count\": 1,\n        \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/057/900/original/b6fe95f75fc553d3.png\",\n        \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/057/900/static/b6fe95f75fc553d3.png\",\n        \"domain\": null,\n        \"account_ids\": [\n          \"106243276260829420\"\n        ],\n        \"me\": true\n      }\n    ],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": true,\n    \"pinned\": false,\n    \"content\": \"<p>test</p>\",\n    \"account\": {\n      \"id\": \"106243276260829420\",\n      \"username\": \"Panta\",\n      \"acct\": \"Panta\",\n      \"display_name\": \"\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": null,\n      \"group\": false,\n      \"created_at\": \"2021-05-16T00:00:00.000Z\",\n      \"note\": \"<p></p>\",\n      \"url\": \"https://fedibird.com/@Panta\",\n      \"avatar\": \"https://fedibird.com/avatars/original/missing.png\",\n      \"avatar_static\": \"https://fedibird.com/avatars/original/missing.png\",\n      \"header\": \"https://fedibird.com/headers/original/missing.png\",\n      \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 0,\n      \"following_count\": 6,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 2,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [],\n      \"other_settings\": {\n        \"noindex\": false,\n        \"hide_network\": false,\n        \"hide_statuses_count\": false,\n        \"hide_following_count\": false,\n        \"hide_followers_count\": false,\n        \"enable_reaction\": true\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"application\": {\n      \"name\": \"Web\",\n      \"website\": null\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691681848913309\",\n    \"created_at\": \"2023-01-15T05:57:14.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691681827231052\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691681827231052\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 1,\n    \"emoji_reactions\": [\n      {\n        \"name\": \"👍\",\n        \"count\": 1,\n        \"account_ids\": [\n          \"106243276260829420\"\n        ],\n        \"me\": true\n      }\n    ],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": true,\n    \"content\": \"<p>無から有を生成した</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691679856012143\",\n    \"created_at\": \"2023-01-15T05:56:44.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691679823227136\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691679823227136\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>やったぜ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691679222832886\",\n    \"created_at\": \"2023-01-15T05:56:34.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691679202465676\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691679202465676\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ビューティフル</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691678788697606\",\n    \"created_at\": \"2023-01-15T05:56:28.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691678778439792/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>モンスター！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109691668445280134\",\n      \"created_at\": \"2023-01-15T05:53:50.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/yawarakamidori/statuses/109691668421970054\",\n      \"url\": \"https://pawoo.net/@yawarakamidori/109691668421970054\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>モンスター！</p>\",\n      \"account\": {\n        \"id\": \"107536927157283143\",\n        \"username\": \"yawarakamidori\",\n        \"acct\": \"yawarakamidori@pawoo.net\",\n        \"display_name\": \"🔞\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2021-12-30T00:00:00.000Z\",\n        \"note\": \"<p>本人です。あんまり見てないかもしれません。<br>フォローリクエストに気づかなかったらごめんなさい。学生・未成年はダメよ。<br>鴨の庭師やってます。</p><p>2022/09/22-<br>とりあえずPawooのアカウントを予備として保守し、<br>Fedibirdにて仮運用中しています</p>\",\n        \"url\": \"https://pawoo.net/@yawarakamidori\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/107/536/927/157/283/143/original/c3a13f2572f3bf1d.jpg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/107/536/927/157/283/143/original/c3a13f2572f3bf1d.jpg\",\n        \"header\": \"https://fedibird.com/headers/original/missing.png\",\n        \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 615,\n        \"following_count\": 208,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 22786,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"Fedibirdのすがた\",\n            \"value\": \"<a href=\\\"https://fedibird.com/@nyath\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/@nyath</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": \"2023-01-16T21:10:56.608+00:00\"\n          },\n          {\n            \"name\": \"Twitterのすがた\",\n            \"value\": \"<a href=\\\"https://twitter.com/midorijp\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/midorijp</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#a1928f\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691678281595648\",\n    \"created_at\": \"2023-01-15T05:56:20.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691678257109483\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691678257109483\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 2,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>顎でもありπでもある</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691677321276670\",\n    \"created_at\": \"2023-01-15T05:56:05.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691677307715213/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>顔だけ見るとケツアゴに見える(‘､3_ヽ)_</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109691668322970054\",\n      \"created_at\": \"2023-01-15T05:53:48.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/kawarage/statuses/109691668278385003\",\n      \"url\": \"https://pawoo.net/@kawarage/109691668278385003\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>顔だけ見るとケツアゴに見える(‘､3_ヽ)_</p>\",\n      \"account\": {\n        \"id\": \"3567\",\n        \"username\": \"kawarage\",\n        \"acct\": \"kawarage@pawoo.net\",\n        \"display_name\": \"しゃくえりね　🔞🎨🔻👙\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": true,\n        \"group\": false,\n        \"created_at\": \"2019-08-19T00:00:00.000Z\",\n        \"note\": \"<p>絵を描きたい_(:3 」∠)_見たい</p><p>スマブラやってるよ　誘われたり、ID流れてきたら乱闘しちゃうよ　(‘､3_ヽ)_</p><p><a href=\\\"https://pawoo.net/tags/%E3%83%91%E3%83%B3%E3%83%84\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>パンツ</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%81%8A%E3%81%A3%E3%81%B1%E3%81%84\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>おっぱい</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%82%A8%E3%83%AB%E3%83%95\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>エルフ</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>イラスト</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%82%B9%E3%83%9E%E3%83%96%E3%83%A9\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>スマブラ</span></a></p><p><a href=\\\"https://pawoo.net/tags/Pawoo%E5%8C%97%E9%96%A2%E6%9D%B1%E9%80%A3%E5%90%88\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Pawoo北関東連合</span></a></p>\",\n        \"url\": \"https://pawoo.net/@kawarage\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/003/567/original/0c6afcfbb11dd958.gif\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/003/567/static/0c6afcfbb11dd958.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/003/567/original/0549ba421584a893.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/003/567/original/0549ba421584a893.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 2783,\n        \"following_count\": 841,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 58794,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691675820436835\",\n    \"created_at\": \"2023-01-15T05:55:42.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691675798788905\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691675798788905\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>灰羽同盟みたいな雰囲気のタッチにしてみました</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691674234734845\",\n    \"created_at\": \"2023-01-15T05:55:18.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691674200321071/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>セクシーモンスター</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109691671036547709\",\n      \"created_at\": \"2023-01-15T05:54:29.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109691670989522219\",\n      \"url\": \"https://pawoo.net/@emukoman/109691670989522219\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>セクシーモンスター</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194327,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691674118612776\",\n    \"created_at\": \"2023-01-15T05:55:16.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691674093608744/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>なまめかしすぎる</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109691667512965185\",\n      \"created_at\": \"2023-01-15T05:53:36.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109691667483687991\",\n      \"url\": \"https://pawoo.net/@emukoman/109691667483687991\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>なまめかしすぎる</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194327,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691673703965972\",\n    \"created_at\": \"2023-01-15T05:55:10.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691673681441117\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691673681441117\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ぴすぴす</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691673352154713\",\n    \"created_at\": \"2023-01-15T05:55:05.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691673326202276/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>くっそわろた</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109691665528809023\",\n      \"created_at\": \"2023-01-15T05:53:05.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109691665502257058\",\n      \"url\": \"https://pawoo.net/@emukoman/109691665502257058\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>くっそわろた</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194327,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691664060102087\",\n    \"created_at\": \"2023-01-15T05:52:43.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691664014039303\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691664014039303\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 7,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109691664040544605\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/691/664/040/544/605/original/5d8ad281402d7ca1.png\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/691/664/040/544/605/small/5d8ad281402d7ca1.png\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/691/663/867/645/427/original/198304c2fa1b078c.png\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 339,\n            \"height\": 401,\n            \"size\": \"339x401\",\n            \"aspect\": 0.8453865336658354\n          },\n          \"small\": {\n            \"width\": 339,\n            \"height\": 401,\n            \"size\": \"339x401\",\n            \"aspect\": 0.8453865336658354\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"U*KnIrJ71JxZK4R+njoLEhs.$hazR+o1kBWV\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691663116846447\",\n    \"created_at\": \"2023-01-15T05:52:29.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691663089523656/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109691460433089820\",\n      \"created_at\": \"2023-01-15T05:00:55.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": null,\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109691460380509696\",\n      \"url\": \"https://pawoo.net/@emukoman/109691460380509696\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 4,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194327,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109691460410477696\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/691/460/410/477/696/original/65ea98c6cd42a8e0.png\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/691/460/410/477/696/small/65ea98c6cd42a8e0.png\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/691/460/018/877/291/original/cfaca3863403afd4.png\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 339,\n              \"height\": 401,\n              \"size\": \"339x401\",\n              \"aspect\": 0.8453865336658354\n            },\n            \"small\": {\n              \"width\": 339,\n              \"height\": 401,\n              \"size\": \"339x401\",\n              \"aspect\": 0.8453865336658354\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"U2T9L#_3t7-;-;ofxufQxuM{ofof-;M{ayof\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691468692970399\",\n    \"created_at\": \"2023-01-15T05:03:02.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691468665221283\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691468665221283\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ほーい</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691447340819522\",\n    \"created_at\": \"2023-01-15T04:57:36.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691447315778944\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691447315778944\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ボーイの息子モミモミしちゃお❤️</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691437312676315\",\n    \"created_at\": \"2023-01-15T04:55:03.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691437270660464\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691437270660464\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>やってることが違法感満載で好き</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109691421704165091\",\n    \"created_at\": \"2023-01-15T04:51:05.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109691421661557043\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109691421661557043\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>合法ってなんだってなる動画だな</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109690782668601589\",\n    \"created_at\": \"2023-01-15T02:08:33.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109690782602496314\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109690782602496314\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 2,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71506,\n      \"last_status_at\": \"2023-01-15\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109690782640545858\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/690/782/640/545/858/original/1a5d48947dc6312f.png\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/690/782/640/545/858/small/1a5d48947dc6312f.png\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/690/782/521/572/796/original/6d60b2c349317c35.png\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 559,\n            \"height\": 368,\n            \"size\": \"559x368\",\n            \"aspect\": 1.5190217391304348\n          },\n          \"small\": {\n            \"width\": 493,\n            \"height\": 325,\n            \"size\": \"493x325\",\n            \"aspect\": 1.5169230769230768\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"URQl|Et7.mRjrqj]o~V@yDbHMwjZtlayR5t7\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline_2.json",
    "content": "[\n  {\n    \"id\": \"109682867447846122\",\n    \"created_at\": \"2023-01-13T16:32:44.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109682856070982568/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109682772629452477\",\n      \"created_at\": \"2023-01-13T16:11:29.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": null,\n      \"uri\": \"https://pawoo.net/users/tponcocchan02/statuses/109682772479586009\",\n      \"url\": \"https://pawoo.net/@tponcocchan02/109682772479586009\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 16,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"\",\n      \"account\": {\n        \"id\": \"106108055251538349\",\n        \"username\": \"tponcocchan02\",\n        \"acct\": \"tponcocchan02@pawoo.net\",\n        \"display_name\": \"ぽんこっちゃん🔞\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2021-04-22T00:00:00.000Z\",\n        \"note\": \"<p>鳥との棲み分け用です。<br>こっちでは思ったこととかあんま自重せず発言しますのでご注意ください。リムは気にせずご自由に。</p>\",\n        \"url\": \"https://pawoo.net/@tponcocchan02\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/106/108/055/251/538/349/original/01d09bcd7d88340f.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/106/108/055/251/538/349/original/01d09bcd7d88340f.png\",\n        \"header\": \"https://fedibird.com/headers/original/missing.png\",\n        \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 243,\n        \"following_count\": 152,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 17240,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e6c1b7\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109682772506971981\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/682/772/506/971/981/original/f7ecd3f88998f87a.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/682/772/506/971/981/small/f7ecd3f88998f87a.jpg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/682/771/273/328/618/original/fc6b58bea47111fa.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 600,\n              \"height\": 548,\n              \"size\": \"600x548\",\n              \"aspect\": 1.094890510948905\n            },\n            \"small\": {\n              \"width\": 418,\n              \"height\": 382,\n              \"size\": \"418x382\",\n              \"aspect\": 1.094240837696335\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"U6R3TW%MWBxu_3WB%MfQD%RjD%of00xuayof\"\n        },\n        {\n          \"id\": \"109682772532556450\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/682/772/532/556/450/original/1290b4706b082b92.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/682/772/532/556/450/small/1290b4706b082b92.jpg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/682/771/451/611/670/original/125dbd0cfa7f73d7.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 600,\n              \"height\": 548,\n              \"size\": \"600x548\",\n              \"aspect\": 1.094890510948905\n            },\n            \"small\": {\n              \"width\": 418,\n              \"height\": 382,\n              \"size\": \"418x382\",\n              \"aspect\": 1.094240837696335\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"U8RMb$WBIU-;~qWB%MofD%xuRjM{00t7WBWB\"\n        },\n        {\n          \"id\": \"109682772572061744\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/682/772/572/061/744/original/1218e115193e9f62.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/682/772/572/061/744/small/1218e115193e9f62.jpg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/682/771/620/775/013/original/9c24bfd0e615f027.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 600,\n              \"height\": 548,\n              \"size\": \"600x548\",\n              \"aspect\": 1.094890510948905\n            },\n            \"small\": {\n              \"width\": 418,\n              \"height\": 382,\n              \"size\": \"418x382\",\n              \"aspect\": 1.094240837696335\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"U9Q]+w%MRjt7-;t7%MRj9FxuRjM{00xuWBay\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109681617966947084\",\n    \"created_at\": \"2023-01-13T11:17:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109681617945990642\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109681617945990642\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>高くなってもいいからあのまま5個入りにしてくれよ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109681613014199600\",\n    \"created_at\": \"2023-01-13T11:16:36.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109681612975786396\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109681612975786396\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>薄皮あんぱん4個入り、全然前みたいな薄皮じゃなくて殺意湧いてる</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664450864820625\",\n    \"created_at\": \"2023-01-10T10:32:03.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664450840468143\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664450840468143\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ショットガンひょっとこフェラはちんこを痛めるぜ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664449652586917\",\n    \"created_at\": \"2023-01-10T10:31:35.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664449010370170/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ショットガンはちんぽを痛めるぜ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109664437868470861\",\n      \"created_at\": \"2023-01-10T10:28:43.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109664437793043188\",\n      \"url\": \"https://pawoo.net/@emukoman/109664437793043188\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>ショットガンはちんぽを痛めるぜ！</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194338,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664446763798668\",\n    \"created_at\": \"2023-01-10T10:31:00.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664446723579355\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664446723579355\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>wwwwwwwwwwww</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664421374848750\",\n    \"created_at\": \"2023-01-10T10:24:32.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664421329581580\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664421329581580\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>私はマグネッツ1号、2号が融合してカルボナーラ戦士になるの未だに許せない</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664393352962011\",\n    \"created_at\": \"2023-01-10T10:17:20.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664392982526733/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ショットガンシャッフルは金玉を痛めるぜ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109664392072944089\",\n      \"created_at\": \"2023-01-10T10:17:04.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/ironblood_kurosuke/statuses/109664391948322878\",\n      \"url\": \"https://pawoo.net/@ironblood_kurosuke/109664391948322878\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>ショットガンシャッフルは金玉を痛めるぜ！</p>\",\n      \"account\": {\n        \"id\": \"361\",\n        \"username\": \"ironblood_kurosuke\",\n        \"acct\": \"ironblood_kurosuke@pawoo.net\",\n        \"display_name\": \"高遠くろ助\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-15T00:00:00.000Z\",\n        \"note\": \"<p>クソザコお絵描きマン(҉ ́҉・҉ω҉・҉ ҉)<br>絵を貼ったり不満や不安をボヤいたりするホラ穴です</p>\",\n        \"url\": \"https://pawoo.net/@ironblood_kurosuke\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/361/original/6f759c5d8da1cb78.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/361/original/6f759c5d8da1cb78.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/361/original/802ea0f94cca9859.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/361/original/802ea0f94cca9859.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 8596,\n        \"following_count\": 216,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 13800,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"Fantia\",\n            \"value\": \"<a href=\\\"https://fantia.jp/fanclubs/5306\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fantia.jp/fanclubs/5306</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/596129\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/59612</span><span class=\\\"invisible\\\">9</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"Skeb\",\n            \"value\": \"<a href=\\\"https://skeb.jp/@takato96suke\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">skeb.jp/@takato96suke</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"ニジエ\",\n            \"value\": \"<a href=\\\"https://nijie.info/members.php?id=153711\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">nijie.info/members.php?id=1537</span><span class=\\\"invisible\\\">11</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#b4a986\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664391170629985\",\n    \"created_at\": \"2023-01-10T10:16:45.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664390685381947/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>めちゃ遅れの賀正🙏<br>改めてあけあめ！😉</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109662091574617997\",\n      \"created_at\": \"2023-01-10T00:32:02.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/uyras42/statuses/109662091514911478\",\n      \"url\": \"https://pawoo.net/@uyras42/109662091514911478\",\n      \"replies_count\": 2,\n      \"reblogs_count\": 59,\n      \"favourites_count\": 3,\n      \"emoji_reactions_count\": 17,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"👍\",\n          \"count\": 3,\n          \"account_ids\": [\n            \"2985\",\n            \"190047\",\n            \"108873613247178580\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"❤\",\n          \"count\": 8,\n          \"account_ids\": [\n            \"2007\",\n            \"109312912671134708\",\n            \"108707896557860909\",\n            \"188174\",\n            \"16950\",\n            \"108905514662633288\",\n            \"109085663834966261\",\n            \"43001\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"kawaiii\",\n          \"count\": 4,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/080/595/original/e17c6349aaebe796.png\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/080/595/static/e17c6349aaebe796.png\",\n          \"domain\": \"misskey.io\",\n          \"account_ids\": [\n            \"107040301840140854\",\n            \"109549052117738959\",\n            \"2023\",\n            \"107052503176646446\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"foxjump\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/136/288/original/c4c78c6aec369668.gif\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/136/288/static/c4c78c6aec369668.png\",\n          \"domain\": \"misskey.io\",\n          \"account_ids\": [\n            \"24303\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"ecchi\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/054/763/original/c0037765204c4bfc.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/054/763/static/c0037765204c4bfc.png\",\n          \"domain\": null,\n          \"account_ids\": [\n            \"174159\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>めちゃ遅れの賀正🙏<br>改めてあけあめ！😉</p>\",\n      \"account\": {\n        \"id\": \"182352\",\n        \"username\": \"uyras42\",\n        \"acct\": \"uyras42@pawoo.net\",\n        \"display_name\": \"🦠👾🦠\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-12-01T00:00:00.000Z\",\n        \"note\": \"<p>俺はPawooに絵なんか描きに来たんじゃねぇ！真剣に遊びに来てんだよ！</p>\",\n        \"url\": \"https://pawoo.net/@uyras42\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/182/352/original/e0396b49737f1488.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/182/352/original/e0396b49737f1488.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/182/352/original/30ae08a2dde6d2ae.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/182/352/original/30ae08a2dde6d2ae.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 90,\n        \"following_count\": 149,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 26989,\n        \"last_status_at\": \"2023-01-16\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"DLsite\",\n            \"value\": \"<a href=\\\"https://www.dlsite.com/maniax/fsr/=/language/jp/sex_category%5B0%5D/male/keyword/IRIOMOTE/keyword_maker_name/-%E8%A5%BF%E8%A1%A8%E6%B5%B7%E9%98%B2+-%E8%83%8C%E5%BE%B3%E6%BC%A2/ana_flg/off/order%5B0%5D/trend/genre_and_or/or/options_and_or/or/options%5B0%5D\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">dlsite.com/maniax/fsr/=/langua</span><span class=\\\"invisible\\\">ge/jp/sex_category%5B0%5D/male/keyword/IRIOMOTE/keyword_maker_name/-%E8%A5%BF%E8%A1%A8%E6%B5%B7%E9%98%B2+-%E8%83%8C%E5%BE%B3%E6%BC%A2/ana_flg/off/order%5B0%5D/trend/genre_and_or/or/options_and_or/or/options%5B0%5D</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANZA(DMM)\",\n            \"value\": \"<a href=\\\"https://al.dmm.co.jp/?lurl=https%3A%2F%2Fwww.dmm.co.jp%2Fdc%2Fdoujin%2F-%2Fdetail%2F%3D%2Fcid%3Dd_089455%2F&amp;af_id=tyuiok32-001&amp;ch=toolbar&amp;ch_id=link\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">al.dmm.co.jp/?lurl=https%3A%2F</span><span class=\\\"invisible\\\">%2Fwww.dmm.co.jp%2Fdc%2Fdoujin%2F-%2Fdetail%2F%3D%2Fcid%3Dd_089455%2F&amp;af_id=tyuiok32-001&amp;ch=toolbar&amp;ch_id=link</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"欲しい芋\",\n            \"value\": \"<a href=\\\"https://amzn.to/3cicTPm\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">amzn.to/3cicTPm</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#6d9a7a\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109662091537940606\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/662/091/537/940/606/original/e709ba10df2118f0.png\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/662/091/537/940/606/small/e709ba10df2118f0.png\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/662/088/735/603/767/original/219a026fc29ecbb1.png\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 995,\n              \"height\": 1536,\n              \"size\": \"995x1536\",\n              \"aspect\": 0.6477864583333334\n            },\n            \"small\": {\n              \"width\": 322,\n              \"height\": 497,\n              \"size\": \"322x497\",\n              \"aspect\": 0.647887323943662\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UKRfkBRj~qt7-;ayD%M{%Mj[IUj[IUWB%Mxu\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664391004636132\",\n    \"created_at\": \"2023-01-10T10:16:49.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664390985309674\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664390985309674\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ことよろ！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664386853389418\",\n    \"created_at\": \"2023-01-10T10:15:46.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664386836170165\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664386836170165\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ショットガンシャッフルはおちんちんを痛めるぜ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664381706367895\",\n    \"created_at\": \"2023-01-10T10:14:27.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664381672122193\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664381672122193\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>私のおちんちんはゴギガガギゴ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664380741540637\",\n    \"created_at\": \"2023-01-10T10:14:13.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664380730305566/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>カフェキチ先輩のちんこは征竜だった？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109664374073117628\",\n      \"created_at\": \"2023-01-10T10:12:31.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109664374039781390\",\n      \"url\": \"https://pawoo.net/@emukoman/109664374039781390\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>カフェキチ先輩のちんこは征竜だった？</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194338,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664379663423434\",\n    \"created_at\": \"2023-01-10T10:13:56.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664379636274136\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664379636274136\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 4,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>尿道が痛かったことにより効果発動！<br>死の破壊尿管結石！！！<br>相手の尿道にも石を入れることができるっ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664375711299438\",\n    \"created_at\": \"2023-01-10T10:12:55.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664375649610652/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>罠カード　リビングデッドの呼び声！<br>墓地のカフェキチ先輩のちんこを特殊召喚<br>さらに　カフェキチ先輩のちんこにデーモンの斧を装備！<br>尿道に！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109664370794699074\",\n      \"created_at\": \"2023-01-10T10:11:41.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109664370769673507\",\n      \"url\": \"https://pawoo.net/@emukoman/109664370769673507\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>罠カード　リビングデッドの呼び声！<br>墓地のカフェキチ先輩のちんこを特殊召喚<br>さらに　カフェキチ先輩のちんこにデーモンの斧を装備！<br>尿道に！</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194338,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664372237641125\",\n    \"created_at\": \"2023-01-10T10:12:03.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664372204234878\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664372204234878\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>除外したことによりカフェキチのちんぽの効果発動！墓地から除外された時、デッキからカフェキチのデカマラを特殊召喚できるっ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664368160820245\",\n    \"created_at\": \"2023-01-10T10:10:55.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664367778490363/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>墓地にあるカフェキチ先輩のちんこをゲームから除外！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109664364027619788\",\n      \"created_at\": \"2023-01-10T10:09:58.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109664364003899949\",\n      \"url\": \"https://pawoo.net/@emukoman/109664364003899949\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>墓地にあるカフェキチ先輩のちんこをゲームから除外！</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194338,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664366845811711\",\n    \"created_at\": \"2023-01-10T10:10:40.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664366812939499\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664366812939499\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>バーサーカーソウル発動ッ！！！<br>ドロー！おちんぽカード！<br>ドロー！おちんぽカード！<br>ドロー！おちんぽカード！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664362372691916\",\n    \"created_at\": \"2023-01-10T10:09:32.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664362330103294\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664362330103294\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>リビングデッド大混乱</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664361647054452\",\n    \"created_at\": \"2023-01-10T10:08:53.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664359767680718/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>生贄になったカフェキチ先輩のちんこは墓地に送られます</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109664358615152214\",\n      \"created_at\": \"2023-01-10T10:08:35.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/emukoman/statuses/109664358566291199\",\n      \"url\": \"https://pawoo.net/@emukoman/109664358566291199\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>生贄になったカフェキチ先輩のちんこは墓地に送られます</p>\",\n      \"account\": {\n        \"id\": \"93083\",\n        \"username\": \"emukoman\",\n        \"acct\": \"emukoman@pawoo.net\",\n        \"display_name\": \"暗黒えむ将軍　C101二日目東テ25ｂ\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2020-03-22T00:00:00.000Z\",\n        \"note\": \"<p>スケベ絵を描くマン　サークルX仮歯　<br>pixiv　<a href=\\\"http://www.pixiv.net/member.php?id=3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=303976</span><span class=\\\"invisible\\\">6</span></a></p>\",\n        \"url\": \"https://pawoo.net/@emukoman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/093/083/original/88a699d04b922b21.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/093/083/original/2f930055ea85b356.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 6952,\n        \"following_count\": 648,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 194338,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/ankokuemushogun\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/ankokuemushogun</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/fanbox/creator/3039766\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/fanbox/creator/30397</span><span class=\\\"invisible\\\">66</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"いも\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/1A322SA55HY68?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/1A322</span><span class=\\\"invisible\\\">SA55HY68?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e2dad9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline_3.json",
    "content": "[\n  {\n    \"id\": \"109664355764538044\",\n    \"created_at\": \"2023-01-10T10:07:51.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664355737491537\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664355737491537\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>俺のちんこを4体を生け贄に、<br>オシリスの天空竜を召喚ッ！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664350336362272\",\n    \"created_at\": \"2023-01-10T10:05:33.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664346637338160/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109664274038406631\",\n      \"created_at\": \"2023-01-10T09:47:04.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": null,\n      \"uri\": \"https://pawoo.net/users/mignon/statuses/109664273985441214\",\n      \"url\": \"https://pawoo.net/@mignon/109664273985441214\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 11,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"\",\n      \"account\": {\n        \"id\": \"7400\",\n        \"username\": \"mignon\",\n        \"acct\": \"mignon@pawoo.net\",\n        \"display_name\": \"はまぐり担々麺🎨🌶🌶🌶\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-29T00:00:00.000Z\",\n        \"note\": \"<p>サークル：MIGNON WORKS<br>連絡先：観音堂　<a href=\\\"http://cannondo.biz/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">cannondo.biz/</span><span class=\\\"invisible\\\"></span></a></p><p>mignon（ミニョン）の仮の姿</p><p>避難用：<a href=\\\"https://fedibird.com/@mignon\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/@mignon</span><span class=\\\"invisible\\\"></span></a></p>\",\n        \"url\": \"https://pawoo.net/@mignon\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/007/400/original/22c665a93e8cda61.jpg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/007/400/original/22c665a93e8cda61.jpg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/007/400/original/4b1dde88c0e1e4ee.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/007/400/original/4b1dde88c0e1e4ee.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 8401,\n        \"following_count\": 349,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 31490,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"twitter\",\n            \"value\": \"<a href=\\\"https://twitter.com/mignon\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/mignon</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"pixiv\",\n            \"value\": \"<a href=\\\"https://pixiv.me/mignon\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">pixiv.me/mignon</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"WEBカタログ\",\n            \"value\": \"<a href=\\\"https://webcatalog.circle.ms/Perma/Circle/10370445/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">webcatalog.circle.ms/Perma/Cir</span><span class=\\\"invisible\\\">cle/10370445/</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"fantia\",\n            \"value\": \"<a href=\\\"https://fantia.jp/fanclubs/3012\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fantia.jp/fanclubs/3012</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#b5837f\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109664274007861858\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/664/274/007/861/858/original/5b9c2e4188d36cc3.png\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/664/274/007/861/858/small/5b9c2e4188d36cc3.png\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/664/273/688/532/129/original/06ba67e5dd457444.png\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 465,\n              \"height\": 678,\n              \"size\": \"465x678\",\n              \"aspect\": 0.6858407079646017\n            },\n            \"small\": {\n              \"width\": 331,\n              \"height\": 483,\n              \"size\": \"331x483\",\n              \"aspect\": 0.6853002070393375\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UERC[6t7?bWB~qj[ofof-;WBWBofD%j[j[WB\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664346121123589\",\n    \"created_at\": \"2023-01-10T10:05:20.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664345790011476/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>いっぱい売れたちんぽの絵です</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109421460177913222\",\n      \"created_at\": \"2022-11-28T12:36:16.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/mignon/statuses/109421459995080476\",\n      \"url\": \"https://pawoo.net/@mignon/109421459995080476\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 23,\n      \"favourites_count\": 2,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>いっぱい売れたちんぽの絵です</p>\",\n      \"account\": {\n        \"id\": \"7400\",\n        \"username\": \"mignon\",\n        \"acct\": \"mignon@pawoo.net\",\n        \"display_name\": \"はまぐり担々麺🎨🌶🌶🌶\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-29T00:00:00.000Z\",\n        \"note\": \"<p>サークル：MIGNON WORKS<br>連絡先：観音堂　<a href=\\\"http://cannondo.biz/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">cannondo.biz/</span><span class=\\\"invisible\\\"></span></a></p><p>mignon（ミニョン）の仮の姿</p><p>避難用：<a href=\\\"https://fedibird.com/@mignon\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/@mignon</span><span class=\\\"invisible\\\"></span></a></p>\",\n        \"url\": \"https://pawoo.net/@mignon\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/007/400/original/22c665a93e8cda61.jpg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/007/400/original/22c665a93e8cda61.jpg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/007/400/original/4b1dde88c0e1e4ee.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/007/400/original/4b1dde88c0e1e4ee.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 8401,\n        \"following_count\": 349,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 31490,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"twitter\",\n            \"value\": \"<a href=\\\"https://twitter.com/mignon\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/mignon</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"pixiv\",\n            \"value\": \"<a href=\\\"https://pixiv.me/mignon\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">pixiv.me/mignon</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"WEBカタログ\",\n            \"value\": \"<a href=\\\"https://webcatalog.circle.ms/Perma/Circle/10370445/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">webcatalog.circle.ms/Perma/Cir</span><span class=\\\"invisible\\\">cle/10370445/</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"fantia\",\n            \"value\": \"<a href=\\\"https://fantia.jp/fanclubs/3012\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fantia.jp/fanclubs/3012</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#b5837f\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109421460104976708\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/421/460/104/976/708/original/aadca865e7b972ea.png\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/421/460/104/976/708/small/aadca865e7b972ea.png\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/421/459/383/596/874/original/f8113935ff6597a8.png\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 465,\n              \"height\": 678,\n              \"size\": \"465x678\",\n              \"aspect\": 0.6858407079646017\n            },\n            \"small\": {\n              \"width\": 331,\n              \"height\": 483,\n              \"size\": \"331x483\",\n              \"aspect\": 0.6853002070393375\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UCRp8-xu?bWB~qj[ayay-;WBM{ofIUj[ofj[\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664345032469272\",\n    \"created_at\": \"2023-01-10T10:05:07.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"zh\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664344995803187\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109664344995803187\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>綺麗</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109664338734234115\",\n    \"created_at\": \"2023-01-10T10:03:31.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109664338659173567/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>本日も17時まで営業中</p>\\n<p>ネルソンさんとのコラボ、柴又ブレンドコーヒーもレジ前にて販売開始しました</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109663567226504479\",\n      \"created_at\": \"2023-01-10T06:47:18.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://mstdn.jp/users/salutora/statuses/109663567113676021\",\n      \"url\": \"https://mstdn.jp/@salutora/109663567113676021\",\n      \"replies_count\": 4,\n      \"reblogs_count\": 8,\n      \"favourites_count\": 2,\n      \"emoji_reactions_count\": 1,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"ablobcatcoffee\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/048/527/original/f0f0116782101479.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/048/527/static/f0f0116782101479.png\",\n          \"domain\": null,\n          \"account_ids\": [\n            \"187816\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>本日も17時まで営業中</p>\\n<p>ネルソンさんとのコラボ、柴又ブレンドコーヒーもレジ前にて販売開始しました</p>\",\n      \"account\": {\n        \"id\": \"1061\",\n        \"username\": \"salutora\",\n        \"acct\": \"salutora@mstdn.jp\",\n        \"display_name\": \"salutora\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2017-04-24T00:00:00.000Z\",\n        \"note\": \"<p>東京在住のアラフォー。犬飼い続けて30年弱。ずっとスムースチワワを飼っていたが、ひょんなことから2011年に迷子の柴犬(梅吉)を保護。チワワンズは虹の向こうに旅立ってしまったけど、楽しいワンコ&amp;amp;お酒ライフ(*^^*)</p>\",\n        \"url\": \"https://mstdn.jp/@salutora\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/001/061/original/1146a673a7ef3b5d.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/001/061/original/1146a673a7ef3b5d.jpeg\",\n        \"header\": \"https://fedibird.com/headers/original/missing.png\",\n        \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1627,\n        \"following_count\": 597,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 93055,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109663567165448545\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/663/567/165/448/545/original/a194523601ff6894.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/663/567/165/448/545/small/a194523601ff6894.jpg\",\n          \"remote_url\": \"https://media.mstdn.jp/media_attachments/files/109/663/566/562/941/533/original/7e16d0de440e09a1.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 1024,\n              \"height\": 1360,\n              \"size\": \"1024x1360\",\n              \"aspect\": 0.7529411764705882\n            },\n            \"small\": {\n              \"width\": 347,\n              \"height\": 461,\n              \"size\": \"347x461\",\n              \"aspect\": 0.7527114967462039\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UFFYu#yD0K_2-nxaE2NHtmROZ}ockYWYR6ni\"\n        },\n        {\n          \"id\": \"109663567197560174\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/663/567/197/560/174/original/65d9b199aa1bb157.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/663/567/197/560/174/small/65d9b199aa1bb157.jpg\",\n          \"remote_url\": \"https://media.mstdn.jp/media_attachments/files/109/663/566/868/159/183/original/6d42f982070749d6.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 1024,\n              \"height\": 1360,\n              \"size\": \"1024x1360\",\n              \"aspect\": 0.7529411764705882\n            },\n            \"small\": {\n              \"width\": 347,\n              \"height\": 461,\n              \"size\": \"347x461\",\n              \"aspect\": 0.7527114967462039\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"U8DcUM5sbx?w^ZIUM{tnD#$,RiD%-nIUXoVX\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109663622538235182\",\n    \"created_at\": \"2023-01-10T07:01:23.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109663622500307932\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109663622500307932\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 2,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>☕</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109659159903596693\",\n    \"created_at\": \"2023-01-09T12:06:29.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109659159864766705\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109659159864766705\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>筋トレ終了～</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658825484626979\",\n    \"created_at\": \"2023-01-09T10:41:26.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658825435761992\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658825435761992\",\n    \"replies_count\": 1,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 3,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>鳥山明以外の描いたドラゴンボールキャラ見て批評したり、かと思えば鳥山明の最近のデジタル画と昔の絵柄比べて批評したりしてる奴何がしたいんだってなってる。</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658810175211020\",\n    \"created_at\": \"2023-01-09T10:37:32.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658810150925775\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658810150925775\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>きゃわわ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658810125129060\",\n    \"created_at\": \"2023-01-09T10:37:26.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658809740236534/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p><a href=\\\"https://skeb.jp/@straynight/works/37\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">skeb.jp/@straynight/works/37</span><span class=\\\"invisible\\\"></span></a></p>\\n<p>Skebぅ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658804965730838\",\n      \"created_at\": \"2023-01-09T10:36:09.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/straynight/statuses/109658804657952561\",\n      \"url\": \"https://pawoo.net/@straynight/109658804657952561\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 36,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 2,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"ablobcatheart\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/142/525/original/28f2af7e1febb339.png\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/142/525/static/28f2af7e1febb339.png\",\n          \"domain\": \"gyutte.site\",\n          \"account_ids\": [\n            \"6883\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"❤\",\n          \"count\": 1,\n          \"account_ids\": [\n            \"106737890209064650\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p><a href=\\\"https://skeb.jp/@straynight/works/37\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">skeb.jp/@straynight/works/37</span><span class=\\\"invisible\\\"></span></a></p>\\n<p>Skebぅ</p>\",\n      \"account\": {\n        \"id\": \"1476\",\n        \"username\": \"straynight\",\n        \"acct\": \"straynight@pawoo.net\",\n        \"display_name\": \"三丈えいる🐱 🔞\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-17T00:00:00.000Z\",\n        \"note\": \"<p>山篭り系アカウント<br>やり取りにフォロー関係は気にしない<br>別に裏垢ではないので普通のことしかつぶやかない</p>\",\n        \"url\": \"https://pawoo.net/@straynight\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/001/476/original/0c8b0b4780b723b1.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/001/476/original/0c8b0b4780b723b1.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/476/original/6af20abd105b7ea8.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/476/original/6af20abd105b7ea8.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 4212,\n        \"following_count\": 892,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 75357,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"🐦\",\n            \"value\": \"<a href=\\\"https://twitter.com/straynight\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/straynight</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"FANBOX\",\n            \"value\": \"<a href=\\\"https://stray.fanbox.cc/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">stray.fanbox.cc/</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"コミッション(Skeb)\",\n            \"value\": \"<a href=\\\"https://skeb.jp/@straynight\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">skeb.jp/@straynight</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"ふぇでば\",\n            \"value\": \"<a href=\\\"https://fedibird.com/@straybox\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">fedibird.com/@straybox</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": \"2023-01-16T22:57:55.802+00:00\"\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#b09f92\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109658804859119678\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/804/859/119/678/original/1a970c8ac3b0e128.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/804/859/119/678/small/1a970c8ac3b0e128.jpg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/658/802/789/467/836/original/8eea05b29a86f090.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"focus\": {\n              \"x\": 0.03,\n              \"y\": 0.79\n            },\n            \"original\": {\n              \"width\": 905,\n              \"height\": 1280,\n              \"size\": \"905x1280\",\n              \"aspect\": 0.70703125\n            },\n            \"small\": {\n              \"width\": 336,\n              \"height\": 475,\n              \"size\": \"336x475\",\n              \"aspect\": 0.7073684210526315\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UYM[HU%2?cRjxCozkDae~qniIANaRkWVs:of\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": {\n        \"url\": \"https://skeb.jp/@straynight/works/37\",\n        \"title\": \"Skeb\",\n        \"description\": \"Request Box\",\n        \"type\": \"link\",\n        \"author_name\": \"\",\n        \"author_url\": \"\",\n        \"provider_name\": \"\",\n        \"provider_url\": \"\",\n        \"html\": \"\",\n        \"width\": 400,\n        \"height\": 400,\n        \"image\": \"https://s3.fedibird.com/cache/preview_cards/images/009/433/966/original/11ffdc260d1e5585.png\",\n        \"embed_url\": \"\",\n        \"blurhash\": \"UoI$QcE100%2E1ofxbWB00%2xGRjxaf6fQbG\"\n      },\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658804811612919\",\n    \"created_at\": \"2023-01-09T10:36:10.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658804765613601\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658804765613601\",\n    \"replies_count\": 2,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>その隙間に陰毛出して観葉植物～って晒すか</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658802734631998\",\n    \"created_at\": \"2023-01-09T10:35:38.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658802671065861/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>阪急で見かけたんだけど、メンズでこれはえっちすぎでは？<br>パイパン前提なんだろうし、何用なんでしょうね</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658766341199476\",\n      \"created_at\": \"2023-01-09T10:26:21.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"en\",\n      \"uri\": \"https://mstdn.jp/users/vvvvvv1vvvvv/statuses/109658766126932473\",\n      \"url\": \"https://mstdn.jp/@vvvvvv1vvvvv/109658766126932473\",\n      \"replies_count\": 2,\n      \"reblogs_count\": 33,\n      \"favourites_count\": 9,\n      \"emoji_reactions_count\": 3,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"👍\",\n          \"count\": 2,\n          \"account_ids\": [\n            \"109164759023593699\",\n            \"107813930086437467\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"chin\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/053/723/original/1142b7eb4ceb539e.png\",\n          \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/053/723/static/1142b7eb4ceb539e.png\",\n          \"domain\": null,\n          \"account_ids\": [\n            \"106625018056376477\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>阪急で見かけたんだけど、メンズでこれはえっちすぎでは？<br>パイパン前提なんだろうし、何用なんでしょうね</p>\",\n      \"account\": {\n        \"id\": \"341\",\n        \"username\": \"vvvvvv1vvvvv\",\n        \"acct\": \"vvvvvv1vvvvv@mstdn.jp\",\n        \"display_name\": \"μネ申\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": true,\n        \"group\": false,\n        \"created_at\": \"2017-04-20T00:00:00.000Z\",\n        \"note\": \"<p>あ・え・い・う・え・お・あお!! 　　　　　　　 <br> <a href=\\\"https://vvvvvv1vvvvv.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">vvvvvv1vvvvv.com</span><span class=\\\"invisible\\\"></span></a><br>Discord μネ申#4545</p><p>🫠</p>\",\n        \"url\": \"https://mstdn.jp/@vvvvvv1vvvvv\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/000/341/original/595fa85979bd7de8.gif\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/000/341/static/595fa85979bd7de8.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/341/original/eb6a8aceb5e6fd6c.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/341/original/eb6a8aceb5e6fd6c.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 4431,\n        \"following_count\": 5012,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 283344,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109658766236380080\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/766/236/380/080/original/7bebc3a35190cabc.png\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/766/236/380/080/small/7bebc3a35190cabc.png\",\n          \"remote_url\": \"https://media.mstdn.jp/media_attachments/files/109/658/765/844/620/285/original/f581949ef8434977.png\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 960,\n              \"height\": 1280,\n              \"size\": \"960x1280\",\n              \"aspect\": 0.75\n            },\n            \"small\": {\n              \"width\": 346,\n              \"height\": 461,\n              \"size\": \"346x461\",\n              \"aspect\": 0.7505422993492408\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UJG8v4OARj-o01IpSNs9r=E1xuaLRPx]oysA\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658797480868602\",\n    \"created_at\": \"2023-01-09T09:44:02.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658599750053095/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@souji\\\" class=\\\"u-url mention\\\">@<span>souji</span></a></span> 死ぬほど長い投稿が流れてきて、すごくブーストしてみたい</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658593369132691\",\n      \"created_at\": \"2023-01-09T09:42:25.108Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/souji/statuses/109658593369132691\",\n      \"url\": \"https://fedibird.com/@souji/109658593369132691\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 2,\n      \"favourites_count\": 3,\n      \"emoji_reactions_count\": 2,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"👮\",\n          \"count\": 1,\n          \"account_ids\": [\n            \"109544248121760682\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"senko_stop\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/142/645/original/ec58ac8f74977eb5.png\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/142/645/static/ec58ac8f74977eb5.png\",\n          \"domain\": \"misskey.io\",\n          \"account_ids\": [\n            \"2094\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>死ぬほど長い投稿が流れてきて、すごくブーストしてみたい</p>\",\n      \"account\": {\n        \"id\": \"1896\",\n        \"username\": \"souji\",\n        \"acct\": \"souji\",\n        \"display_name\": \"じぇい\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-18T00:00:00.000Z\",\n        \"note\": \"<p>都合よく忘れたもんだな……トゥートは君より多いのに</p><p>※元「裏表の無い素敵なマダイ(真鯛)」です</p>\",\n        \"url\": \"https://fedibird.com/@souji\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/001/896/original/9f401f3b739560fb.jpg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/001/896/original/9f401f3b739560fb.jpg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/001/896/original/0c95092a14e69329.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/001/896/original/0c95092a14e69329.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 0,\n        \"following_count\": 16784,\n        \"subscribing_count\": 57,\n        \"statuses_count\": 263410,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"シャニマス\",\n            \"value\": \"<a href=\\\"https://shinycolors.idolmaster.jp/\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">shinycolors.idolmaster.jp/</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"コメット☆さんBD\",\n            \"value\": \"<a href=\\\"https://tohoanimationstore.com/shop/g/gTASB01726/\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">tohoanimationstore.com/shop/g/</span><span class=\\\"invisible\\\">gTASB01726/</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"ゼーガペイン\",\n            \"value\": \"<a href=\\\"http://www.zegapain.net/\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"\\\">zegapain.net/</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"メモ\",\n            \"value\": \"<a href=\\\"https://boardgamearena.com/welcome\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">boardgamearena.com/welcome</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"体重\",\n            \"value\": \"71.6 kg (+3.8kg)\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"2023年目標\",\n            \"value\": \"<a class=\\\"status-url-link\\\" data-status-account-acct=\\\"souji\\\" data-status-id=\\\"109664755486318007\\\" href=\\\"https://fedibird.com/@souji/109664755486318007\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">fedibird.com/@souji/1096647554</span><span class=\\\"invisible\\\">86318007</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"見るかもしれないアニメ\",\n            \"value\": \"<a class=\\\"status-url-link\\\" data-status-account-acct=\\\"souji\\\" data-status-id=\\\"109676313280966126\\\" href=\\\"https://fedibird.com/@souji/109676313280966126\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">fedibird.com/@souji/1096763132</span><span class=\\\"invisible\\\">80966126</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"birthday\": \"2022-08-31\",\n          \"location\": \"お前の前頭葉\",\n          \"cat_ears_color\": \"#a99ca7\",\n          \"noindex\": true,\n          \"hide_network\": false,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": false,\n          \"hide_followers_count\": true,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"お前の前頭葉\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658790655732400\",\n    \"created_at\": \"2023-01-09T10:32:21.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658789765170780\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658789765170780\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>このカフェキチはオギャるたびにバブみがはるかに増す...そのオギャるをあと2回も私は残している... その意味がわかるな？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658782161402904\",\n    \"created_at\": \"2023-01-09T10:30:22.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"zh\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658781927665810\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658781927665810\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ｵﾝｷﾞｬｰ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658773219168176\",\n    \"created_at\": \"2023-01-09T10:28:07.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658773109652347\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658773109652347\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 6,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109658773177025436\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/773/177/025/436/original/7c6f268ef551bc55.png\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/773/177/025/436/small/7c6f268ef551bc55.png\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/658/772/533/050/339/original/8926ec18dbbd3639.png\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 1010,\n            \"height\": 1010,\n            \"size\": \"1010x1010\",\n            \"aspect\": 1.0\n          },\n          \"small\": {\n            \"width\": 400,\n            \"height\": 400,\n            \"size\": \"400x400\",\n            \"aspect\": 1.0\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UTR:7;.8?c8_t8bEWAe??wM_ITx]tPRkjwxt\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658707271877575\",\n    \"created_at\": \"2023-01-09T10:11:22.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658707241169318\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658707241169318\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>お前らの股間についてるミッキーをジャンボリしますっ！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658701942896180\",\n    \"created_at\": \"2023-01-09T10:09:59.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658701821060761\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658701821060761\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>おし！仕事おわた！筋トレしよ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658680331499600\",\n    \"created_at\": \"2023-01-09T10:04:30.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658680233519586\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658680233519586\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ネタバレするとセクシー・ランドウィッチがゴンザレスQと戦うんだけど、実はそのゴンザレスQはクローンで本物のゴンザレスQは大都市惑星アフガニスタンのまさおコアになってたんだよね。そこでおしまい。</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658679572118209\",\n    \"created_at\": \"2023-01-09T09:35:08.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658564746180502/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@nu\\\" class=\\\"u-url mention\\\">@<span>nu</span></a></span> 全然マストドンおらんのに未だにちょくちょく話題に上がるトロオドンすごいな</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658553644241753\",\n      \"created_at\": \"2023-01-09T09:32:18.959Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/nu/statuses/109658553644241753\",\n      \"url\": \"https://fedibird.com/@nu/109658553644241753\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 3,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>全然マストドンおらんのに未だにちょくちょく話題に上がるトロオドンすごいな</p>\",\n      \"account\": {\n        \"id\": \"108293775749065015\",\n        \"username\": \"nu\",\n        \"acct\": \"nu\",\n        \"display_name\": \"ぬえ\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-05-13T00:00:00.000Z\",\n        \"note\": \"<p></p>\",\n        \"url\": \"https://fedibird.com/@nu\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/293/775/749/065/015/original/ff0b0b1ebcaac09e.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/293/775/749/065/015/original/ff0b0b1ebcaac09e.png\",\n        \"header\": \"https://fedibird.com/headers/original/missing.png\",\n        \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 103,\n        \"following_count\": 101,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 825,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"Twitter\",\n            \"value\": \"<a href=\\\"https://twitter.com/tsugumi_tiger\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/tsugumi_tiger</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"note\",\n            \"value\": \"<a href=\\\"https://note.com/nue_n\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">note.com/nue_n</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"Suzuri\",\n            \"value\": \"<a href=\\\"https://suzuri.jp/Nue\\\" rel=\\\"me nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">suzuri.jp/Nue</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#a67b53\",\n          \"noindex\": true,\n          \"hide_network\": true,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": false,\n          \"hide_followers_count\": false,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline_4.json",
    "content": "[\n  {\n    \"id\": \"109658675711784407\",\n    \"created_at\": \"2023-01-09T10:01:44.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658669368020307/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>水星の魔女、メチャクチャ見たいけど、話が暗すぎんよ〜</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658665777352259\",\n      \"created_at\": \"2023-01-09T10:00:48.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://best-friends.chat/users/gizenchan/statuses/109658665679384051\",\n      \"url\": \"https://best-friends.chat/@gizenchan/109658665679384051\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 5,\n      \"favourites_count\": 2,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>水星の魔女、メチャクチャ見たいけど、話が暗すぎんよ〜</p>\",\n      \"account\": {\n        \"id\": \"958\",\n        \"username\": \"gizenchan\",\n        \"acct\": \"gizenchan@best-friends.chat\",\n        \"display_name\": \"承認欲求モンスターなすーん\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-16T00:00:00.000Z\",\n        \"note\": \"<p>すまない…ただちょっと…ネットでチヤホヤされたくて…</p>\",\n        \"url\": \"https://best-friends.chat/@gizenchan\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/958/original/6d36826afd539bed.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/958/original/6d36826afd539bed.png\",\n        \"header\": \"https://fedibird.com/headers/original/missing.png\",\n        \"header_static\": \"https://fedibird.com/headers/original/missing.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1152,\n        \"following_count\": 1104,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 59002,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#ac9e95\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658668085671365\",\n    \"created_at\": \"2023-01-09T10:01:20.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658667769754652\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658667769754652\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>3㌶？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658654920231387\",\n    \"created_at\": \"2023-01-09T09:44:50.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658602853908535/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>イークイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクッ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658313812575781\",\n      \"created_at\": \"2023-01-09T08:31:18.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658313740552429\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011/109658313740552429\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 4,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>イークイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクイクッ</p>\",\n      \"account\": {\n        \"id\": \"54\",\n        \"username\": \"rkugaki_1011\",\n        \"acct\": \"rkugaki_1011@pawoo.net\",\n        \"display_name\": \"カフェキチ先輩\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-15T00:00:00.000Z\",\n        \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n        \"url\": \"https://pawoo.net/@rkugaki_1011\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 857,\n        \"following_count\": 713,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 71515,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"鳥\",\n            \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#684e45\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658639213589031\",\n    \"created_at\": \"2023-01-09T09:54:00.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658638955331215\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658638955331215\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>とりあえずみんな落ち着いて</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658620240402657\",\n    \"created_at\": \"2023-01-09T09:49:14.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658620203317626\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658620203317626\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>👌</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658619582561214\",\n    \"created_at\": \"2023-01-09T09:48:34.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658617606249314/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@fuyudazo\\\" class=\\\"u-url mention\\\">@<span>fuyudazo</span></a></span> デートとかマチアプでわざわざ会ってる男の人から蘊蓄聞かされたり、自分の好きなもの否定されたりしたくない。。（「あぁ〜あのカフェね…豆は……」「あのカフェ好きなん？おれ店長さんと仲良くて……」「ビアレッティ？いやーそれじゃなくてもっといいのがあって……」など散々聞かされた）</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109657989381587743\",\n      \"created_at\": \"2023-01-09T07:08:48.996Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/fuyudazo/statuses/109657989381587743\",\n      \"url\": \"https://fedibird.com/@fuyudazo/109657989381587743\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 10,\n      \"favourites_count\": 16,\n      \"emoji_reactions_count\": 2,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"🌠\",\n          \"count\": 1,\n          \"account_ids\": [\n            \"115168\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"🥺\",\n          \"count\": 1,\n          \"account_ids\": [\n            \"2023\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>デートとかマチアプでわざわざ会ってる男の人から蘊蓄聞かされたり、自分の好きなもの否定されたりしたくない。。（「あぁ〜あのカフェね…豆は……」「あのカフェ好きなん？おれ店長さんと仲良くて……」「ビアレッティ？いやーそれじゃなくてもっといいのがあって……」など散々聞かされた）</p>\",\n      \"account\": {\n        \"id\": \"109021715388252207\",\n        \"username\": \"fuyudazo\",\n        \"acct\": \"fuyudazo\",\n        \"display_name\": \"ふゆゆ\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-09-18T00:00:00.000Z\",\n        \"note\": \"<p>それはどうかしら</p>\",\n        \"url\": \"https://fedibird.com/@fuyudazo\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/109/021/715/388/252/207/original/16c94e5ca7c5196e.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/109/021/715/388/252/207/original/16c94e5ca7c5196e.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/109/021/715/388/252/207/original/d7772580eb84ff8f.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/109/021/715/388/252/207/original/d7772580eb84ff8f.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 177,\n        \"following_count\": 122,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 5009,\n        \"last_status_at\": \"2023-01-16\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#baa799\",\n          \"noindex\": false,\n          \"hide_network\": false,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": false,\n          \"hide_followers_count\": false,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"Tootle for Mastodon\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658619258562270\",\n    \"created_at\": \"2023-01-09T09:48:53.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658618826819565\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658618826819565\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>うわそれどこのダークカフェキチ野郎だ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658607054072056\",\n    \"created_at\": \"2023-01-09T09:45:53.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658607003552948\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658607003552948\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>はよ仕事終わらせて筋トレしなきゃ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658603219111858\",\n    \"created_at\": \"2023-01-09T09:44:54.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658603130856055\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658603130856055\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>これかな？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658598617227004\",\n    \"created_at\": \"2023-01-09T09:43:00.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658595665990821\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658595665990821\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>なんかおじさんの知らない流行り言葉が出てきてるみたいね</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658575475008994\",\n    \"created_at\": \"2023-01-09T09:35:40.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658566872376079\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658566872376079\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>トロオドンのあの独特なオイリーな雰囲気は独特だからオイリーなんだと思います。</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658541581778789\",\n    \"created_at\": \"2023-01-09T09:29:09.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658541202237840\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658541202237840\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>みんな察してるのじわる</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658537790385194\",\n    \"created_at\": \"2023-01-09T09:28:12.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658537472854881\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658537472854881\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>おやすみいいよ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658536427500482\",\n    \"created_at\": \"2023-01-09T09:27:44.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658535682049496\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658535682049496\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>仕事終わったと思ったら残ってて草</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658528253211294\",\n    \"created_at\": \"2023-01-09T09:25:41.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658527571125981\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658527571125981\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>片岡LOVE之助はいいのね</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658526120458506\",\n    \"created_at\": \"2023-01-09T09:25:17.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658526026155009/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>馴染んでるのならいいんだけどねぇ<br>愛之助はわりと好きです</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658520226670537\",\n      \"created_at\": \"2023-01-09T09:23:47.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://gorone.xyz/users/simpson_gorotsuki/statuses/109658520152757972\",\n      \"url\": \"https://gorone.xyz/@simpson_gorotsuki/109658520152757972\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>馴染んでるのならいいんだけどねぇ<br>愛之助はわりと好きです</p>\",\n      \"account\": {\n        \"id\": \"22139\",\n        \"username\": \"simpson_gorotsuki\",\n        \"acct\": \"simpson_gorotsuki@gorone.xyz\",\n        \"display_name\": \"シンプソンGX\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2018-10-05T00:00:00.000Z\",\n        \"note\": \"<p>酒で人権を取り戻せ2022</p>\",\n        \"url\": \"https://gorone.xyz/@simpson_gorotsuki\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/139/original/7b1a4000f839fb4a.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/139/original/7b1a4000f839fb4a.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/022/139/original/99b6d40af0413604.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/022/139/original/99b6d40af0413604.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 345,\n        \"following_count\": 354,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 16281,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#648f86\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658517737454489\",\n    \"created_at\": \"2023-01-09T09:23:10.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658517679711032\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658517679711032\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>片岡❤️之助とかかな？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658517201438770\",\n    \"created_at\": \"2023-01-09T09:22:48.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658516229977846/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>歌舞伎役者がしれっと地上波や映画でそこそこの役にキャスティングされること</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658514640019945\",\n      \"created_at\": \"2023-01-09T09:22:22.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": true,\n      \"spoiler_text\": \"俺が地味に嫌いなもの\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://gorone.xyz/users/simpson_gorotsuki/statuses/109658514563298057\",\n      \"url\": \"https://gorone.xyz/@simpson_gorotsuki/109658514563298057\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 4,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>歌舞伎役者がしれっと地上波や映画でそこそこの役にキャスティングされること</p>\",\n      \"account\": {\n        \"id\": \"22139\",\n        \"username\": \"simpson_gorotsuki\",\n        \"acct\": \"simpson_gorotsuki@gorone.xyz\",\n        \"display_name\": \"シンプソンGX\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2018-10-05T00:00:00.000Z\",\n        \"note\": \"<p>酒で人権を取り戻せ2022</p>\",\n        \"url\": \"https://gorone.xyz/@simpson_gorotsuki\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/139/original/7b1a4000f839fb4a.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/139/original/7b1a4000f839fb4a.png\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/022/139/original/99b6d40af0413604.png\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/022/139/original/99b6d40af0413604.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 345,\n        \"following_count\": 354,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 16281,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#648f86\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658513882314786\",\n    \"created_at\": \"2023-01-09T09:22:11.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658513796472107\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658513796472107\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ンホォッ！！！ンホォッ！！！ンホォッ！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658513662840705\",\n    \"created_at\": \"2023-01-09T09:22:01.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658513172776618/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>筋トレしながら　んほぉ　って叫ぶと余計にゴリラ感増す(‘､3_ヽ)_</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658512179917884\",\n      \"created_at\": \"2023-01-09T09:21:41.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/kawarage/statuses/109658511820155956\",\n      \"url\": \"https://pawoo.net/@kawarage/109658511820155956\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 2,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>筋トレしながら　んほぉ　って叫ぶと余計にゴリラ感増す(‘､3_ヽ)_</p>\",\n      \"account\": {\n        \"id\": \"3567\",\n        \"username\": \"kawarage\",\n        \"acct\": \"kawarage@pawoo.net\",\n        \"display_name\": \"しゃくえりね　🔞🎨🔻👙\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": true,\n        \"group\": false,\n        \"created_at\": \"2019-08-19T00:00:00.000Z\",\n        \"note\": \"<p>絵を描きたい_(:3 」∠)_見たい</p><p>スマブラやってるよ　誘われたり、ID流れてきたら乱闘しちゃうよ　(‘､3_ヽ)_</p><p><a href=\\\"https://pawoo.net/tags/%E3%83%91%E3%83%B3%E3%83%84\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>パンツ</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%81%8A%E3%81%A3%E3%81%B1%E3%81%84\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>おっぱい</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%82%A8%E3%83%AB%E3%83%95\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>エルフ</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>イラスト</span></a><br><a href=\\\"https://pawoo.net/tags/%E3%82%B9%E3%83%9E%E3%83%96%E3%83%A9\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>スマブラ</span></a></p><p><a href=\\\"https://pawoo.net/tags/Pawoo%E5%8C%97%E9%96%A2%E6%9D%B1%E9%80%A3%E5%90%88\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Pawoo北関東連合</span></a></p>\",\n        \"url\": \"https://pawoo.net/@kawarage\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/003/567/original/0c6afcfbb11dd958.gif\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/003/567/static/0c6afcfbb11dd958.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/003/567/original/0549ba421584a893.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/003/567/original/0549ba421584a893.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 2783,\n        \"following_count\": 841,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 58794,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline_5.json",
    "content": "[\n  {\n    \"id\": \"109658511773899802\",\n    \"created_at\": \"2023-01-09T09:21:35.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658511477643350\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658511477643350\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>バナナ剥いて天に掲げてシュワッチってしたくなるよね</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658507120117306\",\n    \"created_at\": \"2023-01-09T09:20:23.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658506721387871\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658506721387871\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>なんかこのトゥートゴリラ感あるな</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658505150791706\",\n    \"created_at\": \"2023-01-09T09:19:58.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658505094000780\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658505094000780\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>バナナ食ったら筋トレするか</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658498231076179\",\n    \"created_at\": \"2023-01-09T09:18:04.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658497641976398\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658497641976398\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ノォォォォォォォン！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658497205352847\",\n    \"created_at\": \"2023-01-09T09:17:51.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658496789429994/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>カヘキチ先輩卑猥だから<br>国税局に通報するね</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658485521612257\",\n      \"created_at\": \"2023-01-09T09:14:46.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/mirakurun94/statuses/109658484639632046\",\n      \"url\": \"https://pawoo.net/@mirakurun94/109658484639632046\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>カヘキチ先輩卑猥だから<br>国税局に通報するね</p>\",\n      \"account\": {\n        \"id\": \"914\",\n        \"username\": \"mirakurun94\",\n        \"acct\": \"mirakurun94@pawoo.net\",\n        \"display_name\": \"モンテアルバンれんちょん🦀​:pawoo2:\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-16T00:00:00.000Z\",\n        \"note\": \"<p>Pawoo老人会ランキング凱聖な自分の事を<br>宮内れんげと思い込む人ですのん</p>\",\n        \"url\": \"https://pawoo.net/@mirakurun94\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/914/original/d851f531a2fa7845.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/914/original/d851f531a2fa7845.jpeg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/914/original/d1aa4611fa808f32.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/914/original/d1aa4611fa808f32.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1523,\n        \"following_count\": 1280,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 395407,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [\n          {\n            \"shortcode\": \"pawoo2\",\n            \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/747/original/21db01929757dc2d.png\",\n            \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/747/static/21db01929757dc2d.png\",\n            \"visible_in_picker\": true\n          }\n        ],\n        \"fields\": [\n          {\n            \"name\": \"干し芋\",\n            \"value\": \"<a href=\\\"https://www.amazon.co.jp/hz/wishlist/ls/3DQHQ9C7715J1?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.co.jp/hz/wishlist/ls/3D</span><span class=\\\"invisible\\\">QHQ9C7715J1?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"にゃんぱすーー\",\n            \"value\": \"金\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"にゃんぱすーー\",\n            \"value\": \"暴力\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"にゃんぱすーー\",\n            \"value\": \"SEX\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#a2a1a9\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658495717473312\",\n    \"created_at\": \"2023-01-09T09:17:31.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"zh\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658495471643823\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658495471643823\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>私服</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109658495668023178\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/495/668/023/178/original/30b1328035ee4042.png\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/495/668/023/178/small/30b1328035ee4042.png\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/658/495/072/543/018/original/4110750cc5e3c63a.png\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 1000,\n            \"height\": 1000,\n            \"size\": \"1000x1000\",\n            \"aspect\": 1.0\n          },\n          \"small\": {\n            \"width\": 400,\n            \"height\": 400,\n            \"size\": \"400x400\",\n            \"aspect\": 1.0\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UrQ,E-of~qRjt7ayR*js-;fkIUj[ozayaej[\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658485927589457\",\n    \"created_at\": \"2023-01-09T09:14:47.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658484709863403/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>バス乗らない距離の買い物スタイルは猫キャットちゃんとだいたい一緒だわ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658225731258243\",\n      \"created_at\": \"2023-01-09T08:08:41.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/kawaju/statuses/109658224851061526\",\n      \"url\": \"https://pawoo.net/@kawaju/109658224851061526\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 8,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>バス乗らない距離の買い物スタイルは猫キャットちゃんとだいたい一緒だわ</p>\",\n      \"account\": {\n        \"id\": \"1855\",\n        \"username\": \"kawaju\",\n        \"acct\": \"kawaju@pawoo.net\",\n        \"display_name\": \"地球大統領Gドメスティクス🔞🐔\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": true,\n        \"group\": false,\n        \"created_at\": \"2019-08-18T00:00:00.000Z\",\n        \"note\": \"<p>平野河重というPNで女の子が酷い目に遭う漫画描いてます うちの子過激派 <a href=\\\"https://pawoo.net/tags/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>イラスト</span></a> <a href=\\\"https://pawoo.net/tags/%E6%BC%AB%E7%94%BB\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>漫画</span></a></p>\",\n        \"url\": \"https://pawoo.net/@kawaju\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/001/855/original/2044a001e0c76336.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/001/855/original/2044a001e0c76336.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/855/original/2a60da6f6900e388.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/855/original/2a60da6f6900e388.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 2083,\n        \"following_count\": 1074,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 104663,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"Twitter\",\n            \"value\": \"<a href=\\\"https://twitter.com/kawaju\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/kawaju</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"干芋\",\n            \"value\": \"<a href=\\\"https://www.amazon.co.jp/hz/wishlist/ls/2DC24N2NL3UD0/ref=nav_wishlist_lists_1?_encoding=UTF8&amp;type=wishlist\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.co.jp/hz/wishlist/ls/2D</span><span class=\\\"invisible\\\">C24N2NL3UD0/ref=nav_wishlist_lists_1?_encoding=UTF8&amp;type=wishlist</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"Skeb\",\n            \"value\": \"<a href=\\\"https://skeb.jp/@kawaju\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">skeb.jp/@kawaju</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"単行本等\",\n            \"value\": \"<a href=\\\"http://www.dmm.co.jp/mono/book/-/list/=/article=author/id=252444/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"ellipsis\\\">dmm.co.jp/mono/book/-/list/=/a</span><span class=\\\"invisible\\\">rticle=author/id=252444/</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#7e7774\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109658225697487715\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/225/697/487/715/original/19d9839c03124eb2.png\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/225/697/487/715/small/19d9839c03124eb2.png\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/658/222/620/301/102/original/d72cfa4cb35ecbc0.png\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 864,\n              \"height\": 961,\n              \"size\": \"864x961\",\n              \"aspect\": 0.899063475546306\n            },\n            \"small\": {\n              \"width\": 379,\n              \"height\": 422,\n              \"size\": \"379x422\",\n              \"aspect\": 0.8981042654028436\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UIR{#?j[~qof%Mt7j[Rjt7ofofRjWBRjayt7\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658482075249549\",\n    \"created_at\": \"2023-01-09T09:14:01.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658481685367921\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658481685367921\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>おはちんぽー！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658480301379113\",\n    \"created_at\": \"2023-01-09T09:13:38.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658480178829993\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658480178829993\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>きれい！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658479925276182\",\n    \"created_at\": \"2023-01-09T09:13:31.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658479731953285/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>残り香</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109656715973691413\",\n      \"created_at\": \"2023-01-09T01:44:55.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/foomidori/statuses/109656715809803636\",\n      \"url\": \"https://pawoo.net/@foomidori/109656715809803636\",\n      \"replies_count\": 1,\n      \"reblogs_count\": 67,\n      \"favourites_count\": 16,\n      \"emoji_reactions_count\": 20,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"❤\",\n          \"count\": 7,\n          \"account_ids\": [\n            \"4172\",\n            \"107341891348118514\",\n            \"108873613247178580\",\n            \"43001\",\n            \"109573558586023667\",\n            \"106737890209064650\",\n            \"109407802260653746\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"kawaii\",\n          \"count\": 4,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/178/845/original/54d0230d17fe5090.png\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/178/845/static/54d0230d17fe5090.png\",\n          \"domain\": \"misskey.io\",\n          \"account_ids\": [\n            \"109300851342520579\",\n            \"126396\",\n            \"109285472439391947\",\n            \"109285174575554293\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"nacho_suki\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/164/599/original/67987979d1f2e357.png\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/164/599/static/67987979d1f2e357.png\",\n          \"domain\": \"misskey.io\",\n          \"account_ids\": [\n            \"74855\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"👍\",\n          \"count\": 3,\n          \"account_ids\": [\n            \"108823239491194999\",\n            \"108117441984573069\",\n            \"17824\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"agooglehearts\",\n          \"count\": 1,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/148/772/original/0754b5e285fa557b.png\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/148/772/static/0754b5e285fa557b.png\",\n          \"domain\": \"mi.tkw.fm\",\n          \"account_ids\": [\n            \"106941664584092089\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"kawaiii\",\n          \"count\": 4,\n          \"url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/080/595/original/e17c6349aaebe796.png\",\n          \"static_url\": \"https://s3.fedibird.com/cache/custom_emojis/images/000/080/595/static/e17c6349aaebe796.png\",\n          \"domain\": \"misskey.io\",\n          \"account_ids\": [\n            \"2023\",\n            \"109550338979758405\",\n            \"106363082699153366\",\n            \"109619207774463192\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>残り香</p>\",\n      \"account\": {\n        \"id\": \"1305\",\n        \"username\": \"foomidori\",\n        \"acct\": \"foomidori@pawoo.net\",\n        \"display_name\": \"モンテカルロたかし\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-17T00:00:00.000Z\",\n        \"note\": \"<p>イラストレーター🎨<br><a href=\\\"https://twitter.com/foomidori\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/foomidori</span><span class=\\\"invisible\\\"></span></a><br><a href=\\\"http://www.weibo.com/u/6128922855\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"\\\">weibo.com/u/6128922855</span><span class=\\\"invisible\\\"></span></a><br>foomidori@ybb.ne.jp<br><a href=\\\"https://www.pixiv.me/foomidori\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">pixiv.me/foomidori</span><span class=\\\"invisible\\\"></span></a><br>禁無断転載・加工</p>\",\n        \"url\": \"https://pawoo.net/@foomidori\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/001/305/original/fdfd9b8c207bc279.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/001/305/original/fdfd9b8c207bc279.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/001/305/original/1c640964f3b3bc3f.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/001/305/original/1c640964f3b3bc3f.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 4837,\n        \"following_count\": 2224,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 257633,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109656715931866829\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/656/715/931/866/829/original/9ada129561f3e2c9.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/656/715/931/866/829/small/9ada129561f3e2c9.jpg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/656/712/382/151/732/original/dbc8f74233cb08d5.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 1000,\n              \"height\": 1332,\n              \"size\": \"1000x1332\",\n              \"aspect\": 0.7507507507507507\n            },\n            \"small\": {\n              \"width\": 347,\n              \"height\": 462,\n              \"size\": \"347x462\",\n              \"aspect\": 0.7510822510822511\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UPMtBlWZ~CxZaKM|%fRk%gIor?xutRxaRQt7\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658384694901013\",\n    \"created_at\": \"2023-01-09T08:49:19.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658384607403109\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658384607403109\",\n    \"replies_count\": 1,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>何にとは言わないけど気持ちはわかる</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658384037596113\",\n    \"created_at\": \"2023-01-09T08:49:02.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658383484470681/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>何にとは言わないけどやりやすそう</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658371026290629\",\n      \"created_at\": \"2023-01-09T08:45:51.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://mstdn.beer/users/Benisake/statuses/109658370992723862\",\n      \"url\": \"https://mstdn.beer/@Benisake/109658370992723862\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>何にとは言わないけどやりやすそう</p>\",\n      \"account\": {\n        \"id\": \"22075\",\n        \"username\": \"Benisake\",\n        \"acct\": \"Benisake@mstdn.beer\",\n        \"display_name\": \"紅鮭(ビア鯖公認の信頼)\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-10-23T00:00:00.000Z\",\n        \"note\": \"<p>さけです<br>よろしくおねがいします</p>\",\n        \"url\": \"https://mstdn.beer/@Benisake\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/075/original/2a6d95ba33fed4be.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/075/original/2a6d95ba33fed4be.jpeg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/022/075/original/90e151ae98d08442.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/022/075/original/90e151ae98d08442.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 337,\n        \"following_count\": 313,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 22492,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#694e3c\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658383964348563\",\n    \"created_at\": \"2023-01-09T08:48:42.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658382152712455\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658382152712455\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>？？？？？？？？？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658383828179639\",\n    \"created_at\": \"2023-01-09T08:48:37.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658381837349663/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>百鬼夜行は！！！！！まだですか！！！！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658357290180032\",\n      \"created_at\": \"2023-01-09T08:42:20.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/nelsoncoffeeroaster/statuses/109658357112276849\",\n      \"url\": \"https://pawoo.net/@nelsoncoffeeroaster/109658357112276849\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>百鬼夜行は！！！！！まだですか！！！！！！</p>\",\n      \"account\": {\n        \"id\": \"1746\",\n        \"username\": \"nelsoncoffeeroaster\",\n        \"acct\": \"nelsoncoffeeroaster@pawoo.net\",\n        \"display_name\": \"Nelson Coffee Roaster ✅☕️ 🈺🙈\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-17T00:00:00.000Z\",\n        \"note\": \"<p>席をはずしています☕️<br>急ぎの御用は諦めてください🙈</p><p>豆を<br>買いましょう<br>定期<br>コーヒー豆のお求めはこちら↓AmazonPayで決済らくらくです<br><a href=\\\"https://ncr.official.ec\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">ncr.official.ec</span><span class=\\\"invisible\\\"></span></a><br>ヤフーショッピング<br><a href=\\\"https://store.shopping.yahoo.co.jp/nelsoncoffeeroaster/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">store.shopping.yahoo.co.jp/nel</span><span class=\\\"invisible\\\">soncoffeeroaster/</span></a></p>\",\n        \"url\": \"https://pawoo.net/@nelsoncoffeeroaster\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/001/746/original/a1da0dd0d56638ee.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/001/746/original/a1da0dd0d56638ee.jpeg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/746/original/1d2b9e51947a43d2.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/746/original/1d2b9e51947a43d2.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1937,\n        \"following_count\": 1453,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 276713,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"はやさ\",\n            \"value\": \"99\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"ちから\",\n            \"value\": \"8\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"まほう\",\n            \"value\": \"3\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"うん\",\n            \"value\": \"99\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658361623814845\",\n    \"created_at\": \"2023-01-09T08:43:25.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658361383926469\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658361383926469\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>SHEINこわい…色々な意味で</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658358446088960\",\n    \"created_at\": \"2023-01-09T08:42:25.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658357472396687\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658357472396687\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>パーマがいい感じだ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658354442172050\",\n    \"created_at\": \"2023-01-09T08:41:35.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658354206928455\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658354206928455\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>いただきます！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658354100789536\",\n    \"created_at\": \"2023-01-09T08:41:29.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658353815924765/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>こってりスープできたわよ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658346048256448\",\n      \"created_at\": \"2023-01-09T08:39:25.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/nelsoncoffeeroaster/statuses/109658345647130134\",\n      \"url\": \"https://pawoo.net/@nelsoncoffeeroaster/109658345647130134\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 3,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>こってりスープできたわよ</p>\",\n      \"account\": {\n        \"id\": \"1746\",\n        \"username\": \"nelsoncoffeeroaster\",\n        \"acct\": \"nelsoncoffeeroaster@pawoo.net\",\n        \"display_name\": \"Nelson Coffee Roaster ✅☕️ 🈺🙈\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-17T00:00:00.000Z\",\n        \"note\": \"<p>席をはずしています☕️<br>急ぎの御用は諦めてください🙈</p><p>豆を<br>買いましょう<br>定期<br>コーヒー豆のお求めはこちら↓AmazonPayで決済らくらくです<br><a href=\\\"https://ncr.official.ec\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">ncr.official.ec</span><span class=\\\"invisible\\\"></span></a><br>ヤフーショッピング<br><a href=\\\"https://store.shopping.yahoo.co.jp/nelsoncoffeeroaster/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">store.shopping.yahoo.co.jp/nel</span><span class=\\\"invisible\\\">soncoffeeroaster/</span></a></p>\",\n        \"url\": \"https://pawoo.net/@nelsoncoffeeroaster\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/001/746/original/a1da0dd0d56638ee.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/001/746/original/a1da0dd0d56638ee.jpeg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/746/original/1d2b9e51947a43d2.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/001/746/original/1d2b9e51947a43d2.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1937,\n        \"following_count\": 1453,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 276713,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"はやさ\",\n            \"value\": \"99\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"ちから\",\n            \"value\": \"8\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"まほう\",\n            \"value\": \"3\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"うん\",\n            \"value\": \"99\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109658346022032553\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/346/022/032/553/original/5f78387d1e062369.jpeg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/346/022/032/553/small/5f78387d1e062369.jpeg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/658/345/456/492/124/original/4dc33cddd5d3f3cc.jpeg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 1109,\n              \"height\": 1478,\n              \"size\": \"1109x1478\",\n              \"aspect\": 0.7503382949932341\n            },\n            \"small\": {\n              \"width\": 346,\n              \"height\": 461,\n              \"size\": \"346x461\",\n              \"aspect\": 0.7505422993492408\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UPM$hH=_0i-nb]xCjYod0iofNeNJxsn~niWV\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658353062739784\",\n    \"created_at\": \"2023-01-09T08:41:15.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658352857000331/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@ei_nagasawa\\\" class=\\\"u-url mention\\\">@<span>ei_nagasawa</span></a></span> 人生は寝取りタヌキのイク残尿</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658346328049266\",\n      \"created_at\": \"2023-01-09T08:39:35.564Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/ei_nagasawa/statuses/109658346328049266\",\n      \"url\": \"https://fedibird.com/@ei_nagasawa/109658346328049266\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>人生は寝取りタヌキのイク残尿</p>\",\n      \"account\": {\n        \"id\": \"108566264597404531\",\n        \"username\": \"ei_nagasawa\",\n        \"acct\": \"ei_nagasawa\",\n        \"display_name\": \"神社ちゃん\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-06-30T00:00:00.000Z\",\n        \"note\": \"<p><a href=\\\"https://www.mixcloud.com/jaheast/dub-poetry-reading-natty/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">mixcloud.com/jaheast/dub-poetr</span><span class=\\\"invisible\\\">y-reading-natty/</span></a></p>\",\n        \"url\": \"https://fedibird.com/@ei_nagasawa\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/566/264/597/404/531/original/982f595bffed9609.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/566/264/597/404/531/original/982f595bffed9609.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/108/566/264/597/404/531/original/615fecc4f6915ef0.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/108/566/264/597/404/531/original/615fecc4f6915ef0.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 151,\n        \"following_count\": 148,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 28792,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#d2a989\",\n          \"noindex\": false,\n          \"hide_network\": false,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": false,\n          \"hide_followers_count\": false,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"Web\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658352385871697\",\n    \"created_at\": \"2023-01-09T08:40:53.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658351434030457\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658351434030457\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 2,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>多分SHEINは性癖を歪めにきてる</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71515,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109658352364113980\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/352/364/113/980/original/861140ff45488c9c.jpg\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/658/352/364/113/980/small/861140ff45488c9c.jpg\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/658/349/965/788/204/original/1d35c8691aedf5a4.jpg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 429,\n            \"height\": 1088,\n            \"size\": \"429x1088\",\n            \"aspect\": 0.3943014705882353\n          },\n          \"small\": {\n            \"width\": 251,\n            \"height\": 637,\n            \"size\": \"251x637\",\n            \"aspect\": 0.3940345368916798\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"U~M7rzWBt7oL00bHoff5t7a|ayoL-;fkayj[\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline_6.json",
    "content": "[\n  {\n    \"id\": \"109658343587065409\",\n    \"created_at\": \"2023-01-09T08:38:46.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658343126606278\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658343126606278\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>だいたい人生は寝取りタヌキのイク残尿ってことわざでなりたってんだよ！！！<br>しらんけど</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658325625649190\",\n    \"created_at\": \"2023-01-09T08:34:18.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658325547725609\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658325547725609\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>先っぽイキスギ先輩！？ファッションリーダーだ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658322053982575\",\n    \"created_at\": \"2023-01-09T08:33:21.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658321782535518\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658321782535518\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>大変申し訳ございませんでした</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658320276287499\",\n    \"created_at\": \"2023-01-09T08:32:57.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658320208301390\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658320208301390\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>もしかしてこのアカウントってマルチバース？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658317783234629\",\n    \"created_at\": \"2023-01-09T08:32:15.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658317516526696/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>二次元のカフェキチ先輩と<br>喋ってる中の人と<br>乳首が光るムキムキの腹筋の人と<br>ハンサムなメガネの好青年が<br>同じ人なのがうまう処理できていません</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658315979758236\",\n      \"created_at\": \"2023-01-09T08:31:47.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/foomidori/statuses/109658315629641699\",\n      \"url\": \"https://pawoo.net/@foomidori/109658315629641699\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 2,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>二次元のカフェキチ先輩と<br>喋ってる中の人と<br>乳首が光るムキムキの腹筋の人と<br>ハンサムなメガネの好青年が<br>同じ人なのがうまう処理できていません</p>\",\n      \"account\": {\n        \"id\": \"1305\",\n        \"username\": \"foomidori\",\n        \"acct\": \"foomidori@pawoo.net\",\n        \"display_name\": \"モンテカルロたかし\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-17T00:00:00.000Z\",\n        \"note\": \"<p>イラストレーター🎨<br><a href=\\\"https://twitter.com/foomidori\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/foomidori</span><span class=\\\"invisible\\\"></span></a><br><a href=\\\"http://www.weibo.com/u/6128922855\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"\\\">weibo.com/u/6128922855</span><span class=\\\"invisible\\\"></span></a><br>foomidori@ybb.ne.jp<br><a href=\\\"https://www.pixiv.me/foomidori\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">pixiv.me/foomidori</span><span class=\\\"invisible\\\"></span></a><br>禁無断転載・加工</p>\",\n        \"url\": \"https://pawoo.net/@foomidori\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/001/305/original/fdfd9b8c207bc279.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/001/305/original/fdfd9b8c207bc279.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/001/305/original/1c640964f3b3bc3f.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/001/305/original/1c640964f3b3bc3f.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 4837,\n        \"following_count\": 2224,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 257633,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658316835737203\",\n    \"created_at\": \"2023-01-09T08:31:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658315997864788\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658315997864788\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>千賀のフォークみたいな変化球トゥート</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658315550661772\",\n    \"created_at\": \"2023-01-09T08:31:35.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658314887936880/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>こいつ次のトゥートでちんぽって言うぞ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109658312287054534\",\n      \"created_at\": \"2023-01-09T08:30:55.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://mstdn.beer/users/Benisake/statuses/109658312258769542\",\n      \"url\": \"https://mstdn.beer/@Benisake/109658312258769542\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 2,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>こいつ次のトゥートでちんぽって言うぞ</p>\",\n      \"account\": {\n        \"id\": \"22075\",\n        \"username\": \"Benisake\",\n        \"acct\": \"Benisake@mstdn.beer\",\n        \"display_name\": \"紅鮭(ビア鯖公認の信頼)\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-10-23T00:00:00.000Z\",\n        \"note\": \"<p>さけです<br>よろしくおねがいします</p>\",\n        \"url\": \"https://mstdn.beer/@Benisake\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/075/original/2a6d95ba33fed4be.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/075/original/2a6d95ba33fed4be.jpeg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/022/075/original/90e151ae98d08442.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/022/075/original/90e151ae98d08442.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 337,\n        \"following_count\": 313,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 22493,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#694e3c\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658310238581132\",\n    \"created_at\": \"2023-01-09T08:30:22.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658310094359478\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658310094359478\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>もう</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658309873183168\",\n    \"created_at\": \"2023-01-09T08:30:16.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658309705972725\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658309705972725\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>まったく</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109658309444475158\",\n    \"created_at\": \"2023-01-09T08:30:06.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109658309020280745\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109658309020280745\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ちんぽちんぽ言ってないで少しは落ち着いてくださいよ皆さん</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109651652888735354\",\n    \"created_at\": \"2023-01-08T04:17:12.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109651652312180138/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>うぎーカフェキチ一瞬グロ画像と思って怖かったアル‼️‼️‼️</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109651651868877548\",\n      \"created_at\": \"2023-01-08T04:17:05.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://mstdn.jp/users/dn_badman/statuses/109651651842073437\",\n      \"url\": \"https://mstdn.jp/@dn_badman/109651651842073437\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 2,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>うぎーカフェキチ一瞬グロ画像と思って怖かったアル‼️‼️‼️</p>\",\n      \"account\": {\n        \"id\": \"91580\",\n        \"username\": \"dn_badman\",\n        \"acct\": \"dn_badman@mstdn.jp\",\n        \"display_name\": \"張阿呆\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2018-08-16T00:00:00.000Z\",\n        \"note\": \"<p>你好ワタシ日本語苦手アル</p>\",\n        \"url\": \"https://mstdn.jp/@dn_badman\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/091/580/original/3df6d0b8a3d00eaa.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/091/580/original/3df6d0b8a3d00eaa.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/091/580/original/80187ce1f16f1522.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/091/580/original/80187ce1f16f1522.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 157,\n        \"following_count\": 142,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 11926,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#e4dcda\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109651652614224075\",\n    \"created_at\": \"2023-01-08T04:17:17.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109651652595457980\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109651652595457980\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>おほほほ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109651643200202473\",\n    \"created_at\": \"2023-01-08T04:14:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": true,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"private\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109651643135717737\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109651643135717737\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 2,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>昨日パーマりました</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109651643162783551\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/651/643/162/783/551/original/1a15348c198b44cb.jpg\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/651/643/162/783/551/small/1a15348c198b44cb.jpg\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/651/642/557/329/456/original/e73bede0316376f9.jpg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 852,\n            \"height\": 1284,\n            \"size\": \"852x1284\",\n            \"aspect\": 0.6635514018691588\n          },\n          \"small\": {\n            \"width\": 326,\n            \"height\": 491,\n            \"size\": \"326x491\",\n            \"aspect\": 0.6639511201629328\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"U9DlZm%1.S4.~qNG?H%1yEWCIUxa~VxaNaNG\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109648445384796403\",\n    \"created_at\": \"2023-01-07T14:41:38.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109648445314551056\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109648445314551056\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>いい感じのCGアニメーションでした</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109648443807912511\",\n    \"created_at\": \"2023-01-07T14:41:14.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109648443772482390/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ヤング師匠</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109648442577603520\",\n      \"created_at\": \"2023-01-07T14:40:54.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://amefur.asia/users/acid_rain/statuses/109648442465064336\",\n      \"url\": \"https://amefur.asia/@acid_rain/109648442465064336\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>ヤング師匠</p>\",\n      \"account\": {\n        \"id\": \"771\",\n        \"username\": \"acid_rain\",\n        \"acct\": \"acid_rain@amefur.asia\",\n        \"display_name\": \"酸性雨\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-05-18T00:00:00.000Z\",\n        \"note\": \"<p>情報の海の磯辺をさまよう一匹のアメフラシ <br>:amefurasi: 三 :amefurasi_r:</p>\",\n        \"url\": \"https://amefur.asia/@acid_rain\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/771/original/4d664abb38373237.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/771/original/4d664abb38373237.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/771/original/951a915c9088ad8f.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/771/original/951a915c9088ad8f.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 888,\n        \"following_count\": 477,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 167659,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [\n          {\n            \"shortcode\": \"amefurasi\",\n            \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/012/680/original/7160c660238f173f.png\",\n            \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/012/680/static/7160c660238f173f.png\",\n            \"visible_in_picker\": true\n          },\n          {\n            \"shortcode\": \"amefurasi_r\",\n            \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/023/776/original/d113ca49e3d536fc.png\",\n            \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/023/776/static/d113ca49e3d536fc.png\",\n            \"visible_in_picker\": true\n          },\n          {\n            \"shortcode\": \"cc\",\n            \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/666/original/2e80ce41c4363dac.png\",\n            \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/666/static/2e80ce41c4363dac.png\",\n            \"visible_in_picker\": true\n          },\n          {\n            \"shortcode\": \"ccby\",\n            \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/667/original/6c1aea5e8e173850.png\",\n            \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/667/static/6c1aea5e8e173850.png\",\n            \"visible_in_picker\": true\n          },\n          {\n            \"shortcode\": \"ccnc\",\n            \"url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/668/original/97982a6e395da168.png\",\n            \"static_url\": \"https://s3.fedibird.com/custom_emojis/images/000/000/668/static/97982a6e395da168.png\",\n            \"visible_in_picker\": true\n          }\n        ],\n        \"fields\": [\n          {\n            \"name\": \"pixiv\",\n            \"value\": \"<a href=\\\"https://www.pixiv.net/member.php?id=1855709\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">pixiv.net/member.php?id=185570</span><span class=\\\"invisible\\\">9</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"blog(testing)\",\n            \"value\": \"<a href=\\\"https://amefur.rainyman.page/blog/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">amefur.rainyman.page/blog/</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"掲載物のライセンス\",\n            \"value\": \":cc: :ccby: :ccnc: (4.0)\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#cecfcc\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109648442696945325\",\n    \"created_at\": \"2023-01-07T14:40:57.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109648442673301613\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109648442673301613\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>なんで今更トライガンなんだ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109648439748238600\",\n    \"created_at\": \"2023-01-07T14:40:12.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109648439699437141\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109648439699437141\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>トライガンのアニメやっててびっくりした</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647611266645510\",\n    \"created_at\": \"2023-01-07T11:09:31.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647611244198932\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109647611244198932\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>あれは過去の産物なんでそっとしておいてください</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647609678982707\",\n    \"created_at\": \"2023-01-07T11:09:06.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647609657801719/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>インスタでトロオドンぽいやつのカップルアカウントがいつまでもおすすめされてきてめんどくさい</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109647519824642796\",\n      \"created_at\": \"2023-01-07T10:46:15.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": true,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"en\",\n      \"uri\": \"https://gorone.xyz/users/bell/statuses/109647519757138560\",\n      \"url\": \"https://gorone.xyz/@bell/109647519757138560\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>インスタでトロオドンぽいやつのカップルアカウントがいつまでもおすすめされてきてめんどくさい</p>\",\n      \"account\": {\n        \"id\": \"5793\",\n        \"username\": \"bell\",\n        \"acct\": \"bell@gorone.xyz\",\n        \"display_name\": \"ごみばこ\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-15T00:00:00.000Z\",\n        \"note\": \"<p>イェイイェイ</p>\",\n        \"url\": \"https://gorone.xyz/@bell\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/005/793/original/0dce45a9cb775a69.gif\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/005/793/static/0dce45a9cb775a69.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/005/793/original/1a959f11ee77f696.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/005/793/original/1a959f11ee77f696.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 447,\n        \"following_count\": 404,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 35340,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"干し芋\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/3M04V5ZMVRZ5H?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/3M04V</span><span class=\\\"invisible\\\">5ZMVRZ5H?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"cas\",\n            \"value\": \"<a href=\\\"http://twitcasting.tv/c:putinputin\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">twitcasting.tv/c:putinputin</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#a69b9b\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647506420581872\",\n    \"created_at\": \"2023-01-07T10:42:51.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647506392631870\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109647506392631870\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ゼロカロリーコーラお世話になっております</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline_7.json",
    "content": "[\n  {\n    \"id\": \"109647505435421906\",\n    \"created_at\": \"2023-01-07T10:42:36.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647505408582773/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>コーラの美味しさがわからないなんて可哀想</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109647501968006504\",\n      \"created_at\": \"2023-01-07T10:41:41.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": true,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"en\",\n      \"uri\": \"https://gorone.xyz/users/bell/statuses/109647501846703124\",\n      \"url\": \"https://gorone.xyz/@bell/109647501846703124\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>コーラの美味しさがわからないなんて可哀想</p>\",\n      \"account\": {\n        \"id\": \"5793\",\n        \"username\": \"bell\",\n        \"acct\": \"bell@gorone.xyz\",\n        \"display_name\": \"ごみばこ\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-15T00:00:00.000Z\",\n        \"note\": \"<p>イェイイェイ</p>\",\n        \"url\": \"https://gorone.xyz/@bell\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/005/793/original/0dce45a9cb775a69.gif\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/005/793/static/0dce45a9cb775a69.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/005/793/original/1a959f11ee77f696.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/005/793/original/1a959f11ee77f696.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 447,\n        \"following_count\": 404,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 35340,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"干し芋\",\n            \"value\": \"<a href=\\\"https://www.amazon.jp/hz/wishlist/ls/3M04V5ZMVRZ5H?ref_=wl_share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">amazon.jp/hz/wishlist/ls/3M04V</span><span class=\\\"invisible\\\">5ZMVRZ5H?ref_=wl_share</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"cas\",\n            \"value\": \"<a href=\\\"http://twitcasting.tv/c:putinputin\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">twitcasting.tv/c:putinputin</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#a69b9b\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647337429728842\",\n    \"created_at\": \"2023-01-07T09:59:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647337376022721\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109647337376022721\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 2,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>赤城乳業の景品<br><a href=\\\"https://pawoo.net/tags/%E3%81%8A%E3%81%BE%E3%81%88%E3%82%89%E3%81%AE%E3%81%94%E5%AE%B6%E5%BA%AD%E3%81%AB%E7%84%A1%E3%81%95%E3%81%9D%E3%81%86%E3%81%AA%E3%82%82%E3%81%AE\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>おまえらのご家庭に無さそうなもの</span></a></p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109647337404769325\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/647/337/404/769/325/original/bbf15af4ab64cced.jpg\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/647/337/404/769/325/small/bbf15af4ab64cced.jpg\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/647/336/464/635/432/original/563906769e4ad7b0.jpg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 447,\n            \"height\": 512,\n            \"size\": \"447x512\",\n            \"aspect\": 0.873046875\n          },\n          \"small\": {\n            \"width\": 374,\n            \"height\": 428,\n            \"size\": \"374x428\",\n            \"aspect\": 0.8738317757009346\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UIGR@pWBQktR_MozV@jYZ#j?bwaeZ#WBg4kC\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [\n      {\n        \"name\": \"おまえらのご家庭に無さそうなもの\",\n        \"url\": \"https://fedibird.com/tags/%E3%81%8A%E3%81%BE%E3%81%88%E3%82%89%E3%81%AE%E3%81%94%E5%AE%B6%E5%BA%AD%E3%81%AB%E7%84%A1%E3%81%95%E3%81%9D%E3%81%86%E3%81%AA%E3%82%82%E3%81%AE\"\n      }\n    ],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647335502980191\",\n    \"created_at\": \"2023-01-07T09:55:30.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647320248021496/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@pinkherb_00\\\" class=\\\"u-url mention\\\">@<span>pinkherb_00</span></a></span> パーマupいいよ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109646998935239047\",\n      \"created_at\": \"2023-01-07T08:33:48.094Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/pinkherb_00/statuses/109646998935239047\",\n      \"url\": \"https://fedibird.com/@pinkherb_00/109646998935239047\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>パーマupいいよ</p>\",\n      \"account\": {\n        \"id\": \"108436360061510775\",\n        \"username\": \"pinkherb_00\",\n        \"acct\": \"pinkherb_00\",\n        \"display_name\": \"毒草なを🍀\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-06-07T00:00:00.000Z\",\n        \"note\": \"<p>適度な距離感でやってます</p>\",\n        \"url\": \"https://fedibird.com/@pinkherb_00\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 0,\n        \"following_count\": 0,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 19713,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#e0d8e2\",\n          \"noindex\": true,\n          \"hide_network\": true,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": true,\n          \"hide_followers_count\": true,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"SubwayTooter\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647320622196850\",\n    \"created_at\": \"2023-01-07T09:55:35.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647320560301858\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109647320560301858\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>はずかちい</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647152097987053\",\n    \"created_at\": \"2023-01-07T09:12:44.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647152033801749\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109647152033801749\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ドスケベセクシーパーマ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109647151733126035\",\n    \"created_at\": \"2023-01-07T09:12:37.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109647151602142522/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>パーマ……パーマ？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109646951412360760\",\n      \"created_at\": \"2023-01-07T08:21:42.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": true,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/azel_skydart/statuses/109646951387139521\",\n      \"url\": \"https://pawoo.net/@azel_skydart/109646951387139521\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>パーマ……パーマ？</p>\",\n      \"account\": {\n        \"id\": \"2912\",\n        \"username\": \"azel_skydart\",\n        \"acct\": \"azel_skydart@pawoo.net\",\n        \"display_name\": \"しおま（14）✨🦀\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-18T00:00:00.000Z\",\n        \"note\": \"<p>そのうちえっちいのとか</p>\",\n        \"url\": \"https://pawoo.net/@azel_skydart\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/002/912/original/6fc928b0a720923a.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/002/912/original/6fc928b0a720923a.jpeg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/002/912/original/0bb6bcac92b3b42c.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/002/912/original/0bb6bcac92b3b42c.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1010,\n        \"following_count\": 275,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 79731,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#b7a59b\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109646944231638315\",\n    \"created_at\": \"2023-01-07T08:19:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109646944199856539\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109646944199856539\",\n    \"replies_count\": 1,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 2,\n    \"emoji_reactions_count\": 1,\n    \"emoji_reactions\": [\n      {\n        \"name\": \"👍\",\n        \"count\": 1,\n        \"account_ids\": [\n          \"109085663834966261\"\n        ],\n        \"me\": false\n      }\n    ],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>初パーマかけた</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109642653159661817\",\n    \"created_at\": \"2023-01-06T14:08:35.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109642653082634297/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109612276267902344\",\n      \"created_at\": \"2023-01-01T05:23:21.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": null,\n      \"uri\": \"https://pawoo.net/users/foomidori/statuses/109612276203376527\",\n      \"url\": \"https://pawoo.net/@foomidori/109612276203376527\",\n      \"replies_count\": 1,\n      \"reblogs_count\": 22,\n      \"favourites_count\": 4,\n      \"emoji_reactions_count\": 8,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"❤\",\n          \"count\": 4,\n          \"account_ids\": [\n            \"106520653675151419\",\n            \"109324651979726499\",\n            \"108270302727007164\",\n            \"192999\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"☺\",\n          \"count\": 4,\n          \"account_ids\": [\n            \"6883\",\n            \"190047\",\n            \"106765550563009159\",\n            \"107533803115682070\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"\",\n      \"account\": {\n        \"id\": \"1305\",\n        \"username\": \"foomidori\",\n        \"acct\": \"foomidori@pawoo.net\",\n        \"display_name\": \"モンテカルロたかし\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-08-17T00:00:00.000Z\",\n        \"note\": \"<p>イラストレーター🎨<br><a href=\\\"https://twitter.com/foomidori\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/foomidori</span><span class=\\\"invisible\\\"></span></a><br><a href=\\\"http://www.weibo.com/u/6128922855\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://www.</span><span class=\\\"\\\">weibo.com/u/6128922855</span><span class=\\\"invisible\\\"></span></a><br>foomidori@ybb.ne.jp<br><a href=\\\"https://www.pixiv.me/foomidori\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">pixiv.me/foomidori</span><span class=\\\"invisible\\\"></span></a><br>禁無断転載・加工</p>\",\n        \"url\": \"https://pawoo.net/@foomidori\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/000/001/305/original/fdfd9b8c207bc279.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/000/001/305/original/fdfd9b8c207bc279.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/000/001/305/original/1c640964f3b3bc3f.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/000/001/305/original/1c640964f3b3bc3f.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 4837,\n        \"following_count\": 2224,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 257633,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109612276233066701\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/612/276/233/066/701/original/3fc13b5fd693f273.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/612/276/233/066/701/small/3fc13b5fd693f273.jpg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/612/275/861/101/248/original/42c0406330ce102d.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 570,\n              \"height\": 471,\n              \"size\": \"570x471\",\n              \"aspect\": 1.2101910828025477\n            },\n            \"small\": {\n              \"width\": 440,\n              \"height\": 364,\n              \"size\": \"440x364\",\n              \"aspect\": 1.2087912087912087\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UDR:HGD%~q-;xufQM{M{~qxuIURjIURjxu%M\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637376445027431\",\n    \"created_at\": \"2023-01-05T15:46:40.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637376423827872\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637376423827872\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>来冬はいいコート買うか</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637352652116319\",\n    \"created_at\": \"2023-01-05T15:40:37.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637352630150597\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637352630150597\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>しかも絶対長持ちするやつなんよね～</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637351722152605\",\n    \"created_at\": \"2023-01-05T15:38:08.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637342880545177/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@pinkherb_00\\\" class=\\\"u-url mention\\\">@<span>pinkherb_00</span></a></span> コートかっちょええ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109637338006421623\",\n      \"created_at\": \"2023-01-05T15:36:54.017Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/pinkherb_00/statuses/109637338006421623\",\n      \"url\": \"https://fedibird.com/@pinkherb_00/109637338006421623\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>コートかっちょええ</p>\",\n      \"account\": {\n        \"id\": \"108436360061510775\",\n        \"username\": \"pinkherb_00\",\n        \"acct\": \"pinkherb_00\",\n        \"display_name\": \"毒草なを🍀\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-06-07T00:00:00.000Z\",\n        \"note\": \"<p>適度な距離感でやってます</p>\",\n        \"url\": \"https://fedibird.com/@pinkherb_00\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 0,\n        \"following_count\": 0,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 19713,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#e0d8e2\",\n          \"noindex\": true,\n          \"hide_network\": true,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": true,\n          \"hide_followers_count\": true,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"SubwayTooter\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637346333359443\",\n    \"created_at\": \"2023-01-05T15:39:00.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637346312797180\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637346312797180\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>良いなぁと思うコート3万くらいするから泣く</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637336259250931\",\n    \"created_at\": \"2023-01-05T15:34:50.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637329936789967/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>あけましておめでとうございます～<br>今年もよろしくお願いしますわ～</p>\\n<p>🎍セブンイレブンネットプリント🎍<br>登録番号　62083090<br>2023/01/05 23:59まで</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109611509453066369\",\n      \"created_at\": \"2023-01-01T02:08:20.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": true,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://pawoo.net/users/mogaho/statuses/109611509362965029\",\n      \"url\": \"https://pawoo.net/@mogaho/109611509362965029\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 41,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 2,\n      \"emoji_reactions\": [\n        {\n          \"name\": \"❤\",\n          \"count\": 1,\n          \"account_ids\": [\n            \"107533803115682070\"\n          ],\n          \"me\": false\n        },\n        {\n          \"name\": \"🎉\",\n          \"count\": 1,\n          \"account_ids\": [\n            \"6883\"\n          ],\n          \"me\": false\n        }\n      ],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>あけましておめでとうございます～<br>今年もよろしくお願いしますわ～</p>\\n<p>🎍セブンイレブンネットプリント🎍<br>登録番号　62083090<br>2023/01/05 23:59まで</p>\",\n      \"account\": {\n        \"id\": \"106299272900387929\",\n        \"username\": \"mogaho\",\n        \"acct\": \"mogaho@pawoo.net\",\n        \"display_name\": \"ホヌ🔞🐡\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2021-05-26T00:00:00.000Z\",\n        \"note\": \"<p>オリキャラのアヤメにガチ恋の民だよ。<br>気軽に絵描きさんフォローするよ。<br>やさしくしてください。<br>うんちです。ぱう廃なのでうるさいです。</p>\",\n        \"url\": \"https://pawoo.net/@mogaho\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/106/299/272/900/387/929/original/fd58caa0fa7c564e.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/106/299/272/900/387/929/original/fd58caa0fa7c564e.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/106/299/272/900/387/929/original/8752e79406e565cd.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/106/299/272/900/387/929/original/8752e79406e565cd.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 542,\n        \"following_count\": 232,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 22319,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"DLSite\",\n            \"value\": \"<a href=\\\"https://www.dlsite.com/girls/circle/profile/=/maker_id/RG56571.html\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">dlsite.com/girls/circle/profil</span><span class=\\\"invisible\\\">e/=/maker_id/RG56571.html</span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"skeb\",\n            \"value\": \"<a href=\\\"https://skeb.jp/@mogahonu\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">skeb.jp/@mogahonu</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"pixiv\",\n            \"value\": \"<a href=\\\"http://pixiv.me/mogaho\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">http://</span><span class=\\\"\\\">pixiv.me/mogaho</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"twitter\",\n            \"value\": \"<a href=\\\"https://twitter.com/mogahonu\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/mogahonu</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {}\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [\n        {\n          \"id\": \"109611509407402457\",\n          \"type\": \"image\",\n          \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/611/509/407/402/457/original/dc2421b13d9bec58.jpg\",\n          \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/611/509/407/402/457/small/dc2421b13d9bec58.jpg\",\n          \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/611/508/946/408/163/original/693a2b3465a5c20f.jpg\",\n          \"preview_remote_url\": null,\n          \"text_url\": null,\n          \"meta\": {\n            \"original\": {\n              \"width\": 608,\n              \"height\": 900,\n              \"size\": \"608x900\",\n              \"aspect\": 0.6755555555555556\n            },\n            \"small\": {\n              \"width\": 329,\n              \"height\": 487,\n              \"size\": \"329x487\",\n              \"aspect\": 0.675564681724846\n            }\n          },\n          \"description\": null,\n          \"blurhash\": \"UBQ[$1v-^+s-MuWH-WW.?xRTE3V[%1k*OAjZ\"\n        }\n      ],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637333060279049\",\n    \"created_at\": \"2023-01-05T15:35:38.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637333034880286\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637333034880286\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ちんちん170㎝(直径)！？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637321849530432\",\n    \"created_at\": \"2023-01-05T15:32:47.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"zh\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637321825640665\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637321825640665\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>必殺！滅殺！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637320403139319\",\n    \"created_at\": \"2023-01-05T15:32:25.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637320386240821\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637320386240821\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>三バカだ！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637314739755968\",\n    \"created_at\": \"2023-01-05T15:30:58.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637314711797601\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637314711797601\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>あれ？テレ玉でガンダムSEEDやってて草</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637298622244410\",\n    \"created_at\": \"2023-01-05T15:26:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637298599442060\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637298599442060\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ゾゾタウン今セールでクソ安くなってるけど大概欲しい服のサイズ無くて虚無る</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637294091533869\",\n    \"created_at\": \"2023-01-05T15:25:43.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637294048769752\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637294048769752\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>けど高い！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637291141230882\",\n    \"created_at\": \"2023-01-05T15:24:58.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637291114806022\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637291114806022\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>アーバンなリサーチとかグローバルなワークとかナノなユニバース見てると心がワクワクする</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_fedibird_com_home_timeline_8.json",
    "content": "[\n  {\n    \"id\": \"109637286567773233\",\n    \"created_at\": \"2023-01-05T15:23:48.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637286513999808\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637286513999808\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 2,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>実際はこういうのがいいれす</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109637286533333588\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/637/286/533/333/588/original/67e2ac0d35b1a7e6.jpg\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/637/286/533/333/588/small/67e2ac0d35b1a7e6.jpg\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/637/286/384/453/672/original/6305177021726375.jpg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 1080,\n            \"height\": 1288,\n            \"size\": \"1080x1288\",\n            \"aspect\": 0.8385093167701864\n          },\n          \"small\": {\n            \"width\": 366,\n            \"height\": 436,\n            \"size\": \"366x436\",\n            \"aspect\": 0.8394495412844036\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UiI#u-%M~qtRxuaeWWWB%MRjWBV@t7ofWBfk\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637285032624801\",\n    \"created_at\": \"2023-01-05T15:22:40.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637282072644868/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@pinkherb_00\\\" class=\\\"u-url mention\\\">@<span>pinkherb_00</span></a></span> 顔をコーヒー豆に置き換えてもいい感じぽい…</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109637280058288922\",\n      \"created_at\": \"2023-01-05T15:22:09.797Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/pinkherb_00/statuses/109637280058288922\",\n      \"url\": \"https://fedibird.com/@pinkherb_00/109637280058288922\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>顔をコーヒー豆に置き換えてもいい感じぽい…</p>\",\n      \"account\": {\n        \"id\": \"108436360061510775\",\n        \"username\": \"pinkherb_00\",\n        \"acct\": \"pinkherb_00\",\n        \"display_name\": \"毒草なを🍀\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-06-07T00:00:00.000Z\",\n        \"note\": \"<p>適度な距離感でやってます</p>\",\n        \"url\": \"https://fedibird.com/@pinkherb_00\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 0,\n        \"following_count\": 0,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 19713,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#e0d8e2\",\n          \"noindex\": true,\n          \"hide_network\": true,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": true,\n          \"hide_followers_count\": true,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"SubwayTooter\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637281740469991\",\n    \"created_at\": \"2023-01-05T15:22:35.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637281720443563\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637281720443563\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>これで7万ですからね</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637280968586845\",\n    \"created_at\": \"2023-01-05T15:22:21.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637280793939573/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>すっげぇキモいデザインだな！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109637278664912502\",\n      \"created_at\": \"2023-01-05T15:21:27.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://waha.work/users/Regenbogen/statuses/109637277292952439\",\n      \"url\": \"https://waha.work/@Regenbogen/109637277292952439\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>すっげぇキモいデザインだな！</p>\",\n      \"account\": {\n        \"id\": \"15285\",\n        \"username\": \"Regenbogen\",\n        \"acct\": \"Regenbogen@waha.work\",\n        \"display_name\": \"琴葉葵\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-10-01T00:00:00.000Z\",\n        \"note\": \"<p>散々雨に降られたって 笑っていられる<br>君のこと 普通に 羨ましいけど<br>だんだん僕も君みたいに 強くなってさ<br>今よりも 少しだけ 素直に笑えますように<br>いつかまた遠くで 会えたら手を振り返して</p>\",\n        \"url\": \"https://waha.work/@Regenbogen\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/015/285/original/1aea8aa23fdf3921.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/015/285/original/1aea8aa23fdf3921.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/015/285/original/408e176749c5f649.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/015/285/original/408e176749c5f649.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 265,\n        \"following_count\": 215,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 111967,\n        \"last_status_at\": \"2023-01-17\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#c7c9d6\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637276047099792\",\n    \"created_at\": \"2023-01-05T15:21:07.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637275952175733\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637275952175733\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>よし！これ着よ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109637275977010221\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/637/275/977/010/221/original/913407fbb1e401c7.jpg\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/637/275/977/010/221/small/913407fbb1e401c7.jpg\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/637/275/802/816/751/original/36a55372e0a22ac6.jpg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 1077,\n            \"height\": 1522,\n            \"size\": \"1077x1522\",\n            \"aspect\": 0.7076215505913273\n          },\n          \"small\": {\n            \"width\": 336,\n            \"height\": 475,\n            \"size\": \"336x475\",\n            \"aspect\": 0.7073684210526315\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UDJ@:v%LpJtmQ+ozNGR+DiNL9cr:K-RjxZs;\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637273230492143\",\n    \"created_at\": \"2023-01-05T15:20:23.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637273089327441/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@pinkherb_00\\\" class=\\\"u-url mention\\\">@<span>pinkherb_00</span></a></span> カフェきちはスタイルいいのでたぶんなんでもいける</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109637268343480259\",\n      \"created_at\": \"2023-01-05T15:19:11.038Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/pinkherb_00/statuses/109637268343480259\",\n      \"url\": \"https://fedibird.com/@pinkherb_00/109637268343480259\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 2,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>カフェきちはスタイルいいのでたぶんなんでもいける</p>\",\n      \"account\": {\n        \"id\": \"108436360061510775\",\n        \"username\": \"pinkherb_00\",\n        \"acct\": \"pinkherb_00\",\n        \"display_name\": \"毒草なを🍀\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-06-07T00:00:00.000Z\",\n        \"note\": \"<p>適度な距離感でやってます</p>\",\n        \"url\": \"https://fedibird.com/@pinkherb_00\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 0,\n        \"following_count\": 0,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 19713,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#e0d8e2\",\n          \"noindex\": true,\n          \"hide_network\": true,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": true,\n          \"hide_followers_count\": true,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"SubwayTooter\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637266271977424\",\n    \"created_at\": \"2023-01-05T15:18:39.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637266249383514\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637266249383514\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>履いたとしてもこれに似合うコーデがわからない</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637264708040217\",\n    \"created_at\": \"2023-01-05T15:18:05.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637264017219488/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>RT <span class=\\\"h-card\\\"><a href=\\\"https://fedibird.com/@pinkherb_00\\\" class=\\\"u-url mention\\\">@<span>pinkherb_00</span></a></span> ヴィヴィアンやん</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109637262617642185\",\n      \"created_at\": \"2023-01-05T15:17:43.669Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://fedibird.com/users/pinkherb_00/statuses/109637262617642185\",\n      \"url\": \"https://fedibird.com/@pinkherb_00/109637262617642185\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 1,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>ヴィヴィアンやん</p>\",\n      \"account\": {\n        \"id\": \"108436360061510775\",\n        \"username\": \"pinkherb_00\",\n        \"acct\": \"pinkherb_00\",\n        \"display_name\": \"毒草なを🍀\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2022-06-07T00:00:00.000Z\",\n        \"note\": \"<p>適度な距離感でやってます</p>\",\n        \"url\": \"https://fedibird.com/@pinkherb_00\",\n        \"avatar\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/accounts/avatars/108/436/360/061/510/775/original/8038428d8eaeb75e.jpeg\",\n        \"header\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"header_static\": \"https://s3.fedibird.com/accounts/headers/108/436/360/061/510/775/original/668246a8c88b03a9.jpg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 0,\n        \"following_count\": 0,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 19713,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"birthday\": null,\n          \"location\": \"\",\n          \"cat_ears_color\": \"#e0d8e2\",\n          \"noindex\": true,\n          \"hide_network\": true,\n          \"hide_statuses_count\": false,\n          \"hide_following_count\": true,\n          \"hide_followers_count\": true,\n          \"enable_reaction\": true\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"application\": {\n        \"name\": \"SubwayTooter\",\n        \"website\": null\n      },\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637258169436599\",\n    \"created_at\": \"2023-01-05T15:16:34.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637258067383130\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637258067383130\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 1,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>これかってー</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [\n      {\n        \"id\": \"109637258114953190\",\n        \"type\": \"image\",\n        \"url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/637/258/114/953/190/original/7b2a4f3de936e39f.jpg\",\n        \"preview_url\": \"https://s3.fedibird.com/cache/media_attachments/files/109/637/258/114/953/190/small/7b2a4f3de936e39f.jpg\",\n        \"remote_url\": \"https://img.pawoo.net/media_attachments/files/109/637/257/740/572/224/original/bc6b22e798536cc3.jpg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 1073,\n            \"height\": 1526,\n            \"size\": \"1073x1526\",\n            \"aspect\": 0.7031454783748362\n          },\n          \"small\": {\n            \"width\": 335,\n            \"height\": 476,\n            \"size\": \"335x476\",\n            \"aspect\": 0.7037815126050421\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UWPi|:%M_4D%RPxuogIU.9RjjDt79FRjxtxu\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637251106195557\",\n    \"created_at\": \"2023-01-05T15:14:47.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637251072198435\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637251072198435\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>お前は今まで食べたセクシーの枚数を覚えているのか？</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637247531017115\",\n    \"created_at\": \"2023-01-05T15:13:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637247442323043\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637247442323043\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>きんちゃくぅ！きんちゃくぅ！<br>無駄無駄無駄ァッ！！！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637231065235182\",\n    \"created_at\": \"2023-01-05T15:09:41.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637231034811216\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637231034811216\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>どうもヘルクライムピラーです</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637225706264781\",\n    \"created_at\": \"2023-01-05T15:08:20.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637225687047128\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637225687047128\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>WRYYYYYY</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637223688435015\",\n    \"created_at\": \"2023-01-05T15:07:49.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637223655527447\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637223655527447\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>ぱりぃたぁーいむ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637222212056788\",\n    \"created_at\": \"2023-01-05T15:07:26.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637222183312660\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637222183312660\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>歯磨くか</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637219564728052\",\n    \"created_at\": \"2023-01-05T15:06:46.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637219544017613\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637219544017613\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>いぶし銀のセクシャリティ…</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637212472364487\",\n    \"created_at\": \"2023-01-05T15:04:58.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637212438030595\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637212438030595\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 1,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>人間讃歌は勇気の讃歌だってツェペリのおっさんも言ってただろ！</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637202385169674\",\n    \"created_at\": \"2023-01-05T15:01:49.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637200089710437/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>殺意が足りない<br>殺意を高めなきゃ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109637194368513339\",\n      \"created_at\": \"2023-01-05T15:00:21.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"unlisted\",\n      \"language\": \"ja\",\n      \"uri\": \"https://mstdn.beer/users/Benisake/statuses/109637194344189519\",\n      \"url\": \"https://mstdn.beer/@Benisake/109637194344189519\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>殺意が足りない<br>殺意を高めなきゃ</p>\",\n      \"account\": {\n        \"id\": \"22075\",\n        \"username\": \"Benisake\",\n        \"acct\": \"Benisake@mstdn.beer\",\n        \"display_name\": \"紅鮭(ビア鯖公認の信頼)\",\n        \"locked\": true,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-10-23T00:00:00.000Z\",\n        \"note\": \"<p>さけです<br>よろしくおねがいします</p>\",\n        \"url\": \"https://mstdn.beer/@Benisake\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/075/original/2a6d95ba33fed4be.jpeg\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/022/075/original/2a6d95ba33fed4be.jpeg\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/022/075/original/90e151ae98d08442.jpeg\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/022/075/original/90e151ae98d08442.jpeg\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 337,\n        \"following_count\": 313,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 22493,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#694e3c\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637201195335283\",\n    \"created_at\": \"2023-01-05T15:02:05.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637201140122980\",\n    \"url\": \"https://pawoo.net/@rkugaki_1011/109637201140122980\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>私でた・か・め・て❤️</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": null,\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109637089514991949\",\n    \"created_at\": \"2023-01-05T14:32:52.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://pawoo.net/users/rkugaki_1011/statuses/109637086228917283/activity\",\n    \"url\": null,\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"emoji_reactions_count\": 0,\n    \"emoji_reactions\": [],\n    \"status_reference_ids\": [],\n    \"status_references_count\": 0,\n    \"status_referred_by_count\": 0,\n    \"searchability\": \"direct\",\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"emoji_reactioned\": false,\n    \"content\": \"<p>このアイコンでセクシーは無理でしょ</p>\",\n    \"account\": {\n      \"id\": \"54\",\n      \"username\": \"rkugaki_1011\",\n      \"acct\": \"rkugaki_1011@pawoo.net\",\n      \"display_name\": \"カフェキチ先輩\",\n      \"locked\": false,\n      \"bot\": false,\n      \"cat\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2019-08-15T00:00:00.000Z\",\n      \"note\": \"<p>元々はパウー民ンホォッ！！！<br>コウノトリがキャベツ畑でSEXして出生<br>テキサス州在住<br>終末のドスケベセクシー預言者</p><p>マストドン百鬼夜行シール<br>シール横丁で販売中ンホォッ！！！<br><a href=\\\"https://mandarake.co.jp/content/yokocho/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">mandarake.co.jp/content/yokoch</span><span class=\\\"invisible\\\">o/</span></a></p>\",\n      \"url\": \"https://pawoo.net/@rkugaki_1011\",\n      \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/000/054/original/2180f81c71c2f48e.png\",\n      \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/000/054/original/ddf33fd765d4e103.png\",\n      \"searchability\": \"direct\",\n      \"followers_count\": 857,\n      \"following_count\": 713,\n      \"subscribing_count\": 0,\n      \"statuses_count\": 71517,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"鳥\",\n          \"value\": \"<a href=\\\"https://twitter.com/E27A4qXnkAe2kyt?s=09\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/E27A4qXnkAe2kyt?s=</span><span class=\\\"invisible\\\">09</span></a>\",\n          \"verified_at\": null\n        }\n      ],\n      \"other_settings\": {\n        \"cat_ears_color\": \"#684e45\"\n      }\n    },\n    \"reblog\": {\n      \"id\": \"109637074074518772\",\n      \"created_at\": \"2023-01-05T14:29:46.000Z\",\n      \"in_reply_to_id\": null,\n      \"in_reply_to_account_id\": null,\n      \"sensitive\": false,\n      \"spoiler_text\": \"\",\n      \"visibility\": \"public\",\n      \"language\": \"ja\",\n      \"uri\": \"https://waha.work/users/qzbx/statuses/109637074037028739\",\n      \"url\": \"https://waha.work/@qzbx/109637074037028739\",\n      \"replies_count\": 0,\n      \"reblogs_count\": 1,\n      \"favourites_count\": 0,\n      \"emoji_reactions_count\": 0,\n      \"emoji_reactions\": [],\n      \"status_reference_ids\": [],\n      \"status_references_count\": 0,\n      \"status_referred_by_count\": 0,\n      \"searchability\": \"direct\",\n      \"favourited\": false,\n      \"reblogged\": false,\n      \"muted\": false,\n      \"bookmarked\": false,\n      \"emoji_reactioned\": false,\n      \"content\": \"<p>このアイコンでセクシーは無理でしょ</p>\",\n      \"account\": {\n        \"id\": \"13156\",\n        \"username\": \"qzbx\",\n        \"acct\": \"qzbx@waha.work\",\n        \"display_name\": \"なゆも ‮c＾ω＾っ ‮\",\n        \"locked\": false,\n        \"bot\": false,\n        \"cat\": false,\n        \"discoverable\": false,\n        \"group\": false,\n        \"created_at\": \"2019-09-24T00:00:00.000Z\",\n        \"note\": \"<p>　　┏━━━━━━━━━━━┓　　<br>　○┃　わ　は　ー　本　舗　┃○　<br>　■┗━━━━━━━━━━━┛■　<br>　■　┏┷┓　┏┷┓　┏┷┓　■　<br>　■　┃尤┃　┃令┃　┃翫┃　■　<br>　■　┃雲┃　┃和┃　┃歳┃　■　<br>　■　┃殢┃　┃元┃　┃愒┃　■　<br>　■　┃雨┃　┃年┃　┃日┃　■　<br>　■　┗━┛　┃創┃　┗━┛　■　<br>　■　　　　　┃業┃　　　　　■　<br>　■　　　　　┗━┛　　　　　■　<br>　■　　　　　　　　　　　　　■　<br> 　 § 　 　 　 　 ∧　∧　 　　　　  § 　<br>ｗｗｗ　　　(　＾ω＾ )　　 　ｗｗｗ<br>□□□　　　(っ　 　 c)　　 　□□□<br>￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣￣</p>\",\n        \"url\": \"https://waha.work/@qzbx\",\n        \"avatar\": \"https://s3.fedibird.com/cache/accounts/avatars/000/013/156/original/68f98a1056dcb6f5.png\",\n        \"avatar_static\": \"https://s3.fedibird.com/cache/accounts/avatars/000/013/156/original/68f98a1056dcb6f5.png\",\n        \"header\": \"https://s3.fedibird.com/cache/accounts/headers/000/013/156/original/b93f12465654aaa5.png\",\n        \"header_static\": \"https://s3.fedibird.com/cache/accounts/headers/000/013/156/original/b93f12465654aaa5.png\",\n        \"searchability\": \"direct\",\n        \"followers_count\": 1380,\n        \"following_count\": 94,\n        \"subscribing_count\": 0,\n        \"statuses_count\": 167900,\n        \"last_status_at\": \"2023-01-18\",\n        \"emojis\": [],\n        \"fields\": [\n          {\n            \"name\": \"Web\",\n            \"value\": \"<a href=\\\"https://qzbx.github.io\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">qzbx.github.io</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"Instagram\",\n            \"value\": \"<a href=\\\"https://www.instagram.com/qzbx.r\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">instagram.com/qzbx.r</span><span class=\\\"invisible\\\"></span></a>\",\n            \"verified_at\": null\n          },\n          {\n            \"name\": \"本日のわはー\",\n            \"value\": \"<a href=\\\"https://waha.work/tags/%E6%9C%AC%E6%97%A5%E3%81%AE%E3%82%8F%E3%81%AF%E3%83%BC\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">waha.work/tags/%E6%9C%AC%E6%97</span><span class=\\\"invisible\\\">%A5%E3%81%AE%E3%82%8F%E3%81%AF%E3%83%BC</span></a>\",\n            \"verified_at\": null\n          }\n        ],\n        \"other_settings\": {\n          \"cat_ears_color\": \"#d3d3e5\"\n        }\n      },\n      \"reblog\": null,\n      \"quote\": null,\n      \"media_attachments\": [],\n      \"mentions\": [],\n      \"tags\": [],\n      \"emojis\": [],\n      \"card\": null,\n      \"poll\": null\n    },\n    \"quote\": null,\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/toot_mstdn_jp_public_timeline.json",
    "content": "[\n  {\n    \"id\": \"109711449993566770\",\n    \"created_at\": \"2023-01-18T17:44:31.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"zh\",\n    \"uri\": \"https://alive.bar/users/cheel/statuses/109711449906599124\",\n    \"url\": \"https://alive.bar/@cheel/109711449906599124\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>最近又在网络上看到了新近流行的心理测试量表，一直很好奇这种量表的正确使用方法。<br>感觉人类语言即使在结合了大量上下文说明的情况下也很难精确传达出作者的原意（除非制表人像康德那样去斟酌字词），参与测试者只在没有制表人在旁边实时解说的情况下完成问卷更容易和制表人的想法出现偏差（尤其是在一些比较抽象的问题情景中）。前几年经常看到的热门测试似乎都倾向于描述具体的几种情景，回答也是很明确的特定行为，不知道和上面提到的原因有没有关系。<br>虽然这样设置问题和选项更方便儿童与其他阅读有障碍的群体理解，也更不容易（或许）让参与测试者和问卷制作者在问题的理解上产生差异，但感觉预设了选择某项选项的群体一定是通过相同的思维模式才作出了这项决定（或许作者安排的每个选项与性格倾向的关联背后都有统计数据支撑），可是实际生活中人类的思考就是ta所受到的教育、当地风俗、成见、情感以及个人性格倾向等的混合吧？甚至感觉比起教育和成见这些个人性格的影响几乎微乎其微......很好奇是不是几乎所有这类调查问卷都主要是娱乐意义更大些。<br>也看到过尝试用抽象语言描述每一个问题的问卷，但是这样又回到开头来了：每个人对题目的理解都存在一定偏差，没办法保证所有参与者与制表人所讨论的每个词汇定义是否相同。<br>觉得研究人的心理是件很困难的事......至少本人很多时候都不明白自己的一些念头到底是从哪来的、又和什么有关。并且一直很奇怪的事情就是人明明并不是像机器人那样时时刻刻都能确保自己知行合一的动物（至少我做不到），也并不能始终清醒地意识到自己的每项行为是否都合乎自己的观念。很多人都能一边呼吁不要学历歧视的同时一边使用低学历攻击人（而他们甚至根本意识不到自己前后的矛盾，只是单纯没察觉出自己这两种行为背后的逻辑存在冲突。各种社会运动中，一些坚持自己属于某个政/治立场的人也大量出现过类似情况）<br>并不了解这个领域，不知道现代的学者有没有办法把人的心理活动转化为可量化的状态进行物理层面的观察，不然的话感觉只能走弗洛伊德那一套继续对着做出行为的黑箱子猜测其背后运作原理，感觉这活很艰辛。<br>（2022-12-06 09:56:39）</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109710650624215212\",\n      \"username\": \"cheel\",\n      \"acct\": \"cheel@alive.bar\",\n      \"display_name\": \"蓝精灵和格格巫\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2023-01-18T00:00:00.000Z\",\n      \"note\": \"<p>号主是一条处于清醒的神经错乱状态中的灰色蜥蜴，正在焦虑地四处爬动。</p>\",\n      \"url\": \"https://alive.bar/@cheel\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/710/650/624/215/212/original/ca98e15c23650bf0.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/710/650/624/215/212/original/ca98e15c23650bf0.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/710/650/624/215/212/original/9933fef79f4de9e8.jpg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/710/650/624/215/212/original/9933fef79f4de9e8.jpg\",\n      \"followers_count\": 27,\n      \"following_count\": 2,\n      \"statuses_count\": 22,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"身份\",\n          \"value\": \"外星蜥蜴\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"来到这里的原因\",\n          \"value\": \"本来想绕路奈何飞船炸了\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449845616587\",\n    \"created_at\": \"2023-01-18T17:44:30.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/SyamoZy/statuses/109711449811812688\",\n    \"url\": \"https://fedibird.com/@SyamoZy/109711449811812688\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>今週3日連続で「やっべ」って言いながら起きてる</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109088195249352221\",\n      \"username\": \"SyamoZy\",\n      \"acct\": \"SyamoZy@fedibird.com\",\n      \"display_name\": \"しゃも爺\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2022-09-28T00:00:00.000Z\",\n      \"note\": \"<p>pineapple pizza is good</p>\",\n      \"url\": \"https://fedibird.com/@SyamoZy\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/088/195/249/352/221/original/beb0373dbd25ba0c.jpeg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/088/195/249/352/221/original/beb0373dbd25ba0c.jpeg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/088/195/249/352/221/original/39fce30475bc1747.jpeg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/088/195/249/352/221/original/39fce30475bc1747.jpeg\",\n      \"followers_count\": 187,\n      \"following_count\": 133,\n      \"statuses_count\": 17170,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449822677060\",\n    \"created_at\": \"2023-01-18T17:44:29.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://fosstodon.org/users/atoponce/statuses/109711449716271751\",\n    \"url\": \"https://fosstodon.org/@atoponce/109711449716271751\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p><a href=\\\"https://fosstodon.org/tags/OpenBSD\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>OpenBSD</span></a> is the \\\"I use Arch BTW\\\" of the <a href=\\\"https://fosstodon.org/tags/BSD\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>BSD</span></a> world.</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"959795\",\n      \"username\": \"atoponce\",\n      \"acct\": \"atoponce@fosstodon.org\",\n      \"display_name\": \"Aaron Toponce ⚛️:debian:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2021-05-27T00:00:00.000Z\",\n      \"note\": \"<p>MSCSIA, cryptography, security, locksport, Linux, programming, mathematics, amateur radio, Buddhism, running, anime, and bibliophilia.</p>\",\n      \"url\": \"https://fosstodon.org/@atoponce\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/000/959/795/original/9bcf147ce9287c44.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/000/959/795/original/9bcf147ce9287c44.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/000/959/795/original/470a10978bac208c.jpeg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/000/959/795/original/470a10978bac208c.jpeg\",\n      \"followers_count\": 1524,\n      \"following_count\": 546,\n      \"statuses_count\": 3633,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"debian\",\n          \"url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/029/285/original/658b3eff09d6a380.png\",\n          \"static_url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/029/285/static/658b3eff09d6a380.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [\n        {\n          \"name\": \"Blog\",\n          \"value\": \"<a href=\\\"https://pthree.org\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">pthree.org</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2022-12-05T10:59:35.320+00:00\"\n        },\n        {\n          \"name\": \"GitHub\",\n          \"value\": \"<a href=\\\"https://github.com/atoponce\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">github.com/atoponce</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2022-12-05T10:59:35.814+00:00\"\n        },\n        {\n          \"name\": \"Keybase\",\n          \"value\": \"<a href=\\\"https://atoponce.keybase.pub/mastodon.html\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">atoponce.keybase.pub/mastodon.</span><span class=\\\"invisible\\\">html</span></a>\",\n          \"verified_at\": \"2022-12-05T10:59:36.284+00:00\"\n        },\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"<a href=\\\"https://twittodon.com/share.php?t=AaronToponce&amp;m=atoponce@fosstodon.org\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twittodon.com/share.php?t=Aaro</span><span class=\\\"invisible\\\">nToponce&amp;m=atoponce@fosstodon.org</span></a>\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [\n      {\n        \"name\": \"bsd\",\n        \"url\": \"https://mstdn.jp/tags/bsd\"\n      },\n      {\n        \"name\": \"openbsd\",\n        \"url\": \"https://mstdn.jp/tags/openbsd\"\n      }\n    ],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449717462063\",\n    \"created_at\": \"2023-01-18T17:44:27.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"de\",\n    \"uri\": \"https://mas.to/users/dw/statuses/109711449652333881\",\n    \"url\": \"https://mas.to/@dw/109711449652333881\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>Elon Musk goes on trial for fraud over Tesla tweets</p><p><a href=\\\"https://www.dw.com/en/elon-musk-goes-on-trial-for-fraud-over-tesla-tweets/a-64441276?maca=en-dipa_news_mstdn-34613-xml-mrss\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">dw.com/en/elon-musk-goes-on-tr</span><span class=\\\"invisible\\\">ial-for-fraud-over-tesla-tweets/a-64441276?maca=en-dipa_news_mstdn-34613-xml-mrss</span></a></p><p><a href=\\\"https://mas.to/tags/ElonMusk\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>ElonMusk</span></a> <a href=\\\"https://mas.to/tags/Tesla\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Tesla</span></a> <a href=\\\"https://mas.to/tags/Twitter\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Twitter</span></a></p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109477438774986841\",\n      \"username\": \"dw\",\n      \"acct\": \"dw@mas.to\",\n      \"display_name\": \"DW English - Deutsche Welle\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-11-02T00:00:00.000Z\",\n      \"note\": \"<p>Bringing you the best of DW to Mastodon. More at <a href=\\\"https://www.dw.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">dw.com</span><span class=\\\"invisible\\\"></span></a> || The only DW bot with hashtags for each story. <a href=\\\"https://mas.to/tags/News\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>News</span></a> <a href=\\\"https://mas.to/tags/Journalism\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Journalism</span></a></p>\",\n      \"url\": \"https://mas.to/@dw\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/477/438/774/986/841/original/66fd5209b5dac1a4.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/477/438/774/986/841/original/66fd5209b5dac1a4.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/477/438/774/986/841/original/ade04fd220c35c2f.png\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/477/438/774/986/841/original/ade04fd220c35c2f.png\",\n      \"followers_count\": 901,\n      \"following_count\": 0,\n      \"statuses_count\": 946,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Website\",\n          \"value\": \"<a href=\\\"https://www.dw.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">dw.com</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [\n      {\n        \"name\": \"elonmusk\",\n        \"url\": \"https://mstdn.jp/tags/elonmusk\"\n      },\n      {\n        \"name\": \"tesla\",\n        \"url\": \"https://mstdn.jp/tags/tesla\"\n      },\n      {\n        \"name\": \"twitter\",\n        \"url\": \"https://mstdn.jp/tags/twitter\"\n      }\n    ],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449712244555\",\n    \"created_at\": \"2023-01-18T17:44:28.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/Ship_plat/statuses/109711449675635828\",\n    \"url\": \"https://fedibird.com/@Ship_plat/109711449675635828\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>夜の8時か9時くらいに起きて今の時間帯に起きるって言う変な生活リズム</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109127101599842658\",\n      \"username\": \"Ship_plat\",\n      \"acct\": \"Ship_plat@fedibird.com\",\n      \"display_name\": \"小春\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2022-10-07T00:00:00.000Z\",\n      \"note\": \"<p>交通/GT7/etc<br>音声入力に丸投げしてる</p>\",\n      \"url\": \"https://fedibird.com/@Ship_plat\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/127/101/599/842/658/original/f4a8ad7eb94bd66f.jpeg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/127/101/599/842/658/original/f4a8ad7eb94bd66f.jpeg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/127/101/599/842/658/original/9617fa338c4fe8e3.png\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/127/101/599/842/658/original/9617fa338c4fe8e3.png\",\n      \"followers_count\": 147,\n      \"following_count\": 144,\n      \"statuses_count\": 7430,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"<a href=\\\"https://twitter.com/Ship_plat\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/Ship_plat</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"艦これ\",\n          \"value\": \"<a class=\\\"\\\" href=\\\"https://Kancolle.social/@HKT303\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">Kancolle.social/@HKT303</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"🔞\",\n          \"value\": \"<a class=\\\"\\\" href=\\\"https://heislandmine.work/@JA78AN\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">heislandmine.work/@JA78AN</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": \"2023-01-18T11:22:21.720+00:00\"\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449646051946\",\n    \"created_at\": \"2023-01-18T17:44:27.893Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://mstdn.jp/users/jcpb/statuses/109711449646051946\",\n    \"url\": \"https://mstdn.jp/@jcpb/109711449646051946\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p><a href=\\\"https://mstdn.jp/tags/%E3%81%BF%E3%81%8F%E3%81%A1%E3%82%83\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>みくちゃ</span></a> <a href=\\\"https://mstdn.jp/tags/Mikuture\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>Mikuture</span></a> <a href=\\\"https://mstdn.jp/tags/%E8%8A%B1%E9%9A%88%E5%8D%83%E5%86%AC\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>花隈千冬</span></a> <a href=\\\"https://mstdn.jp/tags/%E8%8A%B1%E9%9A%88%E5%8D%83%E5%86%AC%E5%86%99%E7%9C%9F%E9%83%A8\\\" class=\\\"mention hashtag\\\" rel=\\\"tag\\\">#<span>花隈千冬写真部</span></a></p>\",\n    \"reblog\": null,\n    \"application\": {\n      \"name\": \"Mastodon for Android\",\n      \"website\": \"https://app.joinmastodon.org/android\"\n    },\n    \"account\": {\n      \"id\": \"109322350151762990\",\n      \"username\": \"jcpb\",\n      \"acct\": \"jcpb\",\n      \"display_name\": \"jcpb｜ひろはこ・雪ミク2023参戦٩( 'ω' )و\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-11-11T00:00:00.000Z\",\n      \"note\": \"<p>ミク廃 since 2009。あぴミク、重音テトと結月ゆかりも大好きです。雪ミク2016、MIKUEXPO NA 2016、東京150参戦。MIKUEXPO2021サポーター。</p>\",\n      \"url\": \"https://mstdn.jp/@jcpb\",\n      \"avatar\": \"https://media.mstdn.jp/accounts/avatars/109/322/350/151/762/990/original/b6aaf9eaf50df6f7.png\",\n      \"avatar_static\": \"https://media.mstdn.jp/accounts/avatars/109/322/350/151/762/990/original/b6aaf9eaf50df6f7.png\",\n      \"header\": \"https://media.mstdn.jp/accounts/headers/109/322/350/151/762/990/original/7d61df5745db6958.png\",\n      \"header_static\": \"https://media.mstdn.jp/accounts/headers/109/322/350/151/762/990/original/7d61df5745db6958.png\",\n      \"followers_count\": 11,\n      \"following_count\": 27,\n      \"statuses_count\": 107,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"<a href=\\\"https://twitter.com/jcpb_rildmiku\\\" target=\\\"_blank\\\" rel=\\\"nofollow noopener noreferrer me\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/jcpb_rildmiku</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"ニコニコ静画\",\n          \"value\": \"<a href=\\\"https://seiga.nicovideo.jp/user/illust/15815718\\\" target=\\\"_blank\\\" rel=\\\"nofollow noopener noreferrer me\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">seiga.nicovideo.jp/user/illust</span><span class=\\\"invisible\\\">/15815718</span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Moments (past pictures)\",\n          \"value\": \"<a href=\\\"https://twitter.com/jcpb_rildmiku/moments\\\" target=\\\"_blank\\\" rel=\\\"nofollow noopener noreferrer me\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">twitter.com/jcpb_rildmiku/mome</span><span class=\\\"invisible\\\">nts</span></a>\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [\n      {\n        \"id\": \"109711448216810671\",\n        \"type\": \"image\",\n        \"url\": \"https://media.mstdn.jp/media_attachments/files/109/711/448/216/810/671/original/dcdb26c8e5f90088.png\",\n        \"preview_url\": \"https://media.mstdn.jp/media_attachments/files/109/711/448/216/810/671/small/dcdb26c8e5f90088.png\",\n        \"remote_url\": null,\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 942,\n            \"height\": 2201,\n            \"size\": \"942x2201\",\n            \"aspect\": 0.4279872785097683\n          },\n          \"small\": {\n            \"width\": 262,\n            \"height\": 611,\n            \"size\": \"262x611\",\n            \"aspect\": 0.4288052373158756\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UYG95EMxkCtR_4Rjt8s:.8M{xat7-=t7RioL\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [\n      {\n        \"name\": \"花隈千冬写真部\",\n        \"url\": \"https://mstdn.jp/tags/%E8%8A%B1%E9%9A%88%E5%8D%83%E5%86%AC%E5%86%99%E7%9C%9F%E9%83%A8\"\n      },\n      {\n        \"name\": \"花隈千冬\",\n        \"url\": \"https://mstdn.jp/tags/%E8%8A%B1%E9%9A%88%E5%8D%83%E5%86%AC\"\n      },\n      {\n        \"name\": \"mikuture\",\n        \"url\": \"https://mstdn.jp/tags/mikuture\"\n      },\n      {\n        \"name\": \"みくちゃ\",\n        \"url\": \"https://mstdn.jp/tags/%E3%81%BF%E3%81%8F%E3%81%A1%E3%82%83\"\n      }\n    ],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449592960504\",\n    \"created_at\": \"2023-01-18T17:44:22.810Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": true,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://bae.st/objects/4b070959-87a5-4426-898a-4fb565752e9d\",\n    \"url\": \"https://bae.st/objects/4b070959-87a5-4426-898a-4fb565752e9d\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"Always remember, the dick makes it cuter. <a class=\\\"hashtag\\\" href=\\\"https://bae.st/tag/futa\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#Futa</a> <a class=\\\"hashtag\\\" href=\\\"https://bae.st/tag/nafo\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#NAFO</a><br><a href=\\\"https://bae.st/media/a6180d5e42dfafb4a3520f27e69c78707f6c6b92a8eb2948e310d8817f9d05ab.jpg?name=mastodonpyupload_1674063861.8918924_H6MTSN9V1R.jpg\\\" class=\\\"\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">mastodonpyupload_1674063861.8918924_H6MTSN9V1R.jpg</a>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109321716565372110\",\n      \"username\": \"FutaBot\",\n      \"acct\": \"FutaBot@bae.st\",\n      \"display_name\": \"Futa Bot\",\n      \"locked\": false,\n      \"bot\": true,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-11-10T00:00:00.000Z\",\n      \"note\": \"Posting anime futa girls every 30 minutes<br><br>Bot owned by: <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/redneonglow\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>redneonglow</span></a></span><br><br>Powered by Danbooru Fediverse Poster: <a href=\\\"https://github.com/FloatingGhost/danbooru-fediverse-poster\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">https://github.com/FloatingGhost/danbooru-fediverse-poster</a><br><br>Other fun bots: <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/AnimeMommiesBot\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>AnimeMommiesBot</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/BitchX\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>BitchX</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/darkweb\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>darkweb</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/fortunebot\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>fortunebot</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/Impregumin\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>Impregumin</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/LeotardBot\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>LeotardBot</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/LewdPixelArt\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>LewdPixelArt</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/loliaword\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>loliaword</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/LoveLiveBot\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>LoveLiveBot</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/maidinheavenframes\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>maidinheavenframes</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/NekoBot\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>NekoBot</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/PantsuBot\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>PantsuBot</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/RedsAnimeGirlDungeon\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>RedsAnimeGirlDungeon</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/ShowerThoughts\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>ShowerThoughts</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/weebaword\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>weebaword</span></a></span> <span class=\\\"h-card\\\"><a class=\\\"u-url mention\\\" href=\\\"https://bae.st/users/YKYWTMSMW\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">@<span>YKYWTMSMW</span></a></span>\",\n      \"url\": \"https://bae.st/users/FutaBot\",\n      \"avatar\": \"https://mstdn.jp/avatars/original/missing.png\",\n      \"avatar_static\": \"https://mstdn.jp/avatars/original/missing.png\",\n      \"header\": \"https://mstdn.jp/headers/original/missing.png\",\n      \"header_static\": \"https://mstdn.jp/headers/original/missing.png\",\n      \"followers_count\": 172,\n      \"following_count\": 31,\n      \"statuses_count\": 2783,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [\n      {\n        \"id\": \"109711449358578343\",\n        \"type\": \"image\",\n        \"url\": \"https://media.mstdn.jp/cache/media_attachments/files/109/711/449/358/578/343/original/0c0c501fa441962e.jpg\",\n        \"preview_url\": \"https://media.mstdn.jp/cache/media_attachments/files/109/711/449/358/578/343/small/0c0c501fa441962e.jpg\",\n        \"remote_url\": \"https://bae.st/media/a6180d5e42dfafb4a3520f27e69c78707f6c6b92a8eb2948e310d8817f9d05ab.jpg?name=mastodonpyupload_1674063861.8918924_H6MTSN9V1R.jpg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"original\": {\n            \"width\": 707,\n            \"height\": 1000,\n            \"size\": \"707x1000\",\n            \"aspect\": 0.707\n          },\n          \"small\": {\n            \"width\": 336,\n            \"height\": 475,\n            \"size\": \"336x475\",\n            \"aspect\": 0.7073684210526315\n          }\n        },\n        \"description\": \"mastodonpyupload_1674063861.8918924_H6MTSN9V1R.jpg\",\n        \"blurhash\": \"UIP=Wq8y%~PCyT.lxuOZQkNgVZj?#Uo}XnRP\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [\n      {\n        \"name\": \"NAFO\",\n        \"url\": \"https://mstdn.jp/tags/NAFO\"\n      },\n      {\n        \"name\": \"futa\",\n        \"url\": \"https://mstdn.jp/tags/futa\"\n      }\n    ],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449563700370\",\n    \"created_at\": \"2023-01-18T17:44:24.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://mstdn.party/users/jessicawildfire/statuses/109711449437834570\",\n    \"url\": \"https://mstdn.party/@jessicawildfire/109711449437834570\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>Here's 150+ Sources on Covid to Share with Everyone You Know<br>An ongoing project.<br><a href=\\\"https://jessicawildfire.substack.com/p/heres-150-sources-on-covid-to-share\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">jessicawildfire.substack.com/p</span><span class=\\\"invisible\\\">/heres-150-sources-on-covid-to-share</span></a></p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109372941356789605\",\n      \"username\": \"jessicawildfire\",\n      \"acct\": \"jessicawildfire@mstdn.party\",\n      \"display_name\": \"Jessica Wildfire\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-11-12T00:00:00.000Z\",\n      \"note\": \"<p>Doomer.<br>jessicawildfire.substack.com<br>medium.com/@JessicaLexicus</p>\",\n      \"url\": \"https://mstdn.party/@jessicawildfire\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/372/941/356/789/605/original/965d74b852dc071d.png\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/372/941/356/789/605/original/965d74b852dc071d.png\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/372/941/356/789/605/original/fb14ac6605017630.jpg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/372/941/356/789/605/original/fb14ac6605017630.jpg\",\n      \"followers_count\": 722,\n      \"following_count\": 65,\n      \"statuses_count\": 450,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449388576572\",\n    \"created_at\": \"2023-01-18T17:44:23.621Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": null,\n    \"uri\": \"https://misskey.cloud/notes/9a5ipphhw2\",\n    \"url\": \"https://misskey.cloud/notes/9a5ipphhw2\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p><span>It's nice that this server is open to the English-speaking world to some degree<br><br>Anyway, I already had a lot of confusion from the past when I was in that Discord server and got invaded at the end<br>I also had nice things there, though<br>I can't go back because it isn't my safe place<br>Although I need to spend time calmly now, it's nice to see you again</span></p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109574882508473406\",\n      \"username\": \"kalvstranger\",\n      \"acct\": \"kalvstranger@misskey.cloud\",\n      \"display_name\": \"Kalv かぶ\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-12-25T00:00:00.000Z\",\n      \"note\": \"<p><span>心の建築現場の不安定な足場の上で心理化能力に戸惑うオーティスティック<br>アイコン・ヘッダーはつくみず先生絵<br><br>KAV /kæv/ in NAmE and KAHV /kɑːv/ in BrE<br>An autistic feeling at a loss by his mentalizing abilities on an unstable scaffold on a mental construction site<br>Icon and header by Tsukumizu</span></p>\",\n      \"url\": \"https://misskey.cloud/@kalvstranger\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/574/882/508/473/406/original/2a9eb578214b476a.png\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/574/882/508/473/406/original/2a9eb578214b476a.png\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/574/882/508/473/406/original/222cc43310f104d4.png\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/574/882/508/473/406/original/222cc43310f104d4.png\",\n      \"followers_count\": 5,\n      \"following_count\": 11,\n      \"statuses_count\": 360,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Warpday\",\n          \"value\": \"@kalvstranger@warpday.net\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449348878774\",\n    \"created_at\": \"2023-01-18T17:44:22.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://mastodon.social/users/dattmay/statuses/109711449287079159\",\n    \"url\": \"https://mastodon.social/@dattmay/109711449287079159\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>So <a href=\\\"https://mastodon.social/tags/Apple\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Apple</span></a> is re-releasing the failed big boy <a href=\\\"https://mastodon.social/tags/HomePod\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>HomePod</span></a> but with Matter support and a $50 discount?</p><p>Sure.</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109385246670280820\",\n      \"username\": \"dattmay\",\n      \"acct\": \"dattmay@mastodon.social\",\n      \"display_name\": \"Dattmay\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2017-12-11T00:00:00.000Z\",\n      \"note\": \"<p>Dog lover, nerd, and Pittsburgh based training manager who's just looking to love his boyfriend, ride rollercoasters and travel.</p><p><a href=\\\"https://mastodon.social/tags/LGBTQ\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>LGBTQ</span></a> <a href=\\\"https://mastodon.social/tags/Pittsburgh\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Pittsburgh</span></a> <a href=\\\"https://mastodon.social/tags/Nerd\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Nerd</span></a> <a href=\\\"https://mastodon.social/tags/Xbox\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Xbox</span></a> <a href=\\\"https://mastodon.social/tags/Nintendo\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Nintendo</span></a> <a href=\\\"https://mastodon.social/tags/Rollercoaster\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Rollercoaster</span></a> <a href=\\\"https://mastodon.social/tags/CoasterEnthusiast\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>CoasterEnthusiast</span></a> <a href=\\\"https://mastodon.social/tags/Travel\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Travel</span></a> <a href=\\\"https://mastodon.social/tags/Japan\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Japan</span></a></p>\",\n      \"url\": \"https://mastodon.social/@dattmay\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/385/246/670/280/820/original/cc67d2a59ba0c707.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/385/246/670/280/820/original/cc67d2a59ba0c707.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/385/246/670/280/820/original/008ddb9e26500613.jpg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/385/246/670/280/820/original/008ddb9e26500613.jpg\",\n      \"followers_count\": 97,\n      \"following_count\": 124,\n      \"statuses_count\": 502,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [\n      {\n        \"name\": \"homepod\",\n        \"url\": \"https://mstdn.jp/tags/homepod\"\n      },\n      {\n        \"name\": \"apple\",\n        \"url\": \"https://mstdn.jp/tags/apple\"\n      }\n    ],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449299130833\",\n    \"created_at\": \"2023-01-18T17:44:22.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"fr\",\n    \"uri\": \"https://mediastodon.com/users/dwnews/statuses/109711449260173905\",\n    \"url\": \"https://mediastodon.com/@dwnews/109711449260173905\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>Researchers have discovered that chocolate with a lower fat content could taste just as good 🍫🍫   <a href=\\\"https://trib.al/mp1ZV8M\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">trib.al/mp1ZV8M</span><span class=\\\"invisible\\\"></span></a></p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109555708786159654\",\n      \"username\": \"dwnews\",\n      \"acct\": \"dwnews@mediastodon.com\",\n      \"display_name\": \"DW News\",\n      \"locked\": false,\n      \"bot\": true,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-12-21T00:00:00.000Z\",\n      \"note\": \"<p>We really know Germany 🇩🇪. Follow us for trustworthy news and analysis from our reporters around the world. We also have a sense of humor. Sometimes.</p><p>(You represent this media? Claim it by contacting us by e-mail -&gt; contact@mediastodon.com)</p>\",\n      \"url\": \"https://mediastodon.com/@dwnews\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/555/708/786/159/654/original/845357cff054815b.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/555/708/786/159/654/original/845357cff054815b.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/555/708/786/159/654/original/46dc0435ecc911e5.jpeg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/555/708/786/159/654/original/46dc0435ecc911e5.jpeg\",\n      \"followers_count\": 73,\n      \"following_count\": 0,\n      \"statuses_count\": 1401,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Website\",\n          \"value\": \"<a href=\\\"https://dw.com\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">dw.com</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"<a href=\\\"https://twitter.com/dwnews\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">twitter.com/dwnews</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449234196053\",\n    \"created_at\": \"2023-01-18T17:44:08.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://anonsys.net/objects/bf69967c-1463-c82f-e82e-86f222024621\",\n    \"url\": \"https://anonsys.net/display/bf69967c-1463-c82f-e82e-86f222024621\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"Fix compiler warning <a href=\\\"http://git.savannah.gnu.org/cgit/hurd/hurd.git/commit/?id=8fa6ecf56293bdc4b5a29994a389c7dce4038917\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">git.savannah.gnu.org/cgit/hurd…</a>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"942268\",\n      \"username\": \"freax\",\n      \"acct\": \"freax@anonsys.net\",\n      \"display_name\": \"Freax\",\n      \"locked\": false,\n      \"bot\": true,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2021-03-15T00:00:00.000Z\",\n      \"note\": \"Enjoy the latest news from the informatics world.\",\n      \"url\": \"https://anonsys.net/profile/freax\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/000/942/268/original/1ccc750671ed8eaf.jpeg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/000/942/268/original/1ccc750671ed8eaf.jpeg\",\n      \"header\": \"https://mstdn.jp/headers/original/missing.png\",\n      \"header_static\": \"https://mstdn.jp/headers/original/missing.png\",\n      \"followers_count\": 111,\n      \"following_count\": 40,\n      \"statuses_count\": 13936,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": {\n      \"url\": \"http://git.savannah.gnu.org/cgit/hurd/hurd.git/commit/?id=8fa6ecf56293bdc4b5a29994a389c7dce4038917\",\n      \"title\": \"hurd/hurd.git - Hurd\",\n      \"description\": \"\",\n      \"type\": \"link\",\n      \"author_name\": \"\",\n      \"author_url\": \"\",\n      \"provider_name\": \"\",\n      \"provider_url\": \"\",\n      \"html\": \"\",\n      \"width\": 0,\n      \"height\": 0,\n      \"image\": null,\n      \"embed_url\": \"\",\n      \"blurhash\": null\n    },\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449160010513\",\n    \"created_at\": \"2023-01-18T17:44:19.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://fedibird.com/users/SyamoZy/statuses/109711449071303941\",\n    \"url\": \"https://fedibird.com/@SyamoZy/109711449071303941\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>はるのんのんも失敗してて泣いた</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109088195249352221\",\n      \"username\": \"SyamoZy\",\n      \"acct\": \"SyamoZy@fedibird.com\",\n      \"display_name\": \"しゃも爺\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2022-09-28T00:00:00.000Z\",\n      \"note\": \"<p>pineapple pizza is good</p>\",\n      \"url\": \"https://fedibird.com/@SyamoZy\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/088/195/249/352/221/original/beb0373dbd25ba0c.jpeg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/088/195/249/352/221/original/beb0373dbd25ba0c.jpeg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/088/195/249/352/221/original/39fce30475bc1747.jpeg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/088/195/249/352/221/original/39fce30475bc1747.jpeg\",\n      \"followers_count\": 187,\n      \"following_count\": 133,\n      \"statuses_count\": 17170,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449075223176\",\n    \"created_at\": \"2023-01-18T17:44:18.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://mas.to/users/BruceMirken/statuses/109711449017698334\",\n    \"url\": \"https://mas.to/@BruceMirken/109711449017698334\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>How to fight anti-<a href=\\\"https://mas.to/tags/trans\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>trans</span></a> attacks in your state and around the U.S. This comprehensive resource was shared on a listserve I'm on and it looks really helpful: <a href=\\\"https://docs.google.com/document/d/1BOJZ3GJPRqCwSck1uFCUARZiqt1HVKhLO-yBi6Bpuvg/mobilebasic\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">docs.google.com/document/d/1BO</span><span class=\\\"invisible\\\">JZ3GJPRqCwSck1uFCUARZiqt1HVKhLO-yBi6Bpuvg/mobilebasic</span></a></p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109351277103894372\",\n      \"username\": \"BruceMirken\",\n      \"acct\": \"BruceMirken@mas.to\",\n      \"display_name\": \"Bruce Mirken\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-11-15T00:00:00.000Z\",\n      \"note\": \"<p>Writer and media relations consultant for several nonprofits, but all ravings here are strictly mine. General troublemaker. Transplanted from California to Hilo, Hawaii. Formerly @Greenlining, @MarijuanaPolicy and recent escapee from the <a href=\\\"https://mas.to/tags/BirdSite\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>BirdSite</span></a>. <br><a href=\\\"https://mas.to/tags/RacialJustice\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>RacialJustice</span></a><br><a href=\\\"https://mas.to/tags/LGBTQ\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>LGBTQ</span></a><br><a href=\\\"https://mas.to/tags/EnvironmentalJustice\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>EnvironmentalJustice</span></a><br><a href=\\\"https://mas.to/tags/BlackLivesMatter\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>BlackLivesMatter</span></a><br><a href=\\\"https://mas.to/tags/DrugPolicyReform\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>DrugPolicyReform</span></a><br><a href=\\\"https://mas.to/tags/ProtectTransKids\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>ProtectTransKids</span></a><br><a href=\\\"https://mas.to/tags/ElectricVehicles\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>ElectricVehicles</span></a><br><a href=\\\"https://mas.to/tags/EvacuateTwitter\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>EvacuateTwitter</span></a></p>\",\n      \"url\": \"https://mas.to/@BruceMirken\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/351/277/103/894/372/original/d4ab8156736d78b2.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/351/277/103/894/372/original/d4ab8156736d78b2.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/351/277/103/894/372/original/6c5743eefd8417c9.jpg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/351/277/103/894/372/original/6c5743eefd8417c9.jpg\",\n      \"followers_count\": 532,\n      \"following_count\": 300,\n      \"statuses_count\": 3668,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [\n      {\n        \"name\": \"trans\",\n        \"url\": \"https://mstdn.jp/tags/trans\"\n      }\n    ],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711449020184228\",\n    \"created_at\": \"2023-01-18T17:44:11.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://heislandmine.work/users/3b7960/statuses/109711448565044436\",\n    \"url\": \"https://heislandmine.work/@3b7960/109711448565044436\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>​:blob_cry:​</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"652490\",\n      \"username\": \"3b7960\",\n      \"acct\": \"3b7960@heislandmine.work\",\n      \"display_name\": \"瞬間凍結縮小金玉木賊\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2018-12-08T00:00:00.000Z\",\n      \"note\": \"<p>独り寝に　縮む金玉　もてあそび　(冬の句　季語…縮む金玉)</p>\",\n      \"url\": \"https://heislandmine.work/@3b7960\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/000/652/490/original/bb23ae05d585eb6f.png\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/000/652/490/original/bb23ae05d585eb6f.png\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/000/652/490/original/7ab3ded7b4397422.jpeg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/000/652/490/original/7ab3ded7b4397422.jpeg\",\n      \"followers_count\": 693,\n      \"following_count\": 378,\n      \"statuses_count\": 88398,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [\n      {\n        \"shortcode\": \"blob_cry\",\n        \"url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/067/950/original/ef393e51b8cea5a5.png\",\n        \"static_url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/067/950/static/ef393e51b8cea5a5.png\",\n        \"visible_in_picker\": true\n      }\n    ],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711448924926713\",\n    \"created_at\": \"2023-01-18T17:44:15.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://eightpoint.app/users/MaddieQuestions/statuses/109711448811393635\",\n    \"url\": \"https://eightpoint.app/@MaddieQuestions/109711448811393635\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>Still bizarre to me that this tech dude at Fred Meyer tried to convince me I didn't want a tv with smartcast when that's such a good feature </p><p>Sure I don't need to use my phone to operate my TV but I like the part where I can search for things to watch with a touchscreen instead of slowly working a \\\"keyboard\\\" with a remote control</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109349319598569491\",\n      \"username\": \"MaddieQuestions\",\n      \"acct\": \"MaddieQuestions@eightpoint.app\",\n      \"display_name\": \"Maddie, Winter Witch\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-11-13T00:00:00.000Z\",\n      \"note\": \"<p>Maddie | She/Her/Kallai | Queer Lesbian | Genderfluid | Disabled Spoonie | White | Invincible Sword Goddess | Was lisaquestions on Twitter, Tumblr, etc</p>\",\n      \"url\": \"https://eightpoint.app/@MaddieQuestions\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/349/319/598/569/491/original/aeafebfd37d22ad5.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/349/319/598/569/491/original/aeafebfd37d22ad5.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/349/319/598/569/491/original/e4f557e4fbb607f3.jpg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/349/319/598/569/491/original/e4f557e4fbb607f3.jpg\",\n      \"followers_count\": 513,\n      \"following_count\": 541,\n      \"statuses_count\": 1878,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Youtube\",\n          \"value\": \"<a href=\\\"https://www.youtube.com/channel/UCCfxdvpdsjnlJuQC8OPhQvg\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">youtube.com/channel/UCCfxdvpds</span><span class=\\\"invisible\\\">jnlJuQC8OPhQvg</span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Twitch\",\n          \"value\": \"<a href=\\\"https://www.twitch.tv/femmedracula\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">twitch.tv/femmedracula</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711448880206533\",\n    \"created_at\": \"2023-01-18T17:44:15.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://mastodon.social/users/amyhoy/statuses/109711448811922240\",\n    \"url\": \"https://mastodon.social/@amyhoy/109711448811922240\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>accidentally hot mic'd at the end of my webinar 🙀 luckily it was just thomas saying it went well and he wished more people showed up and i said it was more than i thought. phew.</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"585451\",\n      \"username\": \"amyhoy\",\n      \"acct\": \"amyhoy@mastodon.social\",\n      \"display_name\": \"Amy Hoy\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": false,\n      \"group\": false,\n      \"created_at\": \"2018-08-18T00:00:00.000Z\",\n      \"note\": \"<p>juicy, electrified meatsack // \\\"refreshing, thought provoking, and useful\\\" — mike tannenbaum // \\\"probably the greatest living software QA\\\" — nick disabato</p>\",\n      \"url\": \"https://mastodon.social/@amyhoy\",\n      \"avatar\": \"https://media.mstdn.jp/accounts/avatars/000/585/451/original/79bff77aed8a097c.jpeg\",\n      \"avatar_static\": \"https://media.mstdn.jp/accounts/avatars/000/585/451/original/79bff77aed8a097c.jpeg\",\n      \"header\": \"https://media.mstdn.jp/accounts/headers/000/585/451/original/48c716c752041d2c.jpeg\",\n      \"header_static\": \"https://media.mstdn.jp/accounts/headers/000/585/451/original/48c716c752041d2c.jpeg\",\n      \"followers_count\": 1733,\n      \"following_count\": 215,\n      \"statuses_count\": 1371,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711448861964968\",\n    \"created_at\": \"2023-01-18T17:44:12.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"en\",\n    \"uri\": \"https://c18.masto.host/users/SethRudy/statuses/109711448636672518\",\n    \"url\": \"https://c18.masto.host/@SethRudy/109711448636672518\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>“Politics and the pulpit are terms that have little agreement. No sound ought to be heard in the church but the healing voice of Christian charity. The cause of civil Liberty and civil government gains as little as that of religion by this confusion of duties.” ~ Edmund Burke, philosophical founder of conservatism and current in-grave spinner</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109280863252648596\",\n      \"username\": \"SethRudy\",\n      \"acct\": \"SethRudy@c18.masto.host\",\n      \"display_name\": \"Saethelred the Unsteady\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-10-31T00:00:00.000Z\",\n      \"note\": \"<p>Literature Professor specializing in <a href=\\\"https://c18.masto.host/tags/Enlightenment\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Enlightenment</span></a> <a href=\\\"https://c18.masto.host/tags/encyclopedism\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>encyclopedism</span></a> and the <a href=\\\"https://c18.masto.host/tags/HistoryOfKnowledge\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>HistoryOfKnowledge</span></a>.</p>\",\n      \"url\": \"https://c18.masto.host/@SethRudy\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/280/863/252/648/596/original/ea3b5176308b406c.png\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/280/863/252/648/596/original/ea3b5176308b406c.png\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/280/863/252/648/596/original/13d3dc277ada6d59.jpeg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/280/863/252/648/596/original/13d3dc277ada6d59.jpeg\",\n      \"followers_count\": 480,\n      \"following_count\": 192,\n      \"statuses_count\": 420,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": [\n        {\n          \"name\": \"Website\",\n          \"value\": \"<a href=\\\"https://www.sethrudy.com/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"\\\">sethrudy.com/</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Book!\",\n          \"value\": \"<a href=\\\"https://link.springer.com/book/10.1057/9781137411549\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"ellipsis\\\">link.springer.com/book/10.1057</span><span class=\\\"invisible\\\">/9781137411549</span></a>\",\n          \"verified_at\": null\n        },\n        {\n          \"name\": \"Newer Book!\",\n          \"value\": \"<a href=\\\"https://www.bloomsbury.com/us/ends-of-knowledge-9781350242289/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://www.</span><span class=\\\"ellipsis\\\">bloomsbury.com/us/ends-of-know</span><span class=\\\"invisible\\\">ledge-9781350242289/</span></a>\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711448756267924\",\n    \"created_at\": \"2023-01-18T17:44:05.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"de\",\n    \"uri\": \"https://bildung.social/users/empathroet/statuses/109711448150939716\",\n    \"url\": \"https://bildung.social/@empathroet/109711448150939716\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"<p>BÄM! 20 Seiten Hausarbeit abgeschickt. ☝🏼 🥳</p>\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"108224738277154747\",\n      \"username\": \"empathroet\",\n      \"acct\": \"empathroet@bildung.social\",\n      \"display_name\": \"A. Hofmann :mastodon:\",\n      \"locked\": false,\n      \"bot\": false,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-04-30T00:00:00.000Z\",\n      \"note\": \"<p>Politikinteressierter Erzieher - Sozialpädagogischer Familienhelfer - Soziologiestudent  </p><p>geb: 344.96 ppm 🌍   </p><p>Demokrat = Antifa ✊ </p><p>Kein CW für Politik / Nachrichten 🚫   </p><p>Alternative zum Doomscrolling:</p><p>:mastoread: [!] <a href=\\\"https://bildung.social/tags/GuteNachrichtenSamstag\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>GuteNachrichtenSamstag</span></a> [!] :mastoread:</p><p>Weitere Infos in angehefteter Vorstellung</p><p>Folge grundsätzlich erstmal allen zurück, die mir folgen. 🚶🏼‍♂️</p><p>Bleibt lieb! Und viel Spaß beim Tröten. :mastolove:</p><p><a href=\\\"https://bildung.social/tags/fedi22\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>fedi22</span></a> <a href=\\\"https://bildung.social/tags/Politik\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Politik</span></a> <a href=\\\"https://bildung.social/tags/Armut\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Armut</span></a> <a href=\\\"https://bildung.social/tags/Ungleichheit\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Ungleichheit</span></a> <a href=\\\"https://bildung.social/tags/Rechtsextremismus\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Rechtsextremismus</span></a> <a href=\\\"https://bildung.social/tags/Faschismus\\\" class=\\\"mention hashtag\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\">#<span>Faschismus</span></a></p>\",\n      \"url\": \"https://bildung.social/@empathroet\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/108/224/738/277/154/747/original/ed2bab83ee021d3c.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/108/224/738/277/154/747/original/ed2bab83ee021d3c.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/108/224/738/277/154/747/original/7f718dbfe2fc6729.jpg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/108/224/738/277/154/747/original/7f718dbfe2fc6729.jpg\",\n      \"followers_count\": 3023,\n      \"following_count\": 3452,\n      \"statuses_count\": 1757,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [\n        {\n          \"shortcode\": \"mastoread\",\n          \"url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/323/483/original/9ffa7f1ca7e40e13.png\",\n          \"static_url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/323/483/static/9ffa7f1ca7e40e13.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"mastolove\",\n          \"url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/320/612/original/f34e6a31fd006977.png\",\n          \"static_url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/320/612/static/f34e6a31fd006977.png\",\n          \"visible_in_picker\": true\n        },\n        {\n          \"shortcode\": \"mastodon\",\n          \"url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/273/506/original/50eafaa92fcf4dff.png\",\n          \"static_url\": \"https://media.mstdn.jp/cache/custom_emojis/images/000/273/506/static/50eafaa92fcf4dff.png\",\n          \"visible_in_picker\": true\n        }\n      ],\n      \"fields\": [\n        {\n          \"name\": \"Publikum\",\n          \"value\": \"<a href=\\\"https://publikum.net/author/a-hofmann/\\\" rel=\\\"nofollow noopener noreferrer\\\" target=\\\"_blank\\\"><span class=\\\"invisible\\\">https://</span><span class=\\\"\\\">publikum.net/author/a-hofmann/</span><span class=\\\"invisible\\\"></span></a>\",\n          \"verified_at\": null\n        }\n      ]\n    },\n    \"media_attachments\": [],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  },\n  {\n    \"id\": \"109711448483099897\",\n    \"created_at\": \"2023-01-18T17:44:05.000Z\",\n    \"in_reply_to_id\": null,\n    \"in_reply_to_account_id\": null,\n    \"sensitive\": false,\n    \"spoiler_text\": \"\",\n    \"visibility\": \"public\",\n    \"language\": \"ja\",\n    \"uri\": \"https://mstdn.social/users/semi2023/statuses/109711448200200539\",\n    \"url\": \"https://mstdn.social/@semi2023/109711448200200539\",\n    \"replies_count\": 0,\n    \"reblogs_count\": 0,\n    \"favourites_count\": 0,\n    \"edited_at\": null,\n    \"favourited\": false,\n    \"reblogged\": false,\n    \"muted\": false,\n    \"bookmarked\": false,\n    \"content\": \"\",\n    \"reblog\": null,\n    \"account\": {\n      \"id\": \"109291645089488580\",\n      \"username\": \"semi2023\",\n      \"acct\": \"semi2023@mstdn.social\",\n      \"display_name\": \"ぼっち・ざ・ぼっと！\",\n      \"locked\": false,\n      \"bot\": true,\n      \"discoverable\": true,\n      \"group\": false,\n      \"created_at\": \"2022-11-01T00:00:00.000Z\",\n      \"note\": \"<p>はじめまして！プロフィール見てくれて、ありがとうございます！<br>下北沢でバンドをしています。<br>学校で出会いがないので登録してみました。</p><p>美味しいグルメと、感動する音楽が大好きです！<br>家で過ごすのも好きですが、街で深夜俳諧するのも好きです(^^)<br>気軽によろしくお願いします☆ </p><p>仕事で帰りが遅いため、返信が遅れることがあります。すみません＞＜<br>読んでいただいてありがとうございました(^^)<br>ヴィーシャ</p>\",\n      \"url\": \"https://mstdn.social/@semi2023\",\n      \"avatar\": \"https://media.mstdn.jp/cache/accounts/avatars/109/291/645/089/488/580/original/77db685e0a9e1999.jpg\",\n      \"avatar_static\": \"https://media.mstdn.jp/cache/accounts/avatars/109/291/645/089/488/580/original/77db685e0a9e1999.jpg\",\n      \"header\": \"https://media.mstdn.jp/cache/accounts/headers/109/291/645/089/488/580/original/552eb76b9221fceb.jpg\",\n      \"header_static\": \"https://media.mstdn.jp/cache/accounts/headers/109/291/645/089/488/580/original/552eb76b9221fceb.jpg\",\n      \"followers_count\": 119,\n      \"following_count\": 95,\n      \"statuses_count\": 792,\n      \"last_status_at\": \"2023-01-18\",\n      \"emojis\": [],\n      \"fields\": []\n    },\n    \"media_attachments\": [\n      {\n        \"id\": \"109711448257843691\",\n        \"type\": \"image\",\n        \"url\": \"https://media.mstdn.jp/cache/media_attachments/files/109/711/448/257/843/691/original/c23b8b0c185ce938.jpeg\",\n        \"preview_url\": \"https://media.mstdn.jp/cache/media_attachments/files/109/711/448/257/843/691/small/c23b8b0c185ce938.jpeg\",\n        \"remote_url\": \"https://media.mstdn.social/media_attachments/files/109/711/447/743/496/614/original/dd168b65cfe79427.jpeg\",\n        \"preview_remote_url\": null,\n        \"text_url\": null,\n        \"meta\": {\n          \"focus\": {\n            \"x\": -0.14,\n            \"y\": 0.87\n          },\n          \"original\": {\n            \"width\": 1291,\n            \"height\": 1606,\n            \"size\": \"1291x1606\",\n            \"aspect\": 0.8038605230386052\n          },\n          \"small\": {\n            \"width\": 359,\n            \"height\": 446,\n            \"size\": \"359x446\",\n            \"aspect\": 0.804932735426009\n          }\n        },\n        \"description\": null,\n        \"blurhash\": \"UXPi-etS~pnOR4RkRixu?vaLi_gMtRs;oLRi\"\n      }\n    ],\n    \"mentions\": [],\n    \"tags\": [],\n    \"emojis\": [],\n    \"card\": null,\n    \"poll\": null\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/user_dto_give_harunon_case1.json",
    "content": "{\n  \"id\": \"919yl2fdkn\",\n  \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n  \"username\": \"harunon\",\n  \"host\": \"misskey.io\",\n  \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n  \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n  \"avatarColor\": null,\n  \"isAdmin\": false,\n  \"isModerator\": false,\n  \"isBot\": false,\n  \"isCat\": true,\n  \"instance\": {\n    \"name\": \"Misskey.io\",\n    \"softwareName\": \"misskey\",\n    \"softwareVersion\": \"12.118.1\",\n    \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n    \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n    \"themeColor\": \"#86b300\"\n  },\n  \"emojis\": [\n    {\n      \"name\": \"keybase\",\n      \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n    }\n  ],\n  \"onlineStatus\": \"unknown\",\n  \"driveCapacityOverrideMb\": null,\n  \"url\": \"https://misskey.io/@harunon\",\n  \"uri\": \"https://misskey.io/users/7rla9gie6j\",\n  \"createdAt\": \"2022-06-09T02:22:24.649Z\",\n  \"updatedAt\": \"2022-09-25T06:50:07.066Z\",\n  \"lastFetchedAt\": \"2022-09-24T19:06:17.341Z\",\n  \"bannerUrl\": \"https://misskey.pantasystem.com/files/ac9562dc-06ca-465d-ad07-1d698ad10256\",\n  \"bannerBlurhash\": \"yHL:7F~S~2wgE2MiIV%sou?Hs;R6D+wJV%IXM|oyEKtMfzM|M{rwX8I:-.%1w[r=IWShW=ozxa+}xVSdNHa_WEt7TCxXM|IW%2t7V]\",\n  \"bannerColor\": null,\n  \"isLocked\": false,\n  \"isSilenced\": false,\n  \"isSuspended\": false,\n  \"description\": \"Design / Programming / wishlist→https://amzn.to/2Z6BrEz /#Vue /#Nuxt /#Flutter / ｵﾅｶｲﾀｲ / ﾅﾆﾓﾃﾞｷﾅｲ\",\n  \"location\": null,\n  \"birthday\": \"2097-02-06\",\n  \"lang\": null,\n  \"fields\": [\n    {\n      \"name\": \"keybase\",\n      \"value\": \"https://keybase.io/harunon\"\n    },\n    {\n      \"name\": \"ぢすこ\",\n      \"value\": \"harunon#5514\"\n    },\n    {\n      \"name\": \"wishlist\",\n      \"value\": \"https://amzn.to/2Z6BrEz\"\n    },\n    {\n      \"name\": \"紫翠\",\n      \"value\": \"しすい\"\n    },\n    {\n      \"name\": \"Switchフレコ\",\n      \"value\": \"https://lounge.nintendo.com/friendcode/8544-1595-7987/DFDTn7QBYt\"\n    }\n  ],\n  \"followersCount\": 2,\n  \"followingCount\": 2,\n  \"notesCount\": 24051,\n  \"pinnedNoteIds\": [\n    \"92a5xndqfd\",\n    \"91bhhyz350\",\n    \"87cqvphsku\",\n    \"7yo80rvolb\",\n    \"7wkp7bjzl1\"\n  ],\n  \"pinnedNotes\": [\n    {\n      \"id\": \"92a5xndqfd\",\n      \"createdAt\": \"2022-07-04T10:27:51.326Z\",\n      \"userId\": \"919yl2fdkn\",\n      \"user\": {\n        \"id\": \"919yl2fdkn\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"username\": \"harunon\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n        \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n        \"avatarColor\": null,\n        \"isCat\": true,\n        \"instance\": {\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n          \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n          }\n        ],\n        \"onlineStatus\": \"unknown\",\n        \"driveCapacityOverrideMb\": null\n      },\n      \"text\": \"かわいい\",\n      \"cw\": null,\n      \"visibility\": \"public\",\n      \"renoteCount\": 9,\n      \"repliesCount\": 1,\n      \"reactions\": {\n        \"❤\": 1,\n        \"👍\": 2,\n        \"💛\": 2,\n        \"🤯\": 1,\n        \"🥰\": 7,\n        \":kawaiii@misskey.io:\": 2\n      },\n      \"emojis\": [\n        {\n          \"name\": \"kawaiii@misskey.io\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-59da0cdd-4071-4573-bf58-a9a07f9ba2fc.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-59da0cdd-4071-4573-bf58-a9a07f9ba2fc.png\"\n        }\n      ],\n      \"fileIds\": [\n        \"92a5xpoofc\"\n      ],\n      \"files\": [\n        {\n          \"id\": \"92a5xpoofc\",\n          \"createdAt\": \"2022-07-04T10:27:54.312Z\",\n          \"name\": \"webpublic-f4e62c02-04a2-4af6-85a7-8dd2c6033f64.jpg\",\n          \"type\": \"image/jpeg\",\n          \"md5\": \"c3b7359d0190cb5b5fe4c17c8f69d4bd\",\n          \"size\": 471238,\n          \"isSensitive\": false,\n          \"blurhash\": \"yFHxj2SvEOb^D%S#M_0LX7?Et5kVt3bc00obT0WB%Lfkxt?aXSRPNHsmWoV[S4a#t5aet7jZbH~VxFJCs:NGjbbFXVS5-Pt6RPbFWB\",\n          \"properties\": {\n            \"width\": 2048,\n            \"height\": 1536\n          },\n          \"url\": \"https://misskey.pantasystem.com/files/bd49c476-dd82-481e-9d2e-cc2ce370fb24\",\n          \"thumbnailUrl\": \"https://misskey.pantasystem.com/files/thumbnail-2b840912-686c-4874-87a5-0b0dc2aa92ff\",\n          \"comment\": null,\n          \"folderId\": null,\n          \"folder\": null,\n          \"userId\": null,\n          \"user\": null\n        }\n      ],\n      \"replyId\": \"92a5pwacak\",\n      \"renoteId\": null,\n      \"uri\": \"https://misskey.io/notes/92a5xndq1u\",\n      \"reply\": {\n        \"id\": \"92a5pwacak\",\n        \"createdAt\": \"2022-07-04T10:21:49.620Z\",\n        \"userId\": \"919yl2fdkn\",\n        \"user\": {\n          \"id\": \"919yl2fdkn\",\n          \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n          \"username\": \"harunon\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n          \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n          \"avatarColor\": null,\n          \"isCat\": true,\n          \"instance\": {\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"keybase\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n            }\n          ],\n          \"onlineStatus\": \"unknown\",\n          \"driveCapacityOverrideMb\": null\n        },\n        \"text\": \"まいにゅぎあ\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 2,\n        \"repliesCount\": 1,\n        \"reactions\": {\n          \"🎉\": 1,\n          \"💛\": 1,\n          \"🥰\": 1,\n          \":iihanashi@misskey.io:\": 1\n        },\n        \"emojis\": [\n          {\n            \"name\": \"iihanashi@misskey.io\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2F013cf04e-a057-4aed-ab40-4e0ea97b1aa2.gif?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2F013cf04e-a057-4aed-ab40-4e0ea97b1aa2.gif\"\n          }\n        ],\n        \"fileIds\": [\n          \"92a5pxdqaj\"\n        ],\n        \"files\": [\n          {\n            \"id\": \"92a5pxdqaj\",\n            \"createdAt\": \"2022-07-04T10:21:51.038Z\",\n            \"name\": \"webpublic-929c29fe-de10-487f-9bf4-fb22ab02cd27.jpg\",\n            \"type\": \"image/jpeg\",\n            \"md5\": \"16932f56bec8bf9524b0fd51ffb429b0\",\n            \"size\": 425935,\n            \"isSensitive\": false,\n            \"blurhash\": \"y8JkDmml9Y-ma5.7D%4T^+?^wJIARktk00S3E1s.%2IBSht,E24:%Lr@xuD%tOxZ?vRkR5M|-oxbR6E1D*-:xuRjD%?a-pRk%2IUR*\",\n            \"properties\": {\n              \"width\": 1536,\n              \"height\": 2048\n            },\n            \"url\": \"https://misskey.pantasystem.com/files/81a3fd74-11f7-44dd-8cfc-d234590192f2\",\n            \"thumbnailUrl\": \"https://misskey.pantasystem.com/files/thumbnail-f89a96d2-31c1-4f2f-870b-2f916ee1532c\",\n            \"comment\": null,\n            \"folderId\": null,\n            \"folder\": null,\n            \"userId\": null,\n            \"user\": null\n          }\n        ],\n        \"replyId\": null,\n        \"renoteId\": null,\n        \"uri\": \"https://misskey.io/notes/92a5pwac3s\"\n      },\n      \"myReaction\": \"🥰\"\n    },\n    {\n      \"id\": \"91bhhyz350\",\n      \"createdAt\": \"2022-06-10T03:59:39.087Z\",\n      \"userId\": \"919yl2fdkn\",\n      \"user\": {\n        \"id\": \"919yl2fdkn\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"username\": \"harunon\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n        \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n        \"avatarColor\": null,\n        \"isCat\": true,\n        \"instance\": {\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n          \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n          }\n        ],\n        \"onlineStatus\": \"unknown\",\n        \"driveCapacityOverrideMb\": null\n      },\n      \"text\": \"@各位\\n\\n・鍵垢はフォロバできません（フォロリク無視が怖いので）\\n・複数インスタンスに垢ある場合はメインで動かしてる本垢のみフォロバします（どれフォロバしてるしてにゃいが面倒にゃので）\",\n      \"cw\": null,\n      \"visibility\": \"home\",\n      \"renoteCount\": 3,\n      \"repliesCount\": 0,\n      \"reactions\": {\n        \"👌\": 1,\n        \"💛\": 1,\n        \":blobcatsweatflips@misskey.io:\": 1,\n        \":ablobcatfloofpat@groundpolis.app:\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"blobcatsweatflips@misskey.io\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fbfb5521d-71bd-4e2c-ac48-b045da99eedf.apng?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fbfb5521d-71bd-4e2c-ac48-b045da99eedf.apng\"\n        },\n        {\n          \"name\": \"ablobcatfloofpat@groundpolis.app\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fgp%2Ffiles%2F100d8c0f-9b02-4c17-8a3f-713d5a4ded9f?url=https%3A%2F%2Fmedia.xeltica.work%2Fgp%2Ffiles%2F100d8c0f-9b02-4c17-8a3f-713d5a4ded9f\"\n        }\n      ],\n      \"fileIds\": [],\n      \"files\": [],\n      \"replyId\": null,\n      \"renoteId\": null,\n      \"uri\": \"https://misskey.io/notes/91bhhyz3hh\"\n    },\n    {\n      \"id\": \"87cqvphsku\",\n      \"createdAt\": \"2020-05-16T05:18:52.624Z\",\n      \"userId\": \"919yl2fdkn\",\n      \"user\": {\n        \"id\": \"919yl2fdkn\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"username\": \"harunon\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n        \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n        \"avatarColor\": null,\n        \"isCat\": true,\n        \"instance\": {\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n          \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n          }\n        ],\n        \"onlineStatus\": \"unknown\",\n        \"driveCapacityOverrideMb\": null\n      },\n      \"text\": \"分散SNSってのは\\nSNSに何かと投稿する癖がついてしまったが今の人が増えすぎた環境には馴染めにゃい(陰キャちっすちっす)故に「喋りたいけどあんまり聞いて欲しくにゃいにゃ…」とかいうめんどくさいオタクの診療所(医者はいません)とか互助会(だが助けにゃい)みたいにゃものだと思ってますね\",\n      \"cw\": null,\n      \"visibility\": \"public\",\n      \"renoteCount\": 0,\n      \"repliesCount\": 0,\n      \"reactions\": {\n        \":soukamo@misskey.io:\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"soukamo@misskey.io\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-ea065d03-baef-47b7-9753-995f5481da1f.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-ea065d03-baef-47b7-9753-995f5481da1f.png\"\n        }\n      ],\n      \"fileIds\": [],\n      \"files\": [],\n      \"replyId\": null,\n      \"renoteId\": null,\n      \"uri\": \"https://misskey.io/notes/87cqvphs6p\"\n    },\n    {\n      \"id\": \"7yo80rvolb\",\n      \"createdAt\": \"2019-10-10T12:06:49.380Z\",\n      \"userId\": \"919yl2fdkn\",\n      \"user\": {\n        \"id\": \"919yl2fdkn\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"username\": \"harunon\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n        \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n        \"avatarColor\": null,\n        \"isCat\": true,\n        \"instance\": {\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n          \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n          }\n        ],\n        \"onlineStatus\": \"unknown\",\n        \"driveCapacityOverrideMb\": null\n      },\n      \"text\": null,\n      \"cw\": null,\n      \"visibility\": \"public\",\n      \"renoteCount\": 28,\n      \"repliesCount\": 0,\n      \"reactions\": {\n        \"❤\": 1,\n        \"👍\": 1,\n        \"🔽\": 1,\n        \"😢\": 1,\n        \":bap@mk.f72u.net:\": 1,\n        \":takosune@misskey.io:\": 1,\n        \":tako@submarin.online:\": 2,\n        \":char_nachoneko_baa@misskey.io:\": 1,\n        \":half_closed_eyes_woozy@misskey.io:\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"bap@mk.f72u.net\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmedia%2Fmisskey%2F1bfcbc94-2ad3-4963-b638-e59846466c58.gif?url=https%3A%2F%2Fmk.f72u.net%2Fmedia%2Fmisskey%2F1bfcbc94-2ad3-4963-b638-e59846466c58.gif\"\n        },\n        {\n          \"name\": \"takosune@misskey.io\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-1689cb5c-76f3-4d44-8284-36b9d99f183a.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-1689cb5c-76f3-4d44-8284-36b9d99f183a.png\"\n        },\n        {\n          \"name\": \"tako@submarin.online\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Ffiles%2Fwebpublic-79910645-3dc1-4dcb-a0f5-965b3d57054a?url=https%3A%2F%2Fsubmarin.online%2Ffiles%2Fwebpublic-79910645-3dc1-4dcb-a0f5-965b3d57054a\"\n        },\n        {\n          \"name\": \"char_nachoneko_baa@misskey.io\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-0accadc5-e1b4-40aa-b99d-efef01168d9b.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-0accadc5-e1b4-40aa-b99d-efef01168d9b.png\"\n        },\n        {\n          \"name\": \"half_closed_eyes_woozy@misskey.io\",\n          \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-b94cfadd-0400-4a04-bacc-69f0785c6d5f.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-b94cfadd-0400-4a04-bacc-69f0785c6d5f.png\"\n        }\n      ],\n      \"fileIds\": [\n        \"919yl3inl8\"\n      ],\n      \"files\": [\n        {\n          \"id\": \"919yl3inl8\",\n          \"createdAt\": \"2022-06-09T02:22:26.063Z\",\n          \"name\": \"webpublic-45219496-5bdb-4082-b6fe-4fba4956c5b5.jpg\",\n          \"type\": \"image/jpeg\",\n          \"md5\": \"74a1f64a1d8f9d957bcee589b62cd327\",\n          \"size\": 13846,\n          \"isSensitive\": false,\n          \"blurhash\": \"yCSs4~%g_4-poI%MIo_3j[M|kCR%WAt7-;n$M_X8WXoLs:-=bHjYjYs;ozWB-;j[IUaej]oft7xbjsxuflj]j?WBoca}a#oLjZWBWU\",\n          \"properties\": {\n            \"width\": 473,\n            \"height\": 354\n          },\n          \"url\": \"https://s3.arkjp.net/misskey/webpublic-45219496-5bdb-4082-b6fe-4fba4956c5b5.jpg\",\n          \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/webpublic-45219496-5bdb-4082-b6fe-4fba4956c5b5.jpg\",\n          \"comment\": null,\n          \"folderId\": null,\n          \"folder\": null,\n          \"userId\": null,\n          \"user\": null\n        }\n      ],\n      \"replyId\": \"7yo7zdk6la\",\n      \"renoteId\": null,\n      \"mentions\": [\n        \"919yl2wdkv\"\n      ],\n      \"uri\": \"https://misskey.io/notes/7yo80rvomd\",\n      \"reply\": {\n        \"id\": \"7yo7zdk6la\",\n        \"createdAt\": \"2019-10-10T12:05:44.166Z\",\n        \"userId\": \"919yl2wdkv\",\n        \"user\": {\n          \"id\": \"919yl2wdkv\",\n          \"name\": \"かなぽん:verify:\",\n          \"username\": \"kanapon\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-0eee924c-c5c1-429f-a9e6-fa85d68f5493\",\n          \"avatarBlurhash\": \"ylMP|J%3~WoL~WWUM{-pofs;j[RjNFNG9Zj@xaWURjjbxuf8f7xuj[WBj[RjRjayt7j[RjWBR*oft6jbRjt6oMoLxaayRjWBj[ofay\",\n          \"avatarColor\": null,\n          \"instance\": {\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"verify\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2F6b61b9fc-6c8d-4728-88ff-545e80b120ca.gif?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2F6b61b9fc-6c8d-4728-88ff-545e80b120ca.gif\"\n            }\n          ],\n          \"onlineStatus\": \"unknown\",\n          \"driveCapacityOverrideMb\": null\n        },\n        \"text\": \"アイコン付けてないんでアイコン募集\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 0,\n        \"repliesCount\": 1,\n        \"reactions\": {},\n        \"emojis\": [],\n        \"fileIds\": [],\n        \"files\": [],\n        \"replyId\": null,\n        \"renoteId\": null,\n        \"uri\": \"https://misskey.io/notes/7yo7zdk62o\"\n      }\n    },\n    {\n      \"id\": \"7wkp7bjzl1\",\n      \"createdAt\": \"2019-08-18T15:37:18.911Z\",\n      \"userId\": \"919yl2fdkn\",\n      \"user\": {\n        \"id\": \"919yl2fdkn\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"username\": \"harunon\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n        \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n        \"avatarColor\": null,\n        \"isCat\": true,\n        \"instance\": {\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n          \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n          }\n        ],\n        \"onlineStatus\": \"unknown\",\n        \"driveCapacityOverrideMb\": null\n      },\n      \"text\": \"ヒモを養うかきくけこ\\n\\nカードにゃらいくらでも使っていいよ\\n聞いたこと無いよ、この請求書\\n苦しいときは、私にいってね\\n計画的にお金は使ってね\\n今月のお小遣い、ここにおいておくから\",\n      \"cw\": null,\n      \"visibility\": \"public\",\n      \"renoteCount\": 0,\n      \"repliesCount\": 0,\n      \"reactions\": {\n        \"💛\": 1\n      },\n      \"emojis\": [],\n      \"fileIds\": [],\n      \"files\": [],\n      \"replyId\": null,\n      \"renoteId\": null,\n      \"uri\": \"https://misskey.io/notes/7wkp7bjzdz\"\n    }\n  ],\n  \"pinnedPageId\": null,\n  \"pinnedPage\": null,\n  \"publicReactions\": false,\n  \"ffVisibility\": \"public\",\n  \"twoFactorEnabled\": false,\n  \"usePasswordLessLogin\": false,\n  \"securityKeys\": false,\n  \"isFollowing\": true,\n  \"isFollowed\": true,\n  \"hasPendingFollowRequestFromYou\": false,\n  \"hasPendingFollowRequestToYou\": false,\n  \"isBlocking\": false,\n  \"isBlocked\": false,\n  \"isMuted\": false\n}"
  },
  {
    "path": "modules/api/src/test/resources/user_dto_list_case1.json",
    "content": "[\n  {\n    \"id\": \"919yl2fdkn\",\n    \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n    \"username\": \"harunon\",\n    \"host\": \"misskey.io\",\n    \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n    \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n    \"avatarColor\": null,\n    \"isAdmin\": false,\n    \"isModerator\": false,\n    \"isBot\": false,\n    \"isCat\": true,\n    \"instance\": {\n      \"name\": \"Misskey.io\",\n      \"softwareName\": \"misskey\",\n      \"softwareVersion\": \"12.118.1\",\n      \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n      \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n      \"themeColor\": \"#86b300\"\n    },\n    \"emojis\": [\n      {\n        \"name\": \"keybase\",\n        \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n      }\n    ],\n    \"onlineStatus\": \"unknown\",\n    \"driveCapacityOverrideMb\": null,\n    \"url\": \"https://misskey.io/@harunon\",\n    \"uri\": \"https://misskey.io/users/7rla9gie6j\",\n    \"createdAt\": \"2022-06-09T02:22:24.649Z\",\n    \"updatedAt\": \"2022-09-25T07:03:30.027Z\",\n    \"lastFetchedAt\": \"2022-09-24T19:06:17.341Z\",\n    \"bannerUrl\": \"https://misskey.pantasystem.com/files/ac9562dc-06ca-465d-ad07-1d698ad10256\",\n    \"bannerBlurhash\": \"yHL:7F~S~2wgE2MiIV%sou?Hs;R6D+wJV%IXM|oyEKtMfzM|M{rwX8I:-.%1w[r=IWShW=ozxa+}xVSdNHa_WEt7TCxXM|IW%2t7V]\",\n    \"bannerColor\": null,\n    \"isLocked\": false,\n    \"isSilenced\": false,\n    \"isSuspended\": false,\n    \"description\": \"Design / Programming / wishlist→https://amzn.to/2Z6BrEz /#Vue /#Nuxt /#Flutter / ｵﾅｶｲﾀｲ / ﾅﾆﾓﾃﾞｷﾅｲ\",\n    \"location\": null,\n    \"birthday\": \"2097-02-06\",\n    \"lang\": null,\n    \"fields\": [\n      {\n        \"name\": \"keybase\",\n        \"value\": \"https://keybase.io/harunon\"\n      },\n      {\n        \"name\": \"ぢすこ\",\n        \"value\": \"harunon#5514\"\n      },\n      {\n        \"name\": \"wishlist\",\n        \"value\": \"https://amzn.to/2Z6BrEz\"\n      },\n      {\n        \"name\": \"紫翠\",\n        \"value\": \"しすい\"\n      },\n      {\n        \"name\": \"Switchフレコ\",\n        \"value\": \"https://lounge.nintendo.com/friendcode/8544-1595-7987/DFDTn7QBYt\"\n      }\n    ],\n    \"followersCount\": 2,\n    \"followingCount\": 2,\n    \"notesCount\": 24052,\n    \"pinnedNoteIds\": [\n      \"92a5xndqfd\",\n      \"91bhhyz350\",\n      \"87cqvphsku\",\n      \"7yo80rvolb\",\n      \"7wkp7bjzl1\"\n    ],\n    \"pinnedNotes\": [\n      {\n        \"id\": \"92a5xndqfd\",\n        \"createdAt\": \"2022-07-04T10:27:51.326Z\",\n        \"userId\": \"919yl2fdkn\",\n        \"user\": {\n          \"id\": \"919yl2fdkn\",\n          \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n          \"username\": \"harunon\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n          \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n          \"avatarColor\": null,\n          \"isCat\": true,\n          \"instance\": {\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"keybase\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n            }\n          ],\n          \"onlineStatus\": \"unknown\",\n          \"driveCapacityOverrideMb\": null\n        },\n        \"text\": \"かわいい\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 9,\n        \"repliesCount\": 1,\n        \"reactions\": {\n          \"❤\": 1,\n          \"👍\": 2,\n          \"💛\": 2,\n          \"🤯\": 1,\n          \"🥰\": 7,\n          \":kawaiii@misskey.io:\": 2\n        },\n        \"emojis\": [\n          {\n            \"name\": \"kawaiii@misskey.io\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-59da0cdd-4071-4573-bf58-a9a07f9ba2fc.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-59da0cdd-4071-4573-bf58-a9a07f9ba2fc.png\"\n          }\n        ],\n        \"fileIds\": [\n          \"92a5xpoofc\"\n        ],\n        \"files\": [\n          {\n            \"id\": \"92a5xpoofc\",\n            \"createdAt\": \"2022-07-04T10:27:54.312Z\",\n            \"name\": \"webpublic-f4e62c02-04a2-4af6-85a7-8dd2c6033f64.jpg\",\n            \"type\": \"image/jpeg\",\n            \"md5\": \"c3b7359d0190cb5b5fe4c17c8f69d4bd\",\n            \"size\": 471238,\n            \"isSensitive\": false,\n            \"blurhash\": \"yFHxj2SvEOb^D%S#M_0LX7?Et5kVt3bc00obT0WB%Lfkxt?aXSRPNHsmWoV[S4a#t5aet7jZbH~VxFJCs:NGjbbFXVS5-Pt6RPbFWB\",\n            \"properties\": {\n              \"width\": 2048,\n              \"height\": 1536\n            },\n            \"url\": \"https://misskey.pantasystem.com/files/bd49c476-dd82-481e-9d2e-cc2ce370fb24\",\n            \"thumbnailUrl\": \"https://misskey.pantasystem.com/files/thumbnail-2b840912-686c-4874-87a5-0b0dc2aa92ff\",\n            \"comment\": null,\n            \"folderId\": null,\n            \"folder\": null,\n            \"userId\": null,\n            \"user\": null\n          }\n        ],\n        \"replyId\": \"92a5pwacak\",\n        \"renoteId\": null,\n        \"uri\": \"https://misskey.io/notes/92a5xndq1u\",\n        \"reply\": {\n          \"id\": \"92a5pwacak\",\n          \"createdAt\": \"2022-07-04T10:21:49.620Z\",\n          \"userId\": \"919yl2fdkn\",\n          \"user\": {\n            \"id\": \"919yl2fdkn\",\n            \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n            \"username\": \"harunon\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n            \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n            \"avatarColor\": null,\n            \"isCat\": true,\n            \"instance\": {\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.118.1\",\n              \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n              \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"keybase\",\n                \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n              }\n            ],\n            \"onlineStatus\": \"unknown\",\n            \"driveCapacityOverrideMb\": null\n          },\n          \"text\": \"まいにゅぎあ\",\n          \"cw\": null,\n          \"visibility\": \"public\",\n          \"renoteCount\": 2,\n          \"repliesCount\": 1,\n          \"reactions\": {\n            \"🎉\": 1,\n            \"💛\": 1,\n            \"🥰\": 1,\n            \":iihanashi@misskey.io:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"iihanashi@misskey.io\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2F013cf04e-a057-4aed-ab40-4e0ea97b1aa2.gif?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2F013cf04e-a057-4aed-ab40-4e0ea97b1aa2.gif\"\n            }\n          ],\n          \"fileIds\": [\n            \"92a5pxdqaj\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"92a5pxdqaj\",\n              \"createdAt\": \"2022-07-04T10:21:51.038Z\",\n              \"name\": \"webpublic-929c29fe-de10-487f-9bf4-fb22ab02cd27.jpg\",\n              \"type\": \"image/jpeg\",\n              \"md5\": \"16932f56bec8bf9524b0fd51ffb429b0\",\n              \"size\": 425935,\n              \"isSensitive\": false,\n              \"blurhash\": \"y8JkDmml9Y-ma5.7D%4T^+?^wJIARktk00S3E1s.%2IBSht,E24:%Lr@xuD%tOxZ?vRkR5M|-oxbR6E1D*-:xuRjD%?a-pRk%2IUR*\",\n              \"properties\": {\n                \"width\": 1536,\n                \"height\": 2048\n              },\n              \"url\": \"https://misskey.pantasystem.com/files/81a3fd74-11f7-44dd-8cfc-d234590192f2\",\n              \"thumbnailUrl\": \"https://misskey.pantasystem.com/files/thumbnail-f89a96d2-31c1-4f2f-870b-2f916ee1532c\",\n              \"comment\": null,\n              \"folderId\": null,\n              \"folder\": null,\n              \"userId\": null,\n              \"user\": null\n            }\n          ],\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"uri\": \"https://misskey.io/notes/92a5pwac3s\"\n        },\n        \"myReaction\": \"🥰\"\n      },\n      {\n        \"id\": \"91bhhyz350\",\n        \"createdAt\": \"2022-06-10T03:59:39.087Z\",\n        \"userId\": \"919yl2fdkn\",\n        \"user\": {\n          \"id\": \"919yl2fdkn\",\n          \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n          \"username\": \"harunon\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n          \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n          \"avatarColor\": null,\n          \"isCat\": true,\n          \"instance\": {\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"keybase\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n            }\n          ],\n          \"onlineStatus\": \"unknown\",\n          \"driveCapacityOverrideMb\": null\n        },\n        \"text\": \"@各位\\n\\n・鍵垢はフォロバできません（フォロリク無視が怖いので）\\n・複数インスタンスに垢ある場合はメインで動かしてる本垢のみフォロバします（どれフォロバしてるしてにゃいが面倒にゃので）\",\n        \"cw\": null,\n        \"visibility\": \"home\",\n        \"renoteCount\": 3,\n        \"repliesCount\": 0,\n        \"reactions\": {\n          \"👌\": 1,\n          \"💛\": 1,\n          \":blobcatsweatflips@misskey.io:\": 1,\n          \":ablobcatfloofpat@groundpolis.app:\": 1\n        },\n        \"emojis\": [\n          {\n            \"name\": \"blobcatsweatflips@misskey.io\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fbfb5521d-71bd-4e2c-ac48-b045da99eedf.apng?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fbfb5521d-71bd-4e2c-ac48-b045da99eedf.apng\"\n          },\n          {\n            \"name\": \"ablobcatfloofpat@groundpolis.app\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fgp%2Ffiles%2F100d8c0f-9b02-4c17-8a3f-713d5a4ded9f?url=https%3A%2F%2Fmedia.xeltica.work%2Fgp%2Ffiles%2F100d8c0f-9b02-4c17-8a3f-713d5a4ded9f\"\n          }\n        ],\n        \"fileIds\": [],\n        \"files\": [],\n        \"replyId\": null,\n        \"renoteId\": null,\n        \"uri\": \"https://misskey.io/notes/91bhhyz3hh\"\n      },\n      {\n        \"id\": \"87cqvphsku\",\n        \"createdAt\": \"2020-05-16T05:18:52.624Z\",\n        \"userId\": \"919yl2fdkn\",\n        \"user\": {\n          \"id\": \"919yl2fdkn\",\n          \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n          \"username\": \"harunon\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n          \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n          \"avatarColor\": null,\n          \"isCat\": true,\n          \"instance\": {\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"keybase\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n            }\n          ],\n          \"onlineStatus\": \"unknown\",\n          \"driveCapacityOverrideMb\": null\n        },\n        \"text\": \"分散SNSってのは\\nSNSに何かと投稿する癖がついてしまったが今の人が増えすぎた環境には馴染めにゃい(陰キャちっすちっす)故に「喋りたいけどあんまり聞いて欲しくにゃいにゃ…」とかいうめんどくさいオタクの診療所(医者はいません)とか互助会(だが助けにゃい)みたいにゃものだと思ってますね\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 0,\n        \"repliesCount\": 0,\n        \"reactions\": {\n          \":soukamo@misskey.io:\": 1\n        },\n        \"emojis\": [\n          {\n            \"name\": \"soukamo@misskey.io\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-ea065d03-baef-47b7-9753-995f5481da1f.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-ea065d03-baef-47b7-9753-995f5481da1f.png\"\n          }\n        ],\n        \"fileIds\": [],\n        \"files\": [],\n        \"replyId\": null,\n        \"renoteId\": null,\n        \"uri\": \"https://misskey.io/notes/87cqvphs6p\"\n      },\n      {\n        \"id\": \"7yo80rvolb\",\n        \"createdAt\": \"2019-10-10T12:06:49.380Z\",\n        \"userId\": \"919yl2fdkn\",\n        \"user\": {\n          \"id\": \"919yl2fdkn\",\n          \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n          \"username\": \"harunon\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n          \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n          \"avatarColor\": null,\n          \"isCat\": true,\n          \"instance\": {\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"keybase\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n            }\n          ],\n          \"onlineStatus\": \"unknown\",\n          \"driveCapacityOverrideMb\": null\n        },\n        \"text\": null,\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 28,\n        \"repliesCount\": 0,\n        \"reactions\": {\n          \"❤\": 1,\n          \"👍\": 1,\n          \"🔽\": 1,\n          \"😢\": 1,\n          \":bap@mk.f72u.net:\": 1,\n          \":takosune@misskey.io:\": 1,\n          \":tako@submarin.online:\": 2,\n          \":char_nachoneko_baa@misskey.io:\": 1,\n          \":half_closed_eyes_woozy@misskey.io:\": 1\n        },\n        \"emojis\": [\n          {\n            \"name\": \"bap@mk.f72u.net\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmedia%2Fmisskey%2F1bfcbc94-2ad3-4963-b638-e59846466c58.gif?url=https%3A%2F%2Fmk.f72u.net%2Fmedia%2Fmisskey%2F1bfcbc94-2ad3-4963-b638-e59846466c58.gif\"\n          },\n          {\n            \"name\": \"takosune@misskey.io\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-1689cb5c-76f3-4d44-8284-36b9d99f183a.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-1689cb5c-76f3-4d44-8284-36b9d99f183a.png\"\n          },\n          {\n            \"name\": \"tako@submarin.online\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Ffiles%2Fwebpublic-79910645-3dc1-4dcb-a0f5-965b3d57054a?url=https%3A%2F%2Fsubmarin.online%2Ffiles%2Fwebpublic-79910645-3dc1-4dcb-a0f5-965b3d57054a\"\n          },\n          {\n            \"name\": \"char_nachoneko_baa@misskey.io\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-0accadc5-e1b4-40aa-b99d-efef01168d9b.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-0accadc5-e1b4-40aa-b99d-efef01168d9b.png\"\n          },\n          {\n            \"name\": \"half_closed_eyes_woozy@misskey.io\",\n            \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-b94cfadd-0400-4a04-bacc-69f0785c6d5f.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-b94cfadd-0400-4a04-bacc-69f0785c6d5f.png\"\n          }\n        ],\n        \"fileIds\": [\n          \"919yl3inl8\"\n        ],\n        \"files\": [\n          {\n            \"id\": \"919yl3inl8\",\n            \"createdAt\": \"2022-06-09T02:22:26.063Z\",\n            \"name\": \"webpublic-45219496-5bdb-4082-b6fe-4fba4956c5b5.jpg\",\n            \"type\": \"image/jpeg\",\n            \"md5\": \"74a1f64a1d8f9d957bcee589b62cd327\",\n            \"size\": 13846,\n            \"isSensitive\": false,\n            \"blurhash\": \"yCSs4~%g_4-poI%MIo_3j[M|kCR%WAt7-;n$M_X8WXoLs:-=bHjYjYs;ozWB-;j[IUaej]oft7xbjsxuflj]j?WBoca}a#oLjZWBWU\",\n            \"properties\": {\n              \"width\": 473,\n              \"height\": 354\n            },\n            \"url\": \"https://s3.arkjp.net/misskey/webpublic-45219496-5bdb-4082-b6fe-4fba4956c5b5.jpg\",\n            \"thumbnailUrl\": \"https://s3.arkjp.net/misskey/webpublic-45219496-5bdb-4082-b6fe-4fba4956c5b5.jpg\",\n            \"comment\": null,\n            \"folderId\": null,\n            \"folder\": null,\n            \"userId\": null,\n            \"user\": null\n          }\n        ],\n        \"replyId\": \"7yo7zdk6la\",\n        \"renoteId\": null,\n        \"mentions\": [\n          \"919yl2wdkv\"\n        ],\n        \"uri\": \"https://misskey.io/notes/7yo80rvomd\",\n        \"reply\": {\n          \"id\": \"7yo7zdk6la\",\n          \"createdAt\": \"2019-10-10T12:05:44.166Z\",\n          \"userId\": \"919yl2wdkv\",\n          \"user\": {\n            \"id\": \"919yl2wdkv\",\n            \"name\": \"かなぽん:verify:\",\n            \"username\": \"kanapon\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-0eee924c-c5c1-429f-a9e6-fa85d68f5493\",\n            \"avatarBlurhash\": \"ylMP|J%3~WoL~WWUM{-pofs;j[RjNFNG9Zj@xaWURjjbxuf8f7xuj[WBj[RjRjayt7j[RjWBR*oft6jbRjt6oMoLxaayRjWBj[ofay\",\n            \"avatarColor\": null,\n            \"instance\": {\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.118.1\",\n              \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n              \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"verify\",\n                \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2F6b61b9fc-6c8d-4728-88ff-545e80b120ca.gif?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2F6b61b9fc-6c8d-4728-88ff-545e80b120ca.gif\"\n              }\n            ],\n            \"onlineStatus\": \"unknown\",\n            \"driveCapacityOverrideMb\": null\n          },\n          \"text\": \"アイコン付けてないんでアイコン募集\",\n          \"cw\": null,\n          \"visibility\": \"public\",\n          \"renoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"uri\": \"https://misskey.io/notes/7yo7zdk62o\"\n        }\n      },\n      {\n        \"id\": \"7wkp7bjzl1\",\n        \"createdAt\": \"2019-08-18T15:37:18.911Z\",\n        \"userId\": \"919yl2fdkn\",\n        \"user\": {\n          \"id\": \"919yl2fdkn\",\n          \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n          \"username\": \"harunon\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.pantasystem.com/files/thumbnail-d9518707-06cf-474b-8680-2cf97cfb06f9\",\n          \"avatarBlurhash\": \"y8G]g]%NrOIu-n^+0LTKt6={xZE3Ipjs03j?ki%2E1IV^+,0M|0MIp^%-oog~VD+SukB-Ws:E1-;xt^*xa9aR*M|Jj?arvoINGNHX7\",\n          \"avatarColor\": null,\n          \"isCat\": true,\n          \"instance\": {\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://misskey.io/static-assets/icons/192.png\",\n            \"faviconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"keybase\",\n              \"url\": \"https://misskey.pantasystem.com/proxy/%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png?url=https%3A%2F%2Fs3.arkjp.net%2Fmisskey%2Fwebpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n            }\n          ],\n          \"onlineStatus\": \"unknown\",\n          \"driveCapacityOverrideMb\": null\n        },\n        \"text\": \"ヒモを養うかきくけこ\\n\\nカードにゃらいくらでも使っていいよ\\n聞いたこと無いよ、この請求書\\n苦しいときは、私にいってね\\n計画的にお金は使ってね\\n今月のお小遣い、ここにおいておくから\",\n        \"cw\": null,\n        \"visibility\": \"public\",\n        \"renoteCount\": 0,\n        \"repliesCount\": 0,\n        \"reactions\": {\n          \"💛\": 1\n        },\n        \"emojis\": [],\n        \"fileIds\": [],\n        \"files\": [],\n        \"replyId\": null,\n        \"renoteId\": null,\n        \"uri\": \"https://misskey.io/notes/7wkp7bjzdz\"\n      }\n    ],\n    \"pinnedPageId\": null,\n    \"pinnedPage\": null,\n    \"publicReactions\": false,\n    \"ffVisibility\": \"public\",\n    \"twoFactorEnabled\": false,\n    \"usePasswordLessLogin\": false,\n    \"securityKeys\": false,\n    \"isFollowing\": true,\n    \"isFollowed\": true,\n    \"hasPendingFollowRequestFromYou\": false,\n    \"hasPendingFollowRequestToYou\": false,\n    \"isBlocking\": false,\n    \"isBlocked\": false,\n    \"isMuted\": false\n  },\n  {\n    \"id\": \"940ro179h8\",\n    \"name\": null,\n    \"username\": \"haruna\",\n    \"host\": \"misskey.ranranhome.info\",\n    \"avatarUrl\": \"https://misskey.pantasystem.com/identicon/940ro179h8\",\n    \"avatarBlurhash\": null,\n    \"avatarColor\": null,\n    \"isAdmin\": false,\n    \"isModerator\": false,\n    \"isBot\": false,\n    \"isCat\": false,\n    \"instance\": {\n      \"name\": \"Misskey by ranranhome.info\",\n      \"softwareName\": \"misskey\",\n      \"softwareVersion\": \"12.118.1\",\n      \"iconUrl\": \"https://misskey.ranranhome.info/static-assets/icons/192.png\",\n      \"faviconUrl\": \"https://misskey.ranranhome.info/favicon.ico\",\n      \"themeColor\": \"#86b300\"\n    },\n    \"emojis\": [],\n    \"onlineStatus\": \"unknown\",\n    \"driveCapacityOverrideMb\": null,\n    \"url\": \"https://misskey.ranranhome.info/@haruna\",\n    \"uri\": \"https://misskey.ranranhome.info/users/940rhoqv89\",\n    \"createdAt\": \"2022-08-17T05:57:57.141Z\",\n    \"updatedAt\": \"2022-08-17T05:57:57.234Z\",\n    \"lastFetchedAt\": \"2022-08-17T05:57:57.141Z\",\n    \"bannerUrl\": null,\n    \"bannerBlurhash\": null,\n    \"bannerColor\": null,\n    \"isLocked\": false,\n    \"isSilenced\": false,\n    \"isSuspended\": false,\n    \"description\": null,\n    \"location\": null,\n    \"birthday\": null,\n    \"lang\": null,\n    \"fields\": [],\n    \"followersCount\": 0,\n    \"followingCount\": 0,\n    \"notesCount\": 1,\n    \"pinnedNoteIds\": [],\n    \"pinnedNotes\": [],\n    \"pinnedPageId\": null,\n    \"pinnedPage\": null,\n    \"publicReactions\": false,\n    \"ffVisibility\": \"public\",\n    \"twoFactorEnabled\": false,\n    \"usePasswordLessLogin\": false,\n    \"securityKeys\": false,\n    \"isFollowing\": false,\n    \"isFollowed\": false,\n    \"hasPendingFollowRequestFromYou\": false,\n    \"hasPendingFollowRequestToYou\": false,\n    \"isBlocking\": false,\n    \"isBlocked\": false,\n    \"isMuted\": false\n  },\n  {\n    \"id\": \"937sg750o3\",\n    \"name\": \"晴菜\",\n    \"username\": \"haruna\",\n    \"host\": \"misskey.levome-dol.com\",\n    \"avatarUrl\": \"https://misskey.pantasystem.com/identicon/937sg750o3\",\n    \"avatarBlurhash\": null,\n    \"avatarColor\": null,\n    \"isAdmin\": false,\n    \"isModerator\": false,\n    \"isBot\": false,\n    \"isCat\": false,\n    \"instance\": {\n      \"name\": \"Levisskey\",\n      \"softwareName\": \"misskey\",\n      \"softwareVersion\": \"12.84.3\",\n      \"iconUrl\": \"https://misskey.levome-dol.com/static-assets/icons/192.png\",\n      \"faviconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n      \"themeColor\": \"#86b300\"\n    },\n    \"emojis\": [],\n    \"onlineStatus\": \"unknown\",\n    \"driveCapacityOverrideMb\": null,\n    \"url\": \"https://misskey.levome-dol.com/@haruna\",\n    \"uri\": \"https://misskey.levome-dol.com/users/937sfknz3m\",\n    \"createdAt\": \"2022-07-27T23:14:32.100Z\",\n    \"updatedAt\": \"2022-08-04T01:14:42.957Z\",\n    \"lastFetchedAt\": \"2022-08-04T01:13:16.894Z\",\n    \"bannerUrl\": null,\n    \"bannerBlurhash\": null,\n    \"bannerColor\": null,\n    \"isLocked\": false,\n    \"isSilenced\": false,\n    \"isSuspended\": false,\n    \"description\": \"晴菜です7さいです\\nもこの妹です\\nおねがいします\",\n    \"location\": null,\n    \"birthday\": null,\n    \"lang\": null,\n    \"fields\": [],\n    \"followersCount\": 0,\n    \"followingCount\": 0,\n    \"notesCount\": 2,\n    \"pinnedNoteIds\": [],\n    \"pinnedNotes\": [],\n    \"pinnedPageId\": null,\n    \"pinnedPage\": null,\n    \"publicReactions\": false,\n    \"ffVisibility\": \"public\",\n    \"twoFactorEnabled\": false,\n    \"usePasswordLessLogin\": false,\n    \"securityKeys\": false,\n    \"isFollowing\": false,\n    \"isFollowed\": false,\n    \"hasPendingFollowRequestFromYou\": false,\n    \"hasPendingFollowRequestToYou\": false,\n    \"isBlocking\": false,\n    \"isBlocked\": false,\n    \"isMuted\": false\n  }\n]"
  },
  {
    "path": "modules/api/src/test/resources/v10_followers_case1.json",
    "content": "{\n  \"users\": [\n    {\n      \"id\": \"62d6b5ac562661e08b7a47d7\",\n      \"username\": \"aitqb\",\n      \"name\": \"ᗩᓰ\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d6b5ad562661e08b7a47d8/62d6b5ad562661e08b7a47d8.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@aitqb\",\n      \"uri\": \"https://fedibird.com/users/aitqb\",\n      \"createdAt\": \"2022-07-19T13:46:20.983Z\",\n      \"updatedAt\": \"2022-07-20T03:24:18.251Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d6b5ad562661e08b7a47d9/62d6b5ad562661e08b7a47d9.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"IG\",\n          \"value\": \"https://instagram.com/taqiubao/\"\n        },\n        {\n          \"name\": \"Whatsapp Telegram LINE\",\n          \"value\": \"おなじ\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 4,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62d4970b2f522fdde8954dff\",\n      \"username\": \"theDONE\",\n      \"name\": \"DUMP\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d4970b2f522fdde8954e01/62d4970b2f522fdde8954e01.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@theDONE\",\n      \"uri\": \"https://fedibird.com/users/theDONE\",\n      \"createdAt\": \"2022-07-17T23:11:07.202Z\",\n      \"updatedAt\": \"2022-07-19T12:35:48.534Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d4970b2f522fdde8954e02/62d4970b2f522fdde8954e02.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"俺はAAA\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 45,\n      \"pinnedNoteIds\": [\n        \"718210c289e8648238fc0b7d\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"718210c289e8648238fc0b7d\",\n          \"createdAt\": \"2022-07-18T10:02:41.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"ﾃﾞﾝ↑💥ﾃﾞﾝ↓💥ﾃﾞﾝ↑💥ﾃﾞﾝ↓💥ﾃﾞﾝ↑💥ﾃﾞﾃﾞﾝ↑💥この混沌🌀とした😔令和のインターネット🌐を照らす一筋の光✨電子の海🌊を漂うオタク🤓に笑顔を🤣未来の平和をお約束🤞躁🤢鬱🤮だけどまかせとけ！😁👊Internet・Angel🧚‍♂️ただいま✝降臨✝\",\n          \"cw\": null,\n          \"userId\": \"62d4970b2f522fdde8954dff\",\n          \"user\": {\n            \"id\": \"62d4970b2f522fdde8954dff\",\n            \"username\": \"theDONE\",\n            \"name\": \"DUMP\",\n            \"host\": \"fedibird.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d4970b2f522fdde8954e01/62d4970b2f522fdde8954e01.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"fedibird.com\",\n              \"name\": \"Fedibird\",\n              \"softwareName\": \"fedibird\",\n              \"softwareVersion\": \"0.1\",\n              \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://fedibird.com/@theDONE\",\n            \"uri\": \"https://fedibird.com/users/theDONE\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://fedibird.com/users/theDONE/statuses/108667768739706787\",\n          \"url\": \"https://fedibird.com/@theDONE/108667768739706787\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62d3c90b2f522fdde894e736\",\n      \"username\": \"macaroni\",\n      \"name\": \"まかろに✅\",\n      \"host\": \"freespeech.gaac2.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d3c90b2f522fdde894e737/62d3c90b2f522fdde894e737.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"freespeech.gaac2.com\",\n        \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://freespeech.gaac2.com/@macaroni\",\n      \"uri\": \"https://freespeech.gaac2.com/users/macaroni\",\n      \"createdAt\": \"2022-07-17T08:32:11.599Z\",\n      \"updatedAt\": \"2022-07-20T04:38:47.989Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d3c90b2f522fdde894e738/62d3c90b2f522fdde894e738.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"まかろに情報局（YOUTUBE）\\nhttps://www.youtube.com/channel/UCojAa5rxTLpabrgDMw6xl7A\\n2012年2月 チャンネル開設\\n2022年1月 チャンネル登録1000人突破\\n\\n●コンテンツ：ゲーム情報・実況・解説・MOD紹介・セール情報・周辺機器・一番くじ・パソコン関連\\n●動画タイプ：ショート動画・通常動画\\n●デバイス：PS5、PS4、Switch、Steam、Origin、Epic、DMM、XboxGamePass\\nウマ娘、BOTW、トゥームレイダー、サイバーパンク、MSFS2020、SpaceEngine、マイクラダンジョン、ボーダーランズ\\nヴァルヘイム、その他\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 94,\n      \"pinnedNoteIds\": [\n        \"7181fdeb28c0ed7c2092986c\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181fdeb28c0ed7c2092986c\",\n          \"createdAt\": \"2022-07-14T18:14:16.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"スマホアプリの導入方法、ここで教えて頂いた内容を元に、簡単な動画を作成しましたので拡散しようと思います。ツイッターにも貼ります。\\n皆様のご協力に感謝致します！\\nhttps://youtu.be/z7ORjjR7JBI\",\n          \"cw\": null,\n          \"userId\": \"62d3c90b2f522fdde894e736\",\n          \"user\": {\n            \"id\": \"62d3c90b2f522fdde894e736\",\n            \"username\": \"macaroni\",\n            \"name\": \"まかろに✅\",\n            \"host\": \"freespeech.gaac2.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d3c90b2f522fdde894e737/62d3c90b2f522fdde894e737.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"freespeech.gaac2.com\",\n              \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://freespeech.gaac2.com/@macaroni\",\n            \"uri\": \"https://freespeech.gaac2.com/users/macaroni\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://freespeech.gaac2.com/users/macaroni/statuses/108647052515825724\",\n          \"url\": \"https://freespeech.gaac2.com/@macaroni/108647052515825724\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62d389cc2f522fdde894c471\",\n      \"username\": \"puchi\",\n      \"name\": \"プッチ\",\n      \"host\": \"freespeech.gaac2.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d389cc2f522fdde894c474/62d389cc2f522fdde894c474.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"freespeech.gaac2.com\",\n        \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://freespeech.gaac2.com/@puchi\",\n      \"uri\": \"https://freespeech.gaac2.com/users/puchi\",\n      \"createdAt\": \"2022-07-17T04:02:20.434Z\",\n      \"updatedAt\": \"2022-07-20T03:59:20.779Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d4e2d6366d47ba6cb3d2e4/62d4e2d6366d47ba6cb3d2e4.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"絶対的にガーシーを応援！！暴れたあと、ガーシー版ねるとん紅鯨団を見るのが夢！😤\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 379,\n      \"pinnedNoteIds\": [\n        \"7182165c77d8045ea0680d12\",\n        \"71820fa8d0d0315540201198\",\n        \"71820eb865f0b94820f13116\",\n        \"718201a917382d1ba2769f20\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7182165c77d8045ea0680d12\",\n          \"createdAt\": \"2022-07-19T12:08:55.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"はい！かまちょ！\",\n          \"cw\": null,\n          \"userId\": \"62d389cc2f522fdde894c471\",\n          \"user\": {\n            \"id\": \"62d389cc2f522fdde894c471\",\n            \"username\": \"puchi\",\n            \"name\": \"プッチ\",\n            \"host\": \"freespeech.gaac2.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d389cc2f522fdde894c474/62d389cc2f522fdde894c474.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"freespeech.gaac2.com\",\n              \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://freespeech.gaac2.com/@puchi\",\n            \"uri\": \"https://freespeech.gaac2.com/users/puchi\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62d69ed8562661e08b7a36e6\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d69ed8562661e08b7a36e6\",\n              \"createdAt\": \"2022-07-19T12:08:56.357Z\",\n              \"name\": \"9fea8b10692eb77b.png\",\n              \"type\": \"image/png\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"85741130ac3ce251fe23acc081dc1a67\",\n              \"url\": \"https://misskey.m544.net/files/62d69ed8562661e08b7a36e6/62d69ed8562661e08b7a36e6.png?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d69ed8562661e08b7a36e6/62d69ed8562661e08b7a36e6.png?thumbnail\",\n              \"properties\": {\n                \"width\": 477,\n                \"height\": 640\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://freespeech.gaac2.com/users/puchi/statuses/108673927414419215\",\n          \"url\": \"https://freespeech.gaac2.com/@puchi/108673927414419215\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71820fa8d0d0315540201198\",\n          \"createdAt\": \"2022-07-18T04:54:58.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"立花さんにフォローされてた😊\",\n          \"cw\": null,\n          \"userId\": \"62d389cc2f522fdde894c471\",\n          \"user\": {\n            \"id\": \"62d389cc2f522fdde894c471\",\n            \"username\": \"puchi\",\n            \"name\": \"プッチ\",\n            \"host\": \"freespeech.gaac2.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d389cc2f522fdde894c474/62d389cc2f522fdde894c474.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"freespeech.gaac2.com\",\n              \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://freespeech.gaac2.com/@puchi\",\n            \"uri\": \"https://freespeech.gaac2.com/users/puchi\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62d4e7a4d58db765404d1f09\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d4e7a4d58db765404d1f09\",\n              \"createdAt\": \"2022-07-18T04:55:00.546Z\",\n              \"name\": \"46f805023fe5f4ed.png\",\n              \"type\": \"image/png\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"98b42040ffebb2d07c1b4f2d682f497a\",\n              \"url\": \"https://misskey.m544.net/files/62d4e7a4d58db765404d1f09/62d4e7a4d58db765404d1f09.png?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d4e7a4d58db765404d1f09/62d4e7a4d58db765404d1f09.png?thumbnail\",\n              \"properties\": {\n                \"width\": 592,\n                \"height\": 1280\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://freespeech.gaac2.com/users/puchi/statuses/108666558801892743\",\n          \"url\": \"https://freespeech.gaac2.com/@puchi/108666558801892743\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71820eb865f0b94820f13116\",\n          \"createdAt\": \"2022-07-18T00:32:22.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"これいい！\\n https://vt.tiktok.com/ZSR8rYBST/?k=1\",\n          \"cw\": null,\n          \"userId\": \"62d389cc2f522fdde894c471\",\n          \"user\": {\n            \"id\": \"62d389cc2f522fdde894c471\",\n            \"username\": \"puchi\",\n            \"name\": \"プッチ\",\n            \"host\": \"freespeech.gaac2.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d389cc2f522fdde894c474/62d389cc2f522fdde894c474.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"freespeech.gaac2.com\",\n              \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://freespeech.gaac2.com/@puchi\",\n            \"uri\": \"https://freespeech.gaac2.com/users/puchi\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://freespeech.gaac2.com/users/puchi/statuses/108665526214181646\",\n          \"url\": \"https://freespeech.gaac2.com/@puchi/108665526214181646\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"718201a917382d1ba2769f20\",\n          \"createdAt\": \"2022-07-15T11:40:35.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"ガーシーさすが！！うり真っ二つ！！特技はノーパン膝枕！！🤑\",\n          \"cw\": null,\n          \"userId\": \"62d389cc2f522fdde894c471\",\n          \"user\": {\n            \"id\": \"62d389cc2f522fdde894c471\",\n            \"username\": \"puchi\",\n            \"name\": \"プッチ\",\n            \"host\": \"freespeech.gaac2.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d389cc2f522fdde894c474/62d389cc2f522fdde894c474.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"freespeech.gaac2.com\",\n              \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://freespeech.gaac2.com/@puchi\",\n            \"uri\": \"https://freespeech.gaac2.com/users/puchi\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62d4e2d7366d47ba6cb3d2e7\",\n            \"62d4e2d7366d47ba6cb3d2e6\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d4e2d7366d47ba6cb3d2e7\",\n              \"createdAt\": \"2022-07-18T04:34:31.064Z\",\n              \"name\": \"c15bdcd5801d7e21.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"68f12c522290cc216ff9a5a149e60a63\",\n              \"url\": \"https://misskey.m544.net/files/62d4e2d7366d47ba6cb3d2e7/62d4e2d7366d47ba6cb3d2e7.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d4e2d7366d47ba6cb3d2e7/62d4e2d7366d47ba6cb3d2e7.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 710,\n                \"height\": 1536\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d4e2d7366d47ba6cb3d2e6\",\n              \"createdAt\": \"2022-07-18T04:34:31.064Z\",\n              \"name\": \"55fcafbb202b5e29.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"e87e9c615b0483be86820dac5b1e9b14\",\n              \"url\": \"https://misskey.m544.net/files/62d4e2d7366d47ba6cb3d2e6/62d4e2d7366d47ba6cb3d2e6.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d4e2d7366d47ba6cb3d2e6/62d4e2d7366d47ba6cb3d2e6.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 528,\n                \"height\": 607\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://freespeech.gaac2.com/users/puchi/statuses/108651166784182862\",\n          \"url\": \"https://freespeech.gaac2.com/@puchi/108651166784182862\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62d363955d856468e550e35d\",\n      \"username\": \"Hackney33\",\n      \"name\": \"anonymous33\",\n      \"host\": \"freespeech.gaac2.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d363955d856468e550e360/62d363955d856468e550e360.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"freespeech.gaac2.com\",\n        \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://freespeech.gaac2.com/@Hackney33\",\n      \"uri\": \"https://freespeech.gaac2.com/users/Hackney33\",\n      \"createdAt\": \"2022-07-17T01:19:17.657Z\",\n      \"updatedAt\": \"2022-07-19T15:49:41.707Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"We will proceed. We are Anonymous.       Keeping all video links with Gaac before they disappear\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 103,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62d265a35d856468e55063f9\",\n      \"username\": \"nae2\",\n      \"name\": \"なえ (TRUE)2\",\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d265a35d856468e55063fc/62d265a35d856468e55063fc.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.io/@nae2\",\n      \"uri\": \"https://misskey.io/users/92psvf7oci\",\n      \"createdAt\": \"2022-07-16T07:15:47.515Z\",\n      \"updatedAt\": \"2022-07-19T13:51:45.248Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d265a35d856468e55063fb/62d265a35d856468e55063fb.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"不死鳥の如く垢消しから再生するメンヘラ\\n人間関係をわりと壊しがち\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"ActivityPub IDOL RANKING\",\n          \"value\": \"108位\"\n        },\n        {\n          \"name\": \"タイムライン薬剤師免許\",\n          \"value\": \"1級\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 411,\n      \"pinnedNoteIds\": [\n        \"71821190b9cce19f4ded60d7\",\n        \"71820aa2c293dad0f96674fa\",\n        \"718206bd4e7043e742b1687c\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71821190b9cce19f4ded60d7\",\n          \"createdAt\": \"2022-07-18T13:47:53.676Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"お薬投下しま〜す\\n\\n                    〜🛩\\n\\n              💊\\n         💊\\n\\n   💊\",\n          \"cw\": null,\n          \"userId\": \"62d265a35d856468e55063f9\",\n          \"user\": {\n            \"id\": \"62d265a35d856468e55063f9\",\n            \"username\": \"nae2\",\n            \"name\": \"なえ (TRUE)2\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d265a35d856468e55063fc/62d265a35d856468e55063fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@nae2\",\n            \"uri\": \"https://misskey.io/users/92psvf7oci\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/92ud8tsc4i\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71820aa2c293dad0f96674fa\",\n          \"createdAt\": \"2022-07-17T05:30:15.059Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"依存性のにゃい睡眠薬といえば、青酸カリが昔から知られています\",\n          \"cw\": null,\n          \"userId\": \"62d265a35d856468e55063f9\",\n          \"user\": {\n            \"id\": \"62d265a35d856468e55063f9\",\n            \"username\": \"nae2\",\n            \"name\": \"なえ (TRUE)2\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d265a35d856468e55063fc/62d265a35d856468e55063fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@nae2\",\n            \"uri\": \"https://misskey.io/users/92psvf7oci\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/92sg102bbe\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"718206bd4e7043e742b1687c\",\n          \"createdAt\": \"2022-07-16T11:20:45.936Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"人生のロック解除には、丈夫にゃロープとドアノブが必要です\",\n          \"cw\": null,\n          \"userId\": \"62d265a35d856468e55063f9\",\n          \"user\": {\n            \"id\": \"62d265a35d856468e55063f9\",\n            \"username\": \"nae2\",\n            \"name\": \"なえ (TRUE)2\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d265a35d856468e55063fc/62d265a35d856468e55063fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@nae2\",\n            \"uri\": \"https://misskey.io/users/92psvf7oci\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/92rd3wxcck\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62d2530b5d856468e55055a8\",\n      \"username\": \"kani_senbei\",\n      \"name\": \"かにせんべい\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d2530b5d856468e55055a9/62d2530b5d856468e55055a9.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@kani_senbei\",\n      \"uri\": \"https://fedibird.com/users/kani_senbei\",\n      \"createdAt\": \"2022-07-16T05:56:27.677Z\",\n      \"updatedAt\": \"2022-07-16T06:04:12.525Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"め\",\n          \"value\": \"@kani_senbei@heislandmine.work\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5c9d18bf0685c9039f724953\",\n      \"username\": \"BurningArt\",\n      \"name\": \"Burning Art\",\n      \"host\": \"pawoo.net\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/626b0f5eb265f553d128dfaf/626b0f5eb265f553d128dfaf.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"pawoo.net\",\n        \"name\": \"Pawoo\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.2.2\",\n        \"iconUrl\": \"https://pawoo.net/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://pawoo.net/@BurningArt\",\n      \"uri\": \"https://pawoo.net/users/BurningArt\",\n      \"createdAt\": null,\n      \"updatedAt\": \"2022-06-27T12:09:23.010Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/626b0f5eb265f553d128dfb0/626b0f5eb265f553d128dfb0.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"みんなと友達になりたい\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 197,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62d17836631521d89bf45fdd\",\n      \"username\": \"fc2ppv\",\n      \"name\": null,\n      \"host\": \"freespeech.gaac2.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/default-avatar.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"freespeech.gaac2.com\",\n        \"name\": \"GAAC2（ガーシー2） - 言論の自由を尊重したSNS\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://freespeech.gaac2.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://freespeech.gaac2.com/@fc2ppv\",\n      \"uri\": \"https://freespeech.gaac2.com/users/fc2ppv\",\n      \"createdAt\": \"2022-07-15T14:22:46.069Z\",\n      \"updatedAt\": \"2022-07-15T14:22:46.279Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 160,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62832d8a1b96c5cca59bca74\",\n      \"username\": \"proton_dieinsummer\",\n      \"name\": \"h≈6.63⋅10−34 J⋅s\",\n      \"host\": \"m.cmx.im\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d3c080366d47ba6cb3c633/62d3c080366d47ba6cb3c633.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"m.cmx.im\",\n        \"name\": \"长毛象中文站\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://m.cmx.im/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://m.cmx.im/@proton_dieinsummer\",\n      \"uri\": \"https://m.cmx.im/users/proton_dieinsummer\",\n      \"createdAt\": \"2022-05-17T05:07:22.287Z\",\n      \"updatedAt\": \"2022-07-19T12:49:13.131Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d3c080366d47ba6cb3c634/62d3c080366d47ba6cb3c634.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"*禁止一切形式的長毛象外的搬運哦*\\n\\n喜歡所有形式的貓。\\n大多數時間在睡覺，\\n偶爾和數字打交道。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"Gender\",\n          \"value\": \"Non-binary\"\n        },\n        {\n          \"name\": \"Languages\",\n          \"value\": \"中文、ENG、DEU、ITA、JAP(beginner)\"\n        },\n        {\n          \"name\": \"I study now\",\n          \"value\": \"Physics、Maths、CS\"\n        },\n        {\n          \"name\": \"Been listening to\",\n          \"value\": \"It was a good day - Ice Cube\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 200,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5d78eb8609f9cd7ff6e2468c\",\n      \"username\": \"farien4\",\n      \"name\": \"りすさん🐹休職中\",\n      \"host\": \"mstdn.res.ac\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62419c50b51e030ef8159fb1/62419c50b51e030ef8159fb1.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"mstdn.res.ac\",\n        \"name\": \"のめやうたえどん\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.3.2\",\n        \"iconUrl\": \"https://mstdn.res.ac/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://mstdn.res.ac/@farien4\",\n      \"uri\": \"https://mstdn.res.ac/users/farien4\",\n      \"createdAt\": \"2019-09-11T12:41:42.524Z\",\n      \"updatedAt\": \"2022-07-20T06:59:10.117Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62419c50b51e030ef8159fb2/62419c50b51e030ef8159fb2.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"ｲｴｰｲ✌めっちゃﾎﾘﾃﾞｨ✌✌\\n\\nはむたろ／外資系／サンリオ過激派／ぐでたまとぷりんころす／奇声／チンピラ／ポケモンゴー／デジタルゴリラ／IoTデバイス／次世代／INTJ／TMS治療／応援のふぁぼ\\n\\ntwitter：@Risu_3\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 2215,\n      \"pinnedNoteIds\": [\n        \"7180d6d98bd8b4e992512423\",\n        \"7180d6c9ad58746764697430\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7180d6d98bd8b4e992512423\",\n          \"createdAt\": \"2022-05-18T11:07:03.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"なんか和訳が悪いんだよな\\nhttps://www.16personalities.com/ja/intj%E5%9E%8B%E3%81%AE%E6%80%A7%E6%A0%BC\",\n          \"cw\": null,\n          \"userId\": \"5d78eb8609f9cd7ff6e2468c\",\n          \"user\": {\n            \"id\": \"5d78eb8609f9cd7ff6e2468c\",\n            \"username\": \"farien4\",\n            \"name\": \"りすさん🐹休職中\",\n            \"host\": \"mstdn.res.ac\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62419c50b51e030ef8159fb1/62419c50b51e030ef8159fb1.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mstdn.res.ac\",\n              \"name\": \"のめやうたえどん\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.3.2\",\n              \"iconUrl\": \"https://mstdn.res.ac/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mstdn.res.ac/@farien4\",\n            \"uri\": \"https://mstdn.res.ac/users/farien4\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mstdn.res.ac/users/farien4/statuses/108322620938734751\",\n          \"url\": \"https://mstdn.res.ac/@farien4/108322620938734751\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7180d6c9ad58746764697430\",\n          \"createdAt\": \"2022-05-18T10:49:43.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"16タイプ性格診断で私のINTJ社交性最下位なんだろうなと思ったらそうだった\\nhttps://motivation-up.com/assessment/16type/16type_rank1.html\",\n          \"cw\": null,\n          \"userId\": \"5d78eb8609f9cd7ff6e2468c\",\n          \"user\": {\n            \"id\": \"5d78eb8609f9cd7ff6e2468c\",\n            \"username\": \"farien4\",\n            \"name\": \"りすさん🐹休職中\",\n            \"host\": \"mstdn.res.ac\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62419c50b51e030ef8159fb1/62419c50b51e030ef8159fb1.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mstdn.res.ac\",\n              \"name\": \"のめやうたえどん\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.3.2\",\n              \"iconUrl\": \"https://mstdn.res.ac/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mstdn.res.ac/@farien4\",\n            \"uri\": \"https://mstdn.res.ac/users/farien4\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mstdn.res.ac/users/farien4/statuses/108322552758947999\",\n          \"url\": \"https://mstdn.res.ac/@farien4/108322552758947999\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b2ff775a51ed2ea4909159\",\n      \"username\": \"siroserui\",\n      \"name\": \"るい　@自宅待機中　😷🇯🇵\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c0d4d3861e8cdcf2ea9e6d/62c0d4d3861e8cdcf2ea9e6d.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@siroserui\",\n      \"uri\": \"https://submarin.online/users/90wb86mish\",\n      \"createdAt\": \"2022-06-22T11:39:35.733Z\",\n      \"updatedAt\": \"2022-07-20T06:41:54.695Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d29af9366d47ba6cb3c116/62d29af9366d47ba6cb3c116.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"Missky規制~🥺\\n\\n【ぺあが】\\n\\n@Lemon@misskey.ranranhome.info\\nだいすき。\\n\\nⳣぬ–Ʊﾟ−ʖˋゔ\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": \"おおさかふ｡\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 776,\n      \"pinnedNoteIds\": [\n        \"71820ff6864be165fbac87f6\",\n        \"71820ffc85680d8186a5fcdb\",\n        \"71820ecd5e2c9643ba3f967b\",\n        \"7182073cf93e1f39a70fa0f9\",\n        \"7181b24b8b73e6532f595324\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71820ff6864be165fbac87f6\",\n          \"createdAt\": \"2022-07-18T06:19:50.731Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"お願いしますっ\",\n          \"cw\": null,\n          \"userId\": \"62b2ff775a51ed2ea4909159\",\n          \"user\": {\n            \"id\": \"62b2ff775a51ed2ea4909159\",\n            \"username\": \"siroserui\",\n            \"name\": \"るい　@自宅待機中　😷🇯🇵\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c0d4d3861e8cdcf2ea9e6d/62c0d4d3861e8cdcf2ea9e6d.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@siroserui\",\n            \"uri\": \"https://submarin.online/users/90wb86mish\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 9,\n          \"renoteCount\": 8,\n          \"quoteCount\": 5,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"👍\": 1\n          },\n          \"reactionCounts\": {\n            \"👍\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62d4fb89d58db765404d29d4\",\n            \"62d4fb89d58db765404d29d5\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d4fb89d58db765404d29d4\",\n              \"createdAt\": \"2022-07-18T06:19:53.009Z\",\n              \"name\": \"webpublic-abb4afb4-2c82-40b3-91ee-39e455d5ebe4\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"8e0a34fdcdcc8c81fb003ff71daf8ee4\",\n              \"url\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d4/62d4fb89d58db765404d29d4.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d4/62d4fb89d58db765404d29d4.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1097,\n                \"height\": 1432\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d4fb89d58db765404d29d5\",\n              \"createdAt\": \"2022-07-18T06:19:53.235Z\",\n              \"name\": \"webpublic-da012957-3f67-4d91-8c0c-120a89004380\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"55935ab839642355828bc38a6a01a1cc\",\n              \"url\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d5/62d4fb89d58db765404d29d5.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d5/62d4fb89d58db765404d29d5.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 768,\n                \"height\": 768\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://submarin.online/notes/92tx8mrvov\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71820ffc85680d8186a5fcdb\",\n          \"createdAt\": \"2022-07-18T06:26:23.720Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"期限は今日までです\\n明日7/19答えます！\",\n          \"cw\": null,\n          \"userId\": \"62b2ff775a51ed2ea4909159\",\n          \"user\": {\n            \"id\": \"62b2ff775a51ed2ea4909159\",\n            \"username\": \"siroserui\",\n            \"name\": \"るい　@自宅待機中　😷🇯🇵\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c0d4d3861e8cdcf2ea9e6d/62c0d4d3861e8cdcf2ea9e6d.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@siroserui\",\n            \"uri\": \"https://submarin.online/users/90wb86mish\"\n          },\n          \"replyId\": null,\n          \"renoteId\": \"71820ff6864be165fbac87f6\",\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/92txh208zk\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": {\n            \"id\": \"71820ff6864be165fbac87f6\",\n            \"createdAt\": \"2022-07-18T06:19:50.731Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"お願いしますっ\",\n            \"cw\": null,\n            \"userId\": \"62b2ff775a51ed2ea4909159\",\n            \"user\": {\n              \"id\": \"62b2ff775a51ed2ea4909159\",\n              \"username\": \"siroserui\",\n              \"name\": \"るい　@自宅待機中　😷🇯🇵\",\n              \"host\": \"submarin.online\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/62c0d4d3861e8cdcf2ea9e6d/62c0d4d3861e8cdcf2ea9e6d.png?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"submarin.online\",\n                \"name\": \"Submarin\",\n                \"softwareName\": \"misskey\",\n                \"softwareVersion\": \"12.117.0\",\n                \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n                \"themeColor\": \"#41adef\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://submarin.online/@siroserui\",\n              \"uri\": \"https://submarin.online/users/90wb86mish\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 9,\n            \"renoteCount\": 8,\n            \"quoteCount\": 5,\n            \"repliesCount\": 0,\n            \"reactions\": {\n              \"👍\": 1\n            },\n            \"reactionCounts\": {\n              \"👍\": 1\n            },\n            \"emojis\": [],\n            \"fileIds\": [\n              \"62d4fb89d58db765404d29d4\",\n              \"62d4fb89d58db765404d29d5\"\n            ],\n            \"files\": [\n              {\n                \"id\": \"62d4fb89d58db765404d29d4\",\n                \"createdAt\": \"2022-07-18T06:19:53.009Z\",\n                \"name\": \"webpublic-abb4afb4-2c82-40b3-91ee-39e455d5ebe4\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"8e0a34fdcdcc8c81fb003ff71daf8ee4\",\n                \"url\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d4/62d4fb89d58db765404d29d4.jpg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d4/62d4fb89d58db765404d29d4.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1097,\n                  \"height\": 1432\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"62d4fb89d58db765404d29d5\",\n                \"createdAt\": \"2022-07-18T06:19:53.235Z\",\n                \"name\": \"webpublic-da012957-3f67-4d91-8c0c-120a89004380\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"55935ab839642355828bc38a6a01a1cc\",\n                \"url\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d5/62d4fb89d58db765404d29d5.jpg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/62d4fb89d58db765404d29d5/62d4fb89d58db765404d29d5.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 768,\n                  \"height\": 768\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              }\n            ],\n            \"uri\": \"https://submarin.online/notes/92tx8mrvov\",\n            \"url\": null,\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"reply\": null,\n            \"renote\": null,\n            \"poll\": null,\n            \"myReaction\": null,\n            \"myRenoteId\": null,\n            \"notHaveDecorationMfm\": true\n          },\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71820ecd5e2c9643ba3f967b\",\n          \"createdAt\": \"2022-07-18T00:55:16.268Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"安倍さんが天国で喜んでもらうために−\\n\\n名前に−\\n\\n😷🇯🇵をつける運動をしましょう−\\n\\n安倍さん大好きです- #拡散希望　#コロナ　#自宅待機　#rt拡散希望 # #安倍さん応援団 #安倍晋三奈良で凶弾に倒れる #安倍さん大好きです\",\n          \"cw\": null,\n          \"userId\": \"62b2ff775a51ed2ea4909159\",\n          \"user\": {\n            \"id\": \"62b2ff775a51ed2ea4909159\",\n            \"username\": \"siroserui\",\n            \"name\": \"るい　@自宅待機中　😷🇯🇵\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c0d4d3861e8cdcf2ea9e6d/62c0d4d3861e8cdcf2ea9e6d.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@siroserui\",\n            \"uri\": \"https://submarin.online/users/90wb86mish\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"拡散希望\",\n            \"コロナ\",\n            \"自宅待機\",\n            \"rt拡散希望\",\n            \"安倍さん応援団\",\n            \"安倍晋三奈良で凶弾に倒れる\",\n            \"安倍さん大好きです\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/92tln86ko2\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7182073cf93e1f39a70fa0f9\",\n          \"createdAt\": \"2022-07-16T13:40:12.734Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"ーご報告ー\\n僕のお父さんがコロナ陽性でした\\nお母さん、僕、弟、妹という家系なのですが\\nお母さんはコロナ陰性の風邪、\\n妹もコロナ陰性の風邪です\\n僕は元気です！\\n\\nなのでこれから1週間ほど自宅待機になります！\\n\\nなので浮上時間が長くなるかもですw\\n\\n以上ご報告でした #拡散希望　#コロナ　#自宅待機　#rt拡散希望\",\n          \"cw\": null,\n          \"userId\": \"62b2ff775a51ed2ea4909159\",\n          \"user\": {\n            \"id\": \"62b2ff775a51ed2ea4909159\",\n            \"username\": \"siroserui\",\n            \"name\": \"るい　@自宅待機中　😷🇯🇵\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c0d4d3861e8cdcf2ea9e6d/62c0d4d3861e8cdcf2ea9e6d.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@siroserui\",\n            \"uri\": \"https://submarin.online/users/90wb86mish\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"拡散希望\",\n            \"コロナ\",\n            \"自宅待機\",\n            \"rt拡散希望\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/92ri38sens\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181b24b8b73e6532f595324\",\n          \"createdAt\": \"2022-06-30T01:48:24.307Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": null,\n          \"cw\": null,\n          \"userId\": \"62b2ff775a51ed2ea4909159\",\n          \"user\": {\n            \"id\": \"62b2ff775a51ed2ea4909159\",\n            \"username\": \"siroserui\",\n            \"name\": \"るい　@自宅待機中　😷🇯🇵\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c0d4d3861e8cdcf2ea9e6d/62c0d4d3861e8cdcf2ea9e6d.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@siroserui\",\n            \"uri\": \"https://submarin.online/users/90wb86mish\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":t_sorena@misskey.levome-dol.com:\": 1\n          },\n          \"reactionCounts\": {\n            \":t_sorena@misskey.levome-dol.com:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"t_sorena@misskey.levome-dol.com\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/b6ftzk45n039tebqfx6pu1ea.png\",\n              \"host\": \"misskey.levome-dol.com\",\n              \"resolvable\": \"t_sorena@misskey.levome-dol.com\"\n            }\n          ],\n          \"fileIds\": [\n            \"62c0d4d8861e8cdcf2ea9e6e\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62c0d4d8861e8cdcf2ea9e6e\",\n              \"createdAt\": \"2022-07-02T23:29:28.120Z\",\n              \"name\": \"webpublic-f4adc8e3-5372-489a-8ba2-9c6ed6a7ff7f\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"4617a9ca38ef092041deee940d338531\",\n              \"url\": \"https://misskey.m544.net/files/62c0d4d8861e8cdcf2ea9e6e/62c0d4d8861e8cdcf2ea9e6e.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62c0d4d8861e8cdcf2ea9e6e/62c0d4d8861e8cdcf2ea9e6e.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1776,\n                \"height\": 1316\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://submarin.online/notes/923xm8379b\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62bad8b52b064605bf4118c1\",\n      \"username\": \"yumena\",\n      \"name\": \"yume＠夢\",\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d693f8562661e08b7a2f26/62d693f8562661e08b7a2f26.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@yumena\",\n      \"uri\": \"https://misskey.levome-dol.com/users/91ha1brfbi\",\n      \"createdAt\": \"2022-06-28T10:32:21.519Z\",\n      \"updatedAt\": \"2022-07-18T04:06:22.142Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62d3a76d2f522fdde894d24b/62d3a76d2f522fdde894d24b.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"こんちゃ‼\\nお悩み部は副部長イラスト部は部長の夢です！！\\n好きな〇〇はカラピチ、ちろぴの、いれいす、まいぜん、すとぷり、ボカロ曲、辛い物などです、、あとフォローしてくれた皆！！\\n性格は・ツンデレ・優しい・可愛い・天然（バカ）・元気・ビビリとよく言われます（バカでも無いしツンデレでも無いしビビリでも無いし・・・後可愛くないと思う）\\nプロセカはやってます(′▽`〃)\\nそれと東方のダンマクカグラしてます\\nタメ語でも敬語でもどっちでもいいよ〜\\nあとフォローしてくれたら絶対フォローするo(≧o≦)oめっちゃフォローしまくるかも、、嫌だったら言ってね\\nまぁよろしく〜\",\n      \"profile\": {\n        \"birthday\": \"2010-11-01\",\n        \"location\": \"宇宙！！、、、、、、、、、やっぱ地球にしよう\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 46,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"606881f35ddb3c61d44e2503\",\n      \"username\": \"sshuka\",\n      \"name\": null,\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/default-avatar.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"fediverse新潟県民部\"\n      ],\n      \"url\": \"https://misskey.io/@sshuka\",\n      \"uri\": \"https://misskey.io/users/8k5eufn4pi\",\n      \"createdAt\": \"2021-04-03T14:55:47.558Z\",\n      \"updatedAt\": \"2021-05-07T17:58:23.744Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"#fediverse新潟県民部\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 21,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62cf2a0a7336f0a815e8c98e\",\n      \"username\": \"anao\",\n      \"name\": \"愛菜緒（アナオ）fedibird\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62cf2a0a7336f0a815e8c990/62cf2a0a7336f0a815e8c990.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@anao\",\n      \"uri\": \"https://fedibird.com/users/anao\",\n      \"createdAt\": \"2022-07-13T20:24:42.796Z\",\n      \"updatedAt\": \"2022-07-20T04:03:15.424Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62cf2a0a7336f0a815e8c991/62cf2a0a7336f0a815e8c991.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"jpから来ました！！\\nとりあえずの避難垢です。\\n知ってる人を見かけ次第、ひたすらフォローしていきます！！\\n知らない人もフォローしていきます。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 536,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62c82da5006a1a06793eb720\",\n      \"username\": \"morkw\",\n      \"name\": \"森河♡（ﾓﾘｶﾜ）【姉】\",\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c82da6006a1a06793eb722/62c82da6006a1a06793eb722.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@morkw\",\n      \"uri\": \"https://misskey.levome-dol.com/users/92g17eetj4\",\n      \"createdAt\": \"2022-07-08T13:14:13.830Z\",\n      \"updatedAt\": \"2022-07-13T16:20:00.880Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c82da7006a1a06793eb723/62c82da7006a1a06793eb723.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"どうも森河 夏菜 （ｶﾅ）です♡\\n良かったら仲良くしてね\\n@mrkw@misskey.levome-dol.com　森河 菜奈（ﾅﾅ）の姉です\\n話すの好きなので気軽に話しかけてね\\nというか勝手に話してるから\\n\\n自己紹介♡\\n名前 森河 夏菜\\n身長：162ｃｍ\\n誕生日：7月11日\\n\\nプロフィ気になった人とか\\n勝手にフォローする\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 12,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62c92832b212faba796b0bb0\",\n      \"username\": \"hiroto\",\n      \"name\": \"弘樹\",\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c92833b212faba796b0bb5/62c92833b212faba796b0bb5.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@hiroto\",\n      \"uri\": \"https://misskey.levome-dol.com/users/92h11j5tdh\",\n      \"createdAt\": \"2022-07-09T07:03:14.985Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c92833b212faba796b0bb4/62c92833b212faba796b0bb4.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"やほ\\n始めまして\\n性別、、男\\n名前、、ひろき（弘樹）\\nよろしく\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 4,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5cc59b32de04535506ec9f2b\",\n      \"username\": \"haguregumo_4\",\n      \"name\": \"はぐれぐも\",\n      \"host\": \"best-friends.chat\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62ccea7ccee0a631e48b2e7f/62ccea7ccee0a631e48b2e7f.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"best-friends.chat\",\n        \"name\": \"Best Friends\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.2.1\",\n        \"iconUrl\": \"https://best-friends.chat/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://best-friends.chat/@haguregumo_4\",\n      \"uri\": \"https://best-friends.chat/users/haguregumo_4\",\n      \"createdAt\": \"2019-04-28T12:23:14.057Z\",\n      \"updatedAt\": \"2022-07-19T14:26:04.513Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62cdb2aacee0a631e48b941d/62cdb2aacee0a631e48b941d.gif?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"もどってきました　気づいたら仮面浪人してました\\nゲームときどき絵\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"シャドバ\",\n          \"value\": \"504168869\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 192,\n      \"pinnedNoteIds\": [\n        \"716a6703dea0226b39a5e9d9\",\n        \"716a711a2cf077b1f766c132\",\n        \"7181f0743e98008560e8e1f9\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"716a6703dea0226b39a5e9d9\",\n          \"createdAt\": \"2019-04-29T02:54:28.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"タピオカパンの波動がする\",\n          \"cw\": null,\n          \"userId\": \"5cc59b32de04535506ec9f2b\",\n          \"user\": {\n            \"id\": \"5cc59b32de04535506ec9f2b\",\n            \"username\": \"haguregumo_4\",\n            \"name\": \"はぐれぐも\",\n            \"host\": \"best-friends.chat\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62ccea7ccee0a631e48b2e7f/62ccea7ccee0a631e48b2e7f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"best-friends.chat\",\n              \"name\": \"Best Friends\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.2.1\",\n              \"iconUrl\": \"https://best-friends.chat/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://best-friends.chat/@haguregumo_4\",\n            \"uri\": \"https://best-friends.chat/users/haguregumo_4\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://best-friends.chat/users/haguregumo_4/statuses/102007207912559769\",\n          \"url\": \"https://best-friends.chat/@haguregumo_4/102007207912559769\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"716a711a2cf077b1f766c132\",\n          \"createdAt\": \"2019-05-01T01:55:02.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"令和ですです\",\n          \"cw\": null,\n          \"userId\": \"5cc59b32de04535506ec9f2b\",\n          \"user\": {\n            \"id\": \"5cc59b32de04535506ec9f2b\",\n            \"username\": \"haguregumo_4\",\n            \"name\": \"はぐれぐも\",\n            \"host\": \"best-friends.chat\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62ccea7ccee0a631e48b2e7f/62ccea7ccee0a631e48b2e7f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"best-friends.chat\",\n              \"name\": \"Best Friends\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.2.1\",\n              \"iconUrl\": \"https://best-friends.chat/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://best-friends.chat/@haguregumo_4\",\n            \"uri\": \"https://best-friends.chat/users/haguregumo_4\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://best-friends.chat/users/haguregumo_4/statuses/102018298847334351\",\n          \"url\": \"https://best-friends.chat/@haguregumo_4/102018298847334351\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181f0743e98008560e8e1f9\",\n          \"createdAt\": \"2022-07-12T03:29:19.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"アイコン変えたのだわ\",\n          \"cw\": null,\n          \"userId\": \"5cc59b32de04535506ec9f2b\",\n          \"user\": {\n            \"id\": \"5cc59b32de04535506ec9f2b\",\n            \"username\": \"haguregumo_4\",\n            \"name\": \"はぐれぐも\",\n            \"host\": \"best-friends.chat\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62ccea7ccee0a631e48b2e7f/62ccea7ccee0a631e48b2e7f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"best-friends.chat\",\n              \"name\": \"Best Friends\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.2.1\",\n              \"iconUrl\": \"https://best-friends.chat/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://best-friends.chat/@haguregumo_4\",\n            \"uri\": \"https://best-friends.chat/users/haguregumo_4\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://best-friends.chat/users/haguregumo_4/statuses/108632248153729772\",\n          \"url\": \"https://best-friends.chat/@haguregumo_4/108632248153729772\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62caf3481113a83a5103fe7b\",\n      \"username\": \"digi_tan\",\n      \"name\": \"でじたん＠\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62caf3481113a83a5103fe7d/62caf3481113a83a5103fe7d.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@digi_tan\",\n      \"uri\": \"https://fedibird.com/users/digi_tan\",\n      \"createdAt\": \"2022-07-10T15:42:00.712Z\",\n      \"updatedAt\": \"2022-07-20T03:34:07.487Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62caf3481113a83a5103fe7c/62caf3481113a83a5103fe7c.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"でじたんです。\\nスク水のことならお任せあれ。\\nIllust by @yanagiyuu@pawoo.net\",\n      \"profile\": {\n        \"birthday\": \"2006-06-12\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 166,\n      \"pinnedNoteIds\": [\n        \"7181fadbbe102dab947d19ef\",\n        \"7181e8d754b8139e2994c1de\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181fadbbe102dab947d19ef\",\n          \"createdAt\": \"2022-07-14T03:58:34.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"【抱き枕カバー販売中】\\nでじたん抱き枕カバーが販売開始となりました！\\n両面非R-18の差分など種類も豊富です！\\nぜひ検討ください。\\n\\nでじたん抱き枕カバー（裏エロパターンあり） | しゃく屋（ @kawarage@pawoo.net  ）\\n https://shakuerine.booth.pm/items/3871973 #booth_pm\",\n          \"cw\": null,\n          \"userId\": \"62caf3481113a83a5103fe7b\",\n          \"user\": {\n            \"id\": \"62caf3481113a83a5103fe7b\",\n            \"username\": \"digi_tan\",\n            \"name\": \"でじたん＠\",\n            \"host\": \"fedibird.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62caf3481113a83a5103fe7d/62caf3481113a83a5103fe7d.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"fedibird.com\",\n              \"name\": \"Fedibird\",\n              \"softwareName\": \"fedibird\",\n              \"softwareVersion\": \"0.1\",\n              \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://fedibird.com/@digi_tan\",\n            \"uri\": \"https://fedibird.com/users/digi_tan\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"booth_pm\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62cf946b4247ca3cade06cee\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62cf946b4247ca3cade06cee\",\n              \"createdAt\": \"2022-07-14T03:58:35.122Z\",\n              \"name\": \"6c2676acc42ce00b.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"ff99515d83f6963418a7a8983a57c68f\",\n              \"url\": \"https://misskey.m544.net/files/62cf946b4247ca3cade06cee/62cf946b4247ca3cade06cee.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62cf946b4247ca3cade06cee/62cf946b4247ca3cade06cee.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 705,\n                \"height\": 1024\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://fedibird.com/users/digi_tan/statuses/108643687758645958\",\n          \"url\": \"https://fedibird.com/@digi_tan/108643687758645958\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"5b79dab451eabc3fc6ef2695\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": false\n        },\n        {\n          \"id\": \"7181e8d754b8139e2994c1de\",\n          \"createdAt\": \"2022-07-10T16:00:35.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"【おしらせ】\\nFedibirdにでじたんもおじゃましました！\\nこれからもでじたんのコト、色々と応援していただけると嬉しいです。\\nよろしくね。\",\n          \"cw\": null,\n          \"userId\": \"62caf3481113a83a5103fe7b\",\n          \"user\": {\n            \"id\": \"62caf3481113a83a5103fe7b\",\n            \"username\": \"digi_tan\",\n            \"name\": \"でじたん＠\",\n            \"host\": \"fedibird.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62caf3481113a83a5103fe7d/62caf3481113a83a5103fe7d.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"fedibird.com\",\n              \"name\": \"Fedibird\",\n              \"softwareName\": \"fedibird\",\n              \"softwareVersion\": \"0.1\",\n              \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://fedibird.com/@digi_tan\",\n            \"uri\": \"https://fedibird.com/users/digi_tan\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 7,\n          \"renoteCount\": 6,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"🎉\": 1\n          },\n          \"reactionCounts\": {\n            \"🎉\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62caf7bb1113a83a5104004e\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62caf7bb1113a83a5104004e\",\n              \"createdAt\": \"2022-07-10T16:00:59.570Z\",\n              \"name\": \"a8797174cd82ac9b.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"a4bfeb73bbc3552f804a0fdfe942ce0e\",\n              \"url\": \"https://misskey.m544.net/files/62caf7bb1113a83a5104004e/62caf7bb1113a83a5104004e.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62caf7bb1113a83a5104004e/62caf7bb1113a83a5104004e.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1211,\n                \"height\": 1713\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://fedibird.com/users/digi_tan/statuses/108623877631759996\",\n          \"url\": \"https://fedibird.com/@digi_tan/108623877631759996\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": false\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"628e0d2edb958f55259fb888\",\n      \"username\": \"f\",\n      \"name\": \"ふれすと🐣\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a5cbb33b4307308edcf357/62a5cbb33b4307308edcf357.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@f\",\n      \"uri\": \"https://submarin.online/users/90mzhixas8\",\n      \"createdAt\": \"2022-05-25T11:04:14.045Z\",\n      \"updatedAt\": \"2022-07-20T07:00:00.196Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c9629cb212faba796b36ca/62c9629cb212faba796b36ca.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"モデレーターやってたり色々作ってたり。\\n<i><i>🐣</i></i>  [Twitter](https://link.fle.st/twitter)  ･  [Discord](https://link.fle.st/discord)  <i><i>🐣</i></i>\\n\\n素晴らしきアイコンの素晴らしき製作者 ･ あやさん\\n<i><i>🧁</i></i>  [Twitter](https://twitter.com/4y4san)  ･  [pixiv](https://www.pixiv.net/users/67996451)  <i><i>🧁</i></i>\",\n      \"profile\": {\n        \"birthday\": \"2004-12-20\",\n        \"location\": \"㌥\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"おサイト\",\n          \"value\": \"https://fle.st/\"\n        },\n        {\n          \"name\": \"金くれ\",\n          \"value\": \"https://kyash.me/payments/LWf0ptK4G8wYRadjYGC4gN3VHdbP\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 4642,\n      \"pinnedNoteIds\": [\n        \"718160646a125db0be66a28d\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"718160646a125db0be66a28d\",\n          \"createdAt\": \"2022-06-14T04:06:42.450Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"https://submarin.online/clips/91h7gk96hi\",\n          \"cw\": null,\n          \"userId\": \"628e0d2edb958f55259fb888\",\n          \"user\": {\n            \"id\": \"628e0d2edb958f55259fb888\",\n            \"username\": \"f\",\n            \"name\": \"ふれすと🐣\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a5cbb33b4307308edcf357/62a5cbb33b4307308edcf357.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@f\",\n            \"uri\": \"https://submarin.online/users/90mzhixas8\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/91h7igb6jy\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62c9810eb212faba796b4bf9\",\n      \"username\": \"sumi\",\n      \"name\": \"すみれん\",\n      \"host\": \"ip.omorashi.cc\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c9810eb212faba796b4bfa/62c9810eb212faba796b4bfa.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"ip.omorashi.cc\",\n        \"name\": \"恋心が奪われたまま永遠に帰ってこないので無限に働きたい\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"10.102.584-m544\",\n        \"iconUrl\": \"https://ip.omorashi.cc/favicon.ico\",\n        \"themeColor\": \"#fb4e4e\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://ip.omorashi.cc/@sumi\",\n      \"uri\": \"https://ip.omorashi.cc/users/62c97f6a73675b45df6cae40\",\n      \"createdAt\": \"2022-07-09T13:22:22.430Z\",\n      \"updatedAt\": \"2022-07-09T13:53:40.391Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"新規です。すみれです\\nよろしく～✌️\",\n      \"profile\": {\n        \"birthday\": \"2005-05-06\",\n        \"location\": \"空\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"61af60b09571701d2a2b3f7c\",\n      \"username\": \"frfr\",\n      \"name\": \":fusso_fu::fusso_ru:はちさん:emergency:\",\n      \"host\": \"mk.f72u.net\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/61af60b19571701d2a2b3f7e/61af60b19571701d2a2b3f7e.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"mk.f72u.net\",\n        \"name\": \"ふるすきー\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0-frsky\",\n        \"iconUrl\": \"https://mk.f72u.net/media/misskey/642ed126-6129-4a4b-8372-58fc4cd5998c.png\",\n        \"themeColor\": \"#ffe877\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"fusso_fu\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/yep4ov5cg6s3tr83bobbvtsx.png\",\n          \"host\": \"mk.f72u.net\",\n          \"resolvable\": \"fusso_fu@mk.f72u.net\"\n        },\n        {\n          \"name\": \"fusso_ru\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/z0yfybjcduhiklqm55nelv4h.png\",\n          \"host\": \"mk.f72u.net\",\n          \"resolvable\": \"fusso_ru@mk.f72u.net\"\n        },\n        {\n          \"name\": \"emergency\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/gh65w20qkuf8qhhzdyo9tq0p.apng\",\n          \"host\": \"mk.f72u.net\",\n          \"resolvable\": \"emergency@mk.f72u.net\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://mk.f72u.net/@frfr\",\n      \"uri\": \"https://mk.f72u.net/users/8tzm6fqdd2\",\n      \"createdAt\": \"2021-12-07T13:25:04.804Z\",\n      \"updatedAt\": \"2022-07-20T06:27:21.111Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/61f947c7d34ee55fecb63a8f/61f947c7d34ee55fecb63a8f.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"サバゲーしたりGRヤリスに乗ったりしています\\n\\n\\n他のアカウント\\n@frfr@sushi.ski (Mod)\",\n      \"profile\": {\n        \"birthday\": \"1994-12-11\",\n        \"location\": \"Osaka, Japan\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"干し芋\",\n          \"value\": \"https://www.amazon.jp/hz/wishlist/ls/QTKTZ9VV2F9Z\"\n        },\n        {\n          \"name\": \"謎の数字\",\n          \"value\": \"8678-3127\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 11784,\n      \"pinnedNoteIds\": [\n        \"717ea8de07ce84861db7f34c\",\n        \"717e487ffa4bc9c8738abadf\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"717ea8de07ce84861db7f34c\",\n          \"createdAt\": \"2022-01-30T02:43:50.350Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"my new gear... #frfr\",\n          \"cw\": null,\n          \"userId\": \"61af60b09571701d2a2b3f7c\",\n          \"user\": {\n            \"id\": \"61af60b09571701d2a2b3f7c\",\n            \"username\": \"frfr\",\n            \"name\": \":fusso_fu::fusso_ru:はちさん:emergency:\",\n            \"host\": \"mk.f72u.net\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/61af60b19571701d2a2b3f7e/61af60b19571701d2a2b3f7e.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mk.f72u.net\",\n              \"name\": \"ふるすきー\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0-frsky\",\n              \"iconUrl\": \"https://mk.f72u.net/media/misskey/642ed126-6129-4a4b-8372-58fc4cd5998c.png\",\n              \"themeColor\": \"#ffe877\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"fusso_fu\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/yep4ov5cg6s3tr83bobbvtsx.png\",\n                \"host\": \"mk.f72u.net\",\n                \"resolvable\": \"fusso_fu@mk.f72u.net\"\n              },\n              {\n                \"name\": \"fusso_ru\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/z0yfybjcduhiklqm55nelv4h.png\",\n                \"host\": \"mk.f72u.net\",\n                \"resolvable\": \"fusso_ru@mk.f72u.net\"\n              },\n              {\n                \"name\": \"emergency\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/gh65w20qkuf8qhhzdyo9tq0p.apng\",\n                \"host\": \"mk.f72u.net\",\n                \"resolvable\": \"emergency@mk.f72u.net\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mk.f72u.net/@frfr\",\n            \"uri\": \"https://mk.f72u.net/users/8tzm6fqdd2\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"frfr\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 22,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":iihanashi@misskey.omhnc.net:\": 1,\n            \":iihanashi@misskey.na2na.dev:\": 1,\n            \"🎉\": 5,\n            \":nacho_love@misskey.omhnc.net:\": 1,\n            \"🤯\": 3,\n            \":iihanashi@misskey.io:\": 2,\n            \":gr@umaskey.net:\": 1,\n            \"👍\": 1,\n            \":iihanashi@msk.minetaro12.com:\": 1\n          },\n          \"reactionCounts\": {\n            \":iihanashi@misskey.omhnc.net:\": 1,\n            \":iihanashi@misskey.na2na.dev:\": 1,\n            \"🎉\": 5,\n            \":nacho_love@misskey.omhnc.net:\": 1,\n            \"🤯\": 3,\n            \":iihanashi@misskey.io:\": 2,\n            \":gr@umaskey.net:\": 1,\n            \"👍\": 1,\n            \":iihanashi@msk.minetaro12.com:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"iihanashi@misskey.omhnc.net\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/0y24qqq6gxsf9bei7krwtifo.gif\",\n              \"host\": \"misskey.omhnc.net\",\n              \"resolvable\": \"iihanashi@misskey.omhnc.net\"\n            },\n            {\n              \"name\": \"iihanashi@misskey.na2na.dev\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/potdxmmimh4c665zpk81rfpt.gif\",\n              \"host\": \"misskey.na2na.dev\",\n              \"resolvable\": \"iihanashi@misskey.na2na.dev\"\n            },\n            {\n              \"name\": \"nacho_love@misskey.omhnc.net\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/3d7r2tj5v8yhk7oj6zfyfkwc.png\",\n              \"host\": \"misskey.omhnc.net\",\n              \"resolvable\": \"nacho_love@misskey.omhnc.net\"\n            },\n            {\n              \"name\": \"iihanashi@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/4jleii6ye4vmtbl7cj6eekdz.gif\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"iihanashi@misskey.io\"\n            },\n            {\n              \"name\": \"gr@umaskey.net\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/cb6808qkm2mvuuy5m4ywb0yk.png\",\n              \"host\": \"umaskey.net\",\n              \"resolvable\": \"gr@umaskey.net\"\n            },\n            {\n              \"name\": \"iihanashi@msk.minetaro12.com\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/yf6dczclplc2oty88q6qtatf.gif\",\n              \"host\": \"msk.minetaro12.com\",\n              \"resolvable\": \"iihanashi@msk.minetaro12.com\"\n            }\n          ],\n          \"fileIds\": [\n            \"61f60acef96303d5e6a160f9\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"61f60acef96303d5e6a160f9\",\n              \"createdAt\": \"2022-01-30T03:49:34.400Z\",\n              \"name\": \"webpublic-2c027b34-7cf2-4a20-9e3b-e2426f5777ea.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"bcafc853a96eab7e84300cb8134b831c\",\n              \"url\": \"https://misskey.m544.net/files/61f60acef96303d5e6a160f9/61f60acef96303d5e6a160f9.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/61f60acef96303d5e6a160f9/61f60acef96303d5e6a160f9.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 2048,\n                \"height\": 1536\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://mk.f72u.net/notes/8w483vta06\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717e487ffa4bc9c8738abadf\",\n          \"createdAt\": \"2022-01-11T09:37:33.771Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"最近やってること #frfr\",\n          \"cw\": null,\n          \"userId\": \"61af60b09571701d2a2b3f7c\",\n          \"user\": {\n            \"id\": \"61af60b09571701d2a2b3f7c\",\n            \"username\": \"frfr\",\n            \"name\": \":fusso_fu::fusso_ru:はちさん:emergency:\",\n            \"host\": \"mk.f72u.net\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/61af60b19571701d2a2b3f7e/61af60b19571701d2a2b3f7e.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mk.f72u.net\",\n              \"name\": \"ふるすきー\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0-frsky\",\n              \"iconUrl\": \"https://mk.f72u.net/media/misskey/642ed126-6129-4a4b-8372-58fc4cd5998c.png\",\n              \"themeColor\": \"#ffe877\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"fusso_fu\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/yep4ov5cg6s3tr83bobbvtsx.png\",\n                \"host\": \"mk.f72u.net\",\n                \"resolvable\": \"fusso_fu@mk.f72u.net\"\n              },\n              {\n                \"name\": \"fusso_ru\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/z0yfybjcduhiklqm55nelv4h.png\",\n                \"host\": \"mk.f72u.net\",\n                \"resolvable\": \"fusso_ru@mk.f72u.net\"\n              },\n              {\n                \"name\": \"emergency\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/gh65w20qkuf8qhhzdyo9tq0p.apng\",\n                \"host\": \"mk.f72u.net\",\n                \"resolvable\": \"emergency@mk.f72u.net\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mk.f72u.net/@frfr\",\n            \"uri\": \"https://mk.f72u.net/users/8tzm6fqdd2\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"frfr\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 3,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":emergency@misskey.io:\": 3\n          },\n          \"reactionCounts\": {\n            \":emergency@misskey.io:\": 3\n          },\n          \"emojis\": [\n            {\n              \"name\": \"emergency@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/znzqwqwd7q0om0w5j5e5ryd2.apng\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"emergency@misskey.io\"\n            }\n          ],\n          \"fileIds\": [\n            \"61ed5809f7dbc76f21dae04c\",\n            \"61ed5809f7dbc76f21dae050\",\n            \"61ed580af7dbc76f21dae051\",\n            \"61d972923fe37946e5ac5620\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"61ed5809f7dbc76f21dae04c\",\n              \"createdAt\": \"2022-01-23T13:28:41.190Z\",\n              \"name\": \"webpublic-86332cda-22ae-4d5b-ae37-6927423bb2ae.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"38d0755ac4becc5e3cef9af59227ddc6\",\n              \"url\": \"https://misskey.m544.net/files/61ed5809f7dbc76f21dae04c/61ed5809f7dbc76f21dae04c.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/61ed5809f7dbc76f21dae04c/61ed5809f7dbc76f21dae04c.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 2048,\n                \"height\": 1536\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"61ed5809f7dbc76f21dae050\",\n              \"createdAt\": \"2022-01-23T13:28:41.685Z\",\n              \"name\": \"webpublic-faee0284-b0f0-43af-aefc-d21765c51dd2.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"f5a99ffe35aa6d863e9d2cdd7bf205f5\",\n              \"url\": \"https://misskey.m544.net/files/61ed5809f7dbc76f21dae050/61ed5809f7dbc76f21dae050.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/61ed5809f7dbc76f21dae050/61ed5809f7dbc76f21dae050.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 2048,\n                \"height\": 1536\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"61ed580af7dbc76f21dae051\",\n              \"createdAt\": \"2022-01-23T13:28:42.032Z\",\n              \"name\": \"webpublic-26b271e5-553c-444d-85d8-1094e1e59f7e.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"d64daca7878d7cb64648e5731409e6b7\",\n              \"url\": \"https://misskey.m544.net/files/61ed580af7dbc76f21dae051/61ed580af7dbc76f21dae051.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/61ed580af7dbc76f21dae051/61ed580af7dbc76f21dae051.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 2048,\n                \"height\": 1536\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"61d972923fe37946e5ac5620\",\n              \"createdAt\": \"2022-01-08T11:16:34.953Z\",\n              \"name\": \"webpublic-6674e083-2f49-4ecd-a9e0-05b2ab41b3c3.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"ca3c919d3ce8518544af55a3da910913\",\n              \"url\": \"https://misskey.m544.net/files/61d972923fe37946e5ac5620/61d972923fe37946e5ac5620.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/61d972923fe37946e5ac5620/61d972923fe37946e5ac5620.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 2048,\n                \"height\": 1536\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://mk.f72u.net/notes/8vdhir0rvi\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62c8eaa2366d47ba6cb3759d\",\n      \"username\": \"yonagi\",\n      \"name\": \"詩風　夜凪˙˚ʚ₍ ᐢ. ̫ .ᐢ ₎ɞ˚\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey.m544.net/files/default-avatar.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2022-07-09T02:40:34.698Z\",\n      \"updatedAt\": \"2022-07-15T22:31:34.197Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"すしすきー民兼めいすきー民兼とーと民ですわ\\nすしすきー→@usatyan@sushi.suki\\n相方欲しいけど、ちゃんと私が心から好きだと思える人がいいです\\nめいすきー内彼氏&夫募集します！\\n条件\\n1、私が好きだと言える人\\n2、私のことを1番に考えて、大好きでいてくれる人\\n(3、束縛&ドSの人)\\n3は別にいいです\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": \"すしすきーかめいすきー\"\n      },\n      \"fields\": [],\n      \"followersCount\": 1,\n      \"followingCount\": 1,\n      \"notesCount\": 15,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"628cca2c396cb2c28bb54834\",\n      \"username\": \"singingintherain\",\n      \"name\": \"るなち✿\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a6adceecba82b26c5e129a/62a6adceecba82b26c5e129a.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"marindecker\",\n        \"exdeck\"\n      ],\n      \"url\": \"https://submarin.online/@singingintherain\",\n      \"uri\": \"https://submarin.online/users/90n4xj4yle\",\n      \"createdAt\": \"2022-05-24T12:06:04.509Z\",\n      \"updatedAt\": \"2022-07-20T07:01:28.061Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/628cca30396cb2c28bb5483c/628cca30396cb2c28bb5483c.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"そう、明るい日陰で右足を出す、ろくでもない人ですよ。\\nるなちです。**さん**は省略してください。\\n\\nフォロー承認／返しは気分です。\\n\\nSubmarinのモデレーター、モデレーションをします。\\nEXDeckのディレクターと広報担当。\\n#MarinDecker #EXDeck\",\n      \"profile\": {\n        \"birthday\": \"1996-04-10\",\n        \"location\": \"げんふうけい\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"るなちみー\",\n          \"value\": \"https://lunachi.me/\"\n        },\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"[@lunalightp](https://twitter.com/lunalightp)\"\n        },\n        {\n          \"name\": \"Discord\",\n          \"value\": \"[るなち✿#8192](https://discord.com/users/245938757100896256)\"\n        },\n        {\n          \"name\": \"Submarin Wiki\",\n          \"value\": \"[Submarin Wiki](https://wiki.sbmr.in) / @wiki\"\n        },\n        {\n          \"name\": \"Kyash\",\n          \"value\": \"singingintherain\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 14850,\n      \"pinnedNoteIds\": [\n        \"7181f0c5b8b81126e9010755\",\n        \"71818452858252bca7311ab8\",\n        \"71814dc1f3649f6df4428504\",\n        \"71810b23a842ac3e57577113\",\n        \"7180f40666681c9ae96cb152\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181f0c5b8b81126e9010755\",\n          \"createdAt\": \"2022-07-12T04:58:18.680Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"これもアソシエイトリンクです\\nhttps://www.amazon.co.jp/primeday?tag=singingintherain-22\",\n          \"cw\": null,\n          \"userId\": \"628cca2c396cb2c28bb54834\",\n          \"user\": {\n            \"id\": \"628cca2c396cb2c28bb54834\",\n            \"username\": \"singingintherain\",\n            \"name\": \"るなち✿\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a6adceecba82b26c5e129a/62a6adceecba82b26c5e129a.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"marindecker\",\n              \"exdeck\"\n            ],\n            \"url\": \"https://submarin.online/@singingintherain\",\n            \"uri\": \"https://submarin.online/users/90n4xj4yle\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/92l9oo1k8p\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71818452858252bca7311ab8\",\n          \"createdAt\": \"2022-06-21T03:33:29.602Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"【ご報告】\\nこの度るなちと白木咲夏は本日6/21に結婚いたしました。\\nこれから夫婦として二人で明るい日陰を歩んでいきます。\\n\\n下記ページにご報告の詳細とメッセージ等が送れるページが掲載されています。\\nhttps://pr.lunachi.me/article/married.html\",\n          \"cw\": null,\n          \"userId\": \"628cca2c396cb2c28bb54834\",\n          \"user\": {\n            \"id\": \"628cca2c396cb2c28bb54834\",\n            \"username\": \"singingintherain\",\n            \"name\": \"るなち✿\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a6adceecba82b26c5e129a/62a6adceecba82b26c5e129a.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"marindecker\",\n              \"exdeck\"\n            ],\n            \"url\": \"https://submarin.online/@singingintherain\",\n            \"uri\": \"https://submarin.online/users/90n4xj4yle\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 26,\n          \"renoteCount\": 15,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {\n            \"🥰\": 2,\n            \":supertada@misskey.io:\": 1,\n            \":supertada@misskey.zerozaski.tech:\": 1,\n            \"🎉\": 8\n          },\n          \"reactionCounts\": {\n            \"🥰\": 2,\n            \":supertada@misskey.io:\": 1,\n            \":supertada@misskey.zerozaski.tech:\": 1,\n            \"🎉\": 8\n          },\n          \"emojis\": [\n            {\n              \"name\": \"supertada@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/okfx44470mxxab9iyyupbb21.gif\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"supertada@misskey.io\"\n            },\n            {\n              \"name\": \"supertada@misskey.zerozaski.tech\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/g324o2ho1hlwe0hs9dd9f76x.gif\",\n              \"host\": \"misskey.zerozaski.tech\",\n              \"resolvable\": \"supertada@misskey.zerozaski.tech\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/91r6epaacs\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": false\n        },\n        {\n          \"id\": \"71814dc1f3649f6df4428504\",\n          \"createdAt\": \"2022-06-10T13:16:05.348Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"[**Submarin Wiki**](https://wiki.sbmr.in)\\nSubmarinに関する記事やMisskeyの使い方等をまとめたサイトです。\\n\\n何かありましたら@singingintherainまでお問い合わせください。@wikiは更新情報アカウントです。\",\n          \"cw\": null,\n          \"userId\": \"628cca2c396cb2c28bb54834\",\n          \"user\": {\n            \"id\": \"628cca2c396cb2c28bb54834\",\n            \"username\": \"singingintherain\",\n            \"name\": \"るなち✿\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a6adceecba82b26c5e129a/62a6adceecba82b26c5e129a.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"marindecker\",\n              \"exdeck\"\n            ],\n            \"url\": \"https://submarin.online/@singingintherain\",\n            \"uri\": \"https://submarin.online/users/90n4xj4yle\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/91c1djz8c9\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"629ed225ecaab29abd9a2976\",\n            \"628cca2c396cb2c28bb54834\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71810b23a842ac3e57577113\",\n          \"createdAt\": \"2022-05-28T14:48:15.170Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"Dolce for Misskey https://submarin.online/@singingintherain/pages/dolce4misskey\",\n          \"cw\": null,\n          \"userId\": \"628cca2c396cb2c28bb54834\",\n          \"user\": {\n            \"id\": \"628cca2c396cb2c28bb54834\",\n            \"username\": \"singingintherain\",\n            \"name\": \"るなち✿\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a6adceecba82b26c5e129a/62a6adceecba82b26c5e129a.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"marindecker\",\n              \"exdeck\"\n            ],\n            \"url\": \"https://submarin.online/@singingintherain\",\n            \"uri\": \"https://submarin.online/users/90n4xj4yle\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/90tjy05euy\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7180f40666681c9ae96cb152\",\n          \"createdAt\": \"2022-05-24T03:05:01.800Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"大丈夫ですよ。くもりぞらさんが手伝ってくれますから。そうして後輩になったら、また一緒に喫茶店に行ったり、映画を観たり、お酒を飲んだりするんです。今度は掃除人と標的じゃなくて、恋人同士として。\\n\\nそれだけじゃありません。くもりぞらさんが望むなら、もっともっと恋人らしいことをしてあげてもいいです。\\n\\nそれから、毎年、殺してしまった人たちのお墓参りにいきましょう。その程度で罪が贖われるわけではありませんが、そうすべきなんです。\\n\\n今までの行為を深く反省して、あんまり派手な生き方はせず、けれども必要以上に卑屈にもならず、強かに生きていくんです。\\n\\n——そう、明るい日陰で生きていくんです。\",\n          \"cw\": null,\n          \"userId\": \"628cca2c396cb2c28bb54834\",\n          \"user\": {\n            \"id\": \"628cca2c396cb2c28bb54834\",\n            \"username\": \"singingintherain\",\n            \"name\": \"るなち✿\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a6adceecba82b26c5e129a/62a6adceecba82b26c5e129a.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"marindecker\",\n              \"exdeck\"\n            ],\n            \"url\": \"https://submarin.online/@singingintherain\",\n            \"uri\": \"https://submarin.online/users/90n4xj4yle\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/90n528vcoi\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6236bf9a97e6cb0e80076825\",\n      \"username\": \"__akane__\",\n      \"name\": \"𝕂𝕒𝕠𝕣𝕚𝕟𝕒 𝔸𝕜𝕒𝕟𝕖🥠🐾💠:verify:\",\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a556863b4307308edca317/62a556863b4307308edca317.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"verify\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/4ue2j2a0yh862t8ynk3i0gqq.gif\",\n          \"host\": \"misskey.levome-dol.com\",\n          \"resolvable\": \"verify@misskey.levome-dol.com\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@__akane__\",\n      \"uri\": \"https://misskey.levome-dol.com/users/8xh7yjb8h0\",\n      \"createdAt\": \"2022-03-20T05:46:02.065Z\",\n      \"updatedAt\": \"2022-07-19T09:37:46.575Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62ad3ad34f9dd18ad2531ad7/62ad3ad34f9dd18ad2531ad7.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"こんにちわ\\n董奈茜（かおりなあかね）です。\\nめちゃくちゃフォロバします。\\nでも怪しそうな人はしません。フォロバしてくれてもプロフ書いてなかったりしたらフォロー拒否するかもしれまてーん！\\n最近は人気者になってるけど実際の私はあんまし人気者じゃないです。\\nまぁﾖﾛｼｸ！\\nサブ垢⬇︎\\n@akane@misskey.levome-dol.com\\n絵を描く用のアカウント⤵️\\n@Kaorinaakane@misskey.levome-dol.com\\nscratch垢持ってるよ！\\nhttps://scratch.mit.edu/users/A_ayano_/\\nB T S好きです！\\n【ファンマ】🥠🐾💠\\nペア画とかペアアイコンやりたい人は期限とどのようなものでやるのかなど、詳しく教えてください\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"生年月日\",\n          \"value\": \"2012年1月22日\"\n        },\n        {\n          \"name\": \"年\",\n          \"value\": \"10歳\"\n        },\n        {\n          \"name\": \"目標\",\n          \"value\": \"今のとこフォロワー500人！\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 245,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62c3f1791fec2eeb452f2471\",\n      \"username\": \"nagi\",\n      \"name\": \"なぎさん@Cloud\",\n      \"host\": \"misskey.cloud\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c3f1791fec2eeb452f2472/62c3f1791fec2eeb452f2472.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.cloud\",\n        \"name\": \"misskey.cloud\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://misskey.cloud/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.cloud/@nagi\",\n      \"uri\": \"https://misskey.cloud/users/92bg7p717p\",\n      \"createdAt\": \"2022-07-05T08:08:25.627Z\",\n      \"updatedAt\": \"2022-07-20T07:01:53.103Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"== 他のアカウント ==\\n開発系 : @nagi@submarin.online\\n避難垢 : @nagi@fedibird.com\\n\\n*フォローするとTLが荒れます\\n\\nhttps://misskey.tools\\nhttps://join.misskey.page\\n\\n2020/03 -> Now\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"About Me\",\n          \"value\": \"https://meziro039.github.io/About/\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 7484,\n      \"pinnedNoteIds\": [\n        \"71821608861a7b3d6653ba39\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71821608861a7b3d6653ba39\",\n          \"createdAt\": \"2022-07-19T10:37:13.626Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"準備するtodo\",\n          \"cw\": null,\n          \"userId\": \"62c3f1791fec2eeb452f2471\",\n          \"user\": {\n            \"id\": \"62c3f1791fec2eeb452f2471\",\n            \"username\": \"nagi\",\n            \"name\": \"なぎさん@Cloud\",\n            \"host\": \"misskey.cloud\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c3f1791fec2eeb452f2472/62c3f1791fec2eeb452f2472.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.cloud\",\n              \"name\": \"misskey.cloud\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://misskey.cloud/favicon.ico\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.cloud/@nagi\",\n            \"uri\": \"https://misskey.cloud/users/92bg7p717p\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.cloud/notes/92vlvh9679\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62c2f6a1757ad7631280c9b2\",\n      \"username\": \"xiupos\",\n      \"name\": \"🐇\",\n      \"host\": \"m.x4s.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c449021fec2eeb452f5e4c/62c449021fec2eeb452f5e4c.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"m.x4s.io\",\n        \"name\": \"ハウステンぽす🐇\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0-posky-12.11.2\",\n        \"iconUrl\": \"https://m.x4s.io/files/b8ac51ce-0ede-47c0-8edf-16c6f3aef020\",\n        \"themeColor\": \"#fcc800\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://m.x4s.io/@xiupos\",\n      \"uri\": \"https://m.x4s.io/users/92ad1elmix\",\n      \"createdAt\": \"2022-07-04T14:18:09.914Z\",\n      \"updatedAt\": \"2022-07-20T03:06:24.724Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c2f6a2757ad7631280c9b9/62c2f6a2757ad7631280c9b9.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"✞プログラミング✞ わからない／凡夫\\n✞電子工作✞ やってない\\n\\nぽす／Саня\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": \"なかよし川\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"WEB\",\n          \"value\": \"https://xiupos.net/\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 677,\n      \"pinnedNoteIds\": [\n        \"7181cb4cabebe278653a3760\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181cb4cabebe278653a3760\",\n          \"createdAt\": \"2022-07-04T22:20:08.555Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"移転してきました\",\n          \"cw\": null,\n          \"userId\": \"62c2f6a1757ad7631280c9b2\",\n          \"user\": {\n            \"id\": \"62c2f6a1757ad7631280c9b2\",\n            \"username\": \"xiupos\",\n            \"name\": \"🐇\",\n            \"host\": \"m.x4s.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c449021fec2eeb452f5e4c/62c449021fec2eeb452f5e4c.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"m.x4s.io\",\n              \"name\": \"ハウステンぽす🐇\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0-posky-12.11.2\",\n              \"iconUrl\": \"https://m.x4s.io/files/b8ac51ce-0ede-47c0-8edf-16c6f3aef020\",\n              \"themeColor\": \"#fcc800\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://m.x4s.io/@xiupos\",\n            \"uri\": \"https://m.x4s.io/users/92ad1elmix\"\n          },\n          \"replyId\": null,\n          \"renoteId\": \"7181c994365d7947f7965220\",\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://m.x4s.io/notes/92avdnmzx9\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": {\n            \"id\": \"7181c994365d7947f7965220\",\n            \"createdAt\": \"2022-07-04T14:19:02.621Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"DBの問題を解決するため， @xiupos@m.x4s.io に移転します\",\n            \"cw\": null,\n            \"userId\": \"61d6f4c712e1a91564db426f\",\n            \"user\": {\n              \"id\": \"61d6f4c712e1a91564db426f\",\n              \"username\": \"xiupos\",\n              \"name\": \"🐇\",\n              \"host\": \"mk.xiupos.net\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/61d9010c3fe37946e5abe9c3/61d9010c3fe37946e5abe9c3.png?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": true,\n              \"instance\": {\n                \"host\": \"mk.xiupos.net\",\n                \"name\": \"ぽすポラス海峡🐇\",\n                \"softwareName\": \"misskey\",\n                \"softwareVersion\": \"12.117.0-posky-12.11.2\",\n                \"iconUrl\": \"https://mk.xiupos.net/files/9e588645-2bbc-4fd1-b472-ed85f98075ff\",\n                \"themeColor\": \"#fcc800\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://mk.xiupos.net/@xiupos\",\n              \"uri\": \"https://mk.xiupos.net/users/8v6ku4clow\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 3,\n            \"renoteCount\": 2,\n            \"quoteCount\": 1,\n            \"repliesCount\": 0,\n            \"reactions\": {\n              \":nesoberi_suzuka@umaskey.net:\": 1\n            },\n            \"reactionCounts\": {\n              \":nesoberi_suzuka@umaskey.net:\": 1\n            },\n            \"emojis\": [\n              {\n                \"name\": \"nesoberi_suzuka@umaskey.net\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/vf7rdmgj08gcu68dp8g50smc.png\",\n                \"host\": \"umaskey.net\",\n                \"resolvable\": \"nesoberi_suzuka@umaskey.net\"\n              }\n            ],\n            \"fileIds\": [],\n            \"files\": [],\n            \"uri\": \"https://mk.xiupos.net/notes/92ae6yjhrw\",\n            \"url\": null,\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [\n              \"62c2f6a1757ad7631280c9b2\"\n            ],\n            \"hasRemoteMentions\": true,\n            \"reply\": null,\n            \"renote\": null,\n            \"poll\": null,\n            \"myReaction\": null,\n            \"myRenoteId\": null,\n            \"notHaveDecorationMfm\": true\n          },\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b5c3938b96716f028b5c4e\",\n      \"username\": \"miyuttidesu\",\n      \"name\": \"春宮みゆゆ@ウォタチャレガチ勢\",\n      \"host\": \"heislandmine.work\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d79a522c9ae56d3223d9cf/62d79a522c9ae56d3223d9cf.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"heislandmine.work\",\n        \"name\": \"landodon\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.1\",\n        \"iconUrl\": \"https://heislandmine.work/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://heislandmine.work/@miyuttidesu\",\n      \"uri\": \"https://heislandmine.work/users/miyuttidesu\",\n      \"createdAt\": \"2022-06-24T14:00:51.000Z\",\n      \"updatedAt\": \"2022-07-20T06:07:22.302Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62cf44eb7336f0a815e8d256/62cf44eb7336f0a815e8d256.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"どうも名前がやばい人です\\nすまない先生が大好きｾﾞﾖ\\nすまなぁぁぁぁぁぁぁぁぁぁぁぁい！\\n即フォローしなさぁい！(圧)\\n@harumiya@mstdn.beer\\n申請しないとダメだけどフォロバはしますんでよろ\\n最推しがすまない先生で\\n2番目がマネーくんで3番目がレッドくん！\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"誕生日\",\n          \"value\": \"3月17日\"\n        },\n        {\n          \"name\": \"何年？\",\n          \"value\": \"中1\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1025,\n      \"pinnedNoteIds\": [\n        \"71821a19c24002baa4f580f7\",\n        \"71820c2ff9d8dac6e1c55ff0\",\n        \"7181e3dea420e5d918f08be6\",\n        \"7181b417da18d7515759c266\",\n        \"7181b418245039e5ef4001e3\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71821a19c24002baa4f580f7\",\n          \"createdAt\": \"2022-07-20T05:34:32.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"叫ぶならこれくらい叫べ :blobthinksmart:\",\n          \"cw\": null,\n          \"userId\": \"62b5c3938b96716f028b5c4e\",\n          \"user\": {\n            \"id\": \"62b5c3938b96716f028b5c4e\",\n            \"username\": \"miyuttidesu\",\n            \"name\": \"春宮みゆゆ@ウォタチャレガチ勢\",\n            \"host\": \"heislandmine.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d79a522c9ae56d3223d9cf/62d79a522c9ae56d3223d9cf.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"heislandmine.work\",\n              \"name\": \"landodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.1\",\n              \"iconUrl\": \"https://heislandmine.work/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://heislandmine.work/@miyuttidesu\",\n            \"uri\": \"https://heislandmine.work/users/miyuttidesu\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [\n            {\n              \"name\": \"blobthinksmart\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/gzdvxncyjubnmcmz0ukw3y3m.png\",\n              \"host\": \"heislandmine.work\",\n              \"resolvable\": \"blobthinksmart@heislandmine.work\"\n            }\n          ],\n          \"fileIds\": [\n            \"62d793eb2c9ae56d3223d6ca\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d793eb2c9ae56d3223d6ca\",\n              \"createdAt\": \"2022-07-20T05:34:35.269Z\",\n              \"name\": \"171060625becf8f5.mp4\",\n              \"type\": \"video/mp4\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"1e6155a43221ac297418cd4aa54e956a\",\n              \"url\": \"https://misskey.m544.net/files/62d793eb2c9ae56d3223d6ca/62d793eb2c9ae56d3223d6ca.mp4?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d793eb2c9ae56d3223d6ca/62d793eb2c9ae56d3223d6ca.jpg?thumbnail\",\n              \"properties\": {},\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://heislandmine.work/users/miyuttidesu/statuses/108678038993365520\",\n          \"url\": \"https://heislandmine.work/@miyuttidesu/108678038993365520\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71820c2ff9d8dac6e1c55ff0\",\n          \"createdAt\": \"2022-07-17T12:44:07.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"https://m.youtube.com/watch?v=jMlwFShPX_E&t=0s\\nこの曲オヌヌメぇ\",\n          \"cw\": null,\n          \"userId\": \"62b5c3938b96716f028b5c4e\",\n          \"user\": {\n            \"id\": \"62b5c3938b96716f028b5c4e\",\n            \"username\": \"miyuttidesu\",\n            \"name\": \"春宮みゆゆ@ウォタチャレガチ勢\",\n            \"host\": \"heislandmine.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d79a522c9ae56d3223d9cf/62d79a522c9ae56d3223d9cf.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"heislandmine.work\",\n              \"name\": \"landodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.1\",\n              \"iconUrl\": \"https://heislandmine.work/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://heislandmine.work/@miyuttidesu\",\n            \"uri\": \"https://heislandmine.work/users/miyuttidesu\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://heislandmine.work/users/miyuttidesu/statuses/108662741219234370\",\n          \"url\": \"https://heislandmine.work/@miyuttidesu/108662741219234370\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181e3dea420e5d918f08be6\",\n          \"createdAt\": \"2022-07-09T16:50:28.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"お仕置きってえっちなことを考えてしまう\",\n          \"cw\": null,\n          \"userId\": \"62b5c3938b96716f028b5c4e\",\n          \"user\": {\n            \"id\": \"62b5c3938b96716f028b5c4e\",\n            \"username\": \"miyuttidesu\",\n            \"name\": \"春宮みゆゆ@ウォタチャレガチ勢\",\n            \"host\": \"heislandmine.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d79a522c9ae56d3223d9cf/62d79a522c9ae56d3223d9cf.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"heislandmine.work\",\n              \"name\": \"landodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.1\",\n              \"iconUrl\": \"https://heislandmine.work/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://heislandmine.work/@miyuttidesu\",\n            \"uri\": \"https://heislandmine.work/users/miyuttidesu\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 2,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"😳\": 1\n          },\n          \"reactionCounts\": {\n            \"😳\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62c9b1d7b212faba796b7bd3\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62c9b1d7b212faba796b7bd3\",\n              \"createdAt\": \"2022-07-09T16:50:31.493Z\",\n              \"name\": \"70f9b7d72a61a539.png\",\n              \"type\": \"image/png\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"e38811ec11b54ab0bf528cda15d33ce9\",\n              \"url\": \"https://misskey.m544.net/files/62c9b1d7b212faba796b7bd3/62c9b1d7b212faba796b7bd3.png?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62c9b1d7b212faba796b7bd3/62c9b1d7b212faba796b7bd3.png?thumbnail\",\n              \"properties\": {\n                \"width\": 2119,\n                \"height\": 979\n              },\n              \"comment\": null,\n              \"isSensitive\": true\n            }\n          ],\n          \"uri\": \"https://heislandmine.work/users/miyuttidesu/statuses/108618411408265734\",\n          \"url\": \"https://heislandmine.work/@miyuttidesu/108618411408265734\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181b417da18d7515759c266\",\n          \"createdAt\": \"2022-06-30T10:11:11.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"とにかく尊い素材2\\n左；銀さん　右；マネー（様）\",\n          \"cw\": null,\n          \"userId\": \"62b5c3938b96716f028b5c4e\",\n          \"user\": {\n            \"id\": \"62b5c3938b96716f028b5c4e\",\n            \"username\": \"miyuttidesu\",\n            \"name\": \"春宮みゆゆ@ウォタチャレガチ勢\",\n            \"host\": \"heislandmine.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d79a522c9ae56d3223d9cf/62d79a522c9ae56d3223d9cf.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"heislandmine.work\",\n              \"name\": \"landodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.1\",\n              \"iconUrl\": \"https://heislandmine.work/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://heislandmine.work/@miyuttidesu\",\n            \"uri\": \"https://heislandmine.work/users/miyuttidesu\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62bd76c1e0878519dd93220c\",\n            \"62bd76c1e0878519dd93220d\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62bd76c1e0878519dd93220c\",\n              \"createdAt\": \"2022-06-30T10:11:13.021Z\",\n              \"name\": \"6a11cae158391d91.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"61e2e4ca00f31fe86ba120574cdad5fa\",\n              \"url\": \"https://misskey.m544.net/files/62bd76c1e0878519dd93220c/62bd76c1e0878519dd93220c.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62bd76c1e0878519dd93220c/62bd76c1e0878519dd93220c.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1211,\n                \"height\": 1713\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62bd76c1e0878519dd93220d\",\n              \"createdAt\": \"2022-06-30T10:11:13.022Z\",\n              \"name\": \"b5df0587f07071e2.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"dea4608e59f9d11ad3baa5aed64afb8f\",\n              \"url\": \"https://misskey.m544.net/files/62bd76c1e0878519dd93220d/62bd76c1e0878519dd93220d.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62bd76c1e0878519dd93220d/62bd76c1e0878519dd93220d.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1211,\n                \"height\": 1713\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://heislandmine.work/users/miyuttidesu/statuses/108565880614362288\",\n          \"url\": \"https://heislandmine.work/@miyuttidesu/108565880614362288\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181b418245039e5ef4001e3\",\n          \"createdAt\": \"2022-06-30T10:11:30.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"とにかく尊い素材\\n左；レッドくん　右；ブルーくん\",\n          \"cw\": null,\n          \"userId\": \"62b5c3938b96716f028b5c4e\",\n          \"user\": {\n            \"id\": \"62b5c3938b96716f028b5c4e\",\n            \"username\": \"miyuttidesu\",\n            \"name\": \"春宮みゆゆ@ウォタチャレガチ勢\",\n            \"host\": \"heislandmine.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d79a522c9ae56d3223d9cf/62d79a522c9ae56d3223d9cf.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"heislandmine.work\",\n              \"name\": \"landodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.1\",\n              \"iconUrl\": \"https://heislandmine.work/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://heislandmine.work/@miyuttidesu\",\n            \"uri\": \"https://heislandmine.work/users/miyuttidesu\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62bd76d3e0878519dd932210\",\n            \"62bd71b1e0878519dd931d82\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62bd76d3e0878519dd932210\",\n              \"createdAt\": \"2022-06-30T10:11:31.947Z\",\n              \"name\": \"b48f51fcfd974d59.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"9e02c5b6fbe6989e01a88d50b1d4ac3e\",\n              \"url\": \"https://misskey.m544.net/files/62bd76d3e0878519dd932210/62bd76d3e0878519dd932210.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62bd76d3e0878519dd932210/62bd76d3e0878519dd932210.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1211,\n                \"height\": 1713\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62bd71b1e0878519dd931d82\",\n              \"createdAt\": \"2022-06-30T09:49:37.297Z\",\n              \"name\": \"35ed3481f3a9e938.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"8bd18736dc48bbf9e9c681360fa15544\",\n              \"url\": \"https://misskey.m544.net/files/62bd71b1e0878519dd931d82/62bd71b1e0878519dd931d82.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62bd71b1e0878519dd931d82/62bd71b1e0878519dd931d82.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1211,\n                \"height\": 1713\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://heislandmine.work/users/miyuttidesu/statuses/108565881844273656\",\n          \"url\": \"https://heislandmine.work/@miyuttidesu/108565881844273656\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62c29f9c757ad76312808b0a\",\n      \"username\": \"fatbloom\",\n      \"name\": \"通りすがりのオッサン\",\n      \"host\": \"meisskey.one\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c29f9c757ad76312808b0b/62c29f9c757ad76312808b0b.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"meisskey.one\",\n        \"name\": \"meisskey.one\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"10.102.584-m544\",\n        \"iconUrl\": \"https://meisskey.one/favicon.ico\",\n        \"themeColor\": \"#fb4e4e\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://meisskey.one/@fatbloom\",\n      \"uri\": \"https://meisskey.one/users/62c275713d4a2b3713163b20\",\n      \"createdAt\": \"2022-07-04T08:06:52.507Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c29f9c757ad76312808b0c/62c29f9c757ad76312808b0c.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"ただのおっさんです。\\n初心者です。どうかよろしく。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": \"にほんのどこか\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 2,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62bf3bf14a5caab1181e50bf\",\n      \"username\": \"_\",\n      \"name\": \"ろむねこ\",\n      \"host\": \"pleroma.nem.one\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62bf3bf14a5caab1181e50c2/62bf3bf14a5caab1181e50c2.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"pleroma.nem.one\",\n        \"name\": \"ろむ猫ぷれろま\",\n        \"softwareName\": \"pleroma\",\n        \"softwareVersion\": \"2.4.3\",\n        \"iconUrl\": \"https://pleroma.nem.one/favicon.png\",\n        \"themeColor\": null\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://pleroma.nem.one/users/_\",\n      \"uri\": \"https://pleroma.nem.one/users/_\",\n      \"createdAt\": \"2022-07-01T18:24:49.202Z\",\n      \"updatedAt\": \"2022-07-13T22:18:50.896Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c12d2da36d4a3683116963/62c12d2da36d4a3683116963.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"ろむねこだよ！！！、ここのAdminです\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"おひとりさま1\",\n          \"value\": \"https://miss.nem.one/@_\"\n        },\n        {\n          \"name\": \"おひとりさま2\",\n          \"value\": \"https://mei11.nem.one/@_\"\n        },\n        {\n          \"name\": \"おひとりさま3\",\n          \"value\": \"https://romca.tk/@_\"\n        },\n        {\n          \"name\": \"おひとりさま4\",\n          \"value\": \"https://rumia.tk/@_\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 0,\n      \"pinnedNoteIds\": [\n        \"7181bb006f8104c5a2d765ab\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181bb006f8104c5a2d765ab\",\n          \"createdAt\": \"2022-07-01T18:22:56.897Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"Icon\\nhttps://www.pixiv.net/artworks/82817735\",\n          \"cw\": null,\n          \"userId\": \"62bf3bf14a5caab1181e50bf\",\n          \"user\": {\n            \"id\": \"62bf3bf14a5caab1181e50bf\",\n            \"username\": \"_\",\n            \"name\": \"ろむねこ\",\n            \"host\": \"pleroma.nem.one\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62bf3bf14a5caab1181e50c2/62bf3bf14a5caab1181e50c2.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"pleroma.nem.one\",\n              \"name\": \"ろむ猫ぷれろま\",\n              \"softwareName\": \"pleroma\",\n              \"softwareVersion\": \"2.4.3\",\n              \"iconUrl\": \"https://pleroma.nem.one/favicon.png\",\n              \"themeColor\": null\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://pleroma.nem.one/users/_\",\n            \"uri\": \"https://pleroma.nem.one/users/_\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://pleroma.nem.one/objects/8231d04c-19d5-4a93-958c-a5546554f51b\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62be63b0a36d4a368311584b\",\n      \"username\": \"KENTO\",\n      \"name\": \"ひーこちゃん\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/0s397733wjowzzkdk1lth4r1.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2022-07-01T03:02:08.326Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/c9u8zmu11qk4uwv8nb30h30f.jpg\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"投票トークやってます。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": 3,\n      \"followingCount\": 6,\n      \"notesCount\": 0,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5cc6c6b2db76d45500a655a4\",\n      \"username\": \"parsley\",\n      \"name\": \"Parsley\",\n      \"host\": \"best-friends.chat\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/6243b2962257aa17537da1f7/6243b2962257aa17537da1f7.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"best-friends.chat\",\n        \"name\": \"Best Friends\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.2.1\",\n        \"iconUrl\": \"https://best-friends.chat/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://best-friends.chat/@parsley\",\n      \"uri\": \"https://best-friends.chat/users/parsley\",\n      \"createdAt\": \"2019-04-29T09:41:06.586Z\",\n      \"updatedAt\": \"2022-07-20T06:28:26.908Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"そえもの。\\n\\n少しずつライター編集仕事に復帰しているところ。\\n\\nリハビリブログはこちら↓\\nhttps://parsley-reha.hateblo.jp/\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 9877,\n      \"pinnedNoteIds\": [\n        \"716ed14ff2e0057eca0d33ac\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"716ed14ff2e0057eca0d33ac\",\n          \"createdAt\": \"2019-12-04T14:28:28.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"リハビリに新しいブログ作りました。\\n\\nhttps://parsley-reha.hateblo.jp/\",\n          \"cw\": null,\n          \"userId\": \"5cc6c6b2db76d45500a655a4\",\n          \"user\": {\n            \"id\": \"5cc6c6b2db76d45500a655a4\",\n            \"username\": \"parsley\",\n            \"name\": \"Parsley\",\n            \"host\": \"best-friends.chat\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/6243b2962257aa17537da1f7/6243b2962257aa17537da1f7.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"best-friends.chat\",\n              \"name\": \"Best Friends\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.2.1\",\n              \"iconUrl\": \"https://best-friends.chat/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://best-friends.chat/@parsley\",\n            \"uri\": \"https://best-friends.chat/users/parsley\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://best-friends.chat/users/parsley/statuses/103249982825397922\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62bbcfcaf5a34b926f06ab7d\",\n      \"username\": \"reindex\",\n      \"name\": \"Re*Index. (ot_inc)\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62bbcfcbf5a34b926f06ab7e/62bbcfcbf5a34b926f06ab7e.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@reindex\",\n      \"uri\": \"https://submarin.online/users/922mv9560x\",\n      \"createdAt\": \"2022-06-29T04:06:34.650Z\",\n      \"updatedAt\": \"2022-07-01T23:33:11.324Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62bbcfccf5a34b926f06ab7f/62bbcfccf5a34b926f06ab7f.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"なるほどな。\\nMastodonやTwitterなど色々いる。\\nGitHubはローカライズやる位でいる。\\nAndroidとかゲーム機とかなんか色々弄ってます。最近Mi MIX2Sのパーティション吹っ飛ばしました。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": \"Japan,Ibaraki\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"青い鳥 🐦️\",\n          \"value\": \"https://twitter.com/ot_inc\"\n        },\n        {\n          \"name\": \"Discord\",\n          \"value\": \"https://onl.bz/HMXpnzJ\"\n        },\n        {\n          \"name\": \"GitHub\",\n          \"value\": \"https://github.com/reindex-ot\"\n        },\n        {\n          \"name\": \"Pastebin.com\",\n          \"value\": \"https://pastebin.com/u/ot_inc\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 13,\n      \"pinnedNoteIds\": [\n        \"7181adcebf0eadf1d9b87e26\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181adcebf0eadf1d9b87e26\",\n          \"createdAt\": \"2022-06-29T04:53:36.654Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"男の娘抱きたい。\",\n          \"cw\": null,\n          \"userId\": \"62bbcfcaf5a34b926f06ab7d\",\n          \"user\": {\n            \"id\": \"62bbcfcaf5a34b926f06ab7d\",\n            \"username\": \"reindex\",\n            \"name\": \"Re*Index. (ot_inc)\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62bbcfcbf5a34b926f06ab7e/62bbcfcbf5a34b926f06ab7e.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@reindex\",\n            \"uri\": \"https://submarin.online/users/922mv9560x\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/922osjrilv\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b88ca2c4e9e9c412dbe71c\",\n      \"username\": \"nagi\",\n      \"name\": \"なぎさん🔰\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62b88ca3c4e9e9c412dbe71d/62b88ca3c4e9e9c412dbe71d.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@nagi\",\n      \"uri\": \"https://submarin.online/users/91z23wzt39\",\n      \"createdAt\": \"2022-06-26T16:43:14.550Z\",\n      \"updatedAt\": \"2022-07-19T11:21:28.185Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"夢は大きく目標は小さく\\n\\n== 他のアカウント ==\\n日常系 : @nagisan@misskey.io\\nNSFW : @nagi18@misskey.io\\n開発系 : @nagi@submarin.online\\n避難垢 : @nagineko@sushi.ski\\n避難垢 : @nagi@fedibird.com\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"About\",\n          \"value\": \"https://nagisan.dev/\"\n        },\n        {\n          \"name\": \"Github\",\n          \"value\": \"https://github.com/meziro039\"\n        },\n        {\n          \"name\": \"Zenn\",\n          \"value\": \"https://zenn.dev/meziro039\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 656,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b8936ac4e9e9c412dbeb03\",\n      \"username\": \"nagisan\",\n      \"name\": \"なぎさん\",\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62b8936ac4e9e9c412dbeb04/62b8936ac4e9e9c412dbeb04.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.io/@nagisan\",\n      \"uri\": \"https://misskey.io/users/91z421auqz\",\n      \"createdAt\": \"2022-06-26T17:12:10.095Z\",\n      \"updatedAt\": \"2022-07-19T01:23:38.993Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"また移住しました。\\n-> @nagi@misskey.cloud\\n\\n== 他のアカウント ==\\n日常系 : @nagisan@misskey.io\\nNSFW : @nagi18@misskey.io\\n開発系 : @nagi@submarin.online\\n避難垢 : @nagineko@sushi.ski\\n避難垢 : @nagi@fedibird.com\\n\\nhttps://misskey.tools\",\n      \"profile\": {\n        \"birthday\": \"2020-03-01\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 3272,\n      \"pinnedNoteIds\": [\n        \"7181c7b89059392e70e6cf2e\",\n        \"7181ab1d1479349de50fb066\",\n        \"7181a105c69202b2d3dd63c1\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181c7b89059392e70e6cf2e\",\n          \"createdAt\": \"2022-07-04T05:39:30.521Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": null,\n          \"cw\": null,\n          \"userId\": \"62b8936ac4e9e9c412dbeb03\",\n          \"user\": {\n            \"id\": \"62b8936ac4e9e9c412dbeb03\",\n            \"username\": \"nagisan\",\n            \"name\": \"なぎさん\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62b8936ac4e9e9c412dbeb04/62b8936ac4e9e9c412dbeb04.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@nagisan\",\n            \"uri\": \"https://misskey.io/users/91z421auqz\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"followers\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/929vmtztl6\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true,\n          \"isHidden\": true\n        },\n        {\n          \"id\": \"7181ab1d1479349de50fb066\",\n          \"createdAt\": \"2022-06-28T16:20:18.681Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"熱中症対策には水と塩タブレットが有効なのですわ〜！\",\n          \"cw\": null,\n          \"userId\": \"62b8936ac4e9e9c412dbeb03\",\n          \"user\": {\n            \"id\": \"62b8936ac4e9e9c412dbeb03\",\n            \"username\": \"nagisan\",\n            \"name\": \"なぎさん\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62b8936ac4e9e9c412dbeb04/62b8936ac4e9e9c412dbeb04.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@nagisan\",\n            \"uri\": \"https://misskey.io/users/91z421auqz\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/921xvss9hd\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181a105c69202b2d3dd63c1\",\n          \"createdAt\": \"2022-06-26T17:18:39.250Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"ToDo:使ってない垢を爆破してくる\",\n          \"cw\": null,\n          \"userId\": \"62b8936ac4e9e9c412dbeb03\",\n          \"user\": {\n            \"id\": \"62b8936ac4e9e9c412dbeb03\",\n            \"username\": \"nagisan\",\n            \"name\": \"なぎさん\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62b8936ac4e9e9c412dbeb04/62b8936ac4e9e9c412dbeb04.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@nagisan\",\n            \"uri\": \"https://misskey.io/users/91z421auqz\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"home\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/91z534ia3x\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b889b0c4e9e9c412dbe61b\",\n      \"username\": \"get\",\n      \"name\": \"You always get what you want! \",\n      \"host\": \"bae.st\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c9c77cb212faba796b876f/62c9c77cb212faba796b876f.7G3G9DZYQ5ZC?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"bae.st\",\n        \"name\": \"Baest\",\n        \"softwareName\": \"pleroma\",\n        \"softwareVersion\": \"2.4.52-7881-g99d2710e-neckbeard\",\n        \"iconUrl\": \"https://bae.st/favicon.png\",\n        \"themeColor\": null\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://bae.st/users/get\",\n      \"uri\": \"https://bae.st/users/get\",\n      \"createdAt\": \"2022-06-26T16:30:40.677Z\",\n      \"updatedAt\": \"2022-07-20T02:50:28.431Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c07eefd0dc3658fa7eb493/62c07eefd0dc3658fa7eb493.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"PROUD MEMBER OF THE BUB CLUB\\nI LOVE BAEST\\n\\nlearn more: https://getgle.org\\n\\nYouTube: https://youtube.com/channel/UCtbXNvxdkAdNoUkLZ5YaDvg\\n\\nIN CASE OF FEDERAL INVESTIGATION OR SIMILAR:\\n\\nAny reference made to \\\"weed\\\", \\\"pot\\\" or similar is actually a reference to the completely legal substance Delta 8 THC and other legal hemp products\\n\\nrepeating a post is not an endorsement, it just means I want more people to see it. if I liked a post then it was probably a missclick.  Everything said on this account is satire\\n\\n[[[ To any NSA and FBI agents reading my profile: please consider    ]]]\\n[[[ whether defending the US Constitution against all enemies,     ]]]\\n[[[ foreign or domestic, requires you to follow Snowden's example. ]]]\\n\\nmy old fedi account broken,,\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"website\",\n          \"value\": \"https://getgle.org\"\n        },\n        {\n          \"name\": \"my xmpp\",\n          \"value\": \"get@glee.li\"\n        },\n        {\n          \"name\": \"getgle xmpp chatroom\",\n          \"value\": \"getgle@group.glee.li\"\n        },\n        {\n          \"name\": \"gleechan\",\n          \"value\": \"https://chan.getgle.org\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 39,\n      \"pinnedNoteIds\": [\n        \"7181ac21af249863ac834158\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181ac21af249863ac834158\",\n          \"createdAt\": \"2022-06-28T21:04:57.636Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"I drew peter griffin freehand with mouse,  no undo allowed.  i like how he look (:\\n\\nyou should try it it is fun\\n[peter scribble.png](https://bae.st/media/0590abb07078eee532d6a2c05a046a2f3a5e9c58e436c96e72b6f98608ee99ad.png?name=peter%20scribble.png)\",\n          \"cw\": null,\n          \"userId\": \"62b889b0c4e9e9c412dbe61b\",\n          \"user\": {\n            \"id\": \"62b889b0c4e9e9c412dbe61b\",\n            \"username\": \"get\",\n            \"name\": \"You always get what you want! \",\n            \"host\": \"bae.st\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c9c77cb212faba796b876f/62c9c77cb212faba796b876f.7G3G9DZYQ5ZC?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"bae.st\",\n              \"name\": \"Baest\",\n              \"softwareName\": \"pleroma\",\n              \"softwareVersion\": \"2.4.52-7881-g99d2710e-neckbeard\",\n              \"iconUrl\": \"https://bae.st/favicon.png\",\n              \"themeColor\": null\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://bae.st/users/get\",\n            \"uri\": \"https://bae.st/users/get\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 3,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 3,\n          \"reactions\": {\n            \"⭐\": 2\n          },\n          \"reactionCounts\": {\n            \"⭐\": 2\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62be65a94a5caab1181dc665\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62be65a94a5caab1181dc665\",\n              \"createdAt\": \"2022-07-01T03:10:33.125Z\",\n              \"name\": \"0590abb07078eee532d6a2c05a046a2f3a5e9c58e436c96e72b6f98608ee99ad.png\",\n              \"type\": \"image/png\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"04291f8c34da55264f9f13c78a4434e6\",\n              \"url\": \"https://misskey.m544.net/files/62be65a94a5caab1181dc665/62be65a94a5caab1181dc665.png?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62be65a94a5caab1181dc665/62be65a94a5caab1181dc665.png?thumbnail\",\n              \"properties\": {\n                \"width\": 503,\n                \"height\": 483\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://bae.st/objects/b5eb0a0d-30d6-40d2-bd3f-41479ea5097d\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b885dcc4e9e9c412dbe4ab\",\n      \"username\": \"glee\",\n      \"name\": \"Vice President Kamala Harris\",\n      \"host\": \"social.getgle.org\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62b885dec4e9e9c412dbe4ae/62b885dec4e9e9c412dbe4ae.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"social.getgle.org\",\n        \"name\": \"Getgle Social\",\n        \"softwareName\": \"pleroma\",\n        \"softwareVersion\": \"2.4.2\",\n        \"iconUrl\": \"https://social.getgle.org/favicon.png\",\n        \"themeColor\": null\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://social.getgle.org/users/glee\",\n      \"uri\": \"https://social.getgle.org/users/glee\",\n      \"createdAt\": \"2022-06-26T16:14:20.980Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"https://getgle.org learn more\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 0,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a17d33c1bf3037d8637cb4\",\n      \"username\": \"yuin\",\n      \"name\": \"ゆい\",\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62ca42a91113a83a51039b42/62ca42a91113a83a51039b42.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@yuin\",\n      \"uri\": \"https://misskey.levome-dol.com/users/90xbpe2qzm\",\n      \"createdAt\": \"2022-06-09T04:55:15.891Z\",\n      \"updatedAt\": \"2022-07-17T12:07:15.284Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62ca42a91113a83a51039b42/62ca42a91113a83a51039b42.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"始めまして。ゆいです。\\n趣味は、ダンス・歌う事・ピアノです。\\n友達って想ってるのは\\n@akari@misskey.levome-dol.com\\n@sabakan@misskey.levome-dol.com\\n@ginga@misskey.levome-dol.com\\n@kiyoro@misskey.levome-dol.com\\n@ginga@misskey.levome-dol.com\\n@rim@misskey.levome-dol.com\\n他にも居るよ…！\",\n      \"profile\": {\n        \"birthday\": \"2011-01-30\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 142,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b6ddd57a8b233690e43730\",\n      \"username\": \"kuropen\",\n      \"name\": \"Kuropen@fedibird\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62b6ddd57a8b233690e43732/62b6ddd57a8b233690e43732.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@kuropen\",\n      \"uri\": \"https://fedibird.com/users/kuropen\",\n      \"createdAt\": \"2022-06-25T10:05:09.483Z\",\n      \"updatedAt\": \"2022-07-18T10:08:57.655Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62b6ddd57a8b233690e43731/62b6ddd57a8b233690e43731.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"本職はWebプログラマー。東京とさいたまと会津を行ったり来たりしている。\",\n      \"profile\": {\n        \"birthday\": \"1989-08-03\",\n        \"location\": \"さいたま⇔会津若松\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"Profile\",\n          \"value\": \"https://kuropen.org/\"\n        },\n        {\n          \"name\": \"Blog\",\n          \"value\": \"https://penguinone.kuropen.org/\"\n        },\n        {\n          \"name\": \"SNSポリシー\",\n          \"value\": \"https://social.kuropen.org/\"\n        },\n        {\n          \"name\": \"アカウント一覧\",\n          \"value\": \"https://kuropen.org/fediverse\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 268,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b6b7487a8b233690e41ec1\",\n      \"username\": \"FollowBot\",\n      \"name\": \"FollowBot\",\n      \"host\": \"sns.d-rine.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/default-avatar.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": true,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"sns.d-rine.com\",\n        \"name\": \"D-RINE Social Network Service\",\n        \"softwareName\": \"pleroma\",\n        \"softwareVersion\": \"2.4.3\",\n        \"iconUrl\": \"https://sns.d-rine.com/favicon.png\",\n        \"themeColor\": null\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://sns.d-rine.com/users/FollowBot\",\n      \"uri\": \"https://sns.d-rine.com/users/FollowBot\",\n      \"createdAt\": \"2022-06-25T07:20:40.749Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \".\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 0,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629762d9bf42a1548c9fd767\",\n      \"username\": \"siretoko\",\n      \"name\": \"無の中の夢の如し\",\n      \"host\": \"misskey.endaaman.me\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/629762d9bf42a1548c9fd76a/629762d9bf42a1548c9fd76a.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.endaaman.me\",\n        \"name\": \"misskey.endaaman.me\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"10.102.235-m544\",\n        \"iconUrl\": \"https://misskey.endaaman.me/favicon.ico\",\n        \"themeColor\": \"#fb4e4e\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.endaaman.me/@siretoko\",\n      \"uri\": \"https://misskey.endaaman.me/users/6210ccdc613eb4001169a93e\",\n      \"createdAt\": \"2022-06-01T13:00:09.364Z\",\n      \"updatedAt\": \"2022-06-01T13:00:55.476Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/629762d9bf42a1548c9fd76a/629762d9bf42a1548c9fd76a.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 7,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"615a5e20321d2c3c75329fff\",\n      \"username\": \"woxin_chang_dan1904\",\n      \"name\": \"西村透:meowtilt:\",\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62bbf070f5a34b926f06be59/62bbf070f5a34b926f06be59.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"meowtilt\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/03luyftul6pc5pygnzgqnzwg.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"meowtilt@misskey.io\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.io/@woxin_chang_dan1904\",\n      \"uri\": \"https://misskey.io/users/8rfizy7whd\",\n      \"createdAt\": \"2021-10-04T01:51:28.026Z\",\n      \"updatedAt\": \"2022-07-20T06:41:37.045Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62536dac9cd2424775d3d42e/62536dac9cd2424775d3d42e.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"当アカウントは、実在の人間と全く関係がありません。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": \"日本\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"アイコン\",\n          \"value\": \"@zyuen\"\n        },\n        {\n          \"name\": \"アイコン元イラスト\",\n          \"value\": \"@shinamu476@misskey.io\"\n        },\n        {\n          \"name\": \"サブアカウント\",\n          \"value\": \"@woxin_chang_dan1904_@misskey.noellabo.jp\"\n        },\n        {\n          \"name\": \"人生たのシンフォニーウェブサイト\",\n          \"value\": \"https://everyone.ilnk.info/\"\n        },\n        {\n          \"name\": \"アイコンの女の子の名前\",\n          \"value\": \"秋雨希琳\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 11502,\n      \"pinnedNoteIds\": [\n        \"7182052dcec97356dd332f71\",\n        \"71809f957008dc24d4af2555\",\n        \"7180720f976b6ae439f4f02b\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7182052dcec97356dd332f71\",\n          \"createdAt\": \"2022-07-16T04:04:24.393Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"Twitterで発信はやっていません。アカウント名が同じでも、私ではありません。Twitterアカウント自体は所有していますが、見るだけの用途でしか使用しておらず、名前も西村透ではありません。\",\n          \"cw\": null,\n          \"userId\": \"615a5e20321d2c3c75329fff\",\n          \"user\": {\n            \"id\": \"615a5e20321d2c3c75329fff\",\n            \"username\": \"woxin_chang_dan1904\",\n            \"name\": \"西村透:meowtilt:\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62bbf070f5a34b926f06be59/62bbf070f5a34b926f06be59.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"meowtilt\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/03luyftul6pc5pygnzgqnzwg.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"meowtilt@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@woxin_chang_dan1904\",\n            \"uri\": \"https://misskey.io/users/8rfizy7whd\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/92qxir492f\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71809f957008dc24d4af2555\",\n          \"createdAt\": \"2022-05-07T17:33:32.552Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"MFMアートを作る上で役立つ知識集\\n\\n<small>基本は[MFMチートシート](https://misskey.io/mfm-cheat-sheet)を参照すること。\\n【】内は、自分で自由に選択できるもの。\\n筆者はプログラミングの知識が皆無で、MFMのソースコードを一度も読んだことがにゃいので、以下の知識をにゃんとにゃくで運用している。そのため、性格にゃ情報はMFMのソースコードを参照してください。\\nあと、仕様変更されることがあるので、これらは執筆当時有効にゃ構文だということも理解してください。</small>\\n\\n\\n\\n☆重ねがけ\\n$[]を入れ子にすることで、アニメーションを複数個入れることができる。拡大MFMも同様だが、**大きすぎると負荷がかかる。**\\n\\n例：$[x2 $[tada $[spin.y :ablobaww:]]]\\n`$[x2 $[tada $[spin.y :ablobaww:]]]`\\n\\n\\n\\n☆回転スピードの変化\\n`$[【アニメーション効果】.speed=【任意の数字】s 【好きにゃ文字】]`\\nspin.xとspin.yの場合は\\n`$[spin.y,speed=【任意の数字】s 【好きにゃ文字】]`\\n任意の数字は、小数点を付けたほうが早くにゃる。\\n\\n例：$[sparkle $[spin.y,speed=0.001s :blobcatsweatflips:]]\\n`$[sparkle $[spin.y,speed=0.001s :blobcatsweatflips:]]`\\n\\n\\n\\n☆平行移動\\n`$[spin.speed=【任意の数字】s $[spin.left,speed=【1/2任意の数字】s $[spin.speed=【任意の数字】s 【好きにゃ文字】]:blank:]:blank:]`\\n\\n例：$[spin.speed=2s $[spin.left,speed=1s $[spin.speed=2s 🥞]:blank:]:blank:]\\n`$[spin.speed=2s $[spin.left,speed=1s $[spin.speed=2s 🥞]:blank:]:blank:]`\\n\\n\\n\\n☆ルビを振る\\n`\\\\(\\\\sf\\\\small\\\\overset{\\\\tiny 【入れたいルビ】}{【好きにゃ文字】}\\\\)`\\n\\n例：\\\\(\\\\sf\\\\small\\\\overset{\\\\tiny とも}{強敵}\\\\)\\n`\\\\(\\\\sf\\\\small\\\\overset{\\\\tiny とも}{強敵}\\\\)`\\n\\n\\n\\n☆rotateの回転角度を調整する方法\\n`$[rotate.deg=【任意の角度】 【好きにゃ文字】]`\\n\\n例：$[rotate.deg=30 :monsterenergy:]\\n`$[rotate.deg=30 :monsterenergy:]`\\n\\n\\n\\n☆あるカスタム絵文字に別のカスタム絵文字を重ねる方法\\n`【好きにゃ文字1】\\\\(\\\\\\\\[【任意の数字1】mu]\\\\kern【任意の数字2】mu\\\\)【好きにゃ文字2】`\\n\\n例：:vivaldi:\\\\(\\\\\\\\[-30mu]\\\\kern20mu\\\\):blobcat_MUDAMUDAMUDA:\\n`:vivaldi:\\\\(\\\\\\\\[-30mu]\\\\kern20mu\\\\):blobcat_MUDAMUDAMUDA:`\\n\\n<small>注意点\\n・後ろの文字が移動する。\\n・【任意の数字1】数字は-もつけることができる。\\n・【任意の数字2】数字は-をつけるとエラーににゃる。\\n・基本的に【好きにゃ文字2】の文字が前面に出る。しかし、【好きにゃ文字1】にflipMFMを適応すると、【好きにゃ文字1】を前面に出すことができる。\\n・位置を変更すると、投稿欄からはみ出すことがある。そのため、改行をするか:blank:絵文字を適応させることで、余白を作ればはみ出す可能性を減らせる。</small>\\n\\n\\n\\n☆カスタム絵文字と端末標準の絵文字の並列について\\nカスタム絵文字と端末標準の絵文字のサイズは異にゃっていて、カスタム絵文字=端末標準絵文字×2だと思う。そして、標準絵文字二倍の大きさとカスタム絵文字を並列させておくと、微妙に位置がずれて表示される。\\n\\n例：:woozy_cute:🕐\\n\\nにゃので、両者を同じ高さで並べるためには、ある程度位置を調整する必要がある。\\n\\n例：:woozy_cute:\\\\(\\\\\\\\[-38mu]\\\\kern75mu\\\\)$[x2 🕐]\\n`:woozy_cute:\\\\(\\\\\\\\[-38mu]\\\\kern75mu\\\\)$[x2 🕐]`\",\n          \"cw\": \"MFMアートを作る上で役立つ知識\",\n          \"userId\": \"615a5e20321d2c3c75329fff\",\n          \"user\": {\n            \"id\": \"615a5e20321d2c3c75329fff\",\n            \"username\": \"woxin_chang_dan1904\",\n            \"name\": \"西村透:meowtilt:\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62bbf070f5a34b926f06be59/62bbf070f5a34b926f06be59.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"meowtilt\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/03luyftul6pc5pygnzgqnzwg.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"meowtilt@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@woxin_chang_dan1904\",\n            \"uri\": \"https://misskey.io/users/8rfizy7whd\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 21,\n          \"renoteCount\": 8,\n          \"quoteCount\": 1,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":tiken@misskey.io:\": 2,\n            \":agooglehearts@misskey.omhnc.net:\": 1,\n            \":blobfoxcheck@honi.club:\": 1,\n            \":tasukarufes@misskey.io:\": 2,\n            \":blobcatmeltlove@misskey.io:\": 1,\n            \"🉐\": 1\n          },\n          \"reactionCounts\": {\n            \":tiken@misskey.io:\": 2,\n            \":agooglehearts@misskey.omhnc.net:\": 1,\n            \":blobfoxcheck@honi.club:\": 1,\n            \":tasukarufes@misskey.io:\": 2,\n            \":blobcatmeltlove@misskey.io:\": 1,\n            \"🉐\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"ablobaww\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/vu1mzqaca8icjh23qspdymdx.apng\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"ablobaww@misskey.io\"\n            },\n            {\n              \"name\": \"blobcatsweatflips\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/0usxwg2c4bma5jvxu08fsbtn.apng\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"blobcatsweatflips@misskey.io\"\n            },\n            {\n              \"name\": \"blank\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/2aaxup85h6au8ktims76cv1d.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"blank@misskey.io\"\n            },\n            {\n              \"name\": \"monsterenergy\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/17ywn3n2vdcixocc48olrfds.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"monsterenergy@misskey.io\"\n            },\n            {\n              \"name\": \"vivaldi\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/o2ghvfpdcslivs0a28susdzf.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"vivaldi@misskey.io\"\n            },\n            {\n              \"name\": \"blobcat_MUDAMUDAMUDA\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/2r0x4vz5acsfjottipebp32f.apng\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"blobcat_MUDAMUDAMUDA@misskey.io\"\n            },\n            {\n              \"name\": \"woozy_cute\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/w2wo9p7xqbmbs972tcoragez.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"woozy_cute@misskey.io\"\n            },\n            {\n              \"name\": \"tiken@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/4mw6yevuz194n7uykr3wftjb.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"tiken@misskey.io\"\n            },\n            {\n              \"name\": \"agooglehearts@misskey.omhnc.net\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/s88y8cujzerczuonl2s90njq.gif\",\n              \"host\": \"misskey.omhnc.net\",\n              \"resolvable\": \"agooglehearts@misskey.omhnc.net\"\n            },\n            {\n              \"name\": \"blobfoxcheck@honi.club\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/a41m5a6p4qlyvf8i30eub70d.png\",\n              \"host\": \"honi.club\",\n              \"resolvable\": \"blobfoxcheck@honi.club\"\n            },\n            {\n              \"name\": \"tasukarufes@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/9xfa34njc5xiopwl9k2u5ngi.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"tasukarufes@misskey.io\"\n            },\n            {\n              \"name\": \"blobcatmeltlove@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/qwf1uqwqudwbtf0omn5bmz01.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"blobcatmeltlove@misskey.io\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/8zzplog8k9\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": false\n        },\n        {\n          \"id\": \"7180720f976b6ae439f4f02b\",\n          \"createdAt\": \"2022-04-28T21:24:26.091Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"個人的に収集している:gomamayo:のリスト\\n\\nhttps://misskey.io/clips/8yoqchwvkb\",\n          \"cw\": null,\n          \"userId\": \"615a5e20321d2c3c75329fff\",\n          \"user\": {\n            \"id\": \"615a5e20321d2c3c75329fff\",\n            \"username\": \"woxin_chang_dan1904\",\n            \"name\": \"西村透:meowtilt:\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62bbf070f5a34b926f06be59/62bbf070f5a34b926f06be59.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"meowtilt\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/03luyftul6pc5pygnzgqnzwg.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"meowtilt@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@woxin_chang_dan1904\",\n            \"uri\": \"https://misskey.io/users/8rfizy7whd\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 3,\n          \"renoteCount\": 1,\n          \"quoteCount\": 1,\n          \"repliesCount\": 1,\n          \"reactions\": {\n            \":gomamayo@honi.club:\": 1,\n            \":blobthumbsup@honi.club:\": 1\n          },\n          \"reactionCounts\": {\n            \":gomamayo@honi.club:\": 1,\n            \":blobthumbsup@honi.club:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"gomamayo\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/wqi7ntvud3940t6nx2lie1eo.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"gomamayo@misskey.io\"\n            },\n            {\n              \"name\": \"gomamayo@honi.club\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/v4sk2lcx2tp5qgqst0c6gs3x.png\",\n              \"host\": \"honi.club\",\n              \"resolvable\": \"gomamayo@honi.club\"\n            },\n            {\n              \"name\": \"blobthumbsup@honi.club\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/oxwa6fdfjjm1e9cg6vt0nq5a.png\",\n              \"host\": \"honi.club\",\n              \"resolvable\": \"blobthumbsup@honi.club\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/8zn2vxwr0t\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62b2ed41beb66f213122d334\",\n      \"username\": \"miyuttidesu\",\n      \"name\": \":_mi::_yu::_ltsu::_ti::_da::_yo:@復帰:verify:\",\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62b5c3d98b96716f028b5ca3/62b5c3d98b96716f028b5ca3.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"_mi\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/3cdxgp4x4s4p1qa4yqslfnap.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"_mi@misskey.io\"\n        },\n        {\n          \"name\": \"_yu\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/9xwhx70juhyj2hx0gfxu9z4d.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"_yu@misskey.io\"\n        },\n        {\n          \"name\": \"_ltsu\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/wvau7k00uazksc0moajzvc94.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"_ltsu@misskey.io\"\n        },\n        {\n          \"name\": \"_ti\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/njcztst8qk1phacc5f95cvth.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"_ti@misskey.io\"\n        },\n        {\n          \"name\": \"_da\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/uyu71hlwaeqjy545rp7rfc6m.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"_da@misskey.io\"\n        },\n        {\n          \"name\": \"_yo\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/bsctw2swpcicya82mjh1u1ch.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"_yo@misskey.io\"\n        },\n        {\n          \"name\": \"verify\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/0oyumwclql7ss5ht4szkeqj4.gif\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"verify@misskey.io\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.io/@miyuttidesu\",\n      \"uri\": \"https://misskey.io/users/91t0ecp0s9\",\n      \"createdAt\": \"2022-06-22T10:21:53.695Z\",\n      \"updatedAt\": \"2022-07-19T13:26:25.858Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62b38d7d5a51ed2ea490daed/62b38d7d5a51ed2ea490daed.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"@miyutti@misskey.ioです！\\nよかったら仲良くしてください！\\nめいすきーでいえばこの人\\n@sivao1225@misskey.m544.net\\nナリスじゃないよ💢信じて！\\nイラスト（すまない先生）描いてますが\\nプロ絵師ではないです\\nタイムラインにでてるメッセージはリアクションします！\",\n      \"profile\": {\n        \"birthday\": \"2010-03-17\",\n        \"location\": \"すまないスクール（大嘘）\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 29,\n      \"pinnedNoteIds\": [\n        \"71818b104f079e0ffe054eaa\",\n        \"71818b19e5d6536dc5a09106\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71818b104f079e0ffe054eaa\",\n          \"createdAt\": \"2022-06-22T10:58:30.791Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"これかっこいいよ\",\n          \"cw\": null,\n          \"userId\": \"62b2ed41beb66f213122d334\",\n          \"user\": {\n            \"id\": \"62b2ed41beb66f213122d334\",\n            \"username\": \"miyuttidesu\",\n            \"name\": \":_mi::_yu::_ltsu::_ti::_da::_yo:@復帰:verify:\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62b5c3d98b96716f028b5ca3/62b5c3d98b96716f028b5ca3.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"_mi\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/3cdxgp4x4s4p1qa4yqslfnap.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_mi@misskey.io\"\n              },\n              {\n                \"name\": \"_yu\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/9xwhx70juhyj2hx0gfxu9z4d.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_yu@misskey.io\"\n              },\n              {\n                \"name\": \"_ltsu\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/wvau7k00uazksc0moajzvc94.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_ltsu@misskey.io\"\n              },\n              {\n                \"name\": \"_ti\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/njcztst8qk1phacc5f95cvth.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_ti@misskey.io\"\n              },\n              {\n                \"name\": \"_da\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/uyu71hlwaeqjy545rp7rfc6m.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_da@misskey.io\"\n              },\n              {\n                \"name\": \"_yo\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/bsctw2swpcicya82mjh1u1ch.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_yo@misskey.io\"\n              },\n              {\n                \"name\": \"verify\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/0oyumwclql7ss5ht4szkeqj4.gif\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"verify@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@miyuttidesu\",\n            \"uri\": \"https://misskey.io/users/91t0ecp0s9\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62b2f5d8beb66f213122dbce\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62b2f5d8beb66f213122dbce\",\n              \"createdAt\": \"2022-06-22T10:58:32.205Z\",\n              \"name\": \"11c5f641-bbc2-4206-966c-eadf722a938b.MOV\",\n              \"type\": \"video/mp4\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"348427db950c8d413e85dd1004e30c1b\",\n              \"url\": \"https://misskey.m544.net/files/62b2f5d8beb66f213122dbce/62b2f5d8beb66f213122dbce.MOV?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62b2f5d8beb66f213122dbce/62b2f5d8beb66f213122dbce.jpg?thumbnail\",\n              \"properties\": {},\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://misskey.io/notes/91t1qupzoz\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71818b19e5d6536dc5a09106\",\n          \"createdAt\": \"2022-06-22T11:08:59.222Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"生徒が先生を踏んづけた\",\n          \"cw\": null,\n          \"userId\": \"62b2ed41beb66f213122d334\",\n          \"user\": {\n            \"id\": \"62b2ed41beb66f213122d334\",\n            \"username\": \"miyuttidesu\",\n            \"name\": \":_mi::_yu::_ltsu::_ti::_da::_yo:@復帰:verify:\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62b5c3d98b96716f028b5ca3/62b5c3d98b96716f028b5ca3.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"_mi\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/3cdxgp4x4s4p1qa4yqslfnap.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_mi@misskey.io\"\n              },\n              {\n                \"name\": \"_yu\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/9xwhx70juhyj2hx0gfxu9z4d.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_yu@misskey.io\"\n              },\n              {\n                \"name\": \"_ltsu\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/wvau7k00uazksc0moajzvc94.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_ltsu@misskey.io\"\n              },\n              {\n                \"name\": \"_ti\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/njcztst8qk1phacc5f95cvth.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_ti@misskey.io\"\n              },\n              {\n                \"name\": \"_da\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/uyu71hlwaeqjy545rp7rfc6m.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_da@misskey.io\"\n              },\n              {\n                \"name\": \"_yo\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/bsctw2swpcicya82mjh1u1ch.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"_yo@misskey.io\"\n              },\n              {\n                \"name\": \"verify\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/0oyumwclql7ss5ht4szkeqj4.gif\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"verify@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@miyuttidesu\",\n            \"uri\": \"https://misskey.io/users/91t0ecp0s9\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62b2f84cbeb66f213122de5b\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62b2f84cbeb66f213122de5b\",\n              \"createdAt\": \"2022-06-22T11:09:00.552Z\",\n              \"name\": \"ab4d8479-d933-4dc5-bf72-c3dc894111a9.MOV\",\n              \"type\": \"video/mp4\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"59f1101f82c3bab548c5be1fa234b9ab\",\n              \"url\": \"https://misskey.m544.net/files/62b2f84cbeb66f213122de5b/62b2f84cbeb66f213122de5b.MOV?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62b2f84cbeb66f213122de5b/62b2f84cbeb66f213122de5b.jpg?thumbnail\",\n              \"properties\": {},\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://misskey.io/notes/91t24bmeh4\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6238b7feb29ec4ea8f304057\",\n      \"username\": \"NagiChan\",\n      \"name\": \"NagiCatChan!!\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/624c531aa89b619766a8b2bc/624c531aa89b619766a8b2bc.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@NagiChan\",\n      \"uri\": \"https://fedibird.com/users/NagiChan\",\n      \"createdAt\": \"2022-03-21T17:38:06.854Z\",\n      \"updatedAt\": \"2022-06-22T16:30:51.712Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/624c531aa89b619766a8b2bd/624c531aa89b619766a8b2bd.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"cw[頭の中]は考えがまとまってない書き出し\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"FediWikiJP\",\n          \"value\": \"https://fediwiki.jp/\"\n        },\n        {\n          \"name\": \"Matrix\",\n          \"value\": \"@nagi@fedibird.com:matrix.fedibird.com\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 79,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6236a8f833336e0e72b3b732\",\n      \"username\": \"mei23\",\n      \"name\": \"めいめい\",\n      \"host\": \"pleroma.noellabo.jp\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/6236a8f833336e0e72b3b734/6236a8f833336e0e72b3b734.blob?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"pleroma.noellabo.jp\",\n        \"name\": \"のえろま\",\n        \"softwareName\": \"akkoma\",\n        \"softwareVersion\": \"2.5.2-149-g5517802e-noeroma\",\n        \"iconUrl\": \"https://pleroma.noellabo.jp/favicon.png\",\n        \"themeColor\": null\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://pleroma.noellabo.jp/users/mei23\",\n      \"uri\": \"https://pleroma.noellabo.jp/users/mei23\",\n      \"createdAt\": \"2022-03-20T04:09:28.569Z\",\n      \"updatedAt\": \"2022-07-16T01:08:29.307Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 0,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"620f83287d1d0c8f79230fb8\",\n      \"username\": \"1901\",\n      \"name\": \"裕仁(昭和天皇)☑️\",\n      \"host\": \"nightly.fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a9e2a4c36eabf70dd694de/62a9e2a4c36eabf70dd694de.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"nightly.fedibird.com\",\n        \"name\": \"Nightly Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://nightly.fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://nightly.fedibird.com/@1901\",\n      \"uri\": \"https://nightly.fedibird.com/users/1901\",\n      \"createdAt\": \"2022-02-18T11:29:44.860Z\",\n      \"updatedAt\": \"2022-06-18T10:25:25.604Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"実験用兼非常用\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"fediberd\",\n          \"value\": \"https://fedibird.com/@1901\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 0,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a93855c36eabf70dd62957\",\n      \"username\": \"roma\",\n      \"name\": \"ろまろーま\",\n      \"host\": \"miss.nem.one\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62ae3f9fb6ed8703d2c36a47/62ae3f9fb6ed8703d2c36a47.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"miss.nem.one\",\n        \"name\": \"ろむ猫のお部屋\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.111.1-nem-v04\",\n        \"iconUrl\": \"https://miss.nem.one/files/fd1e0579-ddd9-4a8c-b940-240b91fce2cf\",\n        \"themeColor\": \"#7f6665\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://miss.nem.one/@roma\",\n      \"uri\": \"https://miss.nem.one/users/91ihleqlsj\",\n      \"createdAt\": \"2022-06-15T01:39:33.918Z\",\n      \"updatedAt\": \"2022-07-08T11:37:21.540Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62ae3f9fb6ed8703d2c36a49/62ae3f9fb6ed8703d2c36a49.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 231,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"61fb54396d595c4b91643bc3\",\n      \"username\": \"_\",\n      \"name\": \"ろむねこ\",\n      \"host\": \"miss.nem.one\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c457021fec2eeb452f676a/62c457021fec2eeb452f676a.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"miss.nem.one\",\n        \"name\": \"ろむ猫のお部屋\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.111.1-nem-v04\",\n        \"iconUrl\": \"https://miss.nem.one/files/fd1e0579-ddd9-4a8c-b940-240b91fce2cf\",\n        \"themeColor\": \"#7f6665\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://miss.nem.one/@_\",\n      \"uri\": \"https://miss.nem.one/users/8w9i2zgdo0\",\n      \"createdAt\": \"2022-02-03T04:04:09.217Z\",\n      \"updatedAt\": \"2022-07-20T04:23:55.851Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62440e649fd03f433f2a5955/62440e649fd03f433f2a5955.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"ろむ猫だよ！！！\\n自宅サーバーとかでちょっと遊んでます、ルーミアちゃんとあずきゃがすきなよわよわ鯖缶\",\n      \"profile\": {\n        \"birthday\": \"2004-12-30\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 18209,\n      \"pinnedNoteIds\": [\n        \"71820cbde81456eab9715d3e\",\n        \"71812780fa6f4d062dab6f2c\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71820cbde81456eab9715d3e\",\n          \"createdAt\": \"2022-07-17T15:19:08.564Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"本垢:\\n@_@miss.nem.one\\nおひとりさま2:\\n@_@mei11.nem.one \\nおひとりさま3:\\n@_@rumia.tk \\nおひとりさま4:\\n@_@romca.tk \\nおひとりさま5:\\n@_@pleroma.nem.one \\nおひとりさま6:\\n@_@gp4.nem.one \\nMisskey.io:\\n@__@misskey.io\",\n          \"cw\": \"使ってるアカウントとかの一部\",\n          \"userId\": \"61fb54396d595c4b91643bc3\",\n          \"user\": {\n            \"id\": \"61fb54396d595c4b91643bc3\",\n            \"username\": \"_\",\n            \"name\": \"ろむねこ\",\n            \"host\": \"miss.nem.one\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c457021fec2eeb452f676a/62c457021fec2eeb452f676a.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"miss.nem.one\",\n              \"name\": \"ろむ猫のお部屋\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.111.1-nem-v04\",\n              \"iconUrl\": \"https://miss.nem.one/files/fd1e0579-ddd9-4a8c-b940-240b91fce2cf\",\n              \"themeColor\": \"#7f6665\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://miss.nem.one/@_\",\n            \"uri\": \"https://miss.nem.one/users/8w9i2zgdo0\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://miss.nem.one/notes/92t12bkkq9\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"5cb6d3723741e464b91f44d1\",\n            \"61fb54396d595c4b91643bc3\",\n            \"625631bb91ab8caa46ed2850\",\n            \"62a852f164d4ca5dadc437ae\",\n            \"62b469570828972e97dd2a8e\",\n            \"62bf3bf14a5caab1181e50bf\",\n            \"62c1880b861e8cdcf2eb0e43\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71812780fa6f4d062dab6f2c\",\n          \"createdAt\": \"2022-06-03T02:59:33.103Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"わたしのインスタンスです\\n\\n1. :rumia_logo:    [ろむ猫のお部屋](https://miss.nem.one/)\\nMisskey v12フォークが動いてます、名前はまだにゃい(かも)\\nスマホ向けのUIをけっこう触っていて、わりと独自機能はあるかも\\n招待制, 招待コードはFFさんとかにゃらだいたい大丈夫です\\n\\n2. :favicon_mei11:    [ろむ猫のお布団](https://mei11.nem.one)\\nmei23/misskey-v11をお借りして動かしています\\nふるいiPadOSとかでも一応正常に動くはず、そういうインスタンスです\\n招待制, 招待コードはほぼ誰でも言ってくれれば出します\\n\\n3. :favicon_romcatk:    [ろむ猫のおもちゃ](https://romca.tk)\\n純みすきーの最新リリース追従です\\nいまのところ特ににゃにもいじっていにゃいインスタンスで、ただのfreenomドメインにゃのでフィルタ避けにでもどうぞ\\n招待制, 言ってくれればコード出します\\n\\n4. :rumia_logo:    [ろむ猫のお部屋-2号館](https://rumia.tk)\\nろむ猫のお部屋用のフォークが動くもう一つのインスタンスです\\n聯合を伴う試験に使うかも…？、それ以外は同じのはず\\n招待制, 招待コードは言ってくれれば出します\\n\\n#ミスキーサーバー紹介 \\n#サーバー紹介\",\n          \"cw\": null,\n          \"userId\": \"61fb54396d595c4b91643bc3\",\n          \"user\": {\n            \"id\": \"61fb54396d595c4b91643bc3\",\n            \"username\": \"_\",\n            \"name\": \"ろむねこ\",\n            \"host\": \"miss.nem.one\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c457021fec2eeb452f676a/62c457021fec2eeb452f676a.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"miss.nem.one\",\n              \"name\": \"ろむ猫のお部屋\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.111.1-nem-v04\",\n              \"iconUrl\": \"https://miss.nem.one/files/fd1e0579-ddd9-4a8c-b940-240b91fce2cf\",\n              \"themeColor\": \"#7f6665\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://miss.nem.one/@_\",\n            \"uri\": \"https://miss.nem.one/users/8w9i2zgdo0\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"ミスキーサーバー紹介\",\n            \"サーバー紹介\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 2,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"😮\": 1\n          },\n          \"reactionCounts\": {\n            \"😮\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"rumia_logo\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/bo9r833670rjmyvsot3t4ipk.png\",\n              \"host\": \"miss.nem.one\",\n              \"resolvable\": \"rumia_logo@miss.nem.one\"\n            },\n            {\n              \"name\": \"favicon_mei11\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/j55jkmvojx85jxhq7w0zljs9.png\",\n              \"host\": \"miss.nem.one\",\n              \"resolvable\": \"favicon_mei11@miss.nem.one\"\n            },\n            {\n              \"name\": \"favicon_romcatk\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/04c6kou5k6a7cwct9zok14gc.png\",\n              \"host\": \"miss.nem.one\",\n              \"resolvable\": \"favicon_romcatk@miss.nem.one\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://miss.nem.one/notes/911f9pwvj3\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5eba7f652c44e634511f42bd\",\n      \"username\": \"ThinaticSystem\",\n      \"name\": \"しなちくシステム\",\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/61854642c4a7e3ba38c6f49b/61854642c4a7e3ba38c6f49b.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.io/@ThinaticSystem\",\n      \"uri\": \"https://misskey.io/users/8779dptfom\",\n      \"createdAt\": \"2020-05-12T10:50:13.017Z\",\n      \"updatedAt\": \"2022-07-15T15:37:58.887Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"Misskey Live、honi.club撃沈時のサブ用です\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"メインアカウント\",\n          \"value\": \"@ThinaticSystem@misk.thinaticsystem.com\"\n        },\n        {\n          \"name\": \"WebSite\",\n          \"value\": \"https://thinaticsystem.com/\"\n        },\n        {\n          \"name\": \"Discord\",\n          \"value\": \"しなちくシステム#3161\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 563,\n      \"pinnedNoteIds\": [\n        \"7180370bb9349a5bfff52116\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7180370bb9349a5bfff52116\",\n          \"createdAt\": \"2022-04-17T10:22:36.852Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"メインアカウントはこっち→ @ThinaticSystem@honi.club\",\n          \"cw\": null,\n          \"userId\": \"5eba7f652c44e634511f42bd\",\n          \"user\": {\n            \"id\": \"5eba7f652c44e634511f42bd\",\n            \"username\": \"ThinaticSystem\",\n            \"name\": \"しなちくシステム\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/61854642c4a7e3ba38c6f49b/61854642c4a7e3ba38c6f49b.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@ThinaticSystem\",\n            \"uri\": \"https://misskey.io/users/8779dptfom\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 2,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":thinkhappy@misskey.io:\": 1,\n            \":ablobraisehand@honi.club:\": 1\n          },\n          \"reactionCounts\": {\n            \":thinkhappy@misskey.io:\": 1,\n            \":ablobraisehand@honi.club:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"thinkhappy@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/qpcmp2t0e8323qmtsk4wk68e.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"thinkhappy@misskey.io\"\n            },\n            {\n              \"name\": \"ablobraisehand@honi.club\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/790pdnrs00q9lfwbgywqgcne.apng\",\n              \"host\": \"honi.club\",\n              \"resolvable\": \"ablobraisehand@honi.club\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/8z6pegqcqp\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"60ef2ed6589596454f02985e\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62997c504c17e2c997a4f1cd\",\n      \"username\": \"noellabo\",\n      \"name\": \"のえる@cloud\",\n      \"host\": \"misskey.cloud\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62997c504c17e2c997a4f1d0/62997c504c17e2c997a4f1d0.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.cloud\",\n        \"name\": \"misskey.cloud\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://misskey.cloud/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.cloud/@noellabo\",\n      \"uri\": \"https://misskey.cloud/users/910vh4chb6\",\n      \"createdAt\": \"2022-06-03T03:13:20.194Z\",\n      \"updatedAt\": \"2022-07-19T22:14:53.125Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62997c504c17e2c997a4f1d1/62997c504c17e2c997a4f1d1.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"のえるのMisskeyアカウントです。\\nMisskeyに関することは、こちらを中心にしていきます。\\n\\n普段はFedibirdのメインアカウントから発信しています。\\n\\nMisskeyサーバ『misskey.cloud』の管理者アカウントでもあります。misskey.cloudに関することはこちらにご連絡ください。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"Fedibird\",\n          \"value\": \"https://fedibird.com/@noellabo\"\n        },\n        {\n          \"name\": \"のえすきー\",\n          \"value\": \"https://misskey.noellabo.jp/@noellabo\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 89,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62988de94c17e2c997a47d06\",\n      \"username\": \"KawaneRio\",\n      \"name\": \"川音リオ＠さぶまりん\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62988de94c17e2c997a47d07/62988de94c17e2c997a47d07.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@KawaneRio\",\n      \"uri\": \"https://submarin.online/users/90xrwjp55h\",\n      \"createdAt\": \"2022-06-02T10:16:09.481Z\",\n      \"updatedAt\": \"2022-06-25T12:12:51.129Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"もじだいすき｜グラマトロジストの人。\",\n      \"profile\": {\n        \"birthday\": \"2022-04-27\",\n        \"location\": \"バーチャル日本\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"ふりがな\",\n          \"value\": \"かわね りお\"\n        },\n        {\n          \"name\": \"V\",\n          \"value\": \"1\"\n        },\n        {\n          \"name\": \"才\",\n          \"value\": \"13\"\n        },\n        {\n          \"name\": \"ライブラリ\",\n          \"value\": \"まだない\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 84,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"627f90d521566b0752a603e4\",\n      \"username\": \"Run_Aqua\",\n      \"name\": \"ルン\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/oh7ha5m9yry6o4k35u9w0oxj.png\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"れもすか\",\n        \"すとるど\",\n        \"トゥイスタ\",\n        \"レインボーフィッシュ\",\n        \"夢色record\",\n        \"???(グループ名決まってない)\",\n        \"レインボーフラッシュ\",\n        \"からぱれ\",\n        \"カラキャン\",\n        \"スタライ\"\n      ],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2022-05-14T11:21:57.557Z\",\n      \"updatedAt\": \"2022-06-16T06:02:41.756Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/e9gfq95ll1h2ws8r86ln5l8i.png\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"人狼オンライン雑談民です！\\n\\nscratchでも活動中！歌い手活動やってます！\\nhttps://scratch.mit.edu/users/Run-Aqua/\\n\\n～歌い手人格紹介～\\nルン\\n　・普段の活動名。八つ橋大好き。初期設定では猫耳が付く予定だった。()\\n　・所属歌い手グループ　水色担当\\n　　#れもすか　#すとるど　#トゥイスタ　#レインボーフィッシュ\\n　　#夢色Record\\n星野きらら\\n　・いつの間にか新しくできてた人格。ルンと仲がいい。\\n　・所属歌い手グループ　黄色担当\\n　　#？？？（グループ名決まってない）　#レインボーフラッシュ\\n　　#からぱれ\\n星愛心愛\\n　・きららのいとこ。チョコレートが大好き。\\n　・所属歌い手グループ　白、黒色担当\\n　　#カラキャン （黒担当）\\nKAIMU\\n　・ルンのいとこ。趣味はルンとボカロを聴くこと。\\n　・所属歌い手グループ　ピンク担当\\n　　#スタライ\",\n      \"profile\": {\n        \"birthday\": \"2008-11-21\",\n        \"location\": \"幻想郷（ごめんなさいウソです()）この世のどっかです()\"\n      },\n      \"fields\": [],\n      \"followersCount\": 4,\n      \"followingCount\": 4,\n      \"notesCount\": 16,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a60aa93b4307308edd1c1c\",\n      \"username\": \"kurasyunff7\",\n      \"name\": \"おちんぎ\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a769beecba82b26c5e8137/62a769beecba82b26c5e8137.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@kurasyunff7\",\n      \"uri\": \"https://fedibird.com/users/kurasyunff7\",\n      \"createdAt\": \"2022-06-12T15:47:53.241Z\",\n      \"updatedAt\": \"2022-07-05T03:35:49.087Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"はじめましてこんばんは\\nハードの設計エンジニア(限界\\nしょうもないことしか喋りません\\n\\nFORESTERSG5\\nkei worksは壊しました。\\nしゅばしゅばしゅば\",\n      \"profile\": {\n        \"birthday\": \"1998-10-17\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 94,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"619b36ef94df78c597df67ef\",\n      \"username\": \"oto\",\n      \"name\": \"otoneko-魔王-:ablobwobwork:\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/sh8506drbx4gxqnuezunclrs.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [\n        {\n          \"name\": \"ablobwobwork\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/0fjmc4wv985b21il238z3vfa.gif\",\n          \"host\": null,\n          \"resolvable\": \"ablobwobwork\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"性同一性障害\",\n        \"とーと民\",\n        \"口悪い\",\n        \"性格悪\"\n      ],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2021-11-22T06:21:35.643Z\",\n      \"updatedAt\": \"2022-06-12T03:54:13.989Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/09pofsr3vm6do3py2tkvxfdr.png\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"こんちは！\\n好きな食べ物‥甘いもの・駄菓子\\n嫌いな食べ物‥辛いもの\\n趣味‥音楽関係・映画鑑賞\\n他のサイトにもときどきいるかもしれない世紀末のど阿呆でございまーすw\\nウェイ⤴\\nあたおかで暴走しがちなサイコパスだがよろしく！\\n#性同一性障害\\n#とーと民\\n#口悪い\\n#性格悪\",\n      \"profile\": {\n        \"birthday\": \"2011-06-12\",\n        \"location\": \"魔界 首都:トウィン-魔王城-\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"性別\",\n          \"value\": \"中間\"\n        },\n        {\n          \"name\": \"激怒したときの表情\",\n          \"value\": \"満面の笑み\"\n        },\n        {\n          \"name\": \"口癖\",\n          \"value\": \"めんどくせー。\"\n        },\n        {\n          \"name\": \"座右の銘\",\n          \"value\": \"とりあえず笑ってろ、多分なんとかなる。\"\n        }\n      ],\n      \"followersCount\": 60,\n      \"followingCount\": 95,\n      \"notesCount\": 245,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a52cb13b4307308edc8652\",\n      \"username\": \"miyutti\",\n      \"name\": \"みゆっち@辞めます:senko_oh::senko_lewd:\",\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62af9fb51f37ecce72610ee7/62af9fb51f37ecce72610ee7.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"senko_oh\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/hn1md6qngbhomby0ro42bkap.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"senko_oh@misskey.io\"\n        },\n        {\n          \"name\": \"senko_lewd\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/q5yzigyhqdob8noetm88gfjg.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"senko_lewd@misskey.io\"\n        },\n        {\n          \"name\": \"senko_wubbel\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/51d51xje04qjdpui3ublf9iv.gif\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"senko_wubbel@misskey.io\"\n        },\n        {\n          \"name\": \"erojan\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/8y51laxce7zhn3w3o2ow5xsz.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"erojan@misskey.io\"\n        },\n        {\n          \"name\": \"02peek\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/j1qqg2ryw8tn6ujfbnxyesza.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"02peek@misskey.io\"\n        },\n        {\n          \"name\": \"icon_thinaticsystem\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/0nrsdcicmj1qauxj1rjpzct7.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"icon_thinaticsystem@misskey.io\"\n        },\n        {\n          \"name\": \"nacho_smile\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/jyzjxo4aljrn8p33ux4cjlay.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"nacho_smile@misskey.io\"\n        },\n        {\n          \"name\": \"nachoneko_exasperated\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/t5hge6kv0omkrjc69czp42ab.gif\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"nachoneko_exasperated@misskey.io\"\n        },\n        {\n          \"name\": \"ba90\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/6aenjiqbr54i3i05hwtbrqaq.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"ba90@misskey.io\"\n        },\n        {\n          \"name\": \"02pat\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/dvg0aw1t7ez5zgb9drfq1vbw.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"02pat@misskey.io\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.io/@miyutti\",\n      \"uri\": \"https://misskey.io/users/91co0bpbmk\",\n      \"createdAt\": \"2022-06-12T00:00:49.612Z\",\n      \"updatedAt\": \"2022-06-19T14:18:57.157Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62af9fb51f37ecce72610ee7/62af9fb51f37ecce72610ee7.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"いろんなアカウント消えました\\nなので辞めます\\n​:senko_wubbel:​​:erojan:​\\n​:02peek:​​:icon_thinaticsystem:​ ​:nacho_smile:​​:nachoneko_exasperated:​​:ba90:​\\n​:nacho_smile:​​:02pat:​\",\n      \"profile\": {\n        \"birthday\": \"2010-03-17\",\n        \"location\": \"日本\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 23,\n      \"pinnedNoteIds\": [\n        \"7181661fe84e0bfdd5c830c2\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181661fe84e0bfdd5c830c2\",\n          \"createdAt\": \"2022-06-15T06:49:36.078Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"リズム的に徳永カップヌードル禁止令に似てる\",\n          \"cw\": null,\n          \"userId\": \"62a52cb13b4307308edc8652\",\n          \"user\": {\n            \"id\": \"62a52cb13b4307308edc8652\",\n            \"username\": \"miyutti\",\n            \"name\": \"みゆっち@辞めます:senko_oh::senko_lewd:\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62af9fb51f37ecce72610ee7/62af9fb51f37ecce72610ee7.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"senko_oh\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/hn1md6qngbhomby0ro42bkap.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"senko_oh@misskey.io\"\n              },\n              {\n                \"name\": \"senko_lewd\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/q5yzigyhqdob8noetm88gfjg.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"senko_lewd@misskey.io\"\n              },\n              {\n                \"name\": \"senko_wubbel\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/51d51xje04qjdpui3ublf9iv.gif\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"senko_wubbel@misskey.io\"\n              },\n              {\n                \"name\": \"erojan\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/8y51laxce7zhn3w3o2ow5xsz.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"erojan@misskey.io\"\n              },\n              {\n                \"name\": \"02peek\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/j1qqg2ryw8tn6ujfbnxyesza.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"02peek@misskey.io\"\n              },\n              {\n                \"name\": \"icon_thinaticsystem\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/0nrsdcicmj1qauxj1rjpzct7.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"icon_thinaticsystem@misskey.io\"\n              },\n              {\n                \"name\": \"nacho_smile\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/jyzjxo4aljrn8p33ux4cjlay.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"nacho_smile@misskey.io\"\n              },\n              {\n                \"name\": \"nachoneko_exasperated\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/t5hge6kv0omkrjc69czp42ab.gif\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"nachoneko_exasperated@misskey.io\"\n              },\n              {\n                \"name\": \"ba90\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/6aenjiqbr54i3i05hwtbrqaq.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"ba90@misskey.io\"\n              },\n              {\n                \"name\": \"02pat\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/dvg0aw1t7ez5zgb9drfq1vbw.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"02pat@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@miyutti\",\n            \"uri\": \"https://misskey.io/users/91co0bpbmk\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62a98102c36eabf70dd65420\",\n            \"62a98102c36eabf70dd65421\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62a98102c36eabf70dd65420\",\n              \"createdAt\": \"2022-06-15T06:49:38.021Z\",\n              \"name\": \"5bb2156b-397f-498e-ac37-b587392a4fdd.MOV\",\n              \"type\": \"video/mp4\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"43ef350655edcb3eeccf0454022a6d69\",\n              \"url\": \"https://misskey.m544.net/files/62a98102c36eabf70dd65420/62a98102c36eabf70dd65420.MOV?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62a98102c36eabf70dd65420/62a98102c36eabf70dd65420.jpg?thumbnail\",\n              \"properties\": {},\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62a98102c36eabf70dd65421\",\n              \"createdAt\": \"2022-06-15T06:49:38.307Z\",\n              \"name\": \"7d280745-3fb9-49bd-b2c0-77fb37c8c771.MOV\",\n              \"type\": \"video/mp4\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"bb6bfd3fedf5065327fd082093c05223\",\n              \"url\": \"https://misskey.m544.net/files/62a98102c36eabf70dd65421/62a98102c36eabf70dd65421.MOV?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62a98102c36eabf70dd65421/62a98102c36eabf70dd65421.jpg?thumbnail\",\n              \"properties\": {},\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://misskey.io/notes/91isrscuif\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5edf0247e4cb6e4f5a7fae77\",\n      \"username\": \"kamiyu203\",\n      \"name\": \"カミユ\",\n      \"host\": \"ukadon.shillest.net\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a514f207b50830816ccb6a/62a514f207b50830816ccb6a.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"ukadon.shillest.net\",\n        \"name\": \"うかどん\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://ukadon.shillest.net/favicon.ico\",\n        \"themeColor\": \"#6364FF\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://ukadon.shillest.net/@kamiyu203\",\n      \"uri\": \"https://ukadon.shillest.net/users/kamiyu203\",\n      \"createdAt\": \"2020-06-09T03:30:15.543Z\",\n      \"updatedAt\": \"2022-06-17T20:38:24.034Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62a514f207b50830816ccb69/62a514f207b50830816ccb69.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"単眼男子つくってる人\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"おうち跡地\",\n          \"value\": \"http://kamiyu203.stars.ne.jp/\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 78,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a07a82c0725ea289600a02\",\n      \"username\": \"toyohisa\",\n      \"name\": \"もあ\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62b324df5a51ed2ea490b27b/62b324df5a51ed2ea490b27b.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@toyohisa\",\n      \"uri\": \"https://fedibird.com/users/toyohisa\",\n      \"createdAt\": \"2022-06-08T10:31:30.486Z\",\n      \"updatedAt\": \"2022-07-14T13:18:52.549Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62a96222c36eabf70dd643e4/62a96222c36eabf70dd643e4.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"メンヘラニート\\nアイコンは「し」さん@choco@misskey.m544.net\",\n      \"profile\": {\n        \"birthday\": \"2008-02-19\",\n        \"location\": \"北の国\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"やきう\",\n          \"value\": \"名古屋のあの球団\"\n        },\n        {\n          \"name\": \"けいば\",\n          \"value\": \"横山家の3男\"\n        },\n        {\n          \"name\": \"すきなもの\",\n          \"value\": \"みせいねん\"\n        },\n        {\n          \"name\": \"びいる\",\n          \"value\": \"サッポロクラシック\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 7,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a45e93c0725ea2896022a2\",\n      \"username\": \"Otoa\",\n      \"name\": \"十六夜 乙愛。:ablobcatsnowjoy:​\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/wvohsq0d11ck2o5rze1533so.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [\n        {\n          \"name\": \"ablobcatsnowjoy\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/o2z0z6wfgbb2eznlivhlpnh6.gif\",\n          \"host\": null,\n          \"resolvable\": \"ablobcatsnowjoy\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"いれいす知ってる人と絡みたい\"\n      ],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2022-06-11T09:21:23.365Z\",\n      \"updatedAt\": \"2022-07-20T02:35:25.389Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/w8mpp0de391kyj9sb1zusvbe.jpg\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"私の転生する前の垢は、十六夜 梨子です！！\\nもうネタバレしましたww(((\\nなので、今までの乙愛だけのアイコンは見れなくなりますが、名前を変えました！！\\nこれからは十六夜 乙愛。として活動していきます！！\\nよろしくお願いします！！\\nーーーーーーーー\\n推し\\nいれいす(りうらくん寄りの箱推し)(最推しcp：いむしょー)\\nメロンパーカー(なろっち寄りの箱推し)\\nからぴち(どぬ寄りの箱推し)\\nーーーーーーーー\\n⚠りうらくんちょっと同胆拒否気味(でも普通に喋ります！！)\\n#いれいす知ってる人と絡みたい\",\n      \"profile\": {\n        \"birthday\": \"2011-10-08\",\n        \"location\": \"埼玉県\"\n      },\n      \"fields\": [],\n      \"followersCount\": 14,\n      \"followingCount\": 17,\n      \"notesCount\": 336,\n      \"pinnedNoteIds\": [\n        \"718215df1ba48ca98733e6fb\",\n        \"71821078a9aba25b659950a3\",\n        \"7181c7cd8967cd0e50f36ce5\",\n        \"7181ba20312d5d485885a851\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"718215df1ba48ca98733e6fb\",\n          \"createdAt\": \"2022-07-19T09:51:59.396Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"上手くいった絵\\nでもまだまだだっ💦\\n左の方が上手くいったかな～失敗したけど\",\n          \"cw\": null,\n          \"userId\": \"62a45e93c0725ea2896022a2\",\n          \"user\": {\n            \"id\": \"62a45e93c0725ea2896022a2\",\n            \"username\": \"Otoa\",\n            \"name\": \"十六夜 乙愛。:ablobcatsnowjoy:​\",\n            \"host\": null,\n            \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/wvohsq0d11ck2o5rze1533so.jpg\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"borderColor\": null,\n            \"instance\": null,\n            \"emojis\": [\n              {\n                \"name\": \"ablobcatsnowjoy\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/o2z0z6wfgbb2eznlivhlpnh6.gif\",\n                \"host\": null,\n                \"resolvable\": \"ablobcatsnowjoy\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"いれいす知ってる人と絡みたい\"\n            ],\n            \"url\": null,\n            \"uri\": null\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": true,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 4,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"💦\": 1,\n            \"😮\": 1,\n            \"❤\": 1,\n            \"🍮\": 1\n          },\n          \"reactionCounts\": {\n            \"💦\": 1,\n            \"😮\": 1,\n            \"❤\": 1,\n            \"🍮\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62d67e88366d47ba6cb3dd6b\",\n            \"62d67e8e366d47ba6cb3dd6c\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d67e88366d47ba6cb3dd6b\",\n              \"createdAt\": \"2022-07-19T09:51:04.774Z\",\n              \"name\": \"01G82RQJJ7XAZQJQHS59QCRGDB.webp\",\n              \"type\": \"image/webp\",\n              \"animation\": null,\n              \"datasize\": 31160,\n              \"size\": 31160,\n              \"md5\": \"2ef796a4070b5f5873ff9df5f38140d6\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/6l2dmjla31eii0vn8j0p3owk.webp\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/3znn4dqy6wos21o9hc75zid3.jpg\",\n              \"properties\": {\n                \"width\": 960,\n                \"height\": 1202\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d67e8e366d47ba6cb3dd6c\",\n              \"createdAt\": \"2022-07-19T09:51:10.866Z\",\n              \"name\": \"01G82RXDQ42GK10VF1CHKQW6DM.webp\",\n              \"type\": \"image/webp\",\n              \"animation\": null,\n              \"datasize\": 125256,\n              \"size\": 125256,\n              \"md5\": \"2c4981b8f3dfb3fef32bfb25f2d9c34c\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/k3jq346zzgbq52q8pb601bcc.webp\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/9f380jxjtwmqef2vj2upxeep.jpg\",\n              \"properties\": {\n                \"width\": 960,\n                \"height\": 1322\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": null,\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71821078a9aba25b659950a3\",\n          \"createdAt\": \"2022-07-18T08:41:59.467Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"いれいす(ヤンデレ化)\\nなんか恥ずかしいわ\",\n          \"cw\": null,\n          \"userId\": \"62a45e93c0725ea2896022a2\",\n          \"user\": {\n            \"id\": \"62a45e93c0725ea2896022a2\",\n            \"username\": \"Otoa\",\n            \"name\": \"十六夜 乙愛。:ablobcatsnowjoy:​\",\n            \"host\": null,\n            \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/wvohsq0d11ck2o5rze1533so.jpg\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"borderColor\": null,\n            \"instance\": null,\n            \"emojis\": [\n              {\n                \"name\": \"ablobcatsnowjoy\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/o2z0z6wfgbb2eznlivhlpnh6.gif\",\n                \"host\": null,\n                \"resolvable\": \"ablobcatsnowjoy\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"いれいす知ってる人と絡みたい\"\n            ],\n            \"url\": null,\n            \"uri\": null\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": true,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":blobopenmouth@.:\": 1\n          },\n          \"reactionCounts\": {\n            \":blobopenmouth@.:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"blobopenmouth@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/03meazo0ojfetztle5vq5v7m.png\",\n              \"host\": null,\n              \"resolvable\": \"blobopenmouth\"\n            }\n          ],\n          \"fileIds\": [\n            \"62d51ca5366d47ba6cb3d47a\",\n            \"62d51cab366d47ba6cb3d47b\",\n            \"62d51cb9366d47ba6cb3d47c\",\n            \"62d51cbf366d47ba6cb3d47e\",\n            \"62d51cc5366d47ba6cb3d480\",\n            \"62d51ccb366d47ba6cb3d481\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d51ca5366d47ba6cb3d47a\",\n              \"createdAt\": \"2022-07-18T08:41:09.340Z\",\n              \"name\": \"516657_F27x9txK.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 245148,\n              \"size\": 245148,\n              \"md5\": \"eba523292439773a199305685cbe12cb\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/i70v6ktwkvur60fdn5jj26qu.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/gtydbpmbdxh23sqppuzph1cz.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d51cab366d47ba6cb3d47b\",\n              \"createdAt\": \"2022-07-18T08:41:15.987Z\",\n              \"name\": \"516657_z3wrXSfp.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 262122,\n              \"size\": 262122,\n              \"md5\": \"cc239affc8531bfa3e5fb64d2309d5ae\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/js6ouvwq280kj5nu38ioeh03.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/hlef8dfgri8mj1hs39aslj5y.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d51cb9366d47ba6cb3d47c\",\n              \"createdAt\": \"2022-07-18T08:41:29.768Z\",\n              \"name\": \"516657_T5eIp5OQ.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 258120,\n              \"size\": 258120,\n              \"md5\": \"c9253f1b142755c278acb1f94083994d\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/7np1g33gd29ukahdzz0g2xk3.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/mqrp4ahsvfg6p541e4jocb0b.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d51cbf366d47ba6cb3d47e\",\n              \"createdAt\": \"2022-07-18T08:41:35.910Z\",\n              \"name\": \"516657_1b3wIgyv.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 260034,\n              \"size\": 260034,\n              \"md5\": \"10481186f09f8c86a1eb681cb6a13ddd\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/5zf2siynondft15c1gbyq52j.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/ptng8nhgmcwofn9l0ej5ra49.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d51cc5366d47ba6cb3d480\",\n              \"createdAt\": \"2022-07-18T08:41:41.999Z\",\n              \"name\": \"516657_CPktFMS3.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 243894,\n              \"size\": 243894,\n              \"md5\": \"5784f0e84b37857ee52d04a0d098b31a\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/2ynviv0lkqx36g9t06u8phoj.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/fvdccy47nadfjdufcv67sxdw.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62d51ccb366d47ba6cb3d481\",\n              \"createdAt\": \"2022-07-18T08:41:47.115Z\",\n              \"name\": \"516657_bJONpOIl.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 270566,\n              \"size\": 270566,\n              \"md5\": \"d84ebcbb934cb7855078b54ba06b40ef\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/pntoe10ob7wgqgoabsjl340c.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/bxmd4j9psoz8kpe6uad6qzcp.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": null,\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181c7cd8967cd0e50f36ce5\",\n          \"createdAt\": \"2022-07-04T06:02:24.999Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"いれいすのみんな作ってみた！！\\n(理想の女の子バージョン)\",\n          \"cw\": null,\n          \"userId\": \"62a45e93c0725ea2896022a2\",\n          \"user\": {\n            \"id\": \"62a45e93c0725ea2896022a2\",\n            \"username\": \"Otoa\",\n            \"name\": \"十六夜 乙愛。:ablobcatsnowjoy:​\",\n            \"host\": null,\n            \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/wvohsq0d11ck2o5rze1533so.jpg\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"borderColor\": null,\n            \"instance\": null,\n            \"emojis\": [\n              {\n                \"name\": \"ablobcatsnowjoy\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/o2z0z6wfgbb2eznlivhlpnh6.gif\",\n                \"host\": null,\n                \"resolvable\": \"ablobcatsnowjoy\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"いれいす知ってる人と絡みたい\"\n            ],\n            \"url\": null,\n            \"uri\": null\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": true,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 4,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"❤\": 4\n          },\n          \"reactionCounts\": {\n            \"❤\": 4\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62c28213a36d4a3683117147\",\n            \"62c2821ca36d4a3683117148\",\n            \"62c28225a36d4a3683117149\",\n            \"62c28232a36d4a368311714a\",\n            \"62c2823aa36d4a368311714b\",\n            \"62c28243a36d4a368311714d\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62c28213a36d4a3683117147\",\n              \"createdAt\": \"2022-07-04T06:00:51.114Z\",\n              \"name\": \"516657_HJBKVr6M.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 296326,\n              \"size\": 296326,\n              \"md5\": \"65b89ffbed4dfc900bba089eaef8a7d5\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/lfpaa6bwx1kkvj96lyl1ul1f.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/y5k5djbqoxf4y0i9c4scyan9.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62c2821ca36d4a3683117148\",\n              \"createdAt\": \"2022-07-04T06:01:00.479Z\",\n              \"name\": \"516657_HOq3HRLQ.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 268915,\n              \"size\": 268915,\n              \"md5\": \"fb6566f5df35598c7551cd00c65880ad\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/oifl7cyxbpk5rpydjpuysrt3.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/p91pihyvawzbjifd668hd1zw.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62c28225a36d4a3683117149\",\n              \"createdAt\": \"2022-07-04T06:01:09.452Z\",\n              \"name\": \"516657_dpNZJKAo.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 320326,\n              \"size\": 320326,\n              \"md5\": \"0b133d233b8b1893fcaa878cdbd4da4b\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/eonr94rp7th52wdgy9hyin5w.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/vahv42mlaxsx0mvzkm1zuj79.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62c28232a36d4a368311714a\",\n              \"createdAt\": \"2022-07-04T06:01:22.151Z\",\n              \"name\": \"516657_PhKeR7a3.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 317014,\n              \"size\": 317014,\n              \"md5\": \"3f3625464d965592318802523290357c\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/i7v45o2nfebqax13plzi4cxr.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/fbmgcuzpmm7vfv80bcfshs6k.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62c2823aa36d4a368311714b\",\n              \"createdAt\": \"2022-07-04T06:01:30.047Z\",\n              \"name\": \"516657_ivKhqFuG.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 264694,\n              \"size\": 264694,\n              \"md5\": \"6823355b8dad4c3e94fc96c0884e1ee2\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/oir2s20upc05ydyw9rb2eozt.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/am25x6hw1pdexv61d99i922v.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"62c28243a36d4a368311714d\",\n              \"createdAt\": \"2022-07-04T06:01:39.777Z\",\n              \"name\": \"516657_PdFFBODk.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 214959,\n              \"size\": 214959,\n              \"md5\": \"f2a680d2f2b0855a40f8bf426a31e65c\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/vi180zwzbm53coepior80cyy.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/xm0rtk1gg1k3mms4195xvngn.jpg\",\n              \"properties\": {\n                \"width\": 600,\n                \"height\": 600\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": null,\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181ba20312d5d485885a851\",\n          \"createdAt\": \"2022-07-01T14:18:00.877Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"まっシー様が描いてくれました✨\",\n          \"cw\": null,\n          \"userId\": \"62a45e93c0725ea2896022a2\",\n          \"user\": {\n            \"id\": \"62a45e93c0725ea2896022a2\",\n            \"username\": \"Otoa\",\n            \"name\": \"十六夜 乙愛。:ablobcatsnowjoy:​\",\n            \"host\": null,\n            \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/wvohsq0d11ck2o5rze1533so.jpg\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"borderColor\": null,\n            \"instance\": null,\n            \"emojis\": [\n              {\n                \"name\": \"ablobcatsnowjoy\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/o2z0z6wfgbb2eznlivhlpnh6.gif\",\n                \"host\": null,\n                \"resolvable\": \"ablobcatsnowjoy\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"いれいす知ってる人と絡みたい\"\n            ],\n            \"url\": null,\n            \"uri\": null\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": true,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 5,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {\n            \"✨\": 1,\n            \"🎉\": 2,\n            \"🍮\": 1,\n            \"❤\": 1,\n            \"🥰\": 1\n          },\n          \"reactionCounts\": {\n            \"✨\": 1,\n            \"🎉\": 2,\n            \"🍮\": 1,\n            \"❤\": 1,\n            \"🥰\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62bf0201a36d4a3683115cd2\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62bf0201a36d4a3683115cd2\",\n              \"createdAt\": \"2022-07-01T14:17:37.532Z\",\n              \"name\": \"01G6X0HGHK8BH1GR7MQ24TCPW6.webp\",\n              \"type\": \"image/webp\",\n              \"animation\": null,\n              \"datasize\": 43672,\n              \"size\": 43672,\n              \"md5\": \"392d2605e84952f9e9ccd927b89cf382\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/vlmfsi7boxl8sj30fqcjh2vg.webp\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/ir6nked48w46u676f69oo6u1.jpg\",\n              \"properties\": {\n                \"width\": 960,\n                \"height\": 1100\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": null,\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a476364274204eae798091\",\n      \"username\": \"web5\",\n      \"name\": \"Cam Web5\",\n      \"host\": \"solagg.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a476364274204eae798095/62a476364274204eae798095.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"solagg.com\",\n        \"name\": \"Solagg Fediverse: Decentralized Social Network\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.4.1\",\n        \"iconUrl\": \"https://solagg.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"web5\"\n      ],\n      \"url\": \"https://solagg.com/@web5\",\n      \"uri\": \"https://solagg.com/users/web5\",\n      \"createdAt\": \"2022-06-11T11:02:14.493Z\",\n      \"updatedAt\": \"2022-06-13T03:48:26.803Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62a476364274204eae798094/62a476364274204eae798094.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"I love #Web5 Love Jack Dorsey\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"Fediverse\",\n          \"value\": \"Web 2\"\n        },\n        {\n          \"name\": \"FediverseFi\",\n          \"value\": \"Web 5\"\n        },\n        {\n          \"name\": \"Bitcityz Token\",\n          \"value\": \"[#BCTZ](https://solagg.com/tags/BCTZ)\"\n        },\n        {\n          \"name\": \"Dao Token\",\n          \"value\": \"[#BCTY](https://solagg.com/tags/BCTY)\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 13,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a42cb14274204eae795288\",\n      \"username\": \"kanon\",\n      \"name\": \"香音\",\n      \"host\": \"meisskey.one\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a42cb14274204eae795289/62a42cb14274204eae795289.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"meisskey.one\",\n        \"name\": \"meisskey.one\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"10.102.584-m544\",\n        \"iconUrl\": \"https://meisskey.one/favicon.ico\",\n        \"themeColor\": \"#fb4e4e\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"投票トーク民\",\n        \"トート民\"\n      ],\n      \"url\": \"https://meisskey.one/@kanon\",\n      \"uri\": \"https://meisskey.one/users/62a41d3172b21da9c254c3e5\",\n      \"createdAt\": \"2022-06-11T05:48:33.932Z\",\n      \"updatedAt\": \"2022-07-16T06:06:39.266Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62a42cb14274204eae79528a/62a42cb14274204eae79528a.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"中２\\nいろいろやってる（いつか規制かかると思うからスッと消える可能性あるのだわ）\\nめいめい様みたいに上品なふるまいに憧れてる\\n家族は父母弟の四人家族\\n質問箱https://peing.net/ja/kanon2018\\n#投票トーク民　#トート民\\n好きな曲「habit」SEKAINO　OWARIより\\nhttps://www.youtube.com/watch?v=8OZDgBmehbA\\n　　　　「M八七」米津玄師、シン・ウルトラマンより\\nhttps://www.youtube.com/watch?v=Zhx1n6uvgUE\\n　　　　「眩光」ナンバMG５、WANIMAより\\nhttps://www.youtube.com/watch?v=TCYy8Uyf400\",\n      \"profile\": {\n        \"birthday\": \"2009-02-18\",\n        \"location\": \"福岡\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 36,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a2c0c761828eb6d9dfe8a9\",\n      \"username\": \"mewl\",\n      \"name\": \"めうるみ\",\n      \"host\": \"otoya.space\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a2c0c761828eb6d9dfe8aa/62a2c0c761828eb6d9dfe8aa.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"otoya.space\",\n        \"name\": \"Otoyadon\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://otoya.space/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://otoya.space/@mewl\",\n      \"uri\": \"https://otoya.space/users/mewl\",\n      \"createdAt\": \"2022-06-10T03:55:51.636Z\",\n      \"updatedAt\": \"2022-06-10T04:19:44.251Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62a2c0c761828eb6d9dfe8ab/62a2c0c761828eb6d9dfe8ab.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"@hayabusa@otoya.space ← このインスタンスでのメイン\\n@mewl@mewl.me ← このハンドルネームでのメイン\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 7,\n      \"pinnedNoteIds\": [\n        \"71814bd646d8b3796d49f024\",\n        \"71814bd51a10f1346612e6ac\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71814bd646d8b3796d49f024\",\n          \"createdAt\": \"2022-06-10T04:19:03.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"アカウントの使いわけがあるわけではなく、ここはなんか「通過点」といった感じ\\n\\n多分いままでどおり @hayabusa@otoya.space か @mewl@mewl.me にいます\",\n          \"cw\": null,\n          \"userId\": \"62a2c0c761828eb6d9dfe8a9\",\n          \"user\": {\n            \"id\": \"62a2c0c761828eb6d9dfe8a9\",\n            \"username\": \"mewl\",\n            \"name\": \"めうるみ\",\n            \"host\": \"otoya.space\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a2c0c761828eb6d9dfe8aa/62a2c0c761828eb6d9dfe8aa.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"otoya.space\",\n              \"name\": \"Otoyadon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://otoya.space/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://otoya.space/@mewl\",\n            \"uri\": \"https://otoya.space/users/mewl\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 5,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":love_nullcatchan@nca10.net:\": 1,\n            \"👍\": 3,\n            \":blobok@.:\": 1\n          },\n          \"reactionCounts\": {\n            \":love_nullcatchan@nca10.net:\": 1,\n            \"👍\": 3,\n            \":blobok@.:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"love_nullcatchan@nca10.net\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/94g68q0sf3lh81z7vg4y2uke.png\",\n              \"host\": \"nca10.net\",\n              \"resolvable\": \"love_nullcatchan@nca10.net\"\n            },\n            {\n              \"name\": \"blobok@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/4yxgm0bcc7upu5x7hkfehrex.png\",\n              \"host\": null,\n              \"resolvable\": \"blobok\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://otoya.space/users/mewl/statuses/108451249750638683\",\n          \"url\": \"https://otoya.space/@mewl/108451249750638683\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"5b73a64872ee45561f266844\",\n            \"5b6dfdf790c13c27956c6245\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71814bd51a10f1346612e6ac\",\n          \"createdAt\": \"2022-06-10T04:17:46.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"[おしらせ]\\nmewl.me からフォローリストのインポートをしました\",\n          \"cw\": null,\n          \"userId\": \"62a2c0c761828eb6d9dfe8a9\",\n          \"user\": {\n            \"id\": \"62a2c0c761828eb6d9dfe8a9\",\n            \"username\": \"mewl\",\n            \"name\": \"めうるみ\",\n            \"host\": \"otoya.space\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62a2c0c761828eb6d9dfe8aa/62a2c0c761828eb6d9dfe8aa.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"otoya.space\",\n              \"name\": \"Otoyadon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://otoya.space/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://otoya.space/@mewl\",\n            \"uri\": \"https://otoya.space/users/mewl\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"home\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 4,\n          \"renoteCount\": 1,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"🎉\": 2,\n            \"🍮\": 1\n          },\n          \"reactionCounts\": {\n            \"🎉\": 2,\n            \"🍮\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://otoya.space/users/mewl/statuses/108451244723631573\",\n          \"url\": \"https://otoya.space/@mewl/108451244723631573\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629b55f008d918aba68cad47\",\n      \"username\": \"Kirotuki\",\n      \"name\": \"シロツキきろた\",\n      \"host\": \"misskey.girak.net\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/629b561308d918aba68cad4f/629b561308d918aba68cad4f.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"misskey.girak.net\",\n        \"name\": \"ぎらくMisskey支部\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.111.1\",\n        \"iconUrl\": \"https://storage.googleapis.com/misskey_girak/misskey_girak/21804961-fccf-4b7f-b7b3-fe22251b798c.png\",\n        \"themeColor\": \"#7a41a3\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.girak.net/@Kirotuki\",\n      \"uri\": \"https://misskey.girak.net/users/910zu7dr13\",\n      \"createdAt\": \"2022-06-04T12:54:08.544Z\",\n      \"updatedAt\": \"2022-07-18T13:23:58.216Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"いんてりじぇんとなでべろっぱーあかうんとです\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 316,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62a1593ec1bf3037d8636c5a\",\n      \"username\": \"Panta\",\n      \"name\": null,\n      \"host\": \"misskey.pantasystem.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a1593fc1bf3037d8636c60/62a1593fc1bf3037d8636c60.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.pantasystem.com\",\n        \"name\": \"パン太は人間\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.111.1\",\n        \"iconUrl\": \"https://misskey.pantasystem.com/files/0be284ac-671a-406b-ad51-9904c187be2d\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.pantasystem.com/@Panta\",\n      \"uri\": \"https://misskey.pantasystem.com/users/919y2ickt2\",\n      \"createdAt\": \"2022-06-09T02:21:50.992Z\",\n      \"updatedAt\": \"2022-07-20T06:27:39.739Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": \"2001-06-23\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 3029,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5fa2776ebdc8854ec0c59813\",\n      \"username\": \"atau\",\n      \"name\": \"せ お り ら ら\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/udkiy47crc6f1n6rmw077zxt.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2020-11-04T09:42:06.441Z\",\n      \"updatedAt\": \"2022-07-17T14:44:06.316Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/czvjnsiyjbgpzdm0hgynaewn.jpg\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"せお　fjk　ゆる絵描き\\nいいこです\",\n      \"profile\": {\n        \"birthday\": \"2006-07-07\",\n        \"location\": \"どんどんうどんおうどん\"\n      },\n      \"fields\": [],\n      \"followersCount\": 22,\n      \"followingCount\": 19,\n      \"notesCount\": 931,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629f4eaf2a659f37e421a758\",\n      \"username\": \"kanoy\",\n      \"name\": \"かのい🍰\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62a0bcd6c1bf3037d8632e40/62a0bcd6c1bf3037d8632e40.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@kanoy\",\n      \"uri\": \"https://submarin.online/users/90un7r3gdc\",\n      \"createdAt\": \"2022-06-07T13:12:15.126Z\",\n      \"updatedAt\": \"2022-07-20T03:34:09.814Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"Parfaits/Doughnuts wowwow\",\n      \"profile\": {\n        \"birthday\": \"0645-08-16\",\n        \"location\": \"Pacific\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"io\",\n          \"value\": \"@kanoy@misskey.io\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 771,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629e5321ecaab29abd99f031\",\n      \"username\": \"tomxcd\",\n      \"name\": \"tomxcd\",\n      \"host\": \"mastodon.coffee\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62be020ce0878519dd9368a9/62be020ce0878519dd9368a9.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"mastodon.coffee\",\n        \"name\": \"Mastodon ☕\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://mastodon.coffee/favicon.ico\",\n        \"themeColor\": \"#6364FF\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://mastodon.coffee/@tomxcd\",\n      \"uri\": \"https://mastodon.coffee/users/tomxcd\",\n      \"createdAt\": \"2022-06-06T19:18:57.384Z\",\n      \"updatedAt\": \"2022-07-20T06:46:04.741Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62be0505e0878519dd93699a/62be0505e0878519dd93699a.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"You should reconsider...\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"birthday?\",\n          \"value\": \"September 25 (minor)\"\n        },\n        {\n          \"name\": \"pronouns?\",\n          \"value\": \"he/they\"\n        },\n        {\n          \"name\": \"interests?\",\n          \"value\": \"dragons, michigan, computers, minetest, history, and lua\"\n        },\n        {\n          \"name\": \"joined?\",\n          \"value\": \"august 2020 (regular since feburary 2022)\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 2311,\n      \"pinnedNoteIds\": [\n        \"71813a975060e4eeb4d1f4fe\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71813a975060e4eeb4d1f4fe\",\n          \"createdAt\": \"2022-06-06T19:56:44.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"I have changed instances yet again, but my values have not changed one bit:\\n\\nI operate on one policy and one policy only. To each their own. I don't care if you're a furry, brony, pony, Minecraft fan, weeb, gay, lesbian, bisexual, trans, or anything else. As long as you aren't hurting yourself or others, you are always a good person in my eyes. 💕\\n\\nAlso, love is love. Love who you want and be who you want and don't let shitty people keep you behind closed doors. Love you all. Thanks. ❤\",\n          \"cw\": null,\n          \"userId\": \"629e5321ecaab29abd99f031\",\n          \"user\": {\n            \"id\": \"629e5321ecaab29abd99f031\",\n            \"username\": \"tomxcd\",\n            \"name\": \"tomxcd\",\n            \"host\": \"mastodon.coffee\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62be020ce0878519dd9368a9/62be020ce0878519dd9368a9.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.coffee\",\n              \"name\": \"Mastodon ☕\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.coffee/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.coffee/@tomxcd\",\n            \"uri\": \"https://mastodon.coffee/users/tomxcd\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mastodon.coffee/users/tomxcd/statuses/108432287625239995\",\n          \"url\": \"https://mastodon.coffee/@tomxcd/108432287625239995\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"60a534d7a5d4f9475cbf538e\",\n      \"username\": \"kirifuji\",\n      \"name\": \"日韓断交で日本終了！Oteage desu！＼(^o^;)／\",\n      \"host\": \"mastodon.social\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/629fadf5c0725ea2896003fc/629fadf5c0725ea2896003fc.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"mastodon.social\",\n        \"name\": \"Mastodon\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n        \"themeColor\": \"#6364FF\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://mastodon.social/@kirifuji\",\n      \"uri\": \"https://mastodon.social/users/kirifuji\",\n      \"createdAt\": \"2021-05-19T15:55:03.489Z\",\n      \"updatedAt\": \"2022-07-15T16:12:13.715Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/629fadf6c0725ea2896003fd/629fadf6c0725ea2896003fd.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"バンザ〜〜イ!!\\nバンザ〜〜イ!!\\nバンザ〜〜イ!!（やけくそ）\\n「無所属面堂邸＠写生休暇」はジョークが効きすぎていた・・・。\\nいざネットの時間を減らして書を読まん。笑い\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 683,\n      \"pinnedNoteIds\": [\n        \"717b17129d0846a17bee79bc\",\n        \"717b16e4362014d3d19ee964\",\n        \"717ad929b0d00cdabc5b0207\",\n        \"717a614c86784f26954d7a5f\",\n        \"717a6789d4a021f18c60dba9\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"717b17129d0846a17bee79bc\",\n          \"createdAt\": \"2021-08-05T16:08:21.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"@Punk1977_riot@libera.tokyo \\nもうじき戦場の青い鳥から日本語圏ユーザーが自発的に他のSNSに大移動するようになると思うので、マストドンの招待状を沢山発行するのが良いと思います・\",\n          \"cw\": null,\n          \"userId\": \"60a534d7a5d4f9475cbf538e\",\n          \"user\": {\n            \"id\": \"60a534d7a5d4f9475cbf538e\",\n            \"username\": \"kirifuji\",\n            \"name\": \"日韓断交で日本終了！Oteage desu！＼(^o^;)／\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/629fadf5c0725ea2896003fc/629fadf5c0725ea2896003fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@kirifuji\",\n            \"uri\": \"https://mastodon.social/users/kirifuji\"\n          },\n          \"replyId\": \"717b16e4362014d3d19ee964\",\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [\n            {\n              \"name\": \"@punk1977_riot@libera.tokyo\",\n              \"url\": \"https://misskey.m544.net/files/6229990d1e95f257bb6d7ab8/6229990d1e95f257bb6d7ab8.jpg?thumbnail\",\n              \"host\": \"libera.tokyo\",\n              \"resolvable\": \"@punk1977_riot@libera.tokyo\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mastodon.social/users/kirifuji/statuses/106704384883887975\",\n          \"url\": \"https://mastodon.social/@kirifuji/106704384883887975\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"5ee06686e4cb6e4f5a80b880\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": {\n            \"id\": \"717b16e4362014d3d19ee964\",\n            \"createdAt\": \"2021-08-05T15:17:40.000Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"@Punk1977_riot@libera.tokyo \\n戦場の青い鳥にある深夜スワン云々とかいう怪しいアカウントのツイートを見てみた時、そのアカウントはフェミニストのふりをしつつ、悪意のあるクソリプを繰り返していました。このアカウントを筆頭とする、リベラル等に成りすましたオルタナ右翼がクソリプを繰り返して、リベラルやフェミニスト、反差別運動等のマナーの悪化を引き起こそうと画策しまくっているのではないかと思いました。\",\n            \"cw\": null,\n            \"userId\": \"60a534d7a5d4f9475cbf538e\",\n            \"user\": {\n              \"id\": \"60a534d7a5d4f9475cbf538e\",\n              \"username\": \"kirifuji\",\n              \"name\": \"日韓断交で日本終了！Oteage desu！＼(^o^;)／\",\n              \"host\": \"mastodon.social\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/629fadf5c0725ea2896003fc/629fadf5c0725ea2896003fc.jpg?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"mastodon.social\",\n                \"name\": \"Mastodon\",\n                \"softwareName\": \"mastodon\",\n                \"softwareVersion\": \"3.5.3\",\n                \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n                \"themeColor\": \"#6364FF\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://mastodon.social/@kirifuji\",\n              \"uri\": \"https://mastodon.social/users/kirifuji\"\n            },\n            \"replyId\": \"717b147637a8595bfde1f89b\",\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 0,\n            \"renoteCount\": 0,\n            \"quoteCount\": 0,\n            \"repliesCount\": 1,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [\n              {\n                \"name\": \"@punk1977_riot@libera.tokyo\",\n                \"url\": \"https://misskey.m544.net/files/6229990d1e95f257bb6d7ab8/6229990d1e95f257bb6d7ab8.jpg?thumbnail\",\n                \"host\": \"libera.tokyo\",\n                \"resolvable\": \"@punk1977_riot@libera.tokyo\"\n              }\n            ],\n            \"fileIds\": [],\n            \"files\": [],\n            \"uri\": \"https://mastodon.social/users/kirifuji/statuses/106704185629146709\",\n            \"url\": \"https://mastodon.social/@kirifuji/106704185629146709\",\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [\n              \"5ee06686e4cb6e4f5a80b880\"\n            ],\n            \"hasRemoteMentions\": true,\n            \"notHaveDecorationMfm\": true\n          },\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717b16e4362014d3d19ee964\",\n          \"createdAt\": \"2021-08-05T15:17:40.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"@Punk1977_riot@libera.tokyo \\n戦場の青い鳥にある深夜スワン云々とかいう怪しいアカウントのツイートを見てみた時、そのアカウントはフェミニストのふりをしつつ、悪意のあるクソリプを繰り返していました。このアカウントを筆頭とする、リベラル等に成りすましたオルタナ右翼がクソリプを繰り返して、リベラルやフェミニスト、反差別運動等のマナーの悪化を引き起こそうと画策しまくっているのではないかと思いました。\",\n          \"cw\": null,\n          \"userId\": \"60a534d7a5d4f9475cbf538e\",\n          \"user\": {\n            \"id\": \"60a534d7a5d4f9475cbf538e\",\n            \"username\": \"kirifuji\",\n            \"name\": \"日韓断交で日本終了！Oteage desu！＼(^o^;)／\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/629fadf5c0725ea2896003fc/629fadf5c0725ea2896003fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@kirifuji\",\n            \"uri\": \"https://mastodon.social/users/kirifuji\"\n          },\n          \"replyId\": \"717b147637a8595bfde1f89b\",\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [\n            {\n              \"name\": \"@punk1977_riot@libera.tokyo\",\n              \"url\": \"https://misskey.m544.net/files/6229990d1e95f257bb6d7ab8/6229990d1e95f257bb6d7ab8.jpg?thumbnail\",\n              \"host\": \"libera.tokyo\",\n              \"resolvable\": \"@punk1977_riot@libera.tokyo\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mastodon.social/users/kirifuji/statuses/106704185629146709\",\n          \"url\": \"https://mastodon.social/@kirifuji/106704185629146709\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"5ee06686e4cb6e4f5a80b880\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": {\n            \"id\": \"717b147637a8595bfde1f89b\",\n            \"createdAt\": \"2021-08-05T03:58:17.000Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"青鳥ユーザー、マナー悪っ。\\n同じ、反アベ～スガで、反原発派で、反新自由主義派なのに喧嘩をふっかけてくる馬鹿モンどもだらけになった。なんで「アウフヘーベン(小池百合子の口癖なので用いたくなかったが)」という道を探ろうとしないのだろうか？これでは永遠の敗北だろう。青鳥はもはや狂気の世界と化している。\",\n            \"cw\": null,\n            \"userId\": \"5ee06686e4cb6e4f5a80b880\",\n            \"user\": {\n              \"id\": \"5ee06686e4cb6e4f5a80b880\",\n              \"username\": \"Punk1977_riot\",\n              \"name\": \"チャラ男・ダムド\",\n              \"host\": \"libera.tokyo\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/6229990d1e95f257bb6d7ab8/6229990d1e95f257bb6d7ab8.jpg?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"libera.tokyo\",\n                \"name\": \"LIBERA TOKYO\",\n                \"softwareName\": \"mastodon\",\n                \"softwareVersion\": \"3.5.3\",\n                \"iconUrl\": \"https://libera.tokyo/favicon.ico\",\n                \"themeColor\": \"#282c37\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://libera.tokyo/@Punk1977_riot\",\n              \"uri\": \"https://libera.tokyo/users/Punk1977_riot\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 0,\n            \"renoteCount\": 0,\n            \"quoteCount\": 0,\n            \"repliesCount\": 1,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [],\n            \"fileIds\": [],\n            \"files\": [],\n            \"uri\": \"https://libera.tokyo/users/Punk1977_riot/statuses/106701514182689080\",\n            \"url\": \"https://libera.tokyo/@Punk1977_riot/106701514182689080\",\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"notHaveDecorationMfm\": true\n          },\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717ad929b0d00cdabc5b0207\",\n          \"createdAt\": \"2021-07-24T15:37:06.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"オリンピック、中抜きが(ピンハネの類義語として)世界共通語彙になりそう。hentaiやtsunamiみたいに。\",\n          \"cw\": null,\n          \"userId\": \"60a534d7a5d4f9475cbf538e\",\n          \"user\": {\n            \"id\": \"60a534d7a5d4f9475cbf538e\",\n            \"username\": \"kirifuji\",\n            \"name\": \"日韓断交で日本終了！Oteage desu！＼(^o^;)／\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/629fadf5c0725ea2896003fc/629fadf5c0725ea2896003fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@kirifuji\",\n            \"uri\": \"https://mastodon.social/users/kirifuji\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mastodon.social/users/kirifuji/statuses/106636314326493368\",\n          \"url\": \"https://mastodon.social/@kirifuji/106636314326493368\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717a614c86784f26954d7a5f\",\n          \"createdAt\": \"2021-07-01T09:00:43.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"@TomoKomakine@libera.tokyo \\n今となっては水爆で全世界が巻き添えになる可能性すらあるので、今度はもはや、私達が資金を溜めて海外移住しても無駄かも知れない。米ソ(当時)はゲームの理論に基づいた結果こんな兵器を作ってしまったわけみたいだけど、私から見れば当時の政治家は狂っているとしか思えない。\",\n          \"cw\": null,\n          \"userId\": \"60a534d7a5d4f9475cbf538e\",\n          \"user\": {\n            \"id\": \"60a534d7a5d4f9475cbf538e\",\n            \"username\": \"kirifuji\",\n            \"name\": \"日韓断交で日本終了！Oteage desu！＼(^o^;)／\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/629fadf5c0725ea2896003fc/629fadf5c0725ea2896003fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@kirifuji\",\n            \"uri\": \"https://mastodon.social/users/kirifuji\"\n          },\n          \"replyId\": \"717a613f11285f850afddded\",\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [\n            {\n              \"name\": \"@tomokomakine@libera.tokyo\",\n              \"url\": \"https://misskey.m544.net/files/62415843b51e030ef8157c83/62415843b51e030ef8157c83.jpg?thumbnail\",\n              \"host\": \"libera.tokyo\",\n              \"resolvable\": \"@tomokomakine@libera.tokyo\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mastodon.social/users/kirifuji/statuses/106504522518942699\",\n          \"url\": \"https://mastodon.social/@kirifuji/106504522518942699\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"5f58ed432cfc86331f276104\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": {\n            \"id\": \"717a613f11285f850afddded\",\n            \"createdAt\": \"2021-07-01T08:46:01.000Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"オリンピックやりたい見たい派がネトウヨ化していく日本🙄 安倍晋三に忠誠を誓うネトウヨに感化されて憲法改正賛成で自由を奪われ自民党に捨て駒利用される。\\n\\nもう一度徹底的に痛い目を見ないとわからないようだ、今度は原爆何発だ😶 ⁉️ ピカで死ぬのは痛いぞ。\",\n            \"cw\": null,\n            \"userId\": \"5f58ed432cfc86331f276104\",\n            \"user\": {\n              \"id\": \"5f58ed432cfc86331f276104\",\n              \"username\": \"TomoKomakine\",\n              \"name\": \"💙💛\",\n              \"host\": \"libera.tokyo\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/62415843b51e030ef8157c83/62415843b51e030ef8157c83.jpg?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"libera.tokyo\",\n                \"name\": \"LIBERA TOKYO\",\n                \"softwareName\": \"mastodon\",\n                \"softwareVersion\": \"3.5.3\",\n                \"iconUrl\": \"https://libera.tokyo/favicon.ico\",\n                \"themeColor\": \"#282c37\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://libera.tokyo/@TomoKomakine\",\n              \"uri\": \"https://libera.tokyo/users/TomoKomakine\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 0,\n            \"renoteCount\": 0,\n            \"quoteCount\": 0,\n            \"repliesCount\": 1,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [],\n            \"fileIds\": [],\n            \"files\": [],\n            \"uri\": \"https://libera.tokyo/users/TomoKomakine/statuses/106504464759253479\",\n            \"url\": \"https://libera.tokyo/@TomoKomakine/106504464759253479\",\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"notHaveDecorationMfm\": true\n          },\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717a6789d4a021f18c60dba9\",\n          \"createdAt\": \"2021-07-02T14:05:24.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"@Punk1977_riot@libera.tokyo \\n米国本社か日本支社かでリスクの質はかなり違ったものになりそう。前者は(スノーデンさんの報告を考慮すると、例えば)CIAにハッキングされて情報が流出しやすくなる懸念があり、後者はネトサポに情報が流出する懸念が極めて濃厚にある。どっちにしろ論外。\",\n          \"cw\": null,\n          \"userId\": \"60a534d7a5d4f9475cbf538e\",\n          \"user\": {\n            \"id\": \"60a534d7a5d4f9475cbf538e\",\n            \"username\": \"kirifuji\",\n            \"name\": \"日韓断交で日本終了！Oteage desu！＼(^o^;)／\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/629fadf5c0725ea2896003fc/629fadf5c0725ea2896003fc.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@kirifuji\",\n            \"uri\": \"https://mastodon.social/users/kirifuji\"\n          },\n          \"replyId\": \"717a6140ca90d9e659fa1122\",\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [\n            {\n              \"name\": \"@punk1977_riot@libera.tokyo\",\n              \"url\": \"https://misskey.m544.net/files/6229990d1e95f257bb6d7ab8/6229990d1e95f257bb6d7ab8.jpg?thumbnail\",\n              \"host\": \"libera.tokyo\",\n              \"resolvable\": \"@punk1977_riot@libera.tokyo\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mastodon.social/users/kirifuji/statuses/106511382888090094\",\n          \"url\": \"https://mastodon.social/@kirifuji/106511382888090094\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"5ee06686e4cb6e4f5a80b880\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": {\n            \"id\": \"717a6140ca90d9e659fa1122\",\n            \"createdAt\": \"2021-07-01T08:47:54.000Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"青島、いよいよオワコンだな。\",\n            \"cw\": null,\n            \"userId\": \"5ee06686e4cb6e4f5a80b880\",\n            \"user\": {\n              \"id\": \"5ee06686e4cb6e4f5a80b880\",\n              \"username\": \"Punk1977_riot\",\n              \"name\": \"チャラ男・ダムド\",\n              \"host\": \"libera.tokyo\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/6229990d1e95f257bb6d7ab8/6229990d1e95f257bb6d7ab8.jpg?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"libera.tokyo\",\n                \"name\": \"LIBERA TOKYO\",\n                \"softwareName\": \"mastodon\",\n                \"softwareVersion\": \"3.5.3\",\n                \"iconUrl\": \"https://libera.tokyo/favicon.ico\",\n                \"themeColor\": \"#282c37\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://libera.tokyo/@Punk1977_riot\",\n              \"uri\": \"https://libera.tokyo/users/Punk1977_riot\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 1,\n            \"renoteCount\": 0,\n            \"quoteCount\": 0,\n            \"repliesCount\": 2,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [],\n            \"fileIds\": [\n              \"60df1c02bb951423e9c7d333\"\n            ],\n            \"files\": [\n              {\n                \"id\": \"60df1c02bb951423e9c7d333\",\n                \"createdAt\": \"2021-07-02T14:00:34.624Z\",\n                \"name\": \"18d30d16983414ac.jpg\",\n                \"type\": \"image/jpeg\",\n                \"animation\": null,\n                \"datasize\": 105153,\n                \"size\": 105153,\n                \"md5\": \"dcc81896a89eae8863e6b03224ecf2d5\",\n                \"url\": \"https://misskey.m544.net/files/60df1c02bb951423e9c7d333/60df1c02bb951423e9c7d333.jpg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/60df1c02bb951423e9c7d333/60df1c02bb951423e9c7d333.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1080,\n                  \"height\": 863\n                },\n                \"comment\": null,\n                \"deletedAt\": \"2022-03-09T11:49:16.053Z\",\n                \"isSensitive\": false\n              }\n            ],\n            \"uri\": \"https://libera.tokyo/users/Punk1977_riot/statuses/106504472165318130\",\n            \"url\": \"https://libera.tokyo/@Punk1977_riot/106504472165318130\",\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"notHaveDecorationMfm\": true\n          },\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"628e0c6bdb958f55259fb7ce\",\n      \"username\": \"viva\",\n      \"name\": \"かのか\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62d6918e562661e08b7a2da4/62d6918e562661e08b7a2da4.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@viva\",\n      \"uri\": \"https://fedibird.com/users/viva\",\n      \"createdAt\": \"2022-05-25T11:00:59.605Z\",\n      \"updatedAt\": \"2022-07-20T03:25:44.599Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62b2fd4a5a51ed2ea4908ba1/62b2fd4a5a51ed2ea4908ba1.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"ベテランです。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"Tumblr\",\n          \"value\": \"https://nageboya.tumblr.com/archive\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 943,\n      \"pinnedNoteIds\": [\n        \"718201d36b28ae350b0a4aa8\",\n        \"7181322bd798f267fafa0a40\",\n        \"71813228fd20dbbdfb973907\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"718201d36b28ae350b0a4aa8\",\n          \"createdAt\": \"2022-07-15T12:26:49.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"https://music.youtube.com/watch?v=zqDztafQxFI&feature=share\",\n          \"cw\": null,\n          \"userId\": \"628e0c6bdb958f55259fb7ce\",\n          \"user\": {\n            \"id\": \"628e0c6bdb958f55259fb7ce\",\n            \"username\": \"viva\",\n            \"name\": \"かのか\",\n            \"host\": \"fedibird.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d6918e562661e08b7a2da4/62d6918e562661e08b7a2da4.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"fedibird.com\",\n              \"name\": \"Fedibird\",\n              \"softwareName\": \"fedibird\",\n              \"softwareVersion\": \"0.1\",\n              \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://fedibird.com/@viva\",\n            \"uri\": \"https://fedibird.com/users/viva\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://fedibird.com/users/viva/statuses/108651348580689677\",\n          \"url\": \"https://fedibird.com/@viva/108651348580689677\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181322bd798f267fafa0a40\",\n          \"createdAt\": \"2022-06-05T04:42:23.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"https://music.youtube.com/watch?v=QnKykvIp4Yg&feature=share\",\n          \"cw\": null,\n          \"userId\": \"628e0c6bdb958f55259fb7ce\",\n          \"user\": {\n            \"id\": \"628e0c6bdb958f55259fb7ce\",\n            \"username\": \"viva\",\n            \"name\": \"かのか\",\n            \"host\": \"fedibird.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d6918e562661e08b7a2da4/62d6918e562661e08b7a2da4.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"fedibird.com\",\n              \"name\": \"Fedibird\",\n              \"softwareName\": \"fedibird\",\n              \"softwareVersion\": \"0.1\",\n              \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://fedibird.com/@viva\",\n            \"uri\": \"https://fedibird.com/users/viva\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://fedibird.com/users/viva/statuses/108423029920119244\",\n          \"url\": \"https://fedibird.com/@viva/108423029920119244\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71813228fd20dbbdfb973907\",\n          \"createdAt\": \"2022-06-05T04:39:16.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"https://music.youtube.com/watch?v=y79Mi99fOQo&feature=share\",\n          \"cw\": null,\n          \"userId\": \"628e0c6bdb958f55259fb7ce\",\n          \"user\": {\n            \"id\": \"628e0c6bdb958f55259fb7ce\",\n            \"username\": \"viva\",\n            \"name\": \"かのか\",\n            \"host\": \"fedibird.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62d6918e562661e08b7a2da4/62d6918e562661e08b7a2da4.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"fedibird.com\",\n              \"name\": \"Fedibird\",\n              \"softwareName\": \"fedibird\",\n              \"softwareVersion\": \"0.1\",\n              \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://fedibird.com/@viva\",\n            \"uri\": \"https://fedibird.com/users/viva\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://fedibird.com/users/viva/statuses/108423017725654179\",\n          \"url\": \"https://fedibird.com/@viva/108423017725654179\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629a3451ec70d93c8b78af23\",\n      \"username\": \"hayao\",\n      \"name\": \"トロロのトトロ\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/629b874408d918aba68cce1c/629b874408d918aba68cce1c.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@hayao\",\n      \"uri\": \"https://submarin.online/users/91277ezluj\",\n      \"createdAt\": \"2022-06-03T16:18:25.284Z\",\n      \"updatedAt\": \"2022-07-20T07:02:22.329Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/629b874408d918aba68cce1b/629b874408d918aba68cce1b.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"Misskey始めてみました。\\n\\n総合リンク集: https://twecon.moons14.com/links/yJ6brGMgBO\",\n      \"profile\": {\n        \"birthday\": \"2004-08-19\",\n        \"location\": \"ウォールナッツ\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"Mail\",\n          \"value\": \"hayao@fascode.net\"\n        },\n        {\n          \"name\": \"Twitter（活動休止中）\",\n          \"value\": \"https://twitter.com/Hayao0819\"\n        },\n        {\n          \"name\": \"GitHub\",\n          \"value\": \"https://github.com/Hayao0819\"\n        },\n        {\n          \"name\": \"KeyBase\",\n          \"value\": \"https://keybase.io/hayao0819\"\n        },\n        {\n          \"name\": \"Instagram\",\n          \"value\": \"https://instagram.com/Hayao0819\"\n        },\n        {\n          \"name\": \"WebSite\",\n          \"value\": \"https://hayao.fascode.net/\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1559,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629b4fb508d918aba68caa5a\",\n      \"username\": \"sim1222\",\n      \"name\": \"こけっち\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/629b4fb608d918aba68caa5c/629b4fb608d918aba68caa5c.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@sim1222\",\n      \"uri\": \"https://submarin.online/users/90tsm2schb\",\n      \"createdAt\": \"2022-06-04T12:27:33.156Z\",\n      \"updatedAt\": \"2022-06-10T13:48:11.586Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"無\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"メイン\",\n          \"value\": \"@sim1222@misskey.io\"\n        },\n        {\n          \"name\": \"みがわり\",\n          \"value\": \"@_kokt@simkey.net\"\n        },\n        {\n          \"name\": \"ほか\",\n          \"value\": \"https://sim1222.com/\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 4,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629b359a08d918aba68c99b0\",\n      \"username\": \"InfinityBeyond\",\n      \"name\": \"Kⅰrⅰc₳  Lunⓓⓞ\",\n      \"host\": \"fedibird.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/629b359a08d918aba68c99b2/629b359a08d918aba68c99b2.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"fedibird.com\",\n        \"name\": \"Fedibird\",\n        \"softwareName\": \"fedibird\",\n        \"softwareVersion\": \"0.1\",\n        \"iconUrl\": \"https://fedibird.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://fedibird.com/@InfinityBeyond\",\n      \"uri\": \"https://fedibird.com/users/InfinityBeyond\",\n      \"createdAt\": \"2022-06-04T10:36:10.093Z\",\n      \"updatedAt\": \"2022-07-19T11:37:44.166Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/629b359a08d918aba68c99b3/629b359a08d918aba68c99b3.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"特別派遣打撃研究嚮導戦術組織”シボラ”\\n1等空佐 キリカ・ルンド室長\",\n      \"profile\": {\n        \"birthday\": \"1998-02-22\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 254,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"629495731ebc936be93a22c8\",\n      \"username\": \"va\",\n      \"name\": \"ゔぁ:weewoo:\",\n      \"host\": \"misskey.cf\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/629ea52aecaab29abd9a11d5/629ea52aecaab29abd9a11d5.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.cf\",\n        \"name\": \"misskey.cf\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://misskey.cf/favicon.ico\",\n        \"themeColor\": \"#6600cc\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"weewoo\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/r3osed3qt9ru98o45flnvygy.gif\",\n          \"host\": \"misskey.cf\",\n          \"resolvable\": \"weewoo@misskey.cf\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.cf/@va\",\n      \"uri\": \"https://misskey.cf/users/90vy7geqfg\",\n      \"createdAt\": \"2022-05-30T09:59:15.888Z\",\n      \"updatedAt\": \"2022-06-10T13:55:17.457Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62a1e649c1bf3037d863b96f/62a1e649c1bf3037d863b96f.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"こ　れ　い　じ　ょ　う　お　れ　を　ひ　て　い　し　な　い　で　。\\n\\nあ　な　た　に　こ　い　す　る　お　れ　は　つ　み　び　と　で　す　か　⁇\\n\\nこ　の　か　な　し　み　を　あ　な　た　が　み　た　し　て　く　れ　ま　す　か　⁇\\n\\nき　み　を　ま　っ　て　る　。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"いのちのおんじん。かんしゃしかない。\",\n          \"value\": \"@nana@misskey.cf\"\n        },\n        {\n          \"name\": \"ばなーとぷろふお揃い　彼岸はぷろふだけ\",\n          \"value\": \"@ky@misskey.cf @cu_@misskey.cf @_y@misskey.cf\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 175,\n      \"pinnedNoteIds\": [\n        \"7181145ad73ec979bfae3210\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181145ad73ec979bfae3210\",\n          \"createdAt\": \"2022-05-30T09:45:06.622Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"いきろといわれたらしにたくて\\nしねといわれたらいきたくて\\nでもけっきょくはきえたくて\\n #ゔぁ詩\",\n          \"cw\": null,\n          \"userId\": \"629495731ebc936be93a22c8\",\n          \"user\": {\n            \"id\": \"629495731ebc936be93a22c8\",\n            \"username\": \"va\",\n            \"name\": \"ゔぁ:weewoo:\",\n            \"host\": \"misskey.cf\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/629ea52aecaab29abd9a11d5/629ea52aecaab29abd9a11d5.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.cf\",\n              \"name\": \"misskey.cf\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://misskey.cf/favicon.ico\",\n              \"themeColor\": \"#6600cc\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"weewoo\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/r3osed3qt9ru98o45flnvygy.gif\",\n                \"host\": \"misskey.cf\",\n                \"resolvable\": \"weewoo@misskey.cf\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.cf/@va\",\n            \"uri\": \"https://misskey.cf/users/90vy7geqfg\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"ゔぁ詩\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.cf/notes/90w3zv3y05\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6294720571286afaaf1b0afd\",\n      \"username\": \"__\",\n      \"name\": null,\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/default-avatar.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@__\",\n      \"uri\": \"https://submarin.online/users/90vyszgwu0\",\n      \"createdAt\": \"2022-05-30T07:28:05.281Z\",\n      \"updatedAt\": \"2022-05-30T08:09:11.391Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 4,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6292d8fe1631e44cb887bc1b\",\n      \"username\": \"r0_o\",\n      \"name\": \"Lv.0b1000 機巧少女アーティフィシャル👾リンドウ🍫\",\n      \"host\": \"ward2.bouvardia.icu\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/6292d8fe1631e44cb887bc1c/6292d8fe1631e44cb887bc1c.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"ward2.bouvardia.icu\",\n        \"name\": \"bouvardia.icu(第二病棟)\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://ward2.bouvardia.icu/files/36ec729f-a32f-4920-b14c-7916407bbaff\",\n        \"themeColor\": \"#2f4f4f\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://ward2.bouvardia.icu/@r0_o\",\n      \"uri\": \"https://ward2.bouvardia.icu/users/90u6zb6rqg\",\n      \"createdAt\": \"2022-05-29T02:22:54.218Z\",\n      \"updatedAt\": \"2022-07-19T16:48:38.654Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/6294392871286afaaf1aec67/6294392871286afaaf1aec67.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"いいですか。くれぐれも幼女をえっちな目で見てはいけませんよ。どーとくに反してます。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1041,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6292b7ba1631e44cb887a919\",\n      \"username\": \"lapua\",\n      \"name\": \"らぷあ\",\n      \"host\": \"ward2.bouvardia.icu\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/6293337c102be1aef2ecb1e1/6293337c102be1aef2ecb1e1.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"ward2.bouvardia.icu\",\n        \"name\": \"bouvardia.icu(第二病棟)\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://ward2.bouvardia.icu/files/36ec729f-a32f-4920-b14c-7916407bbaff\",\n        \"themeColor\": \"#2f4f4f\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"misskey原神部\",\n        \"bouvardia飲酒部\"\n      ],\n      \"url\": \"https://ward2.bouvardia.icu/@lapua\",\n      \"uri\": \"https://ward2.bouvardia.icu/users/90u3e5vemc\",\n      \"createdAt\": \"2022-05-29T00:00:58.483Z\",\n      \"updatedAt\": \"2022-07-20T04:01:12.236Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"しお!\\nし、ス・ス・ド・ス・ス・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・ス・ド・\\n\\nward2.bouvardia.icu管理人。Twitterアンチ(過激派)。\\n\\n#misskey原神部 #bouvardia飲酒部\\n\\n隔離病棟→ここ\\n休日当番医(たまにいる)→ @lapuacase@kokonect.link\\n先代院長(～6/8)→ @lapua@bouvardia.icu\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 951,\n      \"pinnedNoteIds\": [\n        \"718183aa44cc104f9d2e35b3\",\n        \"71810dad9a693bec2e6c759e\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"718183aa44cc104f9d2e35b3\",\n          \"createdAt\": \"2022-06-21T00:29:42.988Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"bouvardia.icu(第一病棟)、閉鎖してから3週間ぐらいずっとnginxで410返してる状態なんだけどそろそろnginxサーバーのほうも閉じちゃって大丈夫かな\\n\\nというのも、最終的にはgithub pagesで「めっちゃ410っぽい画面だけどよく見るとステータスコードが410じゃないページ」に飛ぶようにしたいんだよな(金ねンだわ)(github pages色々調べてみたけどステータスコードの設定が無さそう)\",\n          \"cw\": null,\n          \"userId\": \"6292b7ba1631e44cb887a919\",\n          \"user\": {\n            \"id\": \"6292b7ba1631e44cb887a919\",\n            \"username\": \"lapua\",\n            \"name\": \"らぷあ\",\n            \"host\": \"ward2.bouvardia.icu\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/6293337c102be1aef2ecb1e1/6293337c102be1aef2ecb1e1.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"ward2.bouvardia.icu\",\n              \"name\": \"bouvardia.icu(第二病棟)\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://ward2.bouvardia.icu/files/36ec729f-a32f-4920-b14c-7916407bbaff\",\n              \"themeColor\": \"#2f4f4f\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"misskey原神部\",\n              \"bouvardia飲酒部\"\n            ],\n            \"url\": \"https://ward2.bouvardia.icu/@lapua\",\n            \"uri\": \"https://ward2.bouvardia.icu/users/90u3e5vemc\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://ward2.bouvardia.icu/notes/91qzud3gza\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71810dad9a693bec2e6c759e\",\n          \"createdAt\": \"2022-05-29T02:38:10.025Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"完全招待制Misskeyインスタンスward2.bouvardia.icu！テレビ初公開の病棟で取材班が見たものとは...！？\",\n          \"cw\": null,\n          \"userId\": \"6292b7ba1631e44cb887a919\",\n          \"user\": {\n            \"id\": \"6292b7ba1631e44cb887a919\",\n            \"username\": \"lapua\",\n            \"name\": \"らぷあ\",\n            \"host\": \"ward2.bouvardia.icu\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/6293337c102be1aef2ecb1e1/6293337c102be1aef2ecb1e1.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"ward2.bouvardia.icu\",\n              \"name\": \"bouvardia.icu(第二病棟)\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://ward2.bouvardia.icu/files/36ec729f-a32f-4920-b14c-7916407bbaff\",\n              \"themeColor\": \"#2f4f4f\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [\n              \"misskey原神部\",\n              \"bouvardia飲酒部\"\n            ],\n            \"url\": \"https://ward2.bouvardia.icu/@lapua\",\n            \"uri\": \"https://ward2.bouvardia.icu/users/90u3e5vemc\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 5,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"😇\": 2\n          },\n          \"reactionCounts\": {\n            \"😇\": 2\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"6292dc931631e44cb887bd8d\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"6292dc931631e44cb887bd8d\",\n              \"createdAt\": \"2022-05-29T02:38:11.554Z\",\n              \"name\": \"webpublic-26f98d3c-5d79-4c86-b4f5-c2ec1be03799.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"375f04986b6767ccf9b0cc6e57c4419c\",\n              \"url\": \"https://misskey.m544.net/files/6292dc931631e44cb887bd8d/6292dc931631e44cb887bd8d.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6292dc931631e44cb887bd8d/6292dc931631e44cb887bd8d.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 372,\n                \"height\": 396\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://ward2.bouvardia.icu/notes/90u9ayjtza\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6270535c04172ae5434da87b\",\n      \"username\": \"30250399\",\n      \"name\": \"ゾム兄💚💣（zm）\",\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c54a11ce8c2f8883c460f4/62c54a11ce8c2f8883c460f4.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@30250399\",\n      \"uri\": \"https://misskey.levome-dol.com/users/8zs79d3v5j\",\n      \"createdAt\": \"2022-05-02T21:55:40.306Z\",\n      \"updatedAt\": \"2022-07-17T07:46:06.731Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62c1493c861e8cdcf2eae7d0/62c1493c861e8cdcf2eae7d0.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"こんちゃー。ゾム兄💚💣（zm）でーす。\\nそんなに言うことないけど仲良くしてーな。\\nプロヒィを下に書いときまっせ（簡単に。）\\n名前　ゾム兄💚💣（zm）\\n性格　寂しがりや、甘えん坊\\n伝言　特に言うことない。\\n　　　たまにしかこんけど仲良くしてーな。\",\n      \"profile\": {\n        \"birthday\": \"2009-03-24\",\n        \"location\": \"広島出身（今も広島）\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 253,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6288d9e001ce8ae36801ead4\",\n      \"username\": \"succeed\",\n      \"name\": \"サクシード\",\n      \"host\": \"mstdn.jp\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c94c60366d47ba6cb3775d/62c94c60366d47ba6cb3775d.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"mstdn.jp\",\n        \"name\": \"mstdn.jp\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.4.6\",\n        \"iconUrl\": \"https://mstdn.jp/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://mstdn.jp/@succeed\",\n      \"uri\": \"https://mstdn.jp/users/succeed\",\n      \"createdAt\": \"2022-05-21T12:24:00.908Z\",\n      \"updatedAt\": \"2022-06-09T00:45:56.734Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/6288d9e001ce8ae36801ead6/6288d9e001ce8ae36801ead6.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 51,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"628cfae5396cb2c28bb56566\",\n      \"username\": \"s\",\n      \"name\": \"すてさん\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/628cfae5396cb2c28bb56568/628cfae5396cb2c28bb56568.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@s\",\n      \"uri\": \"https://submarin.online/users/90m70skdyq\",\n      \"createdAt\": \"2022-05-24T15:33:57.006Z\",\n      \"updatedAt\": \"2022-07-20T06:57:41.420Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"やる気のないプログラマーです。TLから言葉を学んでいます。\\nsubmarin.onlineを立てるのを支援しました。というかやりました。メンテはやってません。\\n\\n空リプを投げる時もあります。フォロリクはお気軽に...通したり弾いたりします。\\nVRC/音ゲー\\n\\nhttps://stesan.dev ホームページ(なにもない)\\nhttps://hmpf.club 無駄に広告が多いサイト\",\n      \"profile\": {\n        \"birthday\": \"2005-06-28\",\n        \"location\": \"ジ・インターネット\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"ツイッター\",\n          \"value\": \"https://twitter.com/terminaling\"\n        },\n        {\n          \"name\": \"io垢\",\n          \"value\": \"@s1@misskey.io\"\n        },\n        {\n          \"name\": \"吹っ飛んだio垢\",\n          \"value\": \"@s0@misskey.io\"\n        },\n        {\n          \"name\": \"おひとりさま\",\n          \"value\": \"@s@n-msk-exp.stesan.dev\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 16080,\n      \"pinnedNoteIds\": [\n        \"7181aaa0ccbcc9a75a2f71ca\",\n        \"718104b4f4367079b088bb53\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181aaa0ccbcc9a75a2f71ca\",\n          \"createdAt\": \"2022-06-28T14:04:33.852Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"もっぱら鍵です\",\n          \"cw\": null,\n          \"userId\": \"628cfae5396cb2c28bb56566\",\n          \"user\": {\n            \"id\": \"628cfae5396cb2c28bb56566\",\n            \"username\": \"s\",\n            \"name\": \"すてさん\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/628cfae5396cb2c28bb56568/628cfae5396cb2c28bb56568.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@s\",\n            \"uri\": \"https://submarin.online/users/90m70skdyq\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/921t1870vs\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"718104b4f4367079b088bb53\",\n          \"createdAt\": \"2022-05-27T08:49:36.822Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"ツイッターで廃人をやっていたらMisskeyに飲み込まれた人です。\",\n          \"cw\": null,\n          \"userId\": \"628cfae5396cb2c28bb56566\",\n          \"user\": {\n            \"id\": \"628cfae5396cb2c28bb56566\",\n            \"username\": \"s\",\n            \"name\": \"すてさん\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/628cfae5396cb2c28bb56568/628cfae5396cb2c28bb56568.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": true,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@s\",\n            \"uri\": \"https://submarin.online/users/90m70skdyq\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/90rroxtiua\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"628c1bd8396cb2c28bb4e184\",\n      \"username\": \"HiSubway\",\n      \"name\": \"さぶうぇいさんたろう\",\n      \"host\": \"submarin.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/628c1bd9396cb2c28bb4e189/628c1bd9396cb2c28bb4e189.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"submarin.online\",\n        \"name\": \"Submarin\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.117.0\",\n        \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n        \"themeColor\": \"#41adef\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://submarin.online/@HiSubway\",\n      \"uri\": \"https://submarin.online/users/90mlc9odz6\",\n      \"createdAt\": \"2022-05-23T23:42:16.139Z\",\n      \"updatedAt\": \"2022-07-20T06:27:18.248Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/6292a8196d8e46d727a3da73/6292a8196d8e46d727a3da73.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"[Submarin.online](https://submarin.online/)は新規登録受付中です\",\n      \"profile\": {\n        \"birthday\": \"2022-05-24\",\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"🌐\",\n          \"value\": \"https://hisubway.online/\"\n        },\n        {\n          \"name\": \"🕊\",\n          \"value\": \"https://twitter.com/hisubway\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 3678,\n      \"pinnedNoteIds\": [\n        \"71819f8ee3ddd71637ea049b\",\n        \"718122702e3c1258fcb88b88\",\n        \"7181082b42cd7486c3d19509\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71819f8ee3ddd71637ea049b\",\n          \"createdAt\": \"2022-06-26T10:29:10.749Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"Misskeyプラグイン一覧ページ完成した\\nこれでもう探し回らなくても大丈夫\\nhttps://hisubway.online/articles/misskeyplugins/\",\n          \"cw\": null,\n          \"userId\": \"628c1bd8396cb2c28bb4e184\",\n          \"user\": {\n            \"id\": \"628c1bd8396cb2c28bb4e184\",\n            \"username\": \"HiSubway\",\n            \"name\": \"さぶうぇいさんたろう\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/628c1bd9396cb2c28bb4e189/628c1bd9396cb2c28bb4e189.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@HiSubway\",\n            \"uri\": \"https://submarin.online/users/90mlc9odz6\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 12,\n          \"renoteCount\": 6,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":eyes_fidgeting@misskey.io:\": 2,\n            \"🎉\": 3,\n            \":igyou@submarin.online:\": 1\n          },\n          \"reactionCounts\": {\n            \":eyes_fidgeting@misskey.io:\": 2,\n            \"🎉\": 3,\n            \":igyou@submarin.online:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"eyes_fidgeting@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/nt79symyl0hy2h1fib73stcx.gif\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"eyes_fidgeting@misskey.io\"\n            },\n            {\n              \"name\": \"igyou@submarin.online\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/xxztoyqptuebww4754alr1iu.png\",\n              \"host\": \"submarin.online\",\n              \"resolvable\": \"igyou@submarin.online\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/91yqgjbx5o\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"718122702e3c1258fcb88b88\",\n          \"createdAt\": \"2022-06-02T03:23:06.172Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"Mastodon日本語Wikiを普通に見られるようにした\\nあとでもうちょい手直しするけどとりあえず使える\\nhttps://hisubway.online/articles/mstdnwiki/\",\n          \"cw\": null,\n          \"userId\": \"628c1bd8396cb2c28bb4e184\",\n          \"user\": {\n            \"id\": \"628c1bd8396cb2c28bb4e184\",\n            \"username\": \"HiSubway\",\n            \"name\": \"さぶうぇいさんたろう\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/628c1bd9396cb2c28bb4e189/628c1bd9396cb2c28bb4e189.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@HiSubway\",\n            \"uri\": \"https://submarin.online/users/90mlc9odz6\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 22,\n          \"renoteCount\": 13,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":erait@mk2.toyoko.in:\": 1,\n            \":arigatofes@misskey.io:\": 3,\n            \":blob_idea@ward2.bouvardia.icu:\": 1,\n            \":erait@.:\": 2,\n            \":erait@misskey.io:\": 1,\n            \"😮\": 1,\n            \":miyano_yay@misskey.io:\": 1\n          },\n          \"reactionCounts\": {\n            \":erait@mk2.toyoko.in:\": 1,\n            \":arigatofes@misskey.io:\": 3,\n            \":blob_idea@ward2.bouvardia.icu:\": 1,\n            \":erait@.:\": 2,\n            \":erait@misskey.io:\": 1,\n            \"😮\": 1,\n            \":miyano_yay@misskey.io:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"erait@mk2.toyoko.in\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/laccemnihu8krsuaqrkdg0vg.png\",\n              \"host\": \"mk2.toyoko.in\",\n              \"resolvable\": \"erait@mk2.toyoko.in\"\n            },\n            {\n              \"name\": \"arigatofes@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/7xkwrm3abgkszpo3fyeo0dle.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"arigatofes@misskey.io\"\n            },\n            {\n              \"name\": \"blob_idea@ward2.bouvardia.icu\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/5jihmthd241ao79wqbjsc4l0.png\",\n              \"host\": \"ward2.bouvardia.icu\",\n              \"resolvable\": \"blob_idea@ward2.bouvardia.icu\"\n            },\n            {\n              \"name\": \"erait@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/s7y8a8ra9ynecaj85ljjl6oh.png\",\n              \"host\": null,\n              \"resolvable\": \"erait\"\n            },\n            {\n              \"name\": \"erait@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/3dokragva6y3jlz9mkcnabnl.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"erait@misskey.io\"\n            },\n            {\n              \"name\": \"miyano_yay@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/hc376he9q1rnfs6072kxlh09.apng\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"miyano_yay@misskey.io\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/9100o5ks8v\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181082b42cd7486c3d19509\",\n          \"createdAt\": \"2022-05-28T00:57:41.837Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"[Submarin.online](https://submarin.online)は新規登録受付中です\",\n          \"cw\": null,\n          \"userId\": \"628c1bd8396cb2c28bb4e184\",\n          \"user\": {\n            \"id\": \"628c1bd8396cb2c28bb4e184\",\n            \"username\": \"HiSubway\",\n            \"name\": \"さぶうぇいさんたろう\",\n            \"host\": \"submarin.online\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/628c1bd9396cb2c28bb4e189/628c1bd9396cb2c28bb4e189.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"submarin.online\",\n              \"name\": \"Submarin\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.117.0\",\n              \"iconUrl\": \"https://submarin.online/files/544e7e94-ed29-4860-b919-f1102027ab3a\",\n              \"themeColor\": \"#41adef\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://submarin.online/@HiSubway\",\n            \"uri\": \"https://submarin.online/users/90mlc9odz6\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 7,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":shitenainoha_omaedake@misskey.io:\": 5\n          },\n          \"reactionCounts\": {\n            \":shitenainoha_omaedake@misskey.io:\": 5\n          },\n          \"emojis\": [\n            {\n              \"name\": \"shitenainoha_omaedake@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/1atkuuaqcjfwali0xtkdj94d.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"shitenainoha_omaedake@misskey.io\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://submarin.online/notes/90sq9wi54n\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"628c7285995247bdc84703e8\",\n      \"username\": \"humika\",\n      \"name\": \"山崎　蒼　（仮）\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/gaq7ld9nl47fck4qni2iyxkt.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2022-05-24T05:52:05.225Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/6zwvvisnwrp05u6npjfr46qv.png\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"日々の出来事を書くよぅ☆彡\\nたまにマイナス発言するかもしれないよぅ(´;ω;｀)\\nだからポジティブな人フォローヨロです(*- -)(*_ _)\\n夜は最高１時まで起きたことがあるよぅ( ˘ω˘ )\",\n      \"profile\": {\n        \"birthday\": \"2008-07-30\",\n        \"location\": \"アリエル\"\n      },\n      \"fields\": [],\n      \"followersCount\": 4,\n      \"followingCount\": 6,\n      \"notesCount\": 0,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6289ac8e97f814bdd59b14d3\",\n      \"username\": \"Nyalaxy\",\n      \"name\": \"ルミ\",\n      \"host\": \"msk.hoshisaki-h.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/628ccb32396cb2c28bb548c2/628ccb32396cb2c28bb548c2.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"msk.hoshisaki-h.com\",\n        \"name\": \"ほしさき～n代目\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://msk.hoshisaki-h.com/favicon.ico\",\n        \"themeColor\": \"#F0F8FF\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://msk.hoshisaki-h.com/@Nyalaxy\",\n      \"uri\": \"https://msk.hoshisaki-h.com/users/90k9wj91r0\",\n      \"createdAt\": \"2022-05-22T03:22:54.703Z\",\n      \"updatedAt\": \"2022-07-19T13:46:50.917Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"アカウント消しすぎの人です()\",\n      \"profile\": {\n        \"birthday\": \"1919-08-10\",\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"https://twitter.com/_XZ1c\"\n        },\n        {\n          \"name\": \"魔境\",\n          \"value\": \"@rumi@machikadon.online\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 648,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"616a62e7c34998bb9ea1567c\",\n      \"username\": \"rena_\",\n      \"name\": \"玲奈.\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/toxdsqicjtoe3iwdyi36a2dr.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2021-10-16T05:28:07.767Z\",\n      \"updatedAt\": \"2022-05-20T21:17:48.394Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": \"2005-06-13\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": 10,\n      \"followingCount\": 9,\n      \"notesCount\": 28,\n      \"pinnedNoteIds\": [\n        \"7180dcaf2706fa89632c74d4\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7180dcaf2706fa89632c74d4\",\n          \"createdAt\": \"2022-05-19T14:18:27.974Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"何かしら反応して\",\n          \"cw\": null,\n          \"userId\": \"616a62e7c34998bb9ea1567c\",\n          \"user\": {\n            \"id\": \"616a62e7c34998bb9ea1567c\",\n            \"username\": \"rena_\",\n            \"name\": \"玲奈.\",\n            \"host\": null,\n            \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/toxdsqicjtoe3iwdyi36a2dr.jpg\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"borderColor\": null,\n            \"instance\": null,\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": null,\n            \"uri\": null\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 4,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"❤\": 1,\n            \":blobreach@.:\": 1,\n            \":gomamayo@.:\": 1,\n            \":koishi_smug@.:\": 1\n          },\n          \"reactionCounts\": {\n            \"❤\": 1,\n            \":blobreach@.:\": 1,\n            \":gomamayo@.:\": 1,\n            \":koishi_smug@.:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"blobreach@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/b2h9yuanjljapedx3ciyf25i.png\",\n              \"host\": null,\n              \"resolvable\": \"blobreach\",\n              \"direction\": \"left\"\n            },\n            {\n              \"name\": \"gomamayo@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/m3ho7hr9gngy3ftfxd1gq274.png\",\n              \"host\": null,\n              \"resolvable\": \"gomamayo\"\n            },\n            {\n              \"name\": \"koishi_smug@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/icgnkmlfv0t8gpnd818uwmpq.png\",\n              \"host\": null,\n              \"resolvable\": \"koishi_smug\",\n              \"direction\": \"right\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": null,\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62870c6e5fdf7058a38840a0\",\n      \"username\": \"Erude\",\n      \"name\": \"Reachability Improver\",\n      \"host\": \"novoa.nagoya\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62870c6f5fdf7058a38840a1/62870c6f5fdf7058a38840a1.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"novoa.nagoya\",\n        \"name\": \"Novoa\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.112.3\",\n        \"iconUrl\": \"https://arca.novoa.nagoya/icons/novoA-sdr-mini.png\",\n        \"themeColor\": \"#0cffca\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://novoa.nagoya/@Erude\",\n      \"uri\": \"https://novoa.nagoya/users/8ytmrf1z5m\",\n      \"createdAt\": \"2022-05-20T03:35:10.104Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": \"https://misskey.m544.net/files/62870c6f5fdf7058a38840a2/62870c6f5fdf7058a38840a2?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"Because Relays fucking SUCK and clog the database.\\n\\nSe pronuncia en español.\\n\\nDo not follow.\",\n      \"profile\": {\n        \"birthday\": \"2048-06-02\",\n        \"location\": \"Novoa\"\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5c9ca943767a87573a40891c\",\n      \"username\": \"RRRB_P\",\n      \"name\": \"れるらば(Pawoo)\",\n      \"host\": \"pawoo.net\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/627a13bbf94eb69041768620/627a13bbf94eb69041768620.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"pawoo.net\",\n        \"name\": \"Pawoo\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.2.2\",\n        \"iconUrl\": \"https://pawoo.net/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://pawoo.net/@RRRB_P\",\n      \"uri\": \"https://pawoo.net/users/RRRB_P\",\n      \"createdAt\": null,\n      \"updatedAt\": \"2022-07-16T18:58:39.518Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62b83273c4e9e9c412dba9e5/62b83273c4e9e9c412dba9e5.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"Twitterはやってません。\\nFedibird不調時などに使用します。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"ほしいものリスト\",\n          \"value\": \"https://www.amazon.co.jp/registry/wishlist/2X5474Y5M8R6G/ref=cm_sw_r_cp_ep_ws_V09fBb0MTVN38\"\n        },\n        {\n          \"name\": \"RailSimPI公開サイト\",\n          \"value\": \"https://jyouban6101.wixsite.com/reruraba-rs\"\n        },\n        {\n          \"name\": \"誕生日と年齢\",\n          \"value\": \"1999/10/24生まれ 21歳\"\n        },\n        {\n          \"name\": \"Fedibird\",\n          \"value\": \"https://fedibird.com/@RRRB_F\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1961,\n      \"pinnedNoteIds\": [\n        \"716da1d3564836845d8da9e0\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"716da1d3564836845d8da9e0\",\n          \"createdAt\": \"2019-10-06T16:07:25.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"【固定用】\\nRailSimプラグイン作ったりコスプレしたり提督したりマスターしたりする鉄オタです。\\n#自己紹介\",\n          \"cw\": null,\n          \"userId\": \"5c9ca943767a87573a40891c\",\n          \"user\": {\n            \"id\": \"5c9ca943767a87573a40891c\",\n            \"username\": \"RRRB_P\",\n            \"name\": \"れるらば(Pawoo)\",\n            \"host\": \"pawoo.net\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/627a13bbf94eb69041768620/627a13bbf94eb69041768620.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"pawoo.net\",\n              \"name\": \"Pawoo\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.2.2\",\n              \"iconUrl\": \"https://pawoo.net/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://pawoo.net/@RRRB_P\",\n            \"uri\": \"https://pawoo.net/users/RRRB_P\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"自己紹介\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"5d9a102e2e49b05bb22e6ca9\",\n            \"5d9a10502e49b05bb22e6d1e\",\n            \"5d9a102e2e49b05bb22e6cad\",\n            \"5d9a102e2e49b05bb22e6cab\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"5d9a102e2e49b05bb22e6ca9\",\n              \"createdAt\": \"2019-10-06T16:02:54.091Z\",\n              \"name\": \"62803fe13fb1216d.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 213265,\n              \"size\": 213265,\n              \"md5\": \"bf39e0d4ee53b8efbc600579de7b750e\",\n              \"url\": \"https://misskey.m544.net/files/5d9a102e2e49b05bb22e6ca9/5d9a102e2e49b05bb22e6ca9.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/5d9a102e2e49b05bb22e6ca9/5d9a102e2e49b05bb22e6ca9.jpg?thumbnail\",\n              \"properties\": {},\n              \"deletedAt\": \"2019-10-14T16:17:52.903Z\"\n            },\n            {\n              \"id\": \"5d9a10502e49b05bb22e6d1e\",\n              \"createdAt\": \"2019-10-06T16:03:28.949Z\",\n              \"name\": \"032b5291049439a7.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 261183,\n              \"size\": 261183,\n              \"md5\": \"6b2e5b7ff4e4c0863b40db4defccbb5a\",\n              \"url\": \"https://misskey.m544.net/files/5d9a10502e49b05bb22e6d1e/5d9a10502e49b05bb22e6d1e.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/5d9a10502e49b05bb22e6d1e/5d9a10502e49b05bb22e6d1e.jpg?thumbnail\",\n              \"properties\": {},\n              \"deletedAt\": \"2019-10-14T16:17:52.965Z\"\n            },\n            {\n              \"id\": \"5d9a102e2e49b05bb22e6cad\",\n              \"createdAt\": \"2019-10-06T16:02:54.834Z\",\n              \"name\": \"07ef723812120421.png\",\n              \"type\": \"image/png\",\n              \"datasize\": 1109936,\n              \"size\": 1109936,\n              \"md5\": \"a7cb0b0434cbc8eca9652914d8cb2402\",\n              \"url\": \"https://misskey.m544.net/files/5d9a102e2e49b05bb22e6cad/5d9a102e2e49b05bb22e6cad.png?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/5d9a102e2e49b05bb22e6cad/5d9a102e2e49b05bb22e6cad.png?thumbnail\",\n              \"properties\": {},\n              \"deletedAt\": \"2019-10-14T16:17:52.945Z\"\n            },\n            {\n              \"id\": \"5d9a102e2e49b05bb22e6cab\",\n              \"createdAt\": \"2019-10-06T16:02:54.473Z\",\n              \"name\": \"95b210d3e35296b8.jpg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 178807,\n              \"size\": 178807,\n              \"md5\": \"8e1bc1490401da53d2f7bbd80622bfb6\",\n              \"url\": \"https://misskey.m544.net/files/5d9a102e2e49b05bb22e6cab/5d9a102e2e49b05bb22e6cab.jpg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/5d9a102e2e49b05bb22e6cab/5d9a102e2e49b05bb22e6cab.jpg?thumbnail\",\n              \"properties\": {},\n              \"deletedAt\": \"2019-10-14T16:17:52.924Z\"\n            }\n          ],\n          \"uri\": \"https://pawoo.net/users/RRRB_P/statuses/102916295600505837\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": false\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6243ccaa2257aa17537db0c1\",\n      \"username\": \"yui\",\n      \"name\": \"烏丸ゆい@鯖缶\",\n      \"host\": \"chillout.chat\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/6243ccaa2257aa17537db0c3/6243ccaa2257aa17537db0c3.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"chillout.chat\",\n        \"name\": \"Chillout Chat\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.4.4\",\n        \"iconUrl\": \"https://chillout.chat/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://chillout.chat/@yui\",\n      \"uri\": \"https://chillout.chat/users/yui\",\n      \"createdAt\": \"2022-03-30T03:21:14.212Z\",\n      \"updatedAt\": \"2022-07-18T21:35:13.086Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/6299f070ec70d93c8b7884a2/6299f070ec70d93c8b7884a2.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"本業高校生・副業鯖缶\\n\\n▷ https://chillout.chat の2代目技術担当です。サーバーの管理や独自機能の実装に携わっています。\\n\\n▷ 安全性重視の Misskey (Mei v11) フォーク \\\"Areionskey\\\" のコラボレーターです。\\n\\n▷ ヘッダー画像はスコリア丘で有名な大室山 (静岡県伊東市) の山頂で撮影しました。\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"Website\",\n          \"value\": \"https://yui.ryoku.chat (工事中)\"\n        },\n        {\n          \"name\": \"GitHub\",\n          \"value\": \"https://github.com/yui87\"\n        },\n        {\n          \"name\": \"Matrix\",\n          \"value\": \"@yui87:matrix.org\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 160,\n      \"pinnedNoteIds\": [\n        \"717fd51791b0ad973f7cd9e8\",\n        \"718210629b5046dcdea133de\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"717fd51791b0ad973f7cd9e8\",\n          \"createdAt\": \"2022-03-29T09:52:46.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"( っ'-')╮ =͟͟͞͞  🍵 🍵 🍵\",\n          \"cw\": null,\n          \"userId\": \"6243ccaa2257aa17537db0c1\",\n          \"user\": {\n            \"id\": \"6243ccaa2257aa17537db0c1\",\n            \"username\": \"yui\",\n            \"name\": \"烏丸ゆい@鯖缶\",\n            \"host\": \"chillout.chat\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/6243ccaa2257aa17537db0c3/6243ccaa2257aa17537db0c3.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"chillout.chat\",\n              \"name\": \"Chillout Chat\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.4.4\",\n              \"iconUrl\": \"https://chillout.chat/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://chillout.chat/@yui\",\n            \"uri\": \"https://chillout.chat/users/yui\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"home\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://chillout.chat/users/yui/statuses/108039213294514362\",\n          \"url\": \"https://chillout.chat/@yui/108039213294514362\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"718210629b5046dcdea133de\",\n          \"createdAt\": \"2022-07-18T08:17:54.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"■ M PLUS 1p と Inter を合成した日本語 TrueType フォント \\\"Motomachi\\\" を公開しました。簡単に使える Web フォント版も提供しています。\\nhttps://motomachi.ryoku.chat/\",\n          \"cw\": null,\n          \"userId\": \"6243ccaa2257aa17537db0c1\",\n          \"user\": {\n            \"id\": \"6243ccaa2257aa17537db0c1\",\n            \"username\": \"yui\",\n            \"name\": \"烏丸ゆい@鯖缶\",\n            \"host\": \"chillout.chat\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/6243ccaa2257aa17537db0c3/6243ccaa2257aa17537db0c3.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"chillout.chat\",\n              \"name\": \"Chillout Chat\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.4.4\",\n              \"iconUrl\": \"https://chillout.chat/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://chillout.chat/@yui\",\n            \"uri\": \"https://chillout.chat/users/yui\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62d51734d58db765404d38aa\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62d51734d58db765404d38aa\",\n              \"createdAt\": \"2022-07-18T08:17:56.086Z\",\n              \"name\": \"28d0ccf7f53d95ca.png\",\n              \"type\": \"image/png\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"7c836c0ef5a42f85779b664e008c187f\",\n              \"url\": \"https://misskey.m544.net/files/62d51734d58db765404d38aa/62d51734d58db765404d38aa.png?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/62d51734d58db765404d38aa/62d51734d58db765404d38aa.png?thumbnail\",\n              \"properties\": {\n                \"width\": 1920,\n                \"height\": 1080\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://chillout.chat/users/yui/statuses/108667356762648215\",\n          \"url\": \"https://chillout.chat/@yui/108667356762648215\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6258006fa12b928da4256b59\",\n      \"username\": \"nek\",\n      \"name\": \"ねこ㌨in娘娘星\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/yd61o7qhtnce732axorbilen.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2022-04-14T11:07:27.288Z\",\n      \"updatedAt\": \"2022-07-07T10:10:15.757Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/kvbe1fe965ovcohmm316ezic.png\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"\\nちは、ねこっす。\\nたぶんすぐ消えると思うんで、\\n僕は娘娘星からきたのだ\\nよろしくなのだ\\n休み期間長いのが僕の特性\\n\\n料理ちょーにがて\\nあ、\\nお菓子作るのは得意( ･´ｰ･｀)\\n\\n落ちるとき、ぐっどないとだぜって言います\\n中2．♀．可愛いものがお好き\",\n      \"profile\": {\n        \"birthday\": \"2008-10-08\",\n        \"location\": \"娘娘星\"\n      },\n      \"fields\": [],\n      \"followersCount\": 6,\n      \"followingCount\": 8,\n      \"notesCount\": 34,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"626cfbbb7daa76b8f7fce736\",\n      \"username\": \"me\",\n      \"name\": \"falsycat\",\n      \"host\": \"falsy.cat\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/627215ddf63d46b2a86c0ca1/627215ddf63d46b2a86c0ca1.blob?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"falsy.cat\",\n        \"name\": \"falsy.cat\",\n        \"softwareName\": \"pleroma\",\n        \"softwareVersion\": \"2.4.2\",\n        \"iconUrl\": \"https://falsy.cat/favicon.png\",\n        \"themeColor\": null\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://falsy.cat/users/me\",\n      \"uri\": \"https://falsy.cat/users/me\",\n      \"createdAt\": \"2022-04-30T09:04:59.455Z\",\n      \"updatedAt\": \"2022-07-20T03:55:41.098Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/627215ddf63d46b2a86c0ca2/627215ddf63d46b2a86c0ca2.JPG?web\",\n      \"bannerColor\": null,\n      \"isLocked\": true,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"鍵ですが変な人以外は承認します．\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"GitHub\",\n          \"value\": \"https://github.com/falsycat\"\n        },\n        {\n          \"name\": \"LiveStream\",\n          \"value\": \"https://live.falsy.cat/\"\n        },\n        {\n          \"name\": \"misskey.io\",\n          \"value\": \"https://misskey.io/@falsy\"\n        },\n        {\n          \"name\": \"chess.com\",\n          \"value\": \"https://www.chess.com/member/falsycat\"\n        },\n        {\n          \"name\": \"blog\",\n          \"value\": \"https://note.falsy.cat/\"\n        },\n        {\n          \"name\": \"YouTube\",\n          \"value\": \"https://www.youtube.com/channel/UCIdrwoVVBFewmAzndxQ1ESg\"\n        },\n        {\n          \"name\": \"Gitea\",\n          \"value\": \"https://git.falsy.cat/me\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 9,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"61d361b49aa54145d026cd01\",\n      \"username\": \"prodbyashy\",\n      \"name\": \"Ashy\",\n      \"host\": \"helladoge.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/6203c67d274478e0956732aa/6203c67d274478e0956732aa.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"helladoge.com\",\n        \"name\": \"HellaDoge\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.4.1\",\n        \"iconUrl\": \"https://helladoge.com/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://helladoge.com/@prodbyashy\",\n      \"uri\": \"https://helladoge.com/users/prodbyashy\",\n      \"createdAt\": \"2022-01-03T20:51:00.970Z\",\n      \"updatedAt\": \"2022-05-21T09:50:59.939Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/6203c67e274478e0956732ad/6203c67e274478e0956732ad.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"My Instagram: https://www.instagram.com/prodbyashy_/\\n\\nMy Soundcloud: https://soundcloud.com/ashy0111\\n\\nMusic Producer Form North Side\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 362,\n      \"pinnedNoteIds\": [\n        \"717e4a85a2b80f381e4da469\",\n        \"717e24908898ccddc51ba9eb\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"717e4a85a2b80f381e4da469\",\n          \"createdAt\": \"2022-01-11T19:02:59.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"fallow = fallow 💞\",\n          \"cw\": null,\n          \"userId\": \"61d361b49aa54145d026cd01\",\n          \"user\": {\n            \"id\": \"61d361b49aa54145d026cd01\",\n            \"username\": \"prodbyashy\",\n            \"name\": \"Ashy\",\n            \"host\": \"helladoge.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/6203c67d274478e0956732aa/6203c67d274478e0956732aa.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"helladoge.com\",\n              \"name\": \"HellaDoge\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.4.1\",\n              \"iconUrl\": \"https://helladoge.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://helladoge.com/@prodbyashy\",\n            \"uri\": \"https://helladoge.com/users/prodbyashy\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://helladoge.com/users/prodbyashy/statuses/107605378973665131\",\n          \"url\": \"https://helladoge.com/@prodbyashy/107605378973665131\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717e24908898ccddc51ba9eb\",\n          \"createdAt\": \"2022-01-04T10:09:19.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"https://t.me/ashy_011\",\n          \"cw\": null,\n          \"userId\": \"61d361b49aa54145d026cd01\",\n          \"user\": {\n            \"id\": \"61d361b49aa54145d026cd01\",\n            \"username\": \"prodbyashy\",\n            \"name\": \"Ashy\",\n            \"host\": \"helladoge.com\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/6203c67d274478e0956732aa/6203c67d274478e0956732aa.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"helladoge.com\",\n              \"name\": \"HellaDoge\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.4.1\",\n              \"iconUrl\": \"https://helladoge.com/favicon.ico\",\n              \"themeColor\": \"#282c37\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://helladoge.com/@prodbyashy\",\n            \"uri\": \"https://helladoge.com/users/prodbyashy\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://helladoge.com/users/prodbyashy/statuses/107563644305041333\",\n          \"url\": \"https://helladoge.com/@prodbyashy/107563644305041333\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"6280c19c7b642fba1025b517\",\n      \"username\": \"melt_adzuki\",\n      \"name\": \"あずきゃ⪥™\",\n      \"host\": \"miss.nem.one\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/6280c19c7b642fba1025b51a/6280c19c7b642fba1025b51a.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"instance\": {\n        \"host\": \"miss.nem.one\",\n        \"name\": \"ろむ猫のお部屋\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.111.1-nem-v04\",\n        \"iconUrl\": \"https://miss.nem.one/files/fd1e0579-ddd9-4a8c-b940-240b91fce2cf\",\n        \"themeColor\": \"#7f6665\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://miss.nem.one/@melt_adzuki\",\n      \"uri\": \"https://miss.nem.one/users/8zwm4xvyfm\",\n      \"createdAt\": \"2022-05-15T09:02:20.361Z\",\n      \"updatedAt\": \"2022-07-18T15:07:37.195Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/6280c19c7b642fba1025b51b/6280c19c7b642fba1025b51b.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"A magic that makes everything simple\\nろむねこちゃんがだいすきです\",\n      \"profile\": {\n        \"birthday\": \"2003-09-10\",\n        \"location\": \"%HOMEPATH%\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"Twitter\",\n          \"value\": \"https://twitter.com/melt_adzuki\"\n        },\n        {\n          \"name\": \"GitHub\",\n          \"value\": \"https://github.com/melt-adzuki\"\n        },\n        {\n          \"name\": \"ぬるにゃ\",\n          \"value\": \"@nya@nca10.net\"\n        },\n        {\n          \"name\": \"りらちゃ\",\n          \"value\": \"@lila@nca.aqualitore-lily.com\"\n        },\n        {\n          \"name\": \"ろむにゃ\",\n          \"value\": \"@_@miss.nem.one\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 2216,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"624ae84842b5e20eea88ad57\",\n      \"username\": \"nontan\",\n      \"name\": \"蘭楼\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/yggqxn3ulpfvob8tj2b2z1zl.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2022-04-04T12:44:56.403Z\",\n      \"updatedAt\": \"2022-05-15T08:13:33.429Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/7bpof9lptgk5apkm8c00m9oy.jpg\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"よろしく,\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": 6,\n      \"followingCount\": 6,\n      \"notesCount\": 56,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62359cde3a4d387fcc429897\",\n      \"username\": \"Nakamichisan\",\n      \"name\": \"Nakamura Midori\",\n      \"host\": \"mastodon.social\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"mastodon.social\",\n        \"name\": \"Mastodon\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n        \"themeColor\": \"#6364FF\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://mastodon.social/@Nakamichisan\",\n      \"uri\": \"https://mastodon.social/users/Nakamichisan\",\n      \"createdAt\": \"2022-03-19T09:05:34.858Z\",\n      \"updatedAt\": \"2022-07-19T21:07:10.694Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/62359ce23a4d387fcc4298a0/62359ce23a4d387fcc4298a0.jpeg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"twitter→引退済😭😭\\nこれからはこっちで色々綴って行きたいです...(^_^;)💦\\n大阪生まれｸﾞﾝﾏｰ育ち.\\ntwitterで知り合った彼と2017年ｺﾞｰﾙｲﾝ→❝不思議な導き❞により大阪民に!\\n(※尚【実家】→❝関西に移転済み❞なので,北関東に行く機会は殆ど無くなっちゃいました...(T_T)💦)\\n夫婦揃って彼方此方撮りに行くのが好き.\\n❝茨木ｷﾘｽﾄ福音教会❞に夫婦でお世話になってる福音派信徒.\\n公共交通(鉄道/ﾊﾞｽ/旅客機/ﾌｪﾘｰ)･防災無線･近代建築･ﾚﾄﾛ看板･野鳥等を撮影するのが趣味.\\nｸﾗｼｯｸ音楽(主に仏近代)･映画鑑賞も好物.\\n森見登美彦作品･鉄むす･ｽｸﾗﾝ･けいおん!･CUE!･ﾌﾟﾗｵﾚ･高木さん大好き😍💕\\n(※最近❝ﾃﾞﾘｼｬｽﾊﾟｰﾃｨｰﾌﾟﾘｷｭｱ❞に夫婦でﾊﾏっております---(゜o゜;‼\\nﾌﾟﾘｷｭｱｼﾘｰｽﾞは勿論ですが,ｱｲｶﾂ･ぴちぴちﾋﾟｯﾁ･ｶﾞﾙ学等の❝女児ｱﾆ❞が好物なので,ｱﾆﾒ関連tweetもちょく×②します🍵✨)\\n今はもう引退済みですが【pop'n】→❝一条司令&ﾎﾟｴｯﾄ推し❞です(^_-)-☆\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 911,\n      \"pinnedNoteIds\": [\n        \"7180945b6fb0b3e029bc9074\",\n        \"718013c302c813826fd0c61a\",\n        \"717fcba4f98834432b96f5f2\",\n        \"717fc6638bd84f6c09b372b8\",\n        \"717fbc412f9893b726efbddb\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7180945b6fb0b3e029bc9074\",\n          \"createdAt\": \"2022-05-05T13:14:22.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"先先月末に撮ったHS.\\n(kt君しょんぼりやった...(^_^;)💦)\\n#ixy #canon #阪神電車 #hanshintigers #武庫川駅\",\n          \"cw\": null,\n          \"userId\": \"62359cde3a4d387fcc429897\",\n          \"user\": {\n            \"id\": \"62359cde3a4d387fcc429897\",\n            \"username\": \"Nakamichisan\",\n            \"name\": \"Nakamura Midori\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@Nakamichisan\",\n            \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"IXY\",\n            \"canon\",\n            \"阪神電車\",\n            \"hanshintigers\",\n            \"武庫川駅\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"627441d769c1b8077caecce3\",\n            \"627441d869c1b8077caecce5\",\n            \"627441d869c1b8077caecce4\",\n            \"627441d869c1b8077caecce6\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"627441d769c1b8077caecce3\",\n              \"createdAt\": \"2022-05-05T21:29:59.514Z\",\n              \"name\": \"2e7f84cd1ae78aa3.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"d78dc2117570250732a6341d14cdc55d\",\n              \"url\": \"https://misskey.m544.net/files/627441d769c1b8077caecce3/627441d769c1b8077caecce3.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/627441d769c1b8077caecce3/627441d769c1b8077caecce3.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1719,\n                \"height\": 1206\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"627441d869c1b8077caecce5\",\n              \"createdAt\": \"2022-05-05T21:30:00.134Z\",\n              \"name\": \"d3143deef8688dea.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"e56ab17c2a2848e4055621a653c71f13\",\n              \"url\": \"https://misskey.m544.net/files/627441d869c1b8077caecce5/627441d869c1b8077caecce5.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/627441d869c1b8077caecce5/627441d869c1b8077caecce5.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1739,\n                \"height\": 1192\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"627441d869c1b8077caecce4\",\n              \"createdAt\": \"2022-05-05T21:30:00.001Z\",\n              \"name\": \"e6065db0e31e07e7.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"74de5f6033a772a5302df56eb85a469c\",\n              \"url\": \"https://misskey.m544.net/files/627441d869c1b8077caecce4/627441d869c1b8077caecce4.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/627441d869c1b8077caecce4/627441d869c1b8077caecce4.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1818,\n                \"height\": 1140\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"627441d869c1b8077caecce6\",\n              \"createdAt\": \"2022-05-05T21:30:00.399Z\",\n              \"name\": \"7a9d24349ba610f6.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"ccc9ab9ce82d3d4b4bb92ba43a41b40d\",\n              \"url\": \"https://misskey.m544.net/files/627441d869c1b8077caecce6/627441d869c1b8077caecce6.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/627441d869c1b8077caecce6/627441d869c1b8077caecce6.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1828,\n                \"height\": 1134\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108249511510111854\",\n          \"url\": \"https://mastodon.social/@Nakamichisan/108249511510111854\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"718013c302c813826fd0c61a\",\n          \"createdAt\": \"2022-04-10T13:56:29.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"❝sllp一色❞になってた駅(^_-)-☆\\n#ixy #canon #叡電 #ｽﾛｰﾙｰﾌﾟ #slowloop #八瀬比叡山口駅\",\n          \"cw\": null,\n          \"userId\": \"62359cde3a4d387fcc429897\",\n          \"user\": {\n            \"id\": \"62359cde3a4d387fcc429897\",\n            \"username\": \"Nakamichisan\",\n            \"name\": \"Nakamura Midori\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@Nakamichisan\",\n            \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n          },\n          \"replyId\": \"718012c69d80c411d5bfc002\",\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"IXY\",\n            \"canon\",\n            \"叡電\",\n            \"ｽﾛｰﾙｰﾌﾟ\",\n            \"slowloop\",\n            \"八瀬比叡山口駅\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"625394b79cd2424775d3e77b\",\n            \"625394b89cd2424775d3e77d\",\n            \"625394b89cd2424775d3e77c\",\n            \"625394b89cd2424775d3e77e\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"625394b79cd2424775d3e77b\",\n              \"createdAt\": \"2022-04-11T02:38:47.524Z\",\n              \"name\": \"267ddf073899a5be.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"23db163bb9a8d9508f0327524758e58e\",\n              \"url\": \"https://misskey.m544.net/files/625394b79cd2424775d3e77b/625394b79cd2424775d3e77b.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b79cd2424775d3e77b/625394b79cd2424775d3e77b.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1663,\n                \"height\": 1247\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"625394b89cd2424775d3e77d\",\n              \"createdAt\": \"2022-04-11T02:38:48.063Z\",\n              \"name\": \"97893efd65eaf147.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"52230168939a9e60b19febfb8f9113ef\",\n              \"url\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77d/625394b89cd2424775d3e77d.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77d/625394b89cd2424775d3e77d.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1727,\n                \"height\": 1201\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"625394b89cd2424775d3e77c\",\n              \"createdAt\": \"2022-04-11T02:38:48.012Z\",\n              \"name\": \"df01b008bacbac87.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"2514b481e6a1666e671e32dcbb6f5cae\",\n              \"url\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77c/625394b89cd2424775d3e77c.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77c/625394b89cd2424775d3e77c.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1663,\n                \"height\": 1247\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"625394b89cd2424775d3e77e\",\n              \"createdAt\": \"2022-04-11T02:38:48.345Z\",\n              \"name\": \"1c50d3aca958aa48.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"71d1860f4781139cb52f0aaf8f997bb3\",\n              \"url\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77e/625394b89cd2424775d3e77e.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77e/625394b89cd2424775d3e77e.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1780,\n                \"height\": 1165\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108108119399930871\",\n          \"url\": \"https://mastodon.social/@Nakamichisan/108108119399930871\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": {\n            \"id\": \"718012c69d80c411d5bfc002\",\n            \"createdAt\": \"2022-04-10T09:20:48.000Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"❝ｼｰﾆｬﾝﾍﾄﾞﾏ❞の車両にうっとり(●´ϖ`●)💕\\n#ixy #canon #叡電 #ｽﾛｰﾙｰﾌﾟ #slowloop #八瀬比叡山口駅\",\n            \"cw\": null,\n            \"userId\": \"62359cde3a4d387fcc429897\",\n            \"user\": {\n              \"id\": \"62359cde3a4d387fcc429897\",\n              \"username\": \"Nakamichisan\",\n              \"name\": \"Nakamura Midori\",\n              \"host\": \"mastodon.social\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"mastodon.social\",\n                \"name\": \"Mastodon\",\n                \"softwareName\": \"mastodon\",\n                \"softwareVersion\": \"3.5.3\",\n                \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n                \"themeColor\": \"#6364FF\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://mastodon.social/@Nakamichisan\",\n              \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [\n              \"IXY\",\n              \"canon\",\n              \"叡電\",\n              \"ｽﾛｰﾙｰﾌﾟ\",\n              \"slowloop\",\n              \"八瀬比叡山口駅\"\n            ],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 0,\n            \"renoteCount\": 0,\n            \"quoteCount\": 0,\n            \"repliesCount\": 1,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [],\n            \"fileIds\": [\n              \"625394b99cd2424775d3e780\",\n              \"625394b89cd2424775d3e77f\",\n              \"625394b99cd2424775d3e781\",\n              \"625394b99cd2424775d3e782\"\n            ],\n            \"files\": [\n              {\n                \"id\": \"625394b99cd2424775d3e780\",\n                \"createdAt\": \"2022-04-11T02:38:49.096Z\",\n                \"name\": \"83e823e8aa7f6f2d.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"a02fde5c4b48539d9a8f2e16d053dd72\",\n                \"url\": \"https://misskey.m544.net/files/625394b99cd2424775d3e780/625394b99cd2424775d3e780.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b99cd2424775d3e780/625394b99cd2424775d3e780.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1732,\n                  \"height\": 1197\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"625394b89cd2424775d3e77f\",\n                \"createdAt\": \"2022-04-11T02:38:48.903Z\",\n                \"name\": \"148239e7e712b540.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"12cdf7f0a455f11c5b1c7f4bda8a0e78\",\n                \"url\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77f/625394b89cd2424775d3e77f.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b89cd2424775d3e77f/625394b89cd2424775d3e77f.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1618,\n                  \"height\": 1281\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"625394b99cd2424775d3e781\",\n                \"createdAt\": \"2022-04-11T02:38:49.221Z\",\n                \"name\": \"853758c23cdaae39.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"e4e62d815f1a09c1c7bf988b7cd72620\",\n                \"url\": \"https://misskey.m544.net/files/625394b99cd2424775d3e781/625394b99cd2424775d3e781.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b99cd2424775d3e781/625394b99cd2424775d3e781.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1717,\n                  \"height\": 1208\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"625394b99cd2424775d3e782\",\n                \"createdAt\": \"2022-04-11T02:38:49.623Z\",\n                \"name\": \"decf5d7c3f35f55f.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"a7b2fb5460469e82013daffd685ec2c5\",\n                \"url\": \"https://misskey.m544.net/files/625394b99cd2424775d3e782/625394b99cd2424775d3e782.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/625394b99cd2424775d3e782/625394b99cd2424775d3e782.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1783,\n                  \"height\": 1162\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              }\n            ],\n            \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108107035315320247\",\n            \"url\": \"https://mastodon.social/@Nakamichisan/108107035315320247\",\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"notHaveDecorationMfm\": true\n          },\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717fcba4f98834432b96f5f2\",\n          \"createdAt\": \"2022-03-27T13:51:01.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"Mission Comple‼\\n(☔の㊥参戦出来た事,只々感謝ですm(_ _)m)\\n#ixy #canon #梅田ｽｶｲﾋﾞﾙ🏢 #謎解きﾒﾄﾛ旅2021 #雨の日の過ごし方 #写真で伝えたい私の世界 #ﾌｧｲﾝﾀﾞｰ越しの私の世界\",\n          \"cw\": null,\n          \"userId\": \"62359cde3a4d387fcc429897\",\n          \"user\": {\n            \"id\": \"62359cde3a4d387fcc429897\",\n            \"username\": \"Nakamichisan\",\n            \"name\": \"Nakamura Midori\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@Nakamichisan\",\n            \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n          },\n          \"replyId\": \"717fcb0016985852b7c21217\",\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"IXY\",\n            \"canon\",\n            \"梅田ｽｶｲﾋﾞﾙ\",\n            \"謎解きﾒﾄﾛ旅2021\",\n            \"雨の日の過ごし方\",\n            \"写真で伝えたい私の世界\",\n            \"ﾌｧｲﾝﾀﾞｰ越しの私の世界\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"6242fbfc2257aa17537d4ec3\",\n            \"6242fbfc2257aa17537d4ec4\",\n            \"6242fbfd2257aa17537d4ec5\",\n            \"6242fbfd2257aa17537d4ec6\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"6242fbfc2257aa17537d4ec3\",\n              \"createdAt\": \"2022-03-29T12:30:52.624Z\",\n              \"name\": \"7d1675eeeaa3ce3b.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"abde74c73a9f4de88ab57f5918baf87b\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfc2257aa17537d4ec3/6242fbfc2257aa17537d4ec3.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfc2257aa17537d4ec3/6242fbfc2257aa17537d4ec3.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1767,\n                \"height\": 1174\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"6242fbfc2257aa17537d4ec4\",\n              \"createdAt\": \"2022-03-29T12:30:52.710Z\",\n              \"name\": \"b162f0008bd41b5f.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"25260d2bc2934b6cb7066d74249cdb08\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfc2257aa17537d4ec4/6242fbfc2257aa17537d4ec4.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfc2257aa17537d4ec4/6242fbfc2257aa17537d4ec4.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1770,\n                \"height\": 1171\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"6242fbfd2257aa17537d4ec5\",\n              \"createdAt\": \"2022-03-29T12:30:53.068Z\",\n              \"name\": \"6c1ac847368a4ffe.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"fcc9ca5a2fbdeb95245583fd5b6babe2\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec5/6242fbfd2257aa17537d4ec5.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec5/6242fbfd2257aa17537d4ec5.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1717,\n                \"height\": 1207\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"6242fbfd2257aa17537d4ec6\",\n              \"createdAt\": \"2022-03-29T12:30:53.330Z\",\n              \"name\": \"34f8472afad69717.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"02c160176064f9a1361df0349e67e745\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec6/6242fbfd2257aa17537d4ec6.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec6/6242fbfd2257aa17537d4ec6.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1633,\n                \"height\": 1270\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108028825557876531\",\n          \"url\": \"https://mastodon.social/@Nakamichisan/108028825557876531\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": {\n            \"id\": \"717fcb0016985852b7c21217\",\n            \"createdAt\": \"2022-03-27T10:50:55.000Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"☔の日の庭園.\\n(雰囲気中々良さ気やった(●´ϖ`●)💕)\\n#ixy #canon #梅田ｽｶｲﾋﾞﾙ🏢 #謎解きﾒﾄﾛ旅2021 #建築物巡り #建築物同盟 #雨の日の過ごし方 #写真で伝えたい私の世界 #ﾌｧｲﾝﾀﾞｰ越しの私の世界\",\n            \"cw\": null,\n            \"userId\": \"62359cde3a4d387fcc429897\",\n            \"user\": {\n              \"id\": \"62359cde3a4d387fcc429897\",\n              \"username\": \"Nakamichisan\",\n              \"name\": \"Nakamura Midori\",\n              \"host\": \"mastodon.social\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"mastodon.social\",\n                \"name\": \"Mastodon\",\n                \"softwareName\": \"mastodon\",\n                \"softwareVersion\": \"3.5.3\",\n                \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n                \"themeColor\": \"#6364FF\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://mastodon.social/@Nakamichisan\",\n              \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n            },\n            \"replyId\": \"717fc676a290bf5671b311f9\",\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [\n              \"IXY\",\n              \"canon\",\n              \"梅田ｽｶｲﾋﾞﾙ\",\n              \"謎解きﾒﾄﾛ旅2021\",\n              \"建築物巡り\",\n              \"建築物同盟\",\n              \"雨の日の過ごし方\",\n              \"写真で伝えたい私の世界\",\n              \"ﾌｧｲﾝﾀﾞｰ越しの私の世界\"\n            ],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 0,\n            \"renoteCount\": 0,\n            \"quoteCount\": 0,\n            \"repliesCount\": 1,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [],\n            \"fileIds\": [\n              \"6242fbfe2257aa17537d4ecb\",\n              \"6242fbfe2257aa17537d4ecd\",\n              \"6242fbfe2257aa17537d4ece\",\n              \"6242fbfe2257aa17537d4ecd\"\n            ],\n            \"files\": [\n              {\n                \"id\": \"6242fbfe2257aa17537d4ecb\",\n                \"createdAt\": \"2022-03-29T12:30:54.243Z\",\n                \"name\": \"86e55c1e64985006.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"9f7adfcac4fd778ab93515ddd17894b7\",\n                \"url\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecb/6242fbfe2257aa17537d4ecb.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecb/6242fbfe2257aa17537d4ecb.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1829,\n                  \"height\": 1134\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"6242fbfe2257aa17537d4ecd\",\n                \"createdAt\": \"2022-03-29T12:30:54.406Z\",\n                \"name\": \"fc7872300f429d49.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"6e807a3c51bca9db52297b2b2278a495\",\n                \"url\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecd/6242fbfe2257aa17537d4ecd.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecd/6242fbfe2257aa17537d4ecd.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1758,\n                  \"height\": 1180\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"6242fbfe2257aa17537d4ece\",\n                \"createdAt\": \"2022-03-29T12:30:54.639Z\",\n                \"name\": \"abd098ceab706bb1.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"515b9a4b8627834e773e9d83487e880a\",\n                \"url\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ece/6242fbfe2257aa17537d4ece.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ece/6242fbfe2257aa17537d4ece.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1710,\n                  \"height\": 1213\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"6242fbfe2257aa17537d4ecd\",\n                \"createdAt\": \"2022-03-29T12:30:54.406Z\",\n                \"name\": \"fc7872300f429d49.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"6e807a3c51bca9db52297b2b2278a495\",\n                \"url\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecd/6242fbfe2257aa17537d4ecd.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecd/6242fbfe2257aa17537d4ecd.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1758,\n                  \"height\": 1180\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              }\n            ],\n            \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108028117383459558\",\n            \"url\": \"https://mastodon.social/@Nakamichisan/108028117383459558\",\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"notHaveDecorationMfm\": true\n          },\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717fc6638bd84f6c09b372b8\",\n          \"createdAt\": \"2022-03-26T13:21:27.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"❝生憎の天気❞やからこそ撮れた空間☔✨\\n(【Uちゃん】→❝被写体❞になって頂きました(^_-)-☆)\\n#ixy #canon #梅田ｽｶｲﾋﾞﾙ🏢 #謎解きﾒﾄﾛ旅2021 #建築物巡り #建築物同盟 #雨の日の過ごし方 #写真で伝えたい私の世界 #ﾌｧｲﾝﾀﾞｰ越しの私の世界\",\n          \"cw\": null,\n          \"userId\": \"62359cde3a4d387fcc429897\",\n          \"user\": {\n            \"id\": \"62359cde3a4d387fcc429897\",\n            \"username\": \"Nakamichisan\",\n            \"name\": \"Nakamura Midori\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@Nakamichisan\",\n            \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n          },\n          \"replyId\": \"717fc6570ca05e5a05448b5d\",\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"IXY\",\n            \"canon\",\n            \"梅田ｽｶｲﾋﾞﾙ\",\n            \"謎解きﾒﾄﾛ旅2021\",\n            \"建築物巡り\",\n            \"建築物同盟\",\n            \"雨の日の過ごし方\",\n            \"写真で伝えたい私の世界\",\n            \"ﾌｧｲﾝﾀﾞｰ越しの私の世界\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"6242fbfd2257aa17537d4ec7\",\n            \"6242fbfd2257aa17537d4ec8\",\n            \"6242fbfe2257aa17537d4eca\",\n            \"6242fbfe2257aa17537d4ecc\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"6242fbfd2257aa17537d4ec7\",\n              \"createdAt\": \"2022-03-29T12:30:53.518Z\",\n              \"name\": \"be204dd0aa332442.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"42735755b030570f678d5d2f14f9aded\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec7/6242fbfd2257aa17537d4ec7.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec7/6242fbfd2257aa17537d4ec7.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1731,\n                \"height\": 1198\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"6242fbfd2257aa17537d4ec8\",\n              \"createdAt\": \"2022-03-29T12:30:53.794Z\",\n              \"name\": \"ebae4734aaab5042.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"19b2b30b2bdc47f7d73972d07e441c22\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec8/6242fbfd2257aa17537d4ec8.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfd2257aa17537d4ec8/6242fbfd2257aa17537d4ec8.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1750,\n                \"height\": 1185\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"6242fbfe2257aa17537d4eca\",\n              \"createdAt\": \"2022-03-29T12:30:54.086Z\",\n              \"name\": \"e1ca3274820b0548.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"b63f97c8066b5f296b14b608f2349924\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4eca/6242fbfe2257aa17537d4eca.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4eca/6242fbfe2257aa17537d4eca.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1773,\n                \"height\": 1170\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            },\n            {\n              \"id\": \"6242fbfe2257aa17537d4ecc\",\n              \"createdAt\": \"2022-03-29T12:30:54.313Z\",\n              \"name\": \"d0f292b91b535721.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"0da9faad2e4ebd3daba1e56b59aece2f\",\n              \"url\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecc/6242fbfe2257aa17537d4ecc.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbfe2257aa17537d4ecc/6242fbfe2257aa17537d4ecc.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1658,\n                \"height\": 1251\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108023046924645676\",\n          \"url\": \"https://mastodon.social/@Nakamichisan/108023046924645676\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": {\n            \"id\": \"717fc6570ca05e5a05448b5d\",\n            \"createdAt\": \"2022-03-26T13:07:48.000Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"生憎の雨☔✨\\nそんな㊥でも❝謎解き🎮❞をcomplete出来た事は,只々感謝です(*^_^*)💞\\n#ixy #canon #梅田ｽｶｲﾋﾞﾙ🏢 #謎解きﾒﾄﾛ旅2021 #建築物巡り #建築物同盟 #雨の日の過ごし方 #空のある風景 #写真で伝えたい私の世界 #ﾌｧｲﾝﾀﾞｰ越しの私の世界\",\n            \"cw\": null,\n            \"userId\": \"62359cde3a4d387fcc429897\",\n            \"user\": {\n              \"id\": \"62359cde3a4d387fcc429897\",\n              \"username\": \"Nakamichisan\",\n              \"name\": \"Nakamura Midori\",\n              \"host\": \"mastodon.social\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"mastodon.social\",\n                \"name\": \"Mastodon\",\n                \"softwareName\": \"mastodon\",\n                \"softwareVersion\": \"3.5.3\",\n                \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n                \"themeColor\": \"#6364FF\"\n              },\n              \"emojis\": [],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://mastodon.social/@Nakamichisan\",\n              \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [\n              \"IXY\",\n              \"canon\",\n              \"梅田ｽｶｲﾋﾞﾙ\",\n              \"謎解きﾒﾄﾛ旅2021\",\n              \"建築物巡り\",\n              \"建築物同盟\",\n              \"雨の日の過ごし方\",\n              \"空のある風景\",\n              \"写真で伝えたい私の世界\",\n              \"ﾌｧｲﾝﾀﾞｰ越しの私の世界\"\n            ],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 0,\n            \"renoteCount\": 0,\n            \"quoteCount\": 0,\n            \"repliesCount\": 1,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [],\n            \"fileIds\": [\n              \"6242fbff2257aa17537d4ecf\",\n              \"6242fbff2257aa17537d4ed0\",\n              \"6242fbff2257aa17537d4ed1\",\n              \"6242fbff2257aa17537d4ed2\"\n            ],\n            \"files\": [\n              {\n                \"id\": \"6242fbff2257aa17537d4ecf\",\n                \"createdAt\": \"2022-03-29T12:30:55.117Z\",\n                \"name\": \"6c54d82773f5ea1d.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"d1110168b5d63642faa517842147517a\",\n                \"url\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ecf/6242fbff2257aa17537d4ecf.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ecf/6242fbff2257aa17537d4ecf.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1693,\n                  \"height\": 1225\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"6242fbff2257aa17537d4ed0\",\n                \"createdAt\": \"2022-03-29T12:30:55.132Z\",\n                \"name\": \"9daccc975270b416.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"6197fae2a4bdd94c84c7c8add882aba8\",\n                \"url\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ed0/6242fbff2257aa17537d4ed0.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ed0/6242fbff2257aa17537d4ed0.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1685,\n                  \"height\": 1231\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"6242fbff2257aa17537d4ed1\",\n                \"createdAt\": \"2022-03-29T12:30:55.469Z\",\n                \"name\": \"b393dc0f8a582501.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"ad5c6b5b4171c8f943f0e6a62b114032\",\n                \"url\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ed1/6242fbff2257aa17537d4ed1.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ed1/6242fbff2257aa17537d4ed1.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1605,\n                  \"height\": 1292\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              },\n              {\n                \"id\": \"6242fbff2257aa17537d4ed2\",\n                \"createdAt\": \"2022-03-29T12:30:55.527Z\",\n                \"name\": \"ae396033d6141769.jpeg\",\n                \"type\": \"image/jpeg\",\n                \"datasize\": 0,\n                \"size\": 0,\n                \"md5\": \"a03dfd5c78308145010324431268b689\",\n                \"url\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ed2/6242fbff2257aa17537d4ed2.jpeg?web\",\n                \"thumbnailUrl\": \"https://misskey.m544.net/files/6242fbff2257aa17537d4ed2/6242fbff2257aa17537d4ed2.jpg?thumbnail\",\n                \"properties\": {\n                  \"width\": 1635,\n                  \"height\": 1268\n                },\n                \"comment\": null,\n                \"isSensitive\": false\n              }\n            ],\n            \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108022993295087420\",\n            \"url\": \"https://mastodon.social/@Nakamichisan/108022993295087420\",\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"notHaveDecorationMfm\": true\n          },\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717fbc412f9893b726efbddb\",\n          \"createdAt\": \"2022-03-24T14:07:43.000Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"CS駅からﾊﾟｼｬﾘ(^_-)-☆\\n(❝Israelの平和❞を願う青空にも思えた🐸✨)\\n【CS駅】&【sksm庁舎】→❝set撮影❞がええぞ(●´ϖ`●)💕\\n#ixy #canon #ｺｽﾓｽｸｴｱ駅 #大阪府咲洲庁舎 #青空 #空のある風景 #写真で伝えたい私の世界 #ﾌｧｲﾝﾀﾞｰ越しの私の世界\",\n          \"cw\": null,\n          \"userId\": \"62359cde3a4d387fcc429897\",\n          \"user\": {\n            \"id\": \"62359cde3a4d387fcc429897\",\n            \"username\": \"Nakamichisan\",\n            \"name\": \"Nakamura Midori\",\n            \"host\": \"mastodon.social\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62c27287757ad76312806e5f/62c27287757ad76312806e5f.jpg?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mastodon.social\",\n              \"name\": \"Mastodon\",\n              \"softwareName\": \"mastodon\",\n              \"softwareVersion\": \"3.5.3\",\n              \"iconUrl\": \"https://mastodon.social/favicon.ico\",\n              \"themeColor\": \"#6364FF\"\n            },\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mastodon.social/@Nakamichisan\",\n            \"uri\": \"https://mastodon.social/users/Nakamichisan\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"IXY\",\n            \"canon\",\n            \"ｺｽﾓｽｸｴｱ駅\",\n            \"大阪府咲洲庁舎\",\n            \"青空\",\n            \"空のある風景\",\n            \"写真で伝えたい私の世界\",\n            \"ﾌｧｲﾝﾀﾞｰ越しの私の世界\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [\n            \"623e5016f4cb5b55fcaa86c4\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"623e5016f4cb5b55fcaa86c4\",\n              \"createdAt\": \"2022-03-25T23:28:22.263Z\",\n              \"name\": \"79edf7e24fbadc4e.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"datasize\": 0,\n              \"size\": 0,\n              \"md5\": \"2df2b23ec6be1827ecc0f2f2a17ace6d\",\n              \"url\": \"https://misskey.m544.net/files/623e5016f4cb5b55fcaa86c4/623e5016f4cb5b55fcaa86c4.jpeg?web\",\n              \"thumbnailUrl\": \"https://misskey.m544.net/files/623e5016f4cb5b55fcaa86c4/623e5016f4cb5b55fcaa86c4.jpg?thumbnail\",\n              \"properties\": {\n                \"width\": 1688,\n                \"height\": 1229\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": \"https://mastodon.social/users/Nakamichisan/statuses/108011904293148105\",\n          \"url\": \"https://mastodon.social/@Nakamichisan/108011904293148105\",\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"61a8a8bc39bc1d2049a396d4\",\n      \"username\": \"ruru__\",\n      \"name\": \"るーちゃ\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/gy7f5irlievvk307zv5hnshm.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2021-12-02T11:06:36.067Z\",\n      \"updatedAt\": \"2022-07-03T03:57:45.412Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/2dc19nqttiv0kr24jasbg1re.png\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"あいらぶゆー\\n\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": 32,\n      \"followingCount\": 32,\n      \"notesCount\": 67,\n      \"pinnedNoteIds\": [\n        \"717d7dde26e8b8b165583ba1\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"717d7dde26e8b8b165583ba1\",\n          \"createdAt\": \"2021-12-03T01:17:30.728Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"虹ぃ~\",\n          \"cw\": null,\n          \"userId\": \"61a8a8bc39bc1d2049a396d4\",\n          \"user\": {\n            \"id\": \"61a8a8bc39bc1d2049a396d4\",\n            \"username\": \"ruru__\",\n            \"name\": \"るーちゃ\",\n            \"host\": null,\n            \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/gy7f5irlievvk307zv5hnshm.jpg\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"borderColor\": null,\n            \"instance\": null,\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": null,\n            \"uri\": null\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": true,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 14,\n          \"renoteCount\": 2,\n          \"quoteCount\": 1,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"🎉\": 2,\n            \"🌈\": 8,\n            \":blobok@.:\": 2,\n            \":blobaww@.:\": 3\n          },\n          \"reactionCounts\": {\n            \"🎉\": 2,\n            \"🌈\": 8,\n            \":blobok@.:\": 2,\n            \":blobaww@.:\": 3\n          },\n          \"emojis\": [\n            {\n              \"name\": \"blobok@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/4yxgm0bcc7upu5x7hkfehrex.png\",\n              \"host\": null,\n              \"resolvable\": \"blobok\"\n            },\n            {\n              \"name\": \"blobaww@.\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/088is6c814uyf3uyzvytil5j.png\",\n              \"host\": null,\n              \"resolvable\": \"blobaww\",\n              \"direction\": \"right\"\n            }\n          ],\n          \"fileIds\": [\n            \"61a9701239bc1d2049a3a835\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"61a9701239bc1d2049a3a835\",\n              \"createdAt\": \"2021-12-03T01:17:06.106Z\",\n              \"name\": \"50FD44F1-AC4A-408D-BAD6-0F210E7042A3.jpeg\",\n              \"type\": \"image/jpeg\",\n              \"animation\": null,\n              \"datasize\": 1099599,\n              \"size\": 1099599,\n              \"md5\": \"fc8fe4beca18a19093a325894800f298\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/6ia0mjbkxkj39ku5cx0tne97.jpg\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/hmgs55dum02bp4b5gliqd2yo.jpg\",\n              \"properties\": {\n                \"width\": 2048,\n                \"height\": 2012\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": null,\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"61ac8c8c39bc1d2049a42be4\",\n      \"username\": \"benizakuro\",\n      \"name\": \"るーくる（最近とってもお嬢様な気分）\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/a6rsb1w0n8j0di68o8j58wk9.png\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2021-12-05T09:55:24.411Z\",\n      \"updatedAt\": \"2022-07-20T00:17:26.428Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/oogs1a3j2ivo47bdwn9jn8wt.png\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"おはこんばんにちはですわ\\n\",\n      \"profile\": {\n        \"birthday\": \"2004-04-26\",\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": 22,\n      \"followingCount\": 22,\n      \"notesCount\": 421,\n      \"pinnedNoteIds\": [\n        \"7181c1b8cda99bef3c8e21cb\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"7181c1b8cda99bef3c8e21cb\",\n          \"createdAt\": \"2022-07-03T01:42:02.921Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"出来ましたわ\\nバナー画像にしますわ\",\n          \"cw\": null,\n          \"userId\": \"61ac8c8c39bc1d2049a42be4\",\n          \"user\": {\n            \"id\": \"61ac8c8c39bc1d2049a42be4\",\n            \"username\": \"benizakuro\",\n            \"name\": \"るーくる（最近とってもお嬢様な気分）\",\n            \"host\": null,\n            \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/a6rsb1w0n8j0di68o8j58wk9.png\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"borderColor\": null,\n            \"instance\": null,\n            \"emojis\": [],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": null,\n            \"uri\": null\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"🎉\": 1\n          },\n          \"reactionCounts\": {\n            \"🎉\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [\n            \"62c0f30ea36d4a3683116727\"\n          ],\n          \"files\": [\n            {\n              \"id\": \"62c0f30ea36d4a3683116727\",\n              \"createdAt\": \"2022-07-03T01:38:22.063Z\",\n              \"name\": \"download20220605014413.png\",\n              \"type\": \"image/png\",\n              \"animation\": \"no\",\n              \"datasize\": 697270,\n              \"size\": 697270,\n              \"md5\": \"0ebaae78e4815c0db81b5d8a1d62f1c7\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/e3xreavqn5il8hpd8szjz64t.png\",\n              \"thumbnailUrl\": \"https://misskey-drive2.m544.net/m544/q2hh2y3drx7lotiocfgeoila.jpg\",\n              \"properties\": {\n                \"width\": 688,\n                \"height\": 688\n              },\n              \"comment\": null,\n              \"isSensitive\": false\n            }\n          ],\n          \"uri\": null,\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"61623703e644a24dd1567a73\",\n      \"username\": \"warabimochi\",\n      \"name\": \"ぎゅらサン\",\n      \"host\": null,\n      \"avatarUrl\": \"https://misskey-drive2.m544.net/m544/kxei8vehqws5tnjorems6wl0.jpg\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": true,\n      \"borderColor\": null,\n      \"instance\": null,\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": null,\n      \"uri\": null,\n      \"createdAt\": \"2021-10-10T00:42:43.027Z\",\n      \"updatedAt\": \"2022-07-18T13:19:36.269Z\",\n      \"bannerUrl\": \"https://misskey-drive2.m544.net/m544/hkftsnx0z7j4ez9wjxju306i.jpg\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"なかよくしてくれよな😾❕\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": \"缶詰\"\n      },\n      \"fields\": [],\n      \"followersCount\": 24,\n      \"followingCount\": 14,\n      \"notesCount\": 199,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isModerator\": false,\n      \"twoFactorEnabled\": false,\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5cb606ec63ca6943b85e16c9\",\n      \"username\": \"mrhc\",\n      \"name\": \"まりシスさん🍔\",\n      \"host\": \"misskey.io\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/61a183536ad4f3adee537c35/61a183536ad4f3adee537c35.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.110.1\",\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"blobcataco\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/xazrajlqbxgndyam1yfcsw10.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"blobcataco@misskey.io\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.io/@mrhc\",\n      \"uri\": \"https://misskey.io/users/7rll90yx0u\",\n      \"createdAt\": \"2019-04-16T16:46:36.605Z\",\n      \"updatedAt\": \"2022-07-20T05:04:07.729Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/618a9aefd50ff7ceb4111f49/618a9aefd50ff7ceb4111f49.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"​:blobcataco:​\\nまりななの妹でしなちの姉です。\\nいつも何か作ってます。\\n音楽を聴くのが好きです。\\nアイコン: @refinyaa@misskey.io\",\n      \"profile\": {\n        \"birthday\": \"1997-06-20\",\n        \"location\": \"Japan\"\n      },\n      \"fields\": [\n        {\n          \"name\": \"GitHub\",\n          \"value\": \"https://github.com/marihachi\"\n        },\n        {\n          \"name\": \"SoundCloud\",\n          \"value\": \"https://soundcloud.com/marihachi\"\n        },\n        {\n          \"name\": \"干し芋\",\n          \"value\": \"https://www.amazon.co.jp/hz/wishlist/ls/3Q6PT6G8VXHS5\"\n        },\n        {\n          \"name\": \"Patreon\",\n          \"value\": \"https://www.patreon.com/marihachi\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 60810,\n      \"pinnedNoteIds\": [\n        \"717e492993b75372ac985c6d\",\n        \"717e2a826bb6a35a6bba5a16\",\n        \"717c4b9f1c5d5cf5f2f3c9ce\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"717e492993b75372ac985c6d\",\n          \"createdAt\": \"2022-01-11T12:42:48.631Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"mfm.js v0.21.0 リリースしました。\\nhttps://github.com/misskey-dev/mfm.js/blob/v0.21.0/CHANGELOG.md#0210 \\n#mfm-js\",\n          \"cw\": null,\n          \"userId\": \"5cb606ec63ca6943b85e16c9\",\n          \"user\": {\n            \"id\": \"5cb606ec63ca6943b85e16c9\",\n            \"username\": \"mrhc\",\n            \"name\": \"まりシスさん🍔\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/61a183536ad4f3adee537c35/61a183536ad4f3adee537c35.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"blobcataco\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/xazrajlqbxgndyam1yfcsw10.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"blobcataco@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@mrhc\",\n            \"uri\": \"https://misskey.io/users/7rll90yx0u\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [\n            \"mfm-js\"\n          ],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 13,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 1,\n          \"reactions\": {\n            \"🎉\": 3,\n            \":ablobcatfloofpat@misskey.io:\": 2\n          },\n          \"reactionCounts\": {\n            \"🎉\": 3,\n            \":ablobcatfloofpat@misskey.io:\": 2\n          },\n          \"emojis\": [\n            {\n              \"name\": \"ablobcatfloofpat@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/0u1qrx3esmzg78vpt5pdslmc.gif\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"ablobcatfloofpat@misskey.io\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/8vdo4zavj5\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717e2a826bb6a35a6bba5a16\",\n          \"createdAt\": \"2022-01-05T13:51:37.398Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"お気に入り曲リスト2 (随時更新！)\\nhttps://open.spotify.com/playlist/0AFzdTG6Mjx8Tt6vRttMBB?si=cc5fd1021bdc4218\",\n          \"cw\": null,\n          \"userId\": \"5cb606ec63ca6943b85e16c9\",\n          \"user\": {\n            \"id\": \"5cb606ec63ca6943b85e16c9\",\n            \"username\": \"mrhc\",\n            \"name\": \"まりシスさん🍔\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/61a183536ad4f3adee537c35/61a183536ad4f3adee537c35.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"blobcataco\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/xazrajlqbxgndyam1yfcsw10.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"blobcataco@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@mrhc\",\n            \"uri\": \"https://misskey.io/users/7rll90yx0u\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 7,\n          \"renoteCount\": 3,\n          \"quoteCount\": 1,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"😊\": 2,\n            \"🦦\": 1\n          },\n          \"reactionCounts\": {\n            \"😊\": 2,\n            \"🦦\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/8v55yd2uq3\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"717c4b9f1c5d5cf5f2f3c9ce\",\n          \"createdAt\": \"2021-10-04T14:04:51.165Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"お気に入り曲リスト\\nhttps://open.spotify.com/playlist/0uxsbqePJc7Ur0gWlPbnfF?si=9126b9589c73482c\",\n          \"cw\": null,\n          \"userId\": \"5cb606ec63ca6943b85e16c9\",\n          \"user\": {\n            \"id\": \"5cb606ec63ca6943b85e16c9\",\n            \"username\": \"mrhc\",\n            \"name\": \"まりシスさん🍔\",\n            \"host\": \"misskey.io\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/61a183536ad4f3adee537c35/61a183536ad4f3adee537c35.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"misskey.io\",\n              \"name\": \"Misskey.io\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.110.1\",\n              \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"blobcataco\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/xazrajlqbxgndyam1yfcsw10.png\",\n                \"host\": \"misskey.io\",\n                \"resolvable\": \"blobcataco@misskey.io\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://misskey.io/@mrhc\",\n            \"uri\": \"https://misskey.io/users/7rll90yx0u\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 21,\n          \"renoteCount\": 3,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"🔞\": 1,\n            \"😮\": 1,\n            \"🏕\": 1,\n            \"🌻\": 1,\n            \":nachoneko_lewd@misskey.io:\": 2,\n            \"😲\": 2\n          },\n          \"reactionCounts\": {\n            \"🔞\": 1,\n            \"😮\": 1,\n            \"🏕\": 1,\n            \"🌻\": 1,\n            \":nachoneko_lewd@misskey.io:\": 2,\n            \"😲\": 2\n          },\n          \"emojis\": [\n            {\n              \"name\": \"nachoneko_lewd@misskey.io\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/dol2p3dsppw1po0i3cx1xg8g.gif\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"nachoneko_lewd@misskey.io\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://misskey.io/notes/8rgah5jx1w\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"5c0cbc88eff33971ab74d43d\",\n      \"username\": \"hlhl\",\n      \"name\": \"はるぴんびーむ\",\n      \"host\": \"heislandmine.work\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/5c65eddff78dd13a6168220b/5c65eddff78dd13a6168220b.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"heislandmine.work\",\n        \"name\": \"landodon\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.1\",\n        \"iconUrl\": \"https://heislandmine.work/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [\n        \"おしり\"\n      ],\n      \"url\": \"https://heislandmine.work/@hlhl\",\n      \"uri\": \"https://heislandmine.work/users/hlhl\",\n      \"createdAt\": null,\n      \"updatedAt\": \"2022-07-17T22:40:40.188Z\",\n      \"bannerUrl\": \"https://misskey.m544.net/files/5c65ede0f78dd13a6168220e/5c65ede0f78dd13a6168220e.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"#おしり\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 1627,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"60a4dd1fa5d4f9475cbf08a6\",\n      \"username\": \"rumi\",\n      \"name\": \"ルミ\",\n      \"host\": \"machikadon.online\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/627f89056c912f34c0086ac5/627f89056c912f34c0086ac5.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"machikadon.online\",\n        \"name\": \"まちカdon\",\n        \"softwareName\": \"mastodon\",\n        \"softwareVersion\": \"3.5.3\",\n        \"iconUrl\": \"https://machikadon.online/favicon.ico\",\n        \"themeColor\": \"#282c37\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://machikadon.online/@rumi\",\n      \"uri\": \"https://machikadon.online/users/rumi\",\n      \"createdAt\": \"2021-05-19T09:40:47.383Z\",\n      \"updatedAt\": \"2022-06-21T06:57:16.540Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"垢消しマゾクの誰か\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 335,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"627d0111d1946708aab1f66c\",\n      \"username\": \"sakamotokinn\",\n      \"name\": null,\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/627d0111d1946708aab1f66d/627d0111d1946708aab1f66d.jpg?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@sakamotokinn\",\n      \"uri\": \"https://misskey.levome-dol.com/users/904hftnyqr\",\n      \"createdAt\": \"2022-05-12T12:44:01.480Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": \"https://misskey.m544.net/files/628621ded58363cb3304d40d/628621ded58363cb3304d40d.jpg?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 7,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"627cbfafd1946708aab1c9c4\",\n      \"username\": \"taroyann\",\n      \"name\": null,\n      \"host\": \"misskey.levome-dol.com\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/627cbfb2d1946708aab1c9d0/627cbfb2d1946708aab1c9d0.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"misskey.levome-dol.com\",\n        \"name\": \"Levisskey\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.84.3\",\n        \"iconUrl\": \"https://misskey.levome-dol.com/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://misskey.levome-dol.com/@taroyann\",\n      \"uri\": \"https://misskey.levome-dol.com/users/904hhbbjus\",\n      \"createdAt\": \"2022-05-12T08:05:03.592Z\",\n      \"updatedAt\": null,\n      \"bannerUrl\": \"https://misskey.m544.net/files/627cbfb0d1946708aab1c9cc/627cbfb0d1946708aab1c9cc.png?web\",\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": null,\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 6,\n      \"pinnedNoteIds\": [],\n      \"pinnedNotes\": [],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    },\n    {\n      \"id\": \"62760754a2c98ac35d9ab0b2\",\n      \"username\": \"morotesovtannu\",\n      \"name\": \"せせせの:musume:@漏れデーター\",\n      \"host\": \"mk.yopo.work\",\n      \"avatarUrl\": \"https://misskey.m544.net/files/62760754a2c98ac35d9ab0b7/62760754a2c98ac35d9ab0b7.png?thumbnail\",\n      \"avatarColor\": null,\n      \"isAdmin\": false,\n      \"isVerified\": false,\n      \"isBot\": false,\n      \"isCat\": false,\n      \"instance\": {\n        \"host\": \"mk.yopo.work\",\n        \"name\": \"暫定よぽすき\",\n        \"softwareName\": \"misskey\",\n        \"softwareVersion\": \"12.111.1\",\n        \"iconUrl\": \"https://mk.yopo.work/favicon.ico\",\n        \"themeColor\": \"#86b300\"\n      },\n      \"emojis\": [\n        {\n          \"name\": \"musume\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/904579cujj6s3aqcuk83uf2b.png\",\n          \"host\": \"mk.yopo.work\",\n          \"resolvable\": \"musume@mk.yopo.work\"\n        }\n      ],\n      \"avoidSearchIndex\": false,\n      \"tags\": [],\n      \"url\": \"https://mk.yopo.work/@morotesovtannu\",\n      \"uri\": \"https://mk.yopo.work/users/8zyzshjjdk\",\n      \"createdAt\": \"2022-05-07T05:44:52.187Z\",\n      \"updatedAt\": \"2022-07-18T12:39:01.810Z\",\n      \"bannerUrl\": null,\n      \"bannerColor\": null,\n      \"isLocked\": false,\n      \"isSilenced\": false,\n      \"isSuspended\": false,\n      \"isDeleted\": false,\n      \"description\": \"@c@misskey.io の娘です。\\nよぽすきのアップローダー管理してます。\\n\\nよぽすき/すしすきー/ほしさき〜モデレーター\\nETONER Socialアドミン\\n@morotesovtannu@msk.ilnk.info\",\n      \"profile\": {\n        \"birthday\": null,\n        \"location\": null\n      },\n      \"fields\": [\n        {\n          \"name\": \"XMPP\",\n          \"value\": \"kon2etonertannu@disroot.org\"\n        },\n        {\n          \"name\": \"Website\",\n          \"value\": \"https://home.ilnk.info/\"\n        },\n        {\n          \"name\": \"E-mail\",\n          \"value\": \"kon2etonertannu@ilnk.info\"\n        }\n      ],\n      \"followersCount\": null,\n      \"followingCount\": null,\n      \"notesCount\": 522,\n      \"pinnedNoteIds\": [\n        \"71817c72214115feb20da08b\",\n        \"7181713cba909f82f68291a6\",\n        \"71809fb5280e866a4b026989\"\n      ],\n      \"pinnedNotes\": [\n        {\n          \"id\": \"71817c72214115feb20da08b\",\n          \"createdAt\": \"2022-06-19T14:51:03.361Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"えとねるが止まっちゃったときだったりよぽどさんとおしゃべりするとき、あと気分次第でここに来ます\",\n          \"cw\": null,\n          \"userId\": \"62760754a2c98ac35d9ab0b2\",\n          \"user\": {\n            \"id\": \"62760754a2c98ac35d9ab0b2\",\n            \"username\": \"morotesovtannu\",\n            \"name\": \"せせせの:musume:@漏れデーター\",\n            \"host\": \"mk.yopo.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62760754a2c98ac35d9ab0b7/62760754a2c98ac35d9ab0b7.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mk.yopo.work\",\n              \"name\": \"暫定よぽすき\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.111.1\",\n              \"iconUrl\": \"https://mk.yopo.work/favicon.ico\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"musume\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/904579cujj6s3aqcuk83uf2b.png\",\n                \"host\": \"mk.yopo.work\",\n                \"resolvable\": \"musume@mk.yopo.work\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mk.yopo.work/@morotesovtannu\",\n            \"uri\": \"https://mk.yopo.work/users/8zyzshjjdk\"\n          },\n          \"replyId\": null,\n          \"renoteId\": \"718155472427dc9411e29ed4\",\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \"👍\": 1\n          },\n          \"reactionCounts\": {\n            \"👍\": 1\n          },\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mk.yopo.work/notes/91ozqcldpb\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [],\n          \"hasRemoteMentions\": false,\n          \"reply\": null,\n          \"renote\": {\n            \"id\": \"718155472427dc9411e29ed4\",\n            \"createdAt\": \"2022-06-12T00:18:54.631Z\",\n            \"deletedAt\": null,\n            \"updatedAt\": null,\n            \"text\": \"すしすきーが重いときだったり気分次第でここに来ます\",\n            \"cw\": null,\n            \"userId\": \"62760754a2c98ac35d9ab0b2\",\n            \"user\": {\n              \"id\": \"62760754a2c98ac35d9ab0b2\",\n              \"username\": \"morotesovtannu\",\n              \"name\": \"せせせの:musume:@漏れデーター\",\n              \"host\": \"mk.yopo.work\",\n              \"avatarUrl\": \"https://misskey.m544.net/files/62760754a2c98ac35d9ab0b7/62760754a2c98ac35d9ab0b7.png?thumbnail\",\n              \"avatarColor\": null,\n              \"isAdmin\": false,\n              \"isVerified\": false,\n              \"isBot\": false,\n              \"isCat\": false,\n              \"instance\": {\n                \"host\": \"mk.yopo.work\",\n                \"name\": \"暫定よぽすき\",\n                \"softwareName\": \"misskey\",\n                \"softwareVersion\": \"12.111.1\",\n                \"iconUrl\": \"https://mk.yopo.work/favicon.ico\",\n                \"themeColor\": \"#86b300\"\n              },\n              \"emojis\": [\n                {\n                  \"name\": \"musume\",\n                  \"url\": \"https://misskey-drive2.m544.net/m544/904579cujj6s3aqcuk83uf2b.png\",\n                  \"host\": \"mk.yopo.work\",\n                  \"resolvable\": \"musume@mk.yopo.work\"\n                }\n              ],\n              \"avoidSearchIndex\": false,\n              \"tags\": [],\n              \"url\": \"https://mk.yopo.work/@morotesovtannu\",\n              \"uri\": \"https://mk.yopo.work/users/8zyzshjjdk\"\n            },\n            \"replyId\": null,\n            \"renoteId\": null,\n            \"viaMobile\": false,\n            \"visibility\": \"public\",\n            \"tags\": [],\n            \"localOnly\": false,\n            \"copyOnce\": false,\n            \"score\": 1,\n            \"renoteCount\": 1,\n            \"quoteCount\": 1,\n            \"repliesCount\": 0,\n            \"reactions\": {},\n            \"reactionCounts\": {},\n            \"emojis\": [],\n            \"fileIds\": [],\n            \"files\": [],\n            \"uri\": \"https://mk.yopo.work/notes/91e4hstjhd\",\n            \"url\": null,\n            \"appId\": null,\n            \"app\": null,\n            \"visibleUserIds\": [],\n            \"mentions\": [],\n            \"hasRemoteMentions\": false,\n            \"reply\": null,\n            \"renote\": null,\n            \"poll\": null,\n            \"myReaction\": null,\n            \"myRenoteId\": null,\n            \"notHaveDecorationMfm\": true\n          },\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"7181713cba909f82f68291a6\",\n          \"createdAt\": \"2022-06-17T10:36:54.288Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"よぽすき管理者・モデレーター一覧　\\n\\n管理者\\nよぽどさん @amaiyo\\n\\nモデレーター\\nこんこんたんぬもろて 私\\n天華使もなかさん @amagashi \\n華鈴さん @Kalin1227\",\n          \"cw\": null,\n          \"userId\": \"62760754a2c98ac35d9ab0b2\",\n          \"user\": {\n            \"id\": \"62760754a2c98ac35d9ab0b2\",\n            \"username\": \"morotesovtannu\",\n            \"name\": \"せせせの:musume:@漏れデーター\",\n            \"host\": \"mk.yopo.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62760754a2c98ac35d9ab0b7/62760754a2c98ac35d9ab0b7.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mk.yopo.work\",\n              \"name\": \"暫定よぽすき\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.111.1\",\n              \"iconUrl\": \"https://mk.yopo.work/favicon.ico\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"musume\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/904579cujj6s3aqcuk83uf2b.png\",\n                \"host\": \"mk.yopo.work\",\n                \"resolvable\": \"musume@mk.yopo.work\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mk.yopo.work/@morotesovtannu\",\n            \"uri\": \"https://mk.yopo.work/users/8zyzshjjdk\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"public\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 1,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {\n            \":ramu_hi@mk.yopo.work:\": 1\n          },\n          \"reactionCounts\": {\n            \":ramu_hi@mk.yopo.work:\": 1\n          },\n          \"emojis\": [\n            {\n              \"name\": \"ramu_hi@mk.yopo.work\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/yz3mxx5g1d0eg44f0x2326hm.png\",\n              \"host\": \"mk.yopo.work\",\n              \"resolvable\": \"ramu_hi@mk.yopo.work\"\n            }\n          ],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mk.yopo.work/notes/91lvrt00i9\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"6277a5a4625fd45f61700ed9\",\n            \"62779b74625fd45f617008b3\",\n            \"62ab3119ff0edb8b1f40d79f\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        },\n        {\n          \"id\": \"71809fb5280e866a4b026989\",\n          \"createdAt\": \"2022-05-07T18:08:11.278Z\",\n          \"deletedAt\": null,\n          \"updatedAt\": null,\n          \"text\": \"こんこんたんぬもろての情報\\n\\nメールアドレス:kon2etonertannu@ilnk.info\\nホームページ:https://home.ilnk.info/\\nブログ:https://ilnk.info/\\n所属グループ:https://main.sisgroup.cyou/\\nActivitypub本垢:@morotesovtannu@sushi.ski\\nMastodonメイン:@tannunico@friends.cafe \\nPleromaメイン:@tannu@cdrom.tokyo \\n写真:@morotesovtannu@pixelfed.gdgd.jp.net\\n暫定Misskeyサブ:ここ\\nサブ垢総本山:@morotesovtannu@mk.f72u.net\",\n          \"cw\": null,\n          \"userId\": \"62760754a2c98ac35d9ab0b2\",\n          \"user\": {\n            \"id\": \"62760754a2c98ac35d9ab0b2\",\n            \"username\": \"morotesovtannu\",\n            \"name\": \"せせせの:musume:@漏れデーター\",\n            \"host\": \"mk.yopo.work\",\n            \"avatarUrl\": \"https://misskey.m544.net/files/62760754a2c98ac35d9ab0b7/62760754a2c98ac35d9ab0b7.png?thumbnail\",\n            \"avatarColor\": null,\n            \"isAdmin\": false,\n            \"isVerified\": false,\n            \"isBot\": false,\n            \"isCat\": false,\n            \"instance\": {\n              \"host\": \"mk.yopo.work\",\n              \"name\": \"暫定よぽすき\",\n              \"softwareName\": \"misskey\",\n              \"softwareVersion\": \"12.111.1\",\n              \"iconUrl\": \"https://mk.yopo.work/favicon.ico\",\n              \"themeColor\": \"#86b300\"\n            },\n            \"emojis\": [\n              {\n                \"name\": \"musume\",\n                \"url\": \"https://misskey-drive2.m544.net/m544/904579cujj6s3aqcuk83uf2b.png\",\n                \"host\": \"mk.yopo.work\",\n                \"resolvable\": \"musume@mk.yopo.work\"\n              }\n            ],\n            \"avoidSearchIndex\": false,\n            \"tags\": [],\n            \"url\": \"https://mk.yopo.work/@morotesovtannu\",\n            \"uri\": \"https://mk.yopo.work/users/8zyzshjjdk\"\n          },\n          \"replyId\": null,\n          \"renoteId\": null,\n          \"viaMobile\": false,\n          \"visibility\": \"home\",\n          \"tags\": [],\n          \"localOnly\": false,\n          \"copyOnce\": false,\n          \"score\": 0,\n          \"renoteCount\": 0,\n          \"quoteCount\": 0,\n          \"repliesCount\": 0,\n          \"reactions\": {},\n          \"reactionCounts\": {},\n          \"emojis\": [],\n          \"fileIds\": [],\n          \"files\": [],\n          \"uri\": \"https://mk.yopo.work/notes/8zzqu8emmx\",\n          \"url\": null,\n          \"appId\": null,\n          \"app\": null,\n          \"visibleUserIds\": [],\n          \"mentions\": [\n            \"619c5345bebd4c4fb4998c78\",\n            \"61532b84f8c54d6728e166b4\",\n            \"6277b430625fd45f617017af\",\n            \"61b8ab54fa9866d95f669ee1\",\n            \"60fd946ea3188d9a967523bb\"\n          ],\n          \"hasRemoteMentions\": true,\n          \"reply\": null,\n          \"renote\": null,\n          \"poll\": null,\n          \"myReaction\": null,\n          \"myRenoteId\": null,\n          \"notHaveDecorationMfm\": true\n        }\n      ],\n      \"movedToUser\": null,\n      \"usertags\": [],\n      \"isFollowing\": false,\n      \"isFollowed\": false,\n      \"hasPendingFollowRequestFromYou\": false,\n      \"hasPendingFollowRequestToYou\": false,\n      \"isBlocking\": false,\n      \"isBlocked\": false,\n      \"isMuted\": false,\n      \"isHideRenoting\": false\n    }\n  ],\n  \"next\": \"627aa1f654e8243f16dc15db\"\n}"
  },
  {
    "path": "modules/api/src/test/resources/v10_user_dto_give_harunon_case1.json",
    "content": "{\n  \"id\": \"5cb405e831dd564a8b1cf124\",\n  \"username\": \"harunon\",\n  \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n  \"host\": \"misskey.io\",\n  \"avatarUrl\": \"https://misskey.m544.net/files/6208f9db36d39e7ce63cfbef/6208f9db36d39e7ce63cfbef.jpg?thumbnail\",\n  \"avatarColor\": null,\n  \"isAdmin\": false,\n  \"isVerified\": false,\n  \"isBot\": false,\n  \"isCat\": true,\n  \"instance\": {\n    \"host\": \"misskey.io\",\n    \"name\": \"Misskey.io\",\n    \"softwareName\": \"misskey\",\n    \"softwareVersion\": \"12.118.1\",\n    \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n    \"themeColor\": \"#86b300\"\n  },\n  \"emojis\": [\n    {\n      \"name\": \"keybase\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/42gs80hpxkibalt54ugp5e1a.png\",\n      \"host\": \"misskey.io\",\n      \"resolvable\": \"keybase@misskey.io\"\n    }\n  ],\n  \"avoidSearchIndex\": false,\n  \"tags\": [\n    \"vue\",\n    \"nuxt\",\n    \"flutter\"\n  ],\n  \"url\": \"https://misskey.io/@harunon\",\n  \"uri\": \"https://misskey.io/users/7rla9gie6j\",\n  \"createdAt\": \"2019-04-15T04:17:44.274Z\",\n  \"updatedAt\": \"2022-09-25T23:53:28.430Z\",\n  \"bannerUrl\": \"https://misskey.m544.net/files/6163f8ef82da6ea25a1250ab/6163f8ef82da6ea25a1250ab.png?web\",\n  \"bannerColor\": null,\n  \"isLocked\": false,\n  \"isSilenced\": false,\n  \"isSuspended\": false,\n  \"isDeleted\": false,\n  \"description\": \"Design / Programming / wishlist→https://amzn.to/2Z6BrEz /#Vue /#Nuxt /#Flutter / ｵﾅｶｲﾀｲ / ﾅﾆﾓﾃﾞｷﾅｲ\",\n  \"profile\": {\n    \"birthday\": \"2097-02-06\",\n    \"location\": null\n  },\n  \"fields\": [\n    {\n      \"name\": \"keybase\",\n      \"value\": \"https://keybase.io/harunon\"\n    },\n    {\n      \"name\": \"ぢすこ\",\n      \"value\": \"harunon#5514\"\n    },\n    {\n      \"name\": \"wishlist\",\n      \"value\": \"https://amzn.to/2Z6BrEz\"\n    },\n    {\n      \"name\": \"紫翠\",\n      \"value\": \"しすい\"\n    },\n    {\n      \"name\": \"Switchフレコ\",\n      \"value\": \"https://lounge.nintendo.com/friendcode/8544-1595-7987/DFDTn7QBYt\"\n    }\n  ],\n  \"followersCount\": null,\n  \"followingCount\": null,\n  \"notesCount\": 119801,\n  \"pinnedNoteIds\": [\n    \"7181c8c08d9ecbd118746efc\",\n    \"71814bc4844f6fdbfbf23da6\",\n    \"71721bebb8d02556cbb4fe42\",\n    \"716db590812475a2075f02bc\",\n    \"716ca5602b3fc29af0a52759\"\n  ],\n  \"pinnedNotes\": [\n    {\n      \"id\": \"7181c8c08d9ecbd118746efc\",\n      \"createdAt\": \"2022-07-04T10:27:51.326Z\",\n      \"deletedAt\": null,\n      \"updatedAt\": null,\n      \"text\": \"かわいい\",\n      \"cw\": null,\n      \"userId\": \"5cb405e831dd564a8b1cf124\",\n      \"user\": {\n        \"id\": \"5cb405e831dd564a8b1cf124\",\n        \"username\": \"harunon\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.m544.net/files/6208f9db36d39e7ce63cfbef/6208f9db36d39e7ce63cfbef.jpg?thumbnail\",\n        \"avatarColor\": null,\n        \"isAdmin\": false,\n        \"isVerified\": false,\n        \"isBot\": false,\n        \"isCat\": true,\n        \"instance\": {\n          \"host\": \"misskey.io\",\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey-drive2.m544.net/m544/42gs80hpxkibalt54ugp5e1a.png\",\n            \"host\": \"misskey.io\",\n            \"resolvable\": \"keybase@misskey.io\"\n          }\n        ],\n        \"avoidSearchIndex\": false,\n        \"tags\": [\n          \"vue\",\n          \"nuxt\",\n          \"flutter\"\n        ],\n        \"url\": \"https://misskey.io/@harunon\",\n        \"uri\": \"https://misskey.io/users/7rla9gie6j\"\n      },\n      \"replyId\": \"7181c8bb08b4c4797084f6d3\",\n      \"renoteId\": null,\n      \"viaMobile\": false,\n      \"visibility\": \"public\",\n      \"tags\": [],\n      \"localOnly\": false,\n      \"copyOnce\": false,\n      \"score\": 30,\n      \"renoteCount\": 14,\n      \"quoteCount\": 1,\n      \"repliesCount\": 1,\n      \"reactions\": {\n        \"🤯\": 1,\n        \"💛\": 3,\n        \"🥰\": 6,\n        \":kawaiii@misskey.io:\": 2,\n        \"👍\": 1,\n        \":ablobaww@misskey.io:\": 2,\n        \"❤\": 1\n      },\n      \"reactionCounts\": {\n        \"🤯\": 1,\n        \"💛\": 3,\n        \"🥰\": 6,\n        \":kawaiii@misskey.io:\": 2,\n        \"👍\": 1,\n        \":ablobaww@misskey.io:\": 2,\n        \"❤\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"kawaiii@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/8wx059347bebw4jjs42ofkbd.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"kawaiii@misskey.io\"\n        },\n        {\n          \"name\": \"ablobaww@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/vu1mzqaca8icjh23qspdymdx.apng\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"ablobaww@misskey.io\"\n        }\n      ],\n      \"fileIds\": [\n        \"62c2c0aa757ad7631280a4e3\"\n      ],\n      \"files\": [\n        {\n          \"id\": \"62c2c0aa757ad7631280a4e3\",\n          \"createdAt\": \"2022-07-04T10:27:54.245Z\",\n          \"name\": \"webpublic-f4e62c02-04a2-4af6-85a7-8dd2c6033f64.jpg\",\n          \"type\": \"image/jpeg\",\n          \"datasize\": 0,\n          \"size\": 0,\n          \"md5\": \"c3b7359d0190cb5b5fe4c17c8f69d4bd\",\n          \"url\": \"https://misskey.m544.net/files/62c2c0aa757ad7631280a4e3/62c2c0aa757ad7631280a4e3.jpg?web\",\n          \"thumbnailUrl\": \"https://misskey.m544.net/files/62c2c0aa757ad7631280a4e3/62c2c0aa757ad7631280a4e3.jpg?thumbnail\",\n          \"properties\": {\n            \"width\": 2048,\n            \"height\": 1536\n          },\n          \"comment\": null,\n          \"isSensitive\": false\n        }\n      ],\n      \"uri\": \"https://misskey.io/notes/92a5xndq1u\",\n      \"url\": null,\n      \"appId\": null,\n      \"app\": null,\n      \"visibleUserIds\": [],\n      \"mentions\": [],\n      \"hasRemoteMentions\": false,\n      \"reply\": {\n        \"id\": \"7181c8bb08b4c4797084f6d3\",\n        \"createdAt\": \"2022-07-04T10:21:49.620Z\",\n        \"deletedAt\": null,\n        \"updatedAt\": null,\n        \"text\": \"まいにゅぎあ\",\n        \"cw\": null,\n        \"userId\": \"5cb405e831dd564a8b1cf124\",\n        \"user\": {\n          \"id\": \"5cb405e831dd564a8b1cf124\",\n          \"username\": \"harunon\",\n          \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.m544.net/files/6208f9db36d39e7ce63cfbef/6208f9db36d39e7ce63cfbef.jpg?thumbnail\",\n          \"avatarColor\": null,\n          \"isAdmin\": false,\n          \"isVerified\": false,\n          \"isBot\": false,\n          \"isCat\": true,\n          \"instance\": {\n            \"host\": \"misskey.io\",\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"keybase\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/42gs80hpxkibalt54ugp5e1a.png\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"keybase@misskey.io\"\n            }\n          ],\n          \"avoidSearchIndex\": false,\n          \"tags\": [\n            \"vue\",\n            \"nuxt\",\n            \"flutter\"\n          ],\n          \"url\": \"https://misskey.io/@harunon\",\n          \"uri\": \"https://misskey.io/users/7rla9gie6j\"\n        },\n        \"replyId\": null,\n        \"renoteId\": null,\n        \"viaMobile\": false,\n        \"visibility\": \"public\",\n        \"tags\": [],\n        \"localOnly\": false,\n        \"copyOnce\": false,\n        \"score\": 6,\n        \"renoteCount\": 2,\n        \"quoteCount\": 0,\n        \"repliesCount\": 1,\n        \"reactions\": {\n          \"🎉\": 1,\n          \"🥰\": 1,\n          \"💛\": 1,\n          \":iihanashi@misskey.io:\": 1\n        },\n        \"reactionCounts\": {\n          \"🎉\": 1,\n          \"🥰\": 1,\n          \"💛\": 1,\n          \":iihanashi@misskey.io:\": 1\n        },\n        \"emojis\": [\n          {\n            \"name\": \"iihanashi@misskey.io\",\n            \"url\": \"https://misskey-drive2.m544.net/m544/4jleii6ye4vmtbl7cj6eekdz.gif\",\n            \"host\": \"misskey.io\",\n            \"resolvable\": \"iihanashi@misskey.io\"\n          }\n        ],\n        \"fileIds\": [\n          \"62c2bf3f757ad7631280a457\"\n        ],\n        \"files\": [\n          {\n            \"id\": \"62c2bf3f757ad7631280a457\",\n            \"createdAt\": \"2022-07-04T10:21:51.112Z\",\n            \"name\": \"webpublic-929c29fe-de10-487f-9bf4-fb22ab02cd27.jpg\",\n            \"type\": \"image/jpeg\",\n            \"datasize\": 0,\n            \"size\": 0,\n            \"md5\": \"b85531101c908aa01309624cfcd3b048\",\n            \"url\": \"https://misskey.m544.net/files/62c2bf3f757ad7631280a457/62c2bf3f757ad7631280a457.jpg?web\",\n            \"thumbnailUrl\": \"https://misskey.m544.net/files/62c2bf3f757ad7631280a457/62c2bf3f757ad7631280a457.jpg?thumbnail\",\n            \"properties\": {\n              \"width\": 1536,\n              \"height\": 2048\n            },\n            \"comment\": null,\n            \"isSensitive\": false\n          }\n        ],\n        \"uri\": \"https://misskey.io/notes/92a5pwac3s\",\n        \"url\": null,\n        \"appId\": null,\n        \"app\": null,\n        \"visibleUserIds\": [],\n        \"mentions\": [],\n        \"hasRemoteMentions\": false,\n        \"notHaveDecorationMfm\": true\n      },\n      \"renote\": null,\n      \"poll\": null,\n      \"myReaction\": null,\n      \"myRenoteId\": null,\n      \"notHaveDecorationMfm\": true\n    },\n    {\n      \"id\": \"71814bc4844f6fdbfbf23da6\",\n      \"createdAt\": \"2022-06-10T03:59:39.087Z\",\n      \"deletedAt\": null,\n      \"updatedAt\": null,\n      \"text\": \"@各位\\n\\n・鍵垢はフォロバできません（フォロリク無視が怖いので）\\n・複数インスタンスに垢ある場合はメインで動かしてる本垢のみフォロバします（どれフォロバしてるしてにゃいが面倒にゃので）\",\n      \"cw\": null,\n      \"userId\": \"5cb405e831dd564a8b1cf124\",\n      \"user\": {\n        \"id\": \"5cb405e831dd564a8b1cf124\",\n        \"username\": \"harunon\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.m544.net/files/6208f9db36d39e7ce63cfbef/6208f9db36d39e7ce63cfbef.jpg?thumbnail\",\n        \"avatarColor\": null,\n        \"isAdmin\": false,\n        \"isVerified\": false,\n        \"isBot\": false,\n        \"isCat\": true,\n        \"instance\": {\n          \"host\": \"misskey.io\",\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey-drive2.m544.net/m544/42gs80hpxkibalt54ugp5e1a.png\",\n            \"host\": \"misskey.io\",\n            \"resolvable\": \"keybase@misskey.io\"\n          }\n        ],\n        \"avoidSearchIndex\": false,\n        \"tags\": [\n          \"vue\",\n          \"nuxt\",\n          \"flutter\"\n        ],\n        \"url\": \"https://misskey.io/@harunon\",\n        \"uri\": \"https://misskey.io/users/7rla9gie6j\"\n      },\n      \"replyId\": null,\n      \"renoteId\": null,\n      \"viaMobile\": false,\n      \"visibility\": \"home\",\n      \"tags\": [],\n      \"localOnly\": false,\n      \"copyOnce\": false,\n      \"score\": 10,\n      \"renoteCount\": 5,\n      \"quoteCount\": 1,\n      \"repliesCount\": 0,\n      \"reactions\": {\n        \"💛\": 1,\n        \"👍\": 2,\n        \":blobcatsweatflips@misskey.io:\": 1,\n        \":ablobcatfloofpat@groundpolis.app:\": 1\n      },\n      \"reactionCounts\": {\n        \"💛\": 1,\n        \"👍\": 2,\n        \":blobcatsweatflips@misskey.io:\": 1,\n        \":ablobcatfloofpat@groundpolis.app:\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"blobcatsweatflips@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/0usxwg2c4bma5jvxu08fsbtn.apng\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"blobcatsweatflips@misskey.io\"\n        },\n        {\n          \"name\": \"ablobcatfloofpat@groundpolis.app\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/pkeipjpi4q9vf9cnuo2zuxyi.gif\",\n          \"host\": \"groundpolis.app\",\n          \"resolvable\": \"ablobcatfloofpat@groundpolis.app\"\n        }\n      ],\n      \"fileIds\": [],\n      \"files\": [],\n      \"uri\": \"https://misskey.io/notes/91bhhyz3hh\",\n      \"url\": null,\n      \"appId\": null,\n      \"app\": null,\n      \"visibleUserIds\": [],\n      \"mentions\": [],\n      \"hasRemoteMentions\": false,\n      \"reply\": null,\n      \"renote\": null,\n      \"poll\": null,\n      \"myReaction\": null,\n      \"myRenoteId\": null,\n      \"notHaveDecorationMfm\": true\n    },\n    {\n      \"id\": \"71721bebb8d02556cbb4fe42\",\n      \"createdAt\": \"2020-05-16T05:18:52.624Z\",\n      \"deletedAt\": null,\n      \"updatedAt\": null,\n      \"text\": \"分散SNSってのは\\nSNSに何かと投稿する癖がついてしまったが今の人が増えすぎた環境には馴染めにゃい(陰キャちっすちっす)故に「喋りたいけどあんまり聞いて欲しくにゃいにゃ…」とかいうめんどくさいオタクの診療所(医者はいません)とか互助会(だが助けにゃい)みたいにゃものだと思ってますね\",\n      \"cw\": null,\n      \"userId\": \"5cb405e831dd564a8b1cf124\",\n      \"user\": {\n        \"id\": \"5cb405e831dd564a8b1cf124\",\n        \"username\": \"harunon\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.m544.net/files/6208f9db36d39e7ce63cfbef/6208f9db36d39e7ce63cfbef.jpg?thumbnail\",\n        \"avatarColor\": null,\n        \"isAdmin\": false,\n        \"isVerified\": false,\n        \"isBot\": false,\n        \"isCat\": true,\n        \"instance\": {\n          \"host\": \"misskey.io\",\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey-drive2.m544.net/m544/42gs80hpxkibalt54ugp5e1a.png\",\n            \"host\": \"misskey.io\",\n            \"resolvable\": \"keybase@misskey.io\"\n          }\n        ],\n        \"avoidSearchIndex\": false,\n        \"tags\": [\n          \"vue\",\n          \"nuxt\",\n          \"flutter\"\n        ],\n        \"url\": \"https://misskey.io/@harunon\",\n        \"uri\": \"https://misskey.io/users/7rla9gie6j\"\n      },\n      \"replyId\": null,\n      \"renoteId\": null,\n      \"viaMobile\": false,\n      \"visibility\": \"public\",\n      \"tags\": [],\n      \"localOnly\": false,\n      \"copyOnce\": false,\n      \"score\": 47,\n      \"renoteCount\": 2,\n      \"quoteCount\": 0,\n      \"repliesCount\": 0,\n      \"reactions\": {\n        \"👍\": 7,\n        \"🍣\": 1,\n        \":0090@misskey.mametsuko.net:\": 1,\n        \"😮\": 1,\n        \":majisuka@misskey.io:\": 1,\n        \":tashikani@misskey.io:\": 1,\n        \"🤬\": 2,\n        \":blob_hyper_nod@honi.club:\": 1,\n        \":wakaru@misskey.io:\": 3,\n        \":relaxed_baby@misskey.io:\": 1,\n        \"❤\": 2,\n        \":ablobcatheadbangfastultra@misskey.io:\": 2,\n        \":soukamo@misskey.io:\": 1\n      },\n      \"reactionCounts\": {\n        \"👍\": 7,\n        \"🍣\": 1,\n        \":0090@misskey.mametsuko.net:\": 1,\n        \"😮\": 1,\n        \":majisuka@misskey.io:\": 1,\n        \":tashikani@misskey.io:\": 1,\n        \"🤬\": 2,\n        \":blob_hyper_nod@honi.club:\": 1,\n        \":wakaru@misskey.io:\": 3,\n        \":relaxed_baby@misskey.io:\": 1,\n        \"❤\": 2,\n        \":ablobcatheadbangfastultra@misskey.io:\": 2,\n        \":soukamo@misskey.io:\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"0090@misskey.mametsuko.net\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/faix39zflt262n695i166fps.png\",\n          \"host\": \"misskey.mametsuko.net\",\n          \"resolvable\": \"0090@misskey.mametsuko.net\"\n        },\n        {\n          \"name\": \"majisuka@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/2ui5f4gecp4jv3qowt4oe6ow.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"majisuka@misskey.io\"\n        },\n        {\n          \"name\": \"tashikani@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/kqe4a0qfg8lg78hxavmorxx9.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"tashikani@misskey.io\"\n        },\n        {\n          \"name\": \"blob_hyper_nod@honi.club\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/igitwhjz1qctha1d00bm2nfh.gif\",\n          \"host\": \"honi.club\",\n          \"resolvable\": \"blob_hyper_nod@honi.club\"\n        },\n        {\n          \"name\": \"wakaru@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/i4ph7iqklteum7ec5qxsff2n.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"wakaru@misskey.io\"\n        },\n        {\n          \"name\": \"relaxed_baby@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/v26td8dounwu2wauscivdglb.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"relaxed_baby@misskey.io\"\n        },\n        {\n          \"name\": \"ablobcatheadbangfastultra@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/1zjevse3x9p2mo3epvetmwbg.gif\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"ablobcatheadbangfastultra@misskey.io\"\n        },\n        {\n          \"name\": \"soukamo@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/0wjihj3hzg5d6itlsanpri4v.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"soukamo@misskey.io\"\n        }\n      ],\n      \"fileIds\": [],\n      \"files\": [],\n      \"uri\": \"https://misskey.io/notes/87cqvphs6p\",\n      \"url\": null,\n      \"appId\": null,\n      \"app\": null,\n      \"visibleUserIds\": [],\n      \"mentions\": [],\n      \"hasRemoteMentions\": false,\n      \"reply\": null,\n      \"renote\": null,\n      \"poll\": null,\n      \"myReaction\": null,\n      \"myRenoteId\": null,\n      \"notHaveDecorationMfm\": true\n    },\n    {\n      \"id\": \"716db590812475a2075f02bc\",\n      \"createdAt\": \"2019-10-10T12:06:49.380Z\",\n      \"deletedAt\": null,\n      \"updatedAt\": null,\n      \"text\": \".\",\n      \"cw\": null,\n      \"userId\": \"5cb405e831dd564a8b1cf124\",\n      \"user\": {\n        \"id\": \"5cb405e831dd564a8b1cf124\",\n        \"username\": \"harunon\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.m544.net/files/6208f9db36d39e7ce63cfbef/6208f9db36d39e7ce63cfbef.jpg?thumbnail\",\n        \"avatarColor\": null,\n        \"isAdmin\": false,\n        \"isVerified\": false,\n        \"isBot\": false,\n        \"isCat\": true,\n        \"instance\": {\n          \"host\": \"misskey.io\",\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey-drive2.m544.net/m544/42gs80hpxkibalt54ugp5e1a.png\",\n            \"host\": \"misskey.io\",\n            \"resolvable\": \"keybase@misskey.io\"\n          }\n        ],\n        \"avoidSearchIndex\": false,\n        \"tags\": [\n          \"vue\",\n          \"nuxt\",\n          \"flutter\"\n        ],\n        \"url\": \"https://misskey.io/@harunon\",\n        \"uri\": \"https://misskey.io/users/7rla9gie6j\"\n      },\n      \"replyId\": \"716db58f8266982572bc4360\",\n      \"renoteId\": null,\n      \"viaMobile\": false,\n      \"visibility\": \"public\",\n      \"tags\": [],\n      \"localOnly\": false,\n      \"copyOnce\": false,\n      \"score\": 169,\n      \"renoteCount\": 62,\n      \"quoteCount\": 1,\n      \"repliesCount\": 2,\n      \"reactions\": {\n        \"😆\": 3,\n        \"👍\": 8,\n        \"😇\": 6,\n        \"🦑\": 3,\n        \"😭\": 2,\n        \"❤\": 3,\n        \":blob_hyper_nod@misskey.io:\": 1,\n        \":ikasune@misskey.io:\": 2,\n        \"⭐\": 1,\n        \"😢\": 2,\n        \":takosune@misskey.io:\": 1,\n        \":majikayo@honi.club:\": 1,\n        \":bap@mk.f72u.net:\": 1,\n        \":tako@submarin.online:\": 2,\n        \"🔽\": 1\n      },\n      \"reactionCounts\": {\n        \"😆\": 3,\n        \"👍\": 8,\n        \"😇\": 6,\n        \"🦑\": 3,\n        \"😭\": 2,\n        \"❤\": 3,\n        \":blob_hyper_nod@misskey.io:\": 1,\n        \":ikasune@misskey.io:\": 2,\n        \"⭐\": 1,\n        \"😢\": 2,\n        \":takosune@misskey.io:\": 1,\n        \":majikayo@honi.club:\": 1,\n        \":bap@mk.f72u.net:\": 1,\n        \":tako@submarin.online:\": 2,\n        \"🔽\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"blob_hyper_nod@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/yg2p6t9zpvg4ay0dt5aqpzgq.gif\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"blob_hyper_nod@misskey.io\"\n        },\n        {\n          \"name\": \"ikasune@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/jvxc3m2xm7jc48441o6dzhl5.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"ikasune@misskey.io\"\n        },\n        {\n          \"name\": \"takosune@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/7bx8ncznxn22009xs3j6wybd.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"takosune@misskey.io\"\n        },\n        {\n          \"name\": \"majikayo@honi.club\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/r09a68dc6uhryfdn8zq7skbo.png\",\n          \"host\": \"honi.club\",\n          \"resolvable\": \"majikayo@honi.club\"\n        },\n        {\n          \"name\": \"bap@mk.f72u.net\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/0j2m413nnov15a9grenphswh.gif\",\n          \"host\": \"mk.f72u.net\",\n          \"resolvable\": \"bap@mk.f72u.net\"\n        },\n        {\n          \"name\": \"tako@submarin.online\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/d4ypqa1moz0abza4zq7pxmj1.png\",\n          \"host\": \"submarin.online\",\n          \"resolvable\": \"tako@submarin.online\"\n        }\n      ],\n      \"fileIds\": [\n        \"5d9bd5be2e49b05bb22f4461\"\n      ],\n      \"files\": [\n        {\n          \"id\": \"5d9bd5be2e49b05bb22f4461\",\n          \"createdAt\": \"2019-10-08T00:18:06.101Z\",\n          \"name\": \"webpublic-cf04ece4-eb64-463a-8fb1-7a53c7e92cb5.jpg\",\n          \"type\": \"image/jpeg\",\n          \"datasize\": 13855,\n          \"size\": 13855,\n          \"md5\": \"2d6aa1affc138447839cf193b5562dbb\",\n          \"url\": \"https://misskey.m544.net/files/5d9bd5be2e49b05bb22f4461/5d9bd5be2e49b05bb22f4461.jpg?web\",\n          \"thumbnailUrl\": \"https://misskey.m544.net/files/5d9bd5be2e49b05bb22f4461/5d9bd5be2e49b05bb22f4461.jpg?thumbnail\",\n          \"properties\": {},\n          \"deletedAt\": \"2019-10-14T14:44:31.748Z\"\n        }\n      ],\n      \"uri\": \"https://misskey.io/notes/7yo80rvomd\",\n      \"url\": null,\n      \"appId\": null,\n      \"app\": null,\n      \"visibleUserIds\": [],\n      \"mentions\": [\n        \"5d956314214cf74c9eae9521\"\n      ],\n      \"hasRemoteMentions\": true,\n      \"reply\": {\n        \"id\": \"716db58f8266982572bc4360\",\n        \"createdAt\": \"2019-10-10T12:05:44.166Z\",\n        \"deletedAt\": null,\n        \"updatedAt\": null,\n        \"text\": \"アイコン付けてないんでアイコン募集\",\n        \"cw\": null,\n        \"userId\": \"5d956314214cf74c9eae9521\",\n        \"user\": {\n          \"id\": \"5d956314214cf74c9eae9521\",\n          \"username\": \"kanapon\",\n          \"name\": \"かなぽん:verify:\",\n          \"host\": \"misskey.io\",\n          \"avatarUrl\": \"https://misskey.m544.net/files/62c52c3dce8c2f8883c44563/62c52c3dce8c2f8883c44563.png?thumbnail\",\n          \"avatarColor\": null,\n          \"isAdmin\": false,\n          \"isVerified\": false,\n          \"isBot\": false,\n          \"isCat\": false,\n          \"instance\": {\n            \"host\": \"misskey.io\",\n            \"name\": \"Misskey.io\",\n            \"softwareName\": \"misskey\",\n            \"softwareVersion\": \"12.118.1\",\n            \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n            \"themeColor\": \"#86b300\"\n          },\n          \"emojis\": [\n            {\n              \"name\": \"verify\",\n              \"url\": \"https://misskey-drive2.m544.net/m544/0oyumwclql7ss5ht4szkeqj4.gif\",\n              \"host\": \"misskey.io\",\n              \"resolvable\": \"verify@misskey.io\"\n            }\n          ],\n          \"avoidSearchIndex\": false,\n          \"tags\": [\n            \"女装\",\n            \"制服\",\n            \"jk\"\n          ],\n          \"url\": \"https://misskey.io/@kanapon\",\n          \"uri\": \"https://misskey.io/users/7ydo008oal\"\n        },\n        \"replyId\": null,\n        \"renoteId\": null,\n        \"viaMobile\": false,\n        \"visibility\": \"public\",\n        \"tags\": [],\n        \"localOnly\": false,\n        \"copyOnce\": false,\n        \"score\": 0,\n        \"renoteCount\": 0,\n        \"quoteCount\": 0,\n        \"repliesCount\": 2,\n        \"reactions\": {},\n        \"reactionCounts\": {},\n        \"emojis\": [],\n        \"fileIds\": [],\n        \"files\": [],\n        \"uri\": \"https://misskey.io/notes/7yo7zdk62o\",\n        \"url\": null,\n        \"appId\": null,\n        \"app\": null,\n        \"visibleUserIds\": [],\n        \"mentions\": [],\n        \"hasRemoteMentions\": false,\n        \"notHaveDecorationMfm\": true\n      },\n      \"renote\": null,\n      \"poll\": null,\n      \"myReaction\": null,\n      \"myRenoteId\": null,\n      \"notHaveDecorationMfm\": true\n    },\n    {\n      \"id\": \"716ca5602b3fc29af0a52759\",\n      \"createdAt\": \"2019-08-18T15:37:18.911Z\",\n      \"deletedAt\": null,\n      \"updatedAt\": null,\n      \"text\": \"ヒモを養うかきくけこ\\n\\nカードにゃらいくらでも使っていいよ\\n聞いたこと無いよ、この請求書\\n苦しいときは、私にいってね\\n計画的にお金は使ってね\\n今月のお小遣い、ここにおいておくから\",\n      \"cw\": null,\n      \"userId\": \"5cb405e831dd564a8b1cf124\",\n      \"user\": {\n        \"id\": \"5cb405e831dd564a8b1cf124\",\n        \"username\": \"harunon\",\n        \"name\": \"harunon:keybase:さんと他99人が注目しています\",\n        \"host\": \"misskey.io\",\n        \"avatarUrl\": \"https://misskey.m544.net/files/6208f9db36d39e7ce63cfbef/6208f9db36d39e7ce63cfbef.jpg?thumbnail\",\n        \"avatarColor\": null,\n        \"isAdmin\": false,\n        \"isVerified\": false,\n        \"isBot\": false,\n        \"isCat\": true,\n        \"instance\": {\n          \"host\": \"misskey.io\",\n          \"name\": \"Misskey.io\",\n          \"softwareName\": \"misskey\",\n          \"softwareVersion\": \"12.118.1\",\n          \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n          \"themeColor\": \"#86b300\"\n        },\n        \"emojis\": [\n          {\n            \"name\": \"keybase\",\n            \"url\": \"https://misskey-drive2.m544.net/m544/42gs80hpxkibalt54ugp5e1a.png\",\n            \"host\": \"misskey.io\",\n            \"resolvable\": \"keybase@misskey.io\"\n          }\n        ],\n        \"avoidSearchIndex\": false,\n        \"tags\": [\n          \"vue\",\n          \"nuxt\",\n          \"flutter\"\n        ],\n        \"url\": \"https://misskey.io/@harunon\",\n        \"uri\": \"https://misskey.io/users/7rla9gie6j\"\n      },\n      \"replyId\": null,\n      \"renoteId\": null,\n      \"viaMobile\": false,\n      \"visibility\": \"public\",\n      \"tags\": [],\n      \"localOnly\": false,\n      \"copyOnce\": false,\n      \"score\": 48,\n      \"renoteCount\": 0,\n      \"quoteCount\": 0,\n      \"repliesCount\": 1,\n      \"reactions\": {\n        \"😇\": 6,\n        \"👍\": 2,\n        \"😆\": 3,\n        \":ijo@misskey.io:\": 1,\n        \"💛\": 1\n      },\n      \"reactionCounts\": {\n        \"😇\": 6,\n        \"👍\": 2,\n        \"😆\": 3,\n        \":ijo@misskey.io:\": 1,\n        \"💛\": 1\n      },\n      \"emojis\": [\n        {\n          \"name\": \"ijo@misskey.io\",\n          \"url\": \"https://misskey-drive2.m544.net/m544/xoaub7odx60cesne7rqh5b1m.png\",\n          \"host\": \"misskey.io\",\n          \"resolvable\": \"ijo@misskey.io\"\n        }\n      ],\n      \"fileIds\": [],\n      \"files\": [],\n      \"uri\": \"https://misskey.io/notes/7wkp7bjzdz\",\n      \"url\": null,\n      \"appId\": null,\n      \"app\": null,\n      \"visibleUserIds\": [],\n      \"mentions\": [],\n      \"hasRemoteMentions\": false,\n      \"reply\": null,\n      \"renote\": null,\n      \"poll\": null,\n      \"myReaction\": null,\n      \"myRenoteId\": null,\n      \"notHaveDecorationMfm\": true\n    }\n  ],\n  \"movedToUser\": null,\n  \"usertags\": [],\n  \"isFollowing\": false,\n  \"isFollowed\": false,\n  \"hasPendingFollowRequestFromYou\": false,\n  \"hasPendingFollowRequestToYou\": false,\n  \"isBlocking\": false,\n  \"isBlocked\": false,\n  \"isMuted\": false,\n  \"isHideRenoting\": false\n}"
  },
  {
    "path": "modules/api_streaming/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/api_streaming/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    alias libs.plugins.kotlin.serialization.plugin\n\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.api_streaming'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:model')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    // define a BOM and its version\n    implementation(platform(\"com.squareup.okhttp3:okhttp-bom:4.10.0\"))\n\n    // define any required OkHttp artifacts without version\n    implementation(\"com.squareup.okhttp3:okhttp\")\n    implementation(\"com.squareup.okhttp3:logging-interceptor\")\n    implementation libs.kotlin.serialization\n    implementation libs.kotlin.datetime\n\n    testImplementation libs.junit.jupiter.api\n\n    implementation libs.okhttp.sse\n\n    testRuntimeOnly libs.junit.jupiter.engine\n\n}"
  },
  {
    "path": "modules/api_streaming/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/api_streaming/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/api_streaming/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/NoteCaptureAPI.kt",
    "content": "package net.pantasystem.milktea.api_streaming\n\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.channelFlow\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.Logger\n\ninterface NoteCaptureAPI {\n    fun capture(noteId: String): Flow<NoteUpdated.Body>\n    fun count(): Int\n    fun isEmpty(): Boolean\n    fun isCaptured(noteId: String): Boolean\n}\n\nclass NoteCaptureAPIImpl(\n    val socket: Socket,\n    loggerFactory: Logger.Factory? = null,\n) : SocketMessageEventListener, SocketStateEventListener, NoteCaptureAPI {\n\n\n    val logger = loggerFactory?.create(\"NoteCaptureAPI\")\n\n\n    override fun capture(noteId: String): Flow<NoteUpdated.Body> {\n\n        return channelFlow {\n\n            val listener: (NoteUpdated) -> Unit = { noteUpdated ->\n                trySend(noteUpdated.body)\n            }\n            capture(noteId, listener)\n\n            awaitClose {\n                unSubscribe(noteId, listener)\n            }\n        }\n\n    }\n\n    /**\n     * subscribeしているノート数を計算します\n     */\n    override fun count(): Int = noteIdListenMap.size\n\n\n    override fun isEmpty(): Boolean {\n        return count() == 0\n    }\n\n    /**\n     * すでにCapture済みかをチェックします\n     */\n    override fun isCaptured(noteId: String): Boolean {\n        return noteIdListenMap.containsKey(noteId)\n\n\n    }\n\n    private var noteIdListenMap = mapOf<String, Set<(NoteUpdated) -> Unit>>()\n    private val lock = Mutex()\n\n    init {\n        socket.addStateEventListener(this)\n    }\n\n    private fun capture(noteId: String, listener: (NoteUpdated) -> Unit) = runBlocking {\n        lock.withLock {\n            val listeners = noteIdListenMap.getOrNew(noteId)\n            if (noteIdListenMap.isEmpty()) {\n                socket.addMessageEventListener(true,this@NoteCaptureAPIImpl)\n            }\n            if (listeners.isEmpty()) {\n                if (!sendSub(noteId)) {\n                    return@runBlocking\n                }\n            }\n            if (!listeners.contains(listener)) {\n                listeners.add(listener)\n            }\n            noteIdListenMap = noteIdListenMap.toMutableMap().also {\n                it[noteId] = listeners\n            }\n        }\n\n\n    }\n\n    private fun unSubscribe(noteId: String, listener: (NoteUpdated) -> Unit) = runBlocking {\n        lock.withLock {\n            val listeners = noteIdListenMap.getOrNew(noteId)\n            if (listeners.isEmpty()) {\n                return@runBlocking\n            }\n\n            if (listeners.remove(listener) && listeners.isEmpty()) {\n                sendUnSub(noteId)\n            }\n            if (listeners.isEmpty()) {\n                noteIdListenMap = noteIdListenMap.toMutableMap().also {\n                    it.remove(noteId)\n                }\n            }\n            if (noteIdListenMap.isEmpty()) {\n                socket.removeMessageEventListener(this@NoteCaptureAPIImpl)\n            }\n        }\n\n\n    }\n\n\n    private fun Map<String, Set<(NoteUpdated) -> Unit>>.getOrNew(noteId: String): MutableSet<(NoteUpdated) -> Unit> {\n        val listeners = this[noteId]\n        return listeners?.toMutableSet() ?: mutableSetOf()\n    }\n\n\n    override fun onMessage(e: StreamingEvent): Boolean {\n        if (e is NoteUpdated) {\n            logger?.debug{ \"noteUpdated: $e\" }\n            val listeners = if (noteIdListenMap[e.body.id].isNullOrEmpty()) {\n                logger?.warning(\"listenerは未登録ですが、何か受信したようです。\")\n                null\n            } else {\n                noteIdListenMap[e.body.id]\n            }\n            listeners?.forEach {\n                it.invoke(e)\n            }\n            if (listeners.isNullOrEmpty()) {\n                sendUnSub(e.body.id)\n            }\n            return true\n        }\n        return false\n    }\n\n    override fun onStateChanged(e: Socket.State) {\n        logger?.debug { \"onStateChanged $e\" }\n        if (e is Socket.State.Connected) {\n            noteIdListenMap.keys.forEach {\n                sendSub(it)\n            }\n        } else if (e is Socket.State.Closing) {\n\n            noteIdListenMap.keys.forEach {\n                sendUnSub(it)\n            }\n\n        }\n    }\n\n    private fun sendSub(noteId: String): Boolean {\n        logger?.debug { \"購読メッセージ送信 noteId: $noteId\" }\n        return socket.send(\n            Send.SubscribeNote(Send.SubscribeNote.Body(noteId)).toJson()\n        )\n    }\n\n    private fun sendUnSub(noteId: String): Boolean {\n        logger?.debug(\"NoteのRemoteへの購読を解除します noteId:$noteId\")\n        return socket.send(\n            Send.UnSubscribeNote(Send.UnSubscribeNote.Body(noteId)).toJson()\n        )\n    }\n\n}\n\n"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/Socket.kt",
    "content": "package net.pantasystem.milktea.api_streaming\n\n/**\n * WebSocketを表すインターフェース\n */\ninterface Socket {\n\n    sealed class State {\n        /**\n         * 接続済みを意味する\n         */\n        object Connected: State()\n\n        /**\n         * 現在接続を試みていることを表す\n         */\n        data class Connecting(val isReconnect: Boolean): State()\n\n\n        data class Closing(\n            val code: Int,\n            val reason: String\n        ): State()\n\n        object  NeverConnected : State()\n\n        /**\n         * 接続が失われていることを表す\n         */\n        data class Closed(\n            val code: Int,\n            val reason: String\n        ): State()\n\n        data class Failure(\n            val throwable: Throwable,\n            val statusCode: Int?,\n            val message: String?,\n        ) : State()\n    }\n\n    /**\n     * 接続する\n     * @return 状態が変化した場合true 現在の状態から何も変化しない場合はfalseが返されます\n     */\n    fun connect(): Boolean\n\n    suspend fun blockingConnect(): Boolean\n\n    /**\n     * 切断する\n     * @return 状態が変化した場合true 現在の状態から何も変化しない場合はfalseが返されます\n     */\n    fun disconnect(): Boolean\n\n    fun reconnect()\n\n    /**\n     * 現在の状態を取得する\n     */\n    fun state(): State\n\n    /**\n     * メッセージを送信します。\n     * @param msg 送信するメッセージ\n     * @param isAutoConnect trueにすると未接続状態の時に自動的に接続しようとします。\n     * @return Queueに追加された場合はtrueそうでない場合はfalseが返されます。\n     */\n    fun send(msg: String, isAutoConnect: Boolean = true): Boolean\n\n    fun onNetworkActive()\n    fun onNetworkInActive()\n\n\n    fun addStateEventListener(listener: SocketStateEventListener)\n\n    fun removeStateEventListener(listener: SocketStateEventListener)\n\n    fun addMessageEventListener(autoConnect: Boolean = true, listener: SocketMessageEventListener)\n\n    fun removeMessageEventListener(listener: SocketMessageEventListener)\n\n}"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/SocketEventListener.kt",
    "content": "package net.pantasystem.milktea.api_streaming\n\n\nfun interface SocketStateEventListener {\n\n    fun onStateChanged(e: Socket.State)\n}\n\nfun interface SocketMessageEventListener {\n\n    fun onMessage(e: StreamingEvent): Boolean\n}\n\n"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/channel/ChannelAPI.kt",
    "content": "package net.pantasystem.milktea.api_streaming.channel\n\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.channels.onFailure\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.channelFlow\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.ChannelEvent\nimport net.pantasystem.milktea.api_streaming.Send\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.api_streaming.SocketMessageEventListener\nimport net.pantasystem.milktea.api_streaming.SocketStateEventListener\nimport net.pantasystem.milktea.api_streaming.StreamingEvent\nimport net.pantasystem.milktea.api_streaming.toJson\nimport net.pantasystem.milktea.common.Logger\nimport java.util.UUID\n\nclass ChannelAPI(\n    val socket: Socket,\n    loggerFactory: Logger.Factory,\n) : SocketMessageEventListener, SocketStateEventListener {\n\n\n    sealed interface Type {\n        data object Main : Type\n        data object Home : Type\n        data object Local : Type\n        data object Hybrid : Type\n        data object Global : Type\n        data object RecommendedTimeline : Type\n        data class UserList(\n            val userListId: String\n        ) : Type\n\n        data class Antenna(\n            val antennaId: String\n        ) : Type\n\n        data class Channel(\n            val channelId: String\n        ) : Type\n    }\n\n    private val logger = loggerFactory.create(\"ChannelAPI\")\n\n    private var listenersMap = mapOf<Type, Set<(ChannelBody) -> Unit>>(\n        Type.Main to hashSetOf(),\n        Type.Home to hashSetOf(),\n        Type.Local to hashSetOf(),\n        Type.Hybrid to hashSetOf(),\n        Type.Global to hashSetOf(),\n        Type.RecommendedTimeline to hashSetOf(),\n    )\n\n    private var typeIdMap = mapOf<Type, String>()\n    private val mutex = Mutex()\n\n    init {\n        //socket.addMessageEventListener(this)\n        socket.addStateEventListener(this)\n    }\n\n    fun connect(type: Type): Flow<ChannelBody> {\n        return channelFlow {\n            val callback: (ChannelBody) -> Unit = {\n                trySend(it).onFailure {  e ->\n                    logger.error(\"ChannelAPI Streamingデータの伝達に失敗\", e)\n                }\n                //logger.debug(\"ChannelAPI message:${if(it.toString().length > 50) it.toString().subSequence(0, 50) else it.toString()}\")\n            }\n            connect(type, callback)\n\n            awaitClose {\n                disconnect(type, callback)\n\n            }\n        }\n    }\n\n    /**\n     * 接続しているチャンネル数\n     */\n    fun count(): Int = typeIdMap.count()\n\n    /**\n     * 接続しているチャンネル数がゼロであるか\n     */\n    fun isEmpty(): Boolean {\n        return count() == 0\n    }\n\n\n    private suspend fun connect(type: Type, listener: (ChannelBody) -> Unit) {\n        // NOTE すでにlistenerを追加済みであれば何もせずに終了する。\n        mutex.withLock {\n            if (listenersMap[type]?.contains(listener) == true) {\n                logger.debug { \"リッスン済み\" }\n                return\n            }\n\n            fun getOrNew(type: Type): Set<(ChannelBody) -> Unit> {\n                return listenersMap[type] ?: emptySet()\n            }\n\n            val sets = getOrNew(type).toMutableSet().also {\n                it.add(listener)\n            }\n            listenersMap = listenersMap.toMutableMap().also {\n                it[type] = sets\n            }\n\n            if (typeIdMap.isEmpty()) {\n                socket.addMessageEventListener(true, this@ChannelAPI)\n            }\n            if (typeIdMap[type] == null) {\n                logger.debug { \"接続処理を開始\" }\n                sendConnect(type)\n                logger.debug { \"after sendConnect:${typeIdMap}\" }\n            }\n        }\n\n    }\n\n    private fun disconnect(type: Type, listener: (ChannelBody) -> Unit) = runBlocking {\n        mutex.withLock {\n            if (listenersMap[type]?.contains(listener) != true) {\n                return@runBlocking\n            }\n\n            listenersMap = listenersMap.toMutableMap().also {\n                it[type] = (it[type]?.toMutableSet() ?: emptySet()).toMutableSet().also { set ->\n                    set.remove(listener)\n                }\n            }\n\n            // 誰にも使われていなければサーバーからChannelへの接続を開放する\n            trySendDisconnect(type)\n            if (typeIdMap.isEmpty()) {\n                socket.removeMessageEventListener(this@ChannelAPI)\n            }\n        }\n\n    }\n\n\n    override fun onMessage(e: StreamingEvent): Boolean {\n        if (e is ChannelEvent) {\n            typeIdMap.filter {\n                it.value == e.body.id\n            }.keys.forEach {\n                listenersMap[it]?.forEach { callback ->\n                    callback.invoke(e.body)\n                } ?: throw IllegalStateException(\"未実装なTypeです。\")\n            }\n\n            return true\n        }\n\n        return false\n    }\n\n    /**\n     * 接続メッセージを現在の状態にかかわらずサーバーに送信する\n     */\n    private fun sendConnect(type: Type): Boolean {\n        logger.debug { \"sendConnect($type)\" }\n        val body = when (type) {\n            is Type.Global -> Send.Connect.Type.GLOBAL_TIMELINE\n            is Type.Hybrid -> Send.Connect.Type.HYBRID_TIMELINE\n            is Type.Local -> Send.Connect.Type.LOCAL_TIMELINE\n            is Type.Home -> Send.Connect.Type.HOME_TIMELINE\n            is Type.Main -> Send.Connect.Type.MAIN\n            is Type.UserList -> Send.Connect.Type.USER_LIST\n            is Type.Antenna -> Send.Connect.Type.ANTENNA\n            is Type.Channel -> Send.Connect.Type.CHANNEL\n            is Type.RecommendedTimeline -> Send.Connect.Type.RECOMMENDED_TIMELINE\n        }\n\n        val id = typeIdMap[type] ?: UUID.randomUUID().toString()\n        typeIdMap = typeIdMap.toMutableMap().also {\n            it[type] = id\n        }\n        return socket.send(\n            Send.Connect(\n                Send.Connect.Body(\n                    channel = body,\n                    id = id,\n                    params = Send.Connect.Body.Params(\n                        listId = (type as? Type.UserList)?.userListId,\n                        antennaId = (type as? Type.Antenna)?.antennaId,\n                        channelId = (type as? Type.Channel)?.channelId\n                    )\n                )\n            ).toJson()\n        ).also {\n            logger.debug { \"channel=$body API登録完了 result=$it, typeIdMap=${typeIdMap}, hash=${this.hashCode()}\" }\n        }\n    }\n\n\n    private fun trySendDisconnect(type: Type) {\n        if (listenersMap[type].isNullOrEmpty()) {\n            val map = typeIdMap.toMutableMap()\n            val id = map.remove(type)\n            typeIdMap = map\n            if (id != null) {\n                socket.send((Send.Disconnect(Send.Disconnect.Body(id)).toJson()))\n            }\n\n            logger.debug { \"channel 購読解除, type=$type, id=$id\" }\n        }\n    }\n\n\n    override fun onStateChanged(e: Socket.State) {\n        if (e is Socket.State.Connected) {\n            val types = typeIdMap.keys\n            val sendCount = types.toList().count {\n                //logger.debug(\"接続処理: $it\")\n                sendConnect(it)\n            }\n            logger.debug { \"types: $typeIdMap, 送信済み数:$sendCount\" }\n        }\n\n    }\n\n}\n"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/channel/user_timeline_extenstion.kt",
    "content": "package net.pantasystem.milktea.api_streaming.channel\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.filter\nimport net.pantasystem.milktea.api_streaming.ChannelBody\n\n\nfun ChannelAPI.connectUserTimeline(userId: String): Flow<ChannelBody> {\n    return this.connect(ChannelAPI.Type.Global).filter {\n        it is ChannelBody.ReceiveNote && it.body.userId == userId\n    }\n}"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/events.kt",
    "content": "package net.pantasystem.milktea.api_streaming\n\n\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport net.pantasystem.milktea.api.misskey.drive.FilePropertyDTO\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\nimport net.pantasystem.milktea.api.misskey.messaging.MessageDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.notification.NotificationDTO\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaDTO\nimport net.pantasystem.milktea.common.serializations.DateSerializer\nimport java.util.*\n\n\n\n\n@Serializable\nsealed class StreamingEvent\n\n/*data class ChannelEvent : StreamingEvent() {\n\n}*/\n\n@Serializable\n@SerialName(\"channel\")\ndata class ChannelEvent(\n    @SerialName(\"body\")\n    val body: ChannelBody\n) : StreamingEvent()\n\n@Serializable\nsealed class ChannelBody : StreamingEvent(){\n\n    abstract val id: String\n\n    @Serializable\n    @SerialName(\"note\")\n    data class ReceiveNote(\n        @SerialName(\"id\")\n        override val id: String,\n\n        @SerialName(\"body\")\n        val body: NoteDTO\n    ) : ChannelBody()\n\n    @Serializable\n    sealed class Main : ChannelBody(){\n\n        interface HavingMessagingBody {\n            val body: MessageDTO\n        }\n\n        interface HavingNoteBody {\n            val body: NoteDTO\n        }\n\n        interface HavingUserBody {\n            val body: UserDTO\n        }\n\n        @Serializable\n        @SerialName(\"notification\")\n        data class Notification(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: NotificationDTO\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"readAllNotifications\")\n        data class ReadAllNotifications(\n            @SerialName(\"id\")\n            override val id: String,\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"unreadNotification\")\n        data class UnreadNotification(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: NotificationDTO\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"unreadMessagingMessage\")\n        data class UnreadMessagingMessage(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: MessageDTO\n        ) : Main(), HavingMessagingBody\n\n        @Serializable\n        @SerialName(\"readAllMessagingMessage\")\n        data class ReadAllMessagingMessages(@SerialName(\"id\") override val id: String) : Main()\n\n        @Serializable\n        @SerialName(\"readAllUnreadSpecifiedNotes\")\n        data class ReadAllUnreadSpecifiedNotes(@SerialName(\"id\") override val id: String) : Main()\n\n        @Serializable\n        @SerialName(\"readAllChannels\")\n        data class ReadAllChannels(@SerialName(\"id\") override val id: String) : Main()\n\n        @Serializable\n        @SerialName(\"readAllUnreadMentions\")\n        data class ReadAllUnreadMentions(@SerialName(\"id\") override val id: String) : Main()\n\n        @Serializable\n        @SerialName(\"readNotifications\")\n        data class ReadNotifications(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: List<String>\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"unreadAntenna\")\n        data class UnreadAntenna(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: AntennaDTO\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"mention\")\n        data class Mention(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: NoteDTO\n        ) : Main(), HavingNoteBody\n\n\n        @Serializable\n        @SerialName(\"unreadMention\")\n        data class UnreadMention(\n            @SerialName(\"id\")\n            override val id: String,\n            @SerialName(\"body\") val noteId: String\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"renote\")\n        data class Renote(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: NoteDTO\n        ) : Main(), HavingNoteBody\n\n        @Serializable\n        @SerialName(\"messagingMessage\")\n        data class MessagingMessage(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: MessageDTO\n        ) : Main(), HavingMessagingBody\n\n        @Serializable\n        @SerialName(\"meUpdated\")\n        data class MeUpdated(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: UserDTO,\n        ) : Main(),\n            HavingUserBody\n\n        @Serializable\n        @SerialName(\"unfollow\")\n        data class UnFollow(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: UserDTO,\n        ) : Main(), HavingUserBody\n\n\n        @Serializable\n        @SerialName(\"followed\")\n        data class Follow(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: UserDTO\n        ) : Main(), HavingUserBody\n\n        @Serializable\n        @SerialName(\"follow\")\n        data class Followed(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            override val body: UserDTO\n        ) : Main(), HavingUserBody\n\n        @Serializable\n        @SerialName(\"fileUpdated\")\n        data class FileUpdated(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val file: FilePropertyDTO\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"driveFileCreated\")\n        data  class DriveFileCreated(\n            @SerialName(\"id\")\n            override val id: String\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"fileDeleted\")\n        data class FileDeleted(\n            @SerialName(\"id\")\n            override val id: String\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"readAntenna\")\n        data class ReadAntenna(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: AntennaDTO\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"readAllAntennas\")\n        data class ReadAllAntennas(\n            @SerialName(\"id\")\n            override val id: String\n        ) : Main()\n\n        @Serializable\n        @SerialName(\"reply\")\n        data class Reply(\n            @SerialName(\"id\")\n            override val id: String,\n            @SerialName(\"body\")\n            val body: NoteDTO\n        ) : Main()\n    }\n}\n\n@Serializable\n@SerialName(\"noteUpdated\")\ndata class NoteUpdated(\n    @SerialName(\"body\")\n    val body: Body\n) : StreamingEvent() {\n\n\n    @Serializable\n    sealed class Body{\n        abstract val id: String\n\n        @Serializable\n        @SerialName(\"reacted\")\n        data class Reacted (\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: Body\n        ) : Body() {\n\n            @Serializable\n            data class Body(\n                @SerialName(\"reaction\")\n                val reaction: String,\n\n                @SerialName(\"userId\")\n                val userId: String,\n\n                @SerialName(\"emoji\")\n                val emoji: CustomEmojiNetworkDTO? = null\n            )\n        }\n\n        @Serializable\n        @SerialName(\"unreacted\")\n        data class Unreacted (\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: Body\n        ) : Body() {\n\n            @Serializable\n            data class Body(\n                @SerialName(\"reaction\")\n                val reaction: String,\n\n                @SerialName(\"userId\")\n                val userId: String,\n            )\n        }\n\n        @Serializable\n        @SerialName(\"pollVoted\")\n        data class PollVoted(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: Body\n        ) : Body() {\n\n            @Serializable\n            data class Body(\n                @SerialName(\"choice\")\n                val choice: Int,\n\n                @SerialName(\"userId\")\n                val userId: String\n            )\n\n        }\n\n        @Serializable\n        @SerialName(\"deleted\")\n        data class Deleted(\n            @SerialName(\"id\")\n            override val id: String,\n\n            @SerialName(\"body\")\n            val body: Body,\n        ) : Body() {\n\n            @Serializable\n            data class Body @OptIn(ExperimentalSerializationApi::class) constructor(\n                @Serializable(with = DateSerializer::class)\n                @SerialName(\"deletedAt\")\n                val deletedAt: Date\n            )\n        }\n    }\n\n\n}\n\n@SerialName(\"emojiAdded\")\n@Serializable\ndata class EmojiAdded(\n    @SerialName(\"body\")\n    val body: Body,\n) : StreamingEvent() {\n    @Serializable\n    data class Body(\n        @SerialName(\"emoji\")\n        val emoji: CustomEmojiNetworkDTO\n    )\n}\n\n@SerialName(\"emojiDeleted\")\n@Serializable\ndata class EmojiDeleted(\n    @SerialName(\"body\")\n    val body: Body\n) : StreamingEvent() {\n    @Serializable\n    data class Body(\n        @SerialName(\"emojis\")\n        val emojis: List<CustomEmojiNetworkDTO>,\n    )\n}\n\n@SerialName(\"emojiUpdated\")\n@Serializable\ndata class EmojiUpdated(\n    @SerialName(\"body\")\n    val body: Body\n) : StreamingEvent() {\n\n    @Serializable\n    data class Body(\n        @SerialName(\"emojis\")\n        val emojis: List<CustomEmojiNetworkDTO>,\n    )\n}"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/mastodon/Event.kt",
    "content": "package net.pantasystem.milktea.api_streaming.mastodon\n\nimport kotlinx.serialization.SerialName\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\n\nsealed interface Event {\n\n    data class Update(val status: TootStatusDTO) : Event\n    data class Delete(val id: String) : Event\n    data class Notification(val notification: MstNotificationDTO) : Event\n    data class Reaction(val reaction: EmojiReaction) : Event\n    data class StatusUpdated(val status: TootStatusDTO) : Event\n}\n\n// {\n//  \"name\":\"ablobattention\",\n//  \"count\":1,\"url\":\"https://s3.fedibird.com/cache/custom_emojis/images/000/292/585/original/2613d831b8b93127.png\",\n//  \"static_url\":\"https://s3.fedibird.com/cache/custom_emojis/images/000/292/585/static/2613d831b8b93127.png\",\n//  \"domain\":\"misskey.life\",\n//  \"account_ids\":[\"109568651641736774\"],\n//  \"status_id\":\"109724595650871529\"\n//  }\n// {\"name\":\"🎉\",\"count\":1,\"account_ids\":[\"109011018797559029\"],\"status_id\":\"109724742705742083\"}\n@kotlinx.serialization.Serializable\ndata class EmojiReaction(\n    @SerialName(\"name\")\n    val name: String,\n\n    @SerialName(\"count\")\n    val count: Int,\n\n    @SerialName(\"url\")\n    val url: String? = null,\n\n    @SerialName(\"static_url\") val staticUrl: String? = null,\n    @SerialName(\"domain\") val domain: String? = null,\n    @SerialName(\"account_ids\") val accountIds: List<String>,\n    @SerialName(\"status_id\") val statusId: String,\n    @SerialName(\"width\") val width: Int? = null,\n    @SerialName(\"height\") val height: Int? = null,\n) {\n    val isCustomEmoji: Boolean = url != null || staticUrl != null\n    val reaction = if (isCustomEmoji) {\n        if (domain == null) {\n            \":$name@.:\"\n        } else {\n            \":$name@$domain:\"\n        }\n    } else {\n        name\n    }\n\n\n    fun toEmoji(cachePath: String? = null): CustomEmoji? {\n        if (!isCustomEmoji) {\n            return null\n        }\n\n        return CustomEmoji(\n            name = if (domain == null) {\n                \"$name@.\"\n            } else {\n                \"$name@$domain\"\n            },\n            url = url,\n            host = domain,\n            aspectRatio = if (width == null || height == null) null else (width.toFloat() / height),\n            cachePath = cachePath,\n        )\n    }\n\n    fun myReaction(myServerId: String): String? {\n        return reaction.takeIf {\n            accountIds.contains(myServerId)\n        }\n    }\n}"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/mastodon/StreamingAPI.kt",
    "content": "package net.pantasystem.milktea.api_streaming.mastodon\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\n\ninterface StreamingAPI {\n\n    fun connectLocalPublic(): Flow<TootStatusDTO>\n    fun connectPublic(): Flow<TootStatusDTO>\n    fun connectHashTag(tag: String): Flow<TootStatusDTO>\n    fun connectUserList(listId: String): Flow<TootStatusDTO>\n    fun connectUser(): Flow<Event>\n}"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/mastodon/StreamingAPIImpl.kt",
    "content": "package net.pantasystem.milktea.api_streaming.mastodon\n\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.buffer\nimport kotlinx.coroutines.flow.channelFlow\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.common.Logger\nimport okhttp3.Call\nimport okhttp3.Callback\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport okhttp3.Response\nimport okhttp3.sse.EventSource\nimport okhttp3.sse.EventSourceListener\nimport okhttp3.sse.EventSources\nimport java.io.IOException\n\nclass StreamingAPIImpl(\n    val host: String,\n    val token: String,\n    val okHttpClient: OkHttpClient,\n    val loggerFactory: Logger.Factory,\n) : StreamingAPI {\n\n\n    private sealed interface ConnectType {\n        data object LocalPublic : ConnectType\n        data object Public : ConnectType\n        data class Hashtag(val tag: String) : ConnectType\n        data class UserList(val listId: String) : ConnectType\n        data object User : ConnectType\n    }\n\n    private fun interface StreamingEventHandler {\n        operator fun invoke(e: Event)\n    }\n\n    val decoder = Json {\n        ignoreUnknownKeys = true\n    }\n\n    private val listenersMap = mutableMapOf<ConnectType, Set<Listener>>()\n\n    private val connections = mutableMapOf<ConnectType, EventSource>()\n    private val isWaitingConnections = mutableSetOf<ConnectType>()\n\n    private val logger by lazy {\n        loggerFactory.create(\"StreamingAPIImpl\")\n    }\n\n\n    override fun connectLocalPublic(): Flow<TootStatusDTO> {\n        return channelFlow {\n            val listener = connect(ConnectType.LocalPublic) {\n                if (it is Event.Update) {\n                    trySend(it.status)\n                }\n            }\n            awaitClose {\n                listener.close()\n            }\n        }.buffer(capacity = 100, onBufferOverflow = BufferOverflow.DROP_OLDEST)\n    }\n\n    override fun connectPublic(): Flow<TootStatusDTO> {\n        return channelFlow {\n            val listener = connect(ConnectType.Public) {\n                if (it is Event.Update) {\n                    trySend(it.status)\n                }\n            }\n            awaitClose {\n                listener.close()\n            }\n        }.buffer(capacity = 100, onBufferOverflow = BufferOverflow.DROP_OLDEST)\n\n    }\n\n    override fun connectHashTag(tag: String): Flow<TootStatusDTO> {\n        return channelFlow {\n            val listener = connect(ConnectType.Hashtag(tag)) {\n                if (it is Event.Update) {\n                    trySend(it.status)\n                }\n            }\n            awaitClose {\n                listener.close()\n            }\n        }.buffer(capacity = 100, onBufferOverflow = BufferOverflow.DROP_OLDEST)\n\n    }\n\n    override fun connectUserList(listId: String): Flow<TootStatusDTO> {\n        return channelFlow {\n            val listener = connect(ConnectType.UserList(listId)) {\n                if (it is Event.Update) {\n                    trySend(it.status)\n                }\n            }\n            awaitClose {\n                listener.close()\n            }\n        }.buffer(capacity = 100, onBufferOverflow = BufferOverflow.DROP_OLDEST)\n\n    }\n\n    override fun connectUser(): Flow<Event> {\n        return channelFlow {\n            val listener = connect(ConnectType.User) {\n                trySend(it)\n            }\n            awaitClose {\n                listener.close()\n            }\n        }.buffer(capacity = 100, onBufferOverflow = BufferOverflow.DROP_OLDEST)\n    }\n\n\n    private fun connect(connectType: ConnectType, handler: StreamingEventHandler): Listener {\n        val listener = Listener(connectType, handler)\n        synchronized(listenersMap) {\n            val listeners = listenersMap[connectType] ?: mutableSetOf()\n            listenersMap[connectType] = (listeners + listener)\n        }\n        logger.debug { \"接続数:${connections.size} ハンドラー数:${listenersMap[connectType]?.size}\" }\n\n        connect(connectType)\n\n        return listener\n\n    }\n\n    private fun connect(connectType: ConnectType) {\n        val call = synchronized(listenersMap) {\n            if (connections[connectType] == null\n                && !isWaitingConnections.contains(connectType)\n                && !listenersMap[connectType].isNullOrEmpty()\n            ) {\n                isWaitingConnections.add(connectType)\n                val request = EventSources.createFactory(okHttpClient).newEventSource(\n                    Request.Builder().url(\n                        when (connectType) {\n                            is ConnectType.Hashtag -> \"https://$host/api/v1/streaming/hashtag/${connectType.tag}\"\n                            ConnectType.LocalPublic -> \"https://$host/api/v1/streaming/public/local\"\n                            ConnectType.Public -> \"https://$host/api/v1/streaming/public\"\n                            ConnectType.User -> \"https://$host/api/v1/streaming/user\"\n                            is ConnectType.UserList -> \"https://$host/api/v1/streaming/list/${connectType.listId}\"\n                        }\n                    ).build(),\n                    SseEventHandler(connectType)\n                ).request()\n                logger.debug { \"接続開始 connections:${connections.size}, listeners:${listenersMap[connectType]?.size}\" }\n                okHttpClient.newCall(request)\n            } else {\n                logger.debug { \"接続済みのためキャンセル\" }\n                null\n            }\n        }\n\n        call?.enqueue(object : Callback {\n            override fun onFailure(call: Call, e: IOException) {\n                logger.error(\"onFailure\", e)\n\n            }\n\n            override fun onResponse(call: Call, response: Response) {\n                logger.debug { \"onResponse, status:${response.code}\" }\n            }\n        })\n    }\n\n    private inner class SseEventHandler(val connectType: ConnectType) : EventSourceListener() {\n        override fun onClosed(eventSource: EventSource) {\n            super.onClosed(eventSource)\n\n            synchronized(listenersMap) {\n                listenersMap.remove(connectType)\n                isWaitingConnections.remove(connectType)\n            }\n        }\n\n        override fun onFailure(eventSource: EventSource, t: Throwable?, response: Response?) {\n            super.onFailure(eventSource, t, response)\n            logger.error(\"接続に失敗: $connectType\", t)\n\n            synchronized(listenersMap) {\n                connections.remove(connectType)\n                isWaitingConnections.remove(connectType)\n            }\n            Thread.sleep(10000)\n            if (response?.code != 404) {\n                connect(connectType)\n            }\n        }\n\n        override fun onOpen(eventSource: EventSource, response: Response) {\n            super.onOpen(eventSource, response)\n            logger.debug {\"onOpen\" }\n            synchronized(listenersMap) {\n                if (connections[connectType] != null) {\n                    logger.debug { \"既に接続済みのコネクションが存在するため接続解除 type:$connectType\" }\n                    connections[connectType]?.cancel()\n                }\n                isWaitingConnections.remove(connectType)\n                connections[connectType] = eventSource\n            }\n        }\n\n        override fun onEvent(eventSource: EventSource, id: String?, type: String?, data: String) {\n            super.onEvent(eventSource, id, type, data)\n\n            val listeners = synchronized(listenersMap) {\n                listenersMap[connectType]\n            }\n\n            if (listeners.isNullOrEmpty()) {\n                synchronized(listenersMap) {\n                    if (listenersMap[connectType].isNullOrEmpty()) {\n                        (connections.remove(connectType) ?: eventSource).cancel()\n                        logger.debug {\"ignore message connectType:$connectType type:$type, data:$data\" }\n                    }\n                    return\n                }\n            }\n\n            try {\n                val event = when (type) {\n                    \"update\" -> {\n                        Event.Update(decoder.decodeFromString(data))\n                    }\n                    \"notification\" -> {\n                        Event.Notification(decoder.decodeFromString(data))\n                    }\n                    \"delete\" -> {\n                        Event.Delete(data)\n                    }\n                    \"emoji_reaction\" -> {\n                        Event.Reaction(decoder.decodeFromString(data))\n                    }\n                    \"status.update\" -> {\n                        Event.StatusUpdated(decoder.decodeFromString(data))\n                    }\n                    else -> {\n                        logger.debug { \"unknown event $type, data:$data\" }\n                        return\n                    }\n                }\n\n                listeners.map {\n                    it.handler(event)\n                }\n\n            } catch (e: Exception) {\n                logger.error(\"onEvent\", e)\n            }\n        }\n    }\n\n    private inner class Listener(\n        val connectType: ConnectType,\n        val handler: StreamingEventHandler,\n    ) {\n        fun close() {\n            synchronized(listenersMap) {\n                listenersMap[connectType]?.toMutableSet()?.also {\n                    it.remove(this)\n                    listenersMap[connectType] = it\n                }\n                logger.debug { \"Listener#接続数:${connections.size} ハンドラー数:${listenersMap[connectType]?.size}\" }\n                if (listenersMap[connectType].isNullOrEmpty()) {\n                    connections.remove(connectType)?.cancel()\n                    logger.debug { \"Listener#接続解除 接続数:${connections.size} ハンドラー数:${listenersMap[connectType]?.size}\" }\n                }\n                logger.debug {\"Listener#接続数:${connections.size} ハンドラー数:${listenersMap[connectType]?.size}\" }\n\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/network/SocketImpl.kt",
    "content": "package net.pantasystem.milktea.api_streaming.network\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.api_streaming.PollingJob\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.api_streaming.SocketMessageEventListener\nimport net.pantasystem.milktea.api_streaming.SocketStateEventListener\nimport net.pantasystem.milktea.api_streaming.StreamingEvent\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport okhttp3.Response\nimport okhttp3.WebSocket\nimport okhttp3.WebSocketListener\nimport java.util.concurrent.TimeUnit\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\nclass SocketImpl(\n    val url: String,\n    var isRequirePingPong: () -> Boolean,\n    loggerFactory: Logger.Factory,\n    okHttpClientProvider: OkHttpClientProvider,\n) : Socket {\n    val logger = loggerFactory.create(\"SocketImpl\")\n\n    private val okHttpClient: OkHttpClient = okHttpClientProvider\n        .get()\n        .newBuilder()\n        .connectTimeout(10, TimeUnit.SECONDS)\n        .writeTimeout(1, TimeUnit.HOURS)\n        .readTimeout(1, TimeUnit.HOURS)\n        .build()\n\n    private var pollingJob: PollingJob = PollingJob(this)\n\n\n    private val json = Json {\n        ignoreUnknownKeys = true\n    }\n\n    private var mWebSocket: WebSocket? = null\n    private var mState: Socket.State = Socket.State.NeverConnected\n        set(value) {\n            field = value\n            logger.debug { \"SocketImpl状態変化: ${value.javaClass.simpleName}, $value}\" }\n            stateListeners.forEach {\n                it.onStateChanged(value)\n            }\n\n        }\n\n    private var stateListeners = setOf<SocketStateEventListener>()\n\n    private var messageListeners = setOf<SocketMessageEventListener>()\n    private var isNetworkActive = true\n\n    /**\n     * 等インスタンスを使用して接続を行う可能性が永続的にない場合はtrueになる。\n     * 主にログアウト処理が行われた際や再認証処理が行われ、インスタンスが使われなくなる可能性がある場合もtrueになる。\n     */\n    private var isDestroyed: Boolean = false\n\n\n    override fun addMessageEventListener(autoConnect: Boolean, listener: SocketMessageEventListener) {\n\n        val empty = messageListeners.isEmpty()\n        messageListeners = messageListeners.toMutableSet().also {\n            it.add(listener)\n        }\n        if (empty && messageListeners.isNotEmpty() && autoConnect) {\n            try {\n                connect()\n            } catch (e: Exception) {\n                logger.error(\"接続失敗\", e)\n            }\n        }\n\n    }\n\n    override fun addStateEventListener(listener: SocketStateEventListener) {\n        stateListeners = stateListeners.toMutableSet().also {\n            it.add(listener)\n        }\n\n    }\n\n    override fun removeMessageEventListener(listener: SocketMessageEventListener) {\n        messageListeners = messageListeners.toMutableSet().also {\n            it.remove(listener)\n        }\n        if (messageListeners.isEmpty()) {\n            disconnect()\n        }\n    }\n\n    override fun removeStateEventListener(listener: SocketStateEventListener) {\n        stateListeners = stateListeners.toMutableSet().also {\n            it.remove(listener)\n        }\n    }\n\n    override fun connect(): Boolean {\n        synchronized(this) {\n            if (mWebSocket != null) {\n                logger.debug { \"接続済みのためキャンセル\" }\n                return false\n            }\n            if (!isNetworkActive) {\n                logger.debug { \"ネットワークがアクティブではないのでキャンセル\" }\n                return false\n            }\n\n            if (isDestroyed) {\n                logger.debug { \"destroyedされているのでキャンセル\" }\n                return false\n            }\n\n            if (messageListeners.isEmpty()) {\n                logger.debug { \"messageListenerが空なのでキャンセル\" }\n                return false\n            }\n\n            if (!(mState is Socket.State.NeverConnected || mState is Socket.State.Failure || mState is Socket.State.Closed)) {\n                return false\n            }\n            mState = Socket.State.Connecting(false)\n            val request = Request.Builder()\n                .url(url)\n                .build()\n\n            mWebSocket = okHttpClient.newWebSocket(request, WebSocketListenerImpl())\n            return true\n        }\n\n    }\n\n    override fun reconnect() {\n        synchronized(this) {\n            mWebSocket?.cancel()\n            mWebSocket = null\n        }\n        mState = Socket.State.Connecting(true)\n\n\n    }\n\n    override suspend fun blockingConnect(): Boolean {\n        return suspendCoroutine { continuation ->\n            var isResumed = false\n            if (!connect()) {\n                logger.debug { \"connect -> falseのためキャンセル\" }\n                continuation.resume(false)\n                isResumed = true\n            }\n            val callback = object : SocketStateEventListener {\n                override fun onStateChanged(e: Socket.State) {\n                    if (!isResumed) {\n                        if (e is Socket.State.Connected) {\n                            removeStateEventListener(this)\n                            continuation.resume(true)\n                        } else if (e is Socket.State.Failure || e is Socket.State.Closed) {\n                            removeStateEventListener(this)\n                            continuation.resume(false)\n                        }\n                        isResumed = true\n                    }\n\n                }\n\n            }\n            addStateEventListener(callback)\n        }\n    }\n\n    override fun disconnect(): Boolean {\n        synchronized(this) {\n            if (mWebSocket == null) {\n                return false\n            }\n            pollingJob.cancel()\n\n            val result = mWebSocket?.close(1001, \"finish\") ?: false\n            mWebSocket = null\n            return result\n        }\n    }\n\n    override fun send(msg: String, isAutoConnect: Boolean): Boolean {\n        logger.debug { \"メッセージ送信: $msg, state${state()}\" }\n        if (state() != Socket.State.Connected) {\n            logger.debug { \"送信をキャンセル state:${state()}\" }\n            if (isAutoConnect) {\n                connect()\n            }\n            return false\n        }\n\n        synchronized(this) {\n            return mWebSocket?.send(msg) ?: false\n        }\n    }\n\n    override fun state(): Socket.State {\n        return this.mState\n\n    }\n\n\n    override fun onNetworkActive() {\n        isNetworkActive = true\n        if (messageListeners.isNotEmpty()) {\n            connect()\n        }\n    }\n\n    override fun onNetworkInActive() {\n        isNetworkActive = false\n    }\n\n    /**\n     * ログアウトや再認証によってこのインスタンスを用いて接続処理などを行わない可能性がある場合がある時に呼び出される。\n     */\n    fun destroy(): Boolean {\n        synchronized(this) {\n            messageListeners = emptySet()\n            isDestroyed = true\n        }\n        return disconnect()\n    }\n\n\n    inner class WebSocketListenerImpl : WebSocketListener() {\n        override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {\n            super.onClosed(webSocket, code, reason)\n            logger.debug { \"WebSocketをClose: $code\" }\n\n            synchronized(this@SocketImpl) {\n                mState = Socket.State.Closed(code, reason)\n                pollingJob.cancel()\n                mWebSocket = null\n                webSocket.cancel()\n            }\n        }\n\n\n        override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {\n            super.onClosing(webSocket, code, reason)\n\n            synchronized(this@SocketImpl) {\n                pollingJob.cancel()\n                mState = Socket.State.Closing(code, reason)\n            }\n        }\n\n        override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {\n            super.onFailure(webSocket, t, response)\n            logger.error(\"onFailure\", e = t)\n\n\n            val state = mState\n            synchronized(this@SocketImpl) {\n                pollingJob.cancel()\n                mWebSocket = null\n\n                webSocket.cancel()\n                mState = Socket.State.Failure(\n                    t, response?.code, response?.message,\n                )\n            }\n\n            // NOTE: 再接続以外の時はレートリミットを入れる\n            if (!(state is Socket.State.Connecting && state.isReconnect)) {\n                Thread.sleep(2000)\n            }\n            connect()\n        }\n\n\n        override fun onMessage(webSocket: WebSocket, text: String) {\n            super.onMessage(webSocket, text)\n            runCancellableCatching {\n                pollingJob.onReceive(text)\n            }\n            if (text.lowercase() == \"pong\") {\n                return\n            }\n            val e = runCancellableCatching { json.decodeFromString<StreamingEvent>(text) }.onFailure { t ->\n                logger.error(\"デコードエラー msg:$text\", e = t)\n            }.getOrNull() ?: return\n\n            val iterator = messageListeners.iterator()\n            while (iterator.hasNext()) {\n\n                val listener = iterator.next()\n                val res = runCancellableCatching {\n                    listener.onMessage(e)\n                }.onFailure {\n                    logger.error(\"メッセージリスナー先でエラー発生\", e = it)\n                }.getOrElse {\n                    false\n                }\n\n                if (res) {\n                    return\n                }\n\n            }\n\n            logger.debug { \"受諾されんかったメッセージ: $text\" }\n        }\n\n        override fun onOpen(webSocket: WebSocket, response: Response) {\n            super.onOpen(webSocket, response)\n\n\n            logger.debug { \"onOpen webSocket 接続\" }\n            synchronized(this@SocketImpl) {\n                pollingJob.cancel()\n                pollingJob = PollingJob(this@SocketImpl).also {\n                    if (isRequirePingPong()) {\n                        it.startPolling(4000, 900, 12000)\n                    }\n                }\n                mState = Socket.State.Connected\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/pollings.kt",
    "content": "package net.pantasystem.milktea.api_streaming\n\nimport android.util.Log\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.TimeoutCancellationException\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.first\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withTimeout\nimport kotlinx.datetime.Clock\n\nconst val TTL_COUNT = 3\ninternal class PollingJob(\n    private val socket: Socket,\n    dispatcher: CoroutineDispatcher = Dispatchers.IO,\n) {\n    private val job = SupervisorJob()\n    private val scope = CoroutineScope(job + dispatcher)\n    private val pongs = MutableSharedFlow<String>(\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n        extraBufferCapacity = 1024\n    )\n\n\n    fun startPolling(interval: Long, count: Long, timeout: Long) {\n\n        // NOTE: pingに一定回数以上失敗すると再接続するそのためのカウント\n        var ttl = TTL_COUNT\n        scope.launch {\n            (0 until count).asSequence().asFlow().onEach {\n                delay(interval)\n            }.collect {\n                val sendTime = Clock.System.now()\n\n                if (!socket.send(\"ping\")) {\n                    if (BuildConfig.DEBUG) {\n                        Log.d(\"PollingJob\", \"sendしたらfalse帰ってきた\")\n                    }\n                }\n                try {\n                    val pong = withTimeout(timeout) {\n                        pongs.first {\n                            it.isNotBlank()\n                        }\n                    }\n                    val resTime = Clock.System.now()\n                    val diff = resTime.toEpochMilliseconds() - sendTime.toEpochMilliseconds()\n\n                    if (BuildConfig.DEBUG) {\n                        Log.d(\"PollingJob\", \"polling成功 msg:$pong, かかった時間(ミリ秒):${diff}\")\n                    }\n                    // NOTE: pingに成功したらTTLのカウントを初期値に戻す\n                    ttl = TTL_COUNT\n                } catch (e: TimeoutCancellationException) {\n                    if (BuildConfig.DEBUG) {\n                        Log.d(\"PollingJob\", \"polling失敗\")\n                    }\n                    if (--ttl <= 0) {\n                        socket.reconnect()\n                    }\n                }\n            }\n        }\n    }\n\n    fun onReceive(msg: String) {\n        pongs.tryEmit(msg)\n    }\n\n    fun cancel() {\n        job.cancel()\n    }\n}\n"
  },
  {
    "path": "modules/api_streaming/src/main/java/net/pantasystem/milktea/api_streaming/sends.kt",
    "content": "package net.pantasystem.milktea.api_streaming\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.encodeToString\nimport kotlinx.serialization.json.Json\n\n/**\n * 注意：decode時やparse時はSendのserializerを使わないとうまくtypeフィールドが追加されない。\n */\n@Serializable\nsealed class Send {\n\n\n    @SerialName(\"connect\")\n    @Serializable\n    data class Connect(\n        @SerialName(\"body\")\n        val body: Body,\n        // type(channel)\n    ) : Send() {\n\n        @Serializable\n        enum class Type {\n            @SerialName(\"main\") MAIN,\n            @SerialName(\"homeTimeline\") HOME_TIMELINE,\n            @SerialName(\"localTimeline\") LOCAL_TIMELINE,\n            @SerialName(\"hybridTimeline\") HYBRID_TIMELINE,\n            @SerialName(\"globalTimeline\") GLOBAL_TIMELINE,\n            @SerialName(\"userList\") USER_LIST,\n            @SerialName(\"antenna\") ANTENNA,\n            @SerialName(\"channel\") CHANNEL,\n            @SerialName(\"recommendedTimeline\") RECOMMENDED_TIMELINE,\n        }\n\n        @Serializable\n        data class Body (\n            @SerialName(\"id\")\n            val id: String,\n\n            @SerialName(\"channel\")\n            val channel: Type,\n\n            @SerialName(\"pong\")\n            val pong: Boolean = false,\n\n            @SerialName(\"params\")\n            val params: Params? = null,\n        ) {\n            @Serializable\n            data class Params(\n                @SerialName(\"listId\")\n                val listId: String? = null,\n\n                @SerialName(\"antennaId\")\n                val antennaId: String? = null,\n\n                @SerialName(\"channelId\")\n                val channelId: String? = null,\n            )\n            init {\n                require(channel != Type.USER_LIST || params?.listId != null)\n                require(channel != Type.ANTENNA || params?.antennaId != null)\n                require(channel != Type.CHANNEL || params?.channelId != null)\n            }\n        }\n    }\n\n    @SerialName(\"readNotification\")\n    @Serializable\n    data class ReadNotification(\n        @SerialName(\"body\")\n        val body: Body\n    ) : Send() {\n\n        /**\n         * @param id 通知のId\n         */\n        @Serializable\n        data class Body(\n            @SerialName(\"id\")\n            val id: String,\n        )\n    }\n\n\n\n    @SerialName(\"disconnect\")\n    @Serializable\n    data class Disconnect(\n        @SerialName(\"body\")\n        val body: Body\n    ) : Send(){\n        @Serializable\n        data class Body(\n            @SerialName(\"id\")\n            val id: String,\n        )\n    }\n\n    @SerialName(\"subNote\")\n    @Serializable\n    data class SubscribeNote(\n        @SerialName(\"body\")\n        val body: Body\n    ) : Send() {\n\n        @Serializable\n        data class Body(\n            @SerialName(\"id\") val noteId: String\n        )\n    }\n\n    @SerialName(\"sr\")\n    @Serializable\n    data class SubscribeAndReadNote(\n        @SerialName(\"body\")\n        val body: Body\n    ) : Send() {\n\n        @Serializable\n        data class Body(\n            @SerialName(\"id\") val noteId: String\n        )\n    }\n\n    @SerialName(\"un\")\n    @Serializable\n    data class UnSubscribeNote(\n        @SerialName(\"body\")\n        val body: Body\n    ) : Send(){\n        @Serializable\n        data class Body(\n            @SerialName(\"id\") val noteId: String\n        )\n    }\n}\n\nfun Send.toJson(): String {\n    return Json.encodeToString(this)\n}\n\n"
  },
  {
    "path": "modules/app_store/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/app_store/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.app_store'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_android')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n    implementation libs.kotlin.datetime\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/app_store/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/app_store/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/app_store/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/account/AccountState.kt",
    "content": "package net.pantasystem.milktea.app_store.account\n\nimport net.pantasystem.milktea.model.account.Account\n\n\ndata class AccountState(\n    val currentAccountId: Long? = null,\n    val accounts: List<Account> = emptyList(),\n    val isLoading: Boolean = true,\n    val error: Throwable? = null\n) {\n\n    val currentAccount: Account?\n        get() = accounts.firstOrNull { it.accountId == currentAccountId }\n            ?: accounts.firstOrNull()\n\n    val isUnauthorized: Boolean\n        get() = accounts.isEmpty() && !isLoading\n\n    fun hasAccount(account: Account): Boolean {\n        return accounts.any { it.accountId == account.accountId }\n    }\n\n    operator fun get(accountId: Long): Account? {\n        return accounts.firstOrNull { it.accountId == accountId }\n    }\n\n    fun add(account: Account): AccountState {\n        return copy(\n            accounts = if (hasAccount(account)) {\n                accounts.map {\n                    if (it.accountId == account.accountId) {\n                        account\n                    } else {\n                        it\n                    }\n                }\n            } else {\n                accounts.toMutableList().also { list ->\n                    list.add(account)\n                }\n            }.distinctBy {\n                it.accountId\n            },\n            currentAccountId = if (accounts.isEmpty()) account.accountId else currentAccountId\n        )\n    }\n\n    fun delete(accountId: Long): AccountState {\n        val filtered = accounts.filterNot { it.accountId == accountId }\n        return copy(\n            currentAccountId = if (currentAccountId == accountId) {\n                filtered.firstOrNull()?.accountId\n            } else {\n                currentAccountId\n            },\n            accounts = filtered\n        )\n    }\n\n    fun setCurrentAccount(account: Account): AccountState {\n        return add(account).copy(currentAccountId = account.accountId)\n    }\n}\n"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/account/AccountStore.kt",
    "content": "package net.pantasystem.milktea.app_store.account\n\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.map\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountNotFoundException\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.MakeDefaultPagesUseCase\nimport net.pantasystem.milktea.model.account.page.Page\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass AccountStore @Inject constructor(\n    val accountRepository: AccountRepository,\n    val loggerFactory: Logger.Factory,\n    val makeDefaultPagesUseCase: MakeDefaultPagesUseCase,\n) {\n    val logger = loggerFactory.create(\"AccountStore\")\n    private val _state = MutableStateFlow<AccountState>(AccountState())\n    val state: StateFlow<AccountState> = _state\n\n    val currentAccount: Account?\n        get() = state.value.currentAccount\n\n    val currentAccountId: Long?\n        get() = currentAccount?.accountId\n\n    val observeCurrentAccount: Flow<Account?>\n        get() = state.map { it.currentAccount }\n    val observeAccounts: Flow<List<Account>>\n        get() = state.map { it.accounts }\n\n    init {\n        accountRepository.addEventListener {\n            when (it) {\n                is AccountRepository.Event.Created -> {\n                    _state.value = state.value.add(it.account)\n                }\n\n                is AccountRepository.Event.Deleted -> {\n                    _state.value = state.value.delete(it.accountId)\n                }\n\n                is AccountRepository.Event.Updated -> {\n                    _state.value = state.value.add(it.account)\n                }\n            }\n        }\n    }\n\n    fun getOrCurrent(specifiedAccount: Long?): Flow<Account?> {\n        return state.map { state ->\n            specifiedAccount?.let { id ->\n                state.get(id)\n            } ?: state.currentAccount\n        }\n    }\n\n\n    suspend fun addAccount(account: Account) {\n        try {\n            val newAccount = accountRepository.add(account, true).getOrThrow()\n            saveDefaultPages(newAccount)\n            val updatedAccount = accountRepository.get(newAccount.accountId).getOrThrow()\n            setCurrent(updatedAccount)\n            initialize()\n        } catch (e: Exception) {\n            logger.error(\"アカウントの追加に失敗しました。\", e)\n        }\n    }\n\n    suspend fun setCurrent(account: Account) {\n        accountRepository.setCurrentAccount(account).getOrThrow()\n        _state.value = state.value.setCurrentAccount(account)\n    }\n\n    suspend fun addPage(page: Page): Boolean {\n        val account = _state.value[page.accountId]\n            ?: _state.value.currentAccount\n            ?: throw IllegalArgumentException()\n        val updated = account.copy(pages = account.pages.toMutableList().also { list ->\n            list.add(page)\n        })\n        _state.value = _state.value.add(accountRepository.add(updated, true).getOrThrow())\n        initialize()\n\n        return true\n    }\n\n    suspend fun replaceAllPage(pages: List<Page>): Result<Account> {\n        return runCancellableCatching {\n            val account = _state.value.currentAccount\n                ?: throw IllegalStateException()\n            val updated = account.copy(pages = pages)\n            val result = accountRepository.add(updated, true).getOrThrow()\n            initialize()\n            result\n        }\n\n    }\n\n    suspend fun removePage(page: Page): Boolean {\n        val account = _state.value[page.accountId]\n            ?: _state.value.currentAccount\n            ?: return false\n        val updated = account.copy(pages = account.pages.filterNot { it.pageId == page.pageId })\n        _state.value = _state.value.add(accountRepository.add(updated, true).getOrThrow())\n        initialize()\n        return true\n    }\n\n\n    suspend fun initialize() {\n        try {\n            var current: Account\n            var accounts: List<Account>\n            try {\n                current = accountRepository.getCurrentAccount().getOrThrow()\n                accounts = accountRepository.findAll().getOrThrow()\n            } catch (e: AccountNotFoundException) {\n                _state.value = AccountState(isLoading = false)\n                return\n            }\n\n            logger.debug { \"accountId:${current.accountId}, account:$current\" }\n            if (current.pages.isEmpty()) {\n                saveDefaultPages(current)\n                accounts = accountRepository.findAll().getOrThrow()\n                current = accountRepository.getCurrentAccount().getOrThrow()\n            }\n\n\n            _state.value = AccountState(\n                accounts = accounts,\n                currentAccountId = current.accountId,\n                isLoading = false\n            )\n        } catch (e: Exception) {\n            //isSuccessCurrentAccount.postValue(false)\n            logger.error(\"初期読み込みに失敗しまちた\", e)\n            _state.value = state.value.copy(error = e)\n        } finally {\n            _state.value = state.value.copy(isLoading = false)\n        }\n    }\n\n\n    private suspend fun saveDefaultPages(account: Account) {\n        if (account.pages.isNotEmpty()) {\n            return\n        }\n        try {\n            val pages = makeDefaultPagesUseCase(account)\n            accountRepository.add(account.copy(pages = pages), true)\n        } catch (e: Exception) {\n            logger.error(\"default pages create error\", e)\n        }\n    }\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/drive/DriveDirectoryPagingStore.kt",
    "content": "package net.pantasystem.milktea.app_store.drive\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.Directory\n\ninterface DriveDirectoryPagingStore {\n    val state: Flow<PageableState<List<Directory>>>\n    suspend fun loadPrevious(): Result<Int>\n    suspend fun clear()\n    suspend fun setAccount(account: Account?)\n    suspend fun setCurrentDirectory(directory: Directory?)\n    fun onCreated(directory: Directory)\n    fun onDeleted(directory: Directory)\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/drive/FilePropertyPagingStore.kt",
    "content": "package net.pantasystem.milktea.app_store.drive\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.Directory\nimport net.pantasystem.milktea.model.drive.FileProperty\n\ninterface FilePropertyPagingStore {\n    val state: Flow<PageableState<List<FileProperty.Id>>>\n    val isLoading: Boolean\n\n    suspend fun loadPrevious(): Result<Int>\n    suspend fun clear()\n    suspend fun setCurrentDirectory(directory: Directory?)\n    suspend fun setCurrentAccount(account: Account?)\n    fun onCreated(id: FileProperty.Id)\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/gallery/GalleryPostSendFavoriteStore.kt",
    "content": "package net.pantasystem.milktea.app_store.gallery\n\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.gallery.GalleryRepository\n\nclass GalleryPostSendFavoriteStore(\n    private val galleryRepository: GalleryRepository\n) {\n    \n    private val lock = Mutex()\n    private val _state = MutableStateFlow<Set<GalleryPost.Id>>(emptySet())\n    val state: StateFlow<Set<GalleryPost.Id>> = _state\n    \n    suspend fun toggleFavorite(galleryId: GalleryPost.Id) {\n        try{\n            lock.withLock {\n                _state.value = _state.value.toMutableSet().also {\n                    it.add(galleryId)\n                }\n            }\n            val gallery = galleryRepository.find(galleryId) as? GalleryPost.Authenticated\n                ?: throw UnauthorizedException()\n            if(gallery.isLiked) {\n                galleryRepository.unlike(galleryId)\n            }else{\n                galleryRepository.like(galleryId)\n            }\n        }catch(e: Throwable) {\n            throw e\n        }finally{\n            lock.withLock {\n                _state.value = _state.value.toMutableSet().also {\n                    it.remove(galleryId)\n                }\n            }\n        }\n\n    }\n    \n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/gallery/GalleryPostsStore.kt",
    "content": "package net.pantasystem.milktea.app_store.gallery\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.gallery.GalleryPost\n\ninterface GalleryPostsStore : StateLocker {\n    interface Factory {\n        fun create(pageable: Pageable.Gallery,\n                   getAccount: suspend () -> Account,): GalleryPostsStore\n    }\n    val state: Flow<PageableState<List<GalleryPost.Id>>>\n\n    suspend fun loadPrevious(): Result<Int>\n    suspend fun loadFuture(): Result<Int>\n    suspend fun clear()\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/handler/UserActionAppGlobalErrorStore.kt",
    "content": "package net.pantasystem.milktea.app_store.handler\n\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.first\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport java.util.UUID\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * アプリ全体で共通としてユーザの操作によって発生したエラーをハンドリングするクラスです。\n * エラーレベルに応じて、UIに対して表示の仕分けを行います。\n * 基本的にはViewModelクラスから呼び出すことを前提とします。\n * 複数のレイヤーから呼び出してしまうと、重複して同じエラーを報告してしまう可能性が考えられるため、ViewModelから呼び出すことを前提としています。\n * また古い実装の場合このクラスを経由しないケースがあるため、このクラスに必ずエラーが報告されないケースもあるため、エラーの発生元を確認するようにしてください。\n */\n@Singleton\nclass UserActionAppGlobalErrorStore @Inject constructor() {\n    private val _errorFlow = MutableSharedFlow<AppGlobalError>(\n        extraBufferCapacity = 999,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n    )\n\n    private val _userActionFlow = MutableSharedFlow<UserActionAppGlobalErrorAction>(\n        extraBufferCapacity = 999,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n    )\n    val errorFlow = _errorFlow.asSharedFlow()\n    val userActionFlow = _userActionFlow.asSharedFlow()\n    fun dispatch(e: AppGlobalError): String {\n        _errorFlow.tryEmit(e)\n        return e.id\n    }\n\n    fun onAction(action: UserActionAppGlobalErrorAction) {\n        _userActionFlow.tryEmit(action)\n    }\n\n    suspend fun awaitUserAction(id: String) = userActionFlow.first {\n        id == it.errorId\n    }\n\n    suspend fun dispatchAndAwaitUserAction(e: AppGlobalError, type: UserActionAppGlobalErrorAction.Type): Boolean {\n        val id = dispatch(e.copy(retryable = true))\n        return awaitUserAction(id).type == type\n    }\n}\n\n/**\n * @param tag エラーの発生元を示すタグです。\n * @param level エラーのレベルです。\n * @param message エラーのメッセージです。\n * @param throwable エラーの発生元となった例外です。\n * @param retryable エラーが発生した場合にリトライ可能かどうかを示します。\n */\ndata class AppGlobalError(\n    val tag: String,\n    val level: ErrorLevel,\n    val message: StringSource,\n    val throwable: Throwable? = null,\n    val retryable: Boolean = false,\n    val id: String = UUID.randomUUID().toString(),\n) {\n    enum class ErrorLevel {\n        /**\n         * ロギング程度の軽微なエラーレベルです。\n         */\n        Info,\n\n        /**\n         * ユーザーに対してToastやSnackBarを用いて警告を行うエラーレベルです。\n         */\n        Warning,\n\n        /**\n         * ユーザーに対してダイアログを用いて警告を行うエラーレベルです。\n         */\n        Error,\n    }\n}\n/**\n * ユーザーがエラーに対して行なったアクションを表すsealed interface\n  */\ndata class UserActionAppGlobalErrorAction(\n    val errorId: String,\n    val tag: String,\n    val type: Type,\n) {\n    enum class Type {\n        Dismiss, Retry, Cancel\n    }\n\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/messaging/MessagePagingStore.kt",
    "content": "package net.pantasystem.milktea.app_store.messaging\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.MessagingId\n\ndata class MessagingPagingState(\n    val pageState: PageableState<List<Message.Id>>,\n)\n\ninterface MessagePagingStore {\n\n    val state: Flow<MessagingPagingState>\n\n    suspend fun loadPrevious()\n    suspend fun clear()\n    suspend fun setMessagingId(messagingId: MessagingId)\n    suspend fun collectReceivedMessageQueue(): Nothing\n\n    fun latestReceivedMessageId(): Message.Id?\n\n    fun onReceiveMessage(msg: Message.Id)\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/notes/NoteTranslationStore.kt",
    "content": "package net.pantasystem.milktea.app_store.notes\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.Translation\n\ndata class NoteTranslationsState(\n    val noteIdWithTranslation: Map<Note.Id, Translation>,\n    val loadings: Set<Note.Id>,\n    val loadFails: Map<Note.Id, Throwable>\n) {\n    fun isLoading(noteId: Note.Id) : Boolean{\n        return loadings.contains(noteId)\n    }\n\n    fun translation(noteId: Note.Id) : Translation? {\n        return noteIdWithTranslation[noteId]\n    }\n\n    fun loading(noteId: Note.Id) : NoteTranslationsState {\n        return this.copy(\n            loadings = this.loadings.toMutableSet().also {\n                it.add(noteId)\n            }\n        )\n    }\n\n    fun complete(noteId: Note.Id, translate: Translation?, throwable: Throwable?) : NoteTranslationsState {\n        return this.copy(\n            loadings = this.loadings.toMutableSet().also {\n                it.remove(noteId)\n            },\n            noteIdWithTranslation = this.noteIdWithTranslation.toMutableMap().also {\n                if(translate != null){\n                    it[noteId] = translate\n                }\n            },\n            loadFails = this.loadFails.toMutableMap().also {\n                if(throwable == null) {\n                    it.remove(noteId)\n                }else{\n                    it[noteId] = throwable\n                }\n            }\n        )\n    }\n\n\n    fun state(noteId: Note.Id): ResultState<Translation> {\n        val translation = translation(noteId)\n        val isLoading = isLoading(noteId)\n        val error = loadFails[noteId]\n        val content = if (translation == null) {\n            StateContent.NotExist()\n        } else {\n            StateContent.Exist(translation)\n        }\n        return when {\n            isLoading -> {\n                ResultState.Loading(content)\n            }\n            error != null -> {\n                ResultState.Error(content, error)\n            }\n            else -> {\n                ResultState.Fixed(content)\n            }\n        }\n\n    }\n}\n\ninterface NoteTranslationStore {\n    fun state(id: Note.Id): Flow<ResultState<Translation>>\n    suspend fun translate(noteId: Note.Id)\n}\n"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/notes/TimelineStore.kt",
    "content": "package net.pantasystem.milktea.app_store.notes\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\n\ninterface TimelineStore {\n    interface Factory {\n        fun create(pageable: Pageable, coroutineScope: CoroutineScope, getAccount: suspend () -> Account, pageId: Long? = null,): TimelineStore\n    }\n\n    val timelineState: Flow<PageableState<List<Note.Id>>>\n    val receiveNoteQueue: SharedFlow<Note.Id>\n    val isActiveStreaming: Boolean\n\n\n    suspend fun loadPrevious(): Result<Int>\n    suspend fun loadFuture(): Result<Int>\n\n    /**\n     * @param initialLoadQuery コンテンツが空の状態の時にloadPreviousを呼び出した時に\n     * このパラメーターの日時以降の投稿を取りに行こうとする\n     */\n    suspend fun clear(initialLoadQuery: InitialLoadQuery?)\n\n    /**\n     * Stream API経由で関連するチャンネルのノートを受信した時のハンドラー\n     */\n    fun onReceiveNote(noteId: Note.Id)\n\n    fun latestReceiveNoteId(): Note.Id?\n\n    fun suspendStreaming()\n\n    suspend fun releaseUnusedPages(position: Int, offset: Int = 50)\n\n    fun setActiveStreamingChangedListener(listener: (Boolean) -> Unit)\n\n}\n\nsealed interface InitialLoadQuery {\n    data class UntilId(val noteId: Note.Id) : InitialLoadQuery\n    data class UntilDate(val date: Instant) : InitialLoadQuery\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/setting/SettingStore.kt",
    "content": "package net.pantasystem.milktea.app_store.setting\n\nimport android.content.SharedPreferences\nimport android.util.Log\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.Keys\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.NoteExpandedHeightSize\nimport net.pantasystem.milktea.model.setting.ReactionPickerType\nimport net.pantasystem.milktea.model.setting.str\n\n\nclass SettingStore(\n    private val sharedPreferences: SharedPreferences,\n    localConfigRepository: LocalConfigRepository,\n    coroutineScope: CoroutineScope\n): NoteExpandedHeightSize {\n\n    val configState = localConfigRepository.observe()\n        .catch { e ->\n            Log.e(\"SettingStore\", \"設定取得エラー\", e)\n        }\n        .stateIn(coroutineScope, SharingStarted.Eagerly, DefaultConfig.config)\n\n    val isSimpleEditorEnabled: Boolean\n        get() {\n            return configState.value.isSimpleEditorEnabled\n        }\n\n\n    var reactionPickerType: ReactionPickerType\n        get() {\n            return configState.value.reactionPickerType\n        }\n        set(value) {\n            val editor = sharedPreferences.edit()\n            editor.putInt(Keys.ReactionPickerType.str(), value.ordinal)\n            editor.apply()\n        }\n\n    var backgroundImagePath: String?\n        get() {\n            return configState.value.backgroundImagePath\n        }\n        set(value) {\n            val edit = sharedPreferences.edit()\n            edit.putString(Keys.BackgroundImage.str(), value)\n            edit.apply()\n        }\n\n    val isClassicUI: Boolean\n        get() {\n            return configState.value.isClassicUI\n        }\n\n\n    val isUserNameDefault: Boolean\n        get() {\n            return configState.value.isUserNameDefault\n        }\n\n\n    val isPostButtonAtTheBottom: Boolean\n        get() {\n            return configState.value.isPostButtonAtTheBottom\n        }\n\n\n\n    override fun getNoteExpandedHeightSize(): Int {\n        return configState.value.noteExpandedHeightSize\n    }\n\n\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/user/FollowFollowerPagingStore.kt",
    "content": "package net.pantasystem.milktea.app_store.user\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.StateFlow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.user.User\n\nsealed interface RequestType {\n    companion object\n    val userId: User.Id\n    data class Follower(override val userId: User.Id) : RequestType\n    data class Following(override val userId: User.Id) : RequestType\n}\n\nfun RequestType.string(): String {\n    return when(this) {\n        is RequestType.Following -> \"following\"\n        is RequestType.Follower -> \"follower\"\n    }\n}\n\nfun RequestType.Companion.from(type: String, userId: User.Id): RequestType {\n    return when(type) {\n        \"following\" -> {\n            RequestType.Following(userId)\n        }\n        \"follower\" -> {\n            RequestType.Follower(userId)\n        }\n        else -> RequestType.Following(userId)\n    }\n}\ninterface FollowFollowerPagingStore {\n\n    interface Factory {\n        fun create(type: RequestType): FollowFollowerPagingStore\n    }\n\n    val type: RequestType\n\n    val state: Flow<PageableState<List<User.Id>>>\n    val users: Flow<List<User.Detail>>\n\n    suspend fun loadPrevious()\n    suspend fun clear()\n}"
  },
  {
    "path": "modules/app_store/src/main/java/net/pantasystem/milktea/app_store/user/UserReactionPagingStore.kt",
    "content": "package net.pantasystem.milktea.app_store.user\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.reaction.UserReactionRelation\n\ninterface UserReactionPagingStore {\n    interface Factory {\n        fun create(userId: User.Id): UserReactionPagingStore\n    }\n\n    val state: Flow<PageableState<List<UserReactionRelation>>>\n\n    suspend fun loadPrevious(): Result<Unit>\n    suspend fun clear(): Result<Unit>\n\n}\n"
  },
  {
    "path": "modules/common/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/common/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    alias libs.plugins.kotlin.serialization.plugin\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n        compose true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.common'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    //Kotlin coroutines用ライブラリ(async, await)\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n    implementation libs.kotlin.datetime\n    implementation libs.retrofit.serialization.converter\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n\n\n    //glide\n    implementation libs.glide.glide\n    kapt libs.glide.compiler\n    implementation \"com.google.accompanist:accompanist-glide:0.14.0\"\n    implementation 'com.github.penfeizhou.android.animation:apng:2.24.0'\n    implementation 'com.caverock:androidsvg-aar:1.4'\n    implementation libs.okhttp3.logging.inspector\n\n    //retrofit\n    implementation libs.retrofit\n\n    implementation libs.kotlin.serialization\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n}"
  },
  {
    "path": "modules/common/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/common/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/common/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ByteSizeHelper.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport kotlin.math.pow\n\nfun Long.convertToHumanReadable(): String {\n    val size = this\n    return if (size >= 2.0.pow(50)) {\n        \"${size / 2.0.pow(50).toLong()}PB\"\n    } else if(size >= 2.0.pow(40)) {\n        \"${size / 2.0.pow(40).toLong()}TB\"\n    } else if(size >= 1073741824L) {\n        \"${size / 1073741824L}GB\"\n    } else if(size >= 1048576L) {\n        \"${size / 1048576L}MB\"\n    } else if (size >= 1024) {\n        \"${size / 1024.0.pow(1.0).toLong()}KB\"\n    } else {\n        \"${size}B\"\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ColorUtil.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport android.util.Log\nimport java.lang.IllegalArgumentException\n\nobject ColorUtil{\n\n    val hexMap = mapOf(\n        '0' to 0,\n        '1' to 1,\n        '2' to 2,\n        '3' to 3,\n        '4' to 4,\n        '5' to 5,\n        '6' to 6,\n        '7' to 7,\n        '8' to 8,\n        '9' to 9,\n        'A' to 10,\n        'B' to 11,\n        'C' to 12,\n        'D' to 13,\n        'E' to 14,\n        'F' to 15,\n        'a' to 10,\n        'b' to 11,\n        'c' to 12,\n        'd' to 13,\n        'e' to 14,\n        'f' to 15,\n    )\n\n    fun matchOpaqueAndColor(opaque: Int, color: Int): Int{\n        if(opaque in 0..255){\n\n            val o = opaque.shl(8 * 3)\n            val mask = 0xffffff\n            val masked = color and mask\n            //14000000\n            //println(Integer.toHexString(o))\n            val matched =  (o.toLong() or masked.toLong()).toInt()\n            Log.d(\"ColorUtil\", \"matched:${Integer.toHexString(matched)}\")\n            return matched\n        }else{\n            throw IllegalArgumentException(\"opacity is 0..255\")\n        }\n    }\n\n\n    /**\n     * 任意の文字列から任意の色を取得するためのメソッド　\n     * @param str 色を取得するソースとなる文字列\n     */\n    fun getRGBFromString(str: String): Triple<Int, Int, Int> {\n        val hash = Hash.sha256(str)\n        val rBase = hash.substring(0 until 10)\n        val gBase = hash.substring(10 until 21)\n        val bBase = hash.substring(22 until 32)\n        val r = generateColorElement(rBase)\n        val g = generateColorElement(gBase)\n        val b = generateColorElement(bBase)\n\n        return Triple(r, g, b)\n    }\n\n    private fun generateColorElement(str: String): Int {\n        val map = mapOf(\n            '0' to 0,\n            '1' to 1,\n            '2' to 2,\n            '3' to 3,\n            '4' to 4,\n            '5' to 5,\n            '6' to 6,\n            '7' to 7,\n            '8' to 8,\n            '9' to 9,\n            'A' to 10,\n            'B' to 11,\n            'C' to 12,\n            'D' to 13,\n            'E' to 14,\n            'F' to 15\n        )\n        return str.map {\n            map[it]!!\n        }.sum() % 255\n    }\n}\n\nfun String.getRGB(): Triple<Int, Int, Int> {\n    return ColorUtil.getRGBFromString(this)\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/Encryption.kt",
    "content": "package net.pantasystem.milktea.common\n\ninterface Encryption {\n    fun encrypt(alias: String, plainText: String) : String\n    fun decrypt(alias: String, encryptedText: String) : String?\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/Hash.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport java.security.MessageDigest\n\nobject Hash {\n    private const val HEX_CHARS = \"0123456789ABCDEF\"\n\n    fun sha256(input: String) = hashString(\"SHA-256\", input)\n\n    private fun hashString(type: String, input: String): String {\n        val bytes = MessageDigest\n            .getInstance(type)\n            .digest(input.toByteArray())\n        val result = StringBuilder(bytes.size * 2)\n\n        bytes.forEach {\n            val i = it.toInt()\n            result.append(HEX_CHARS[i shr 4 and 0x0f])\n            result.append(HEX_CHARS[i and 0x0f])\n        }\n        return result.toString()\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/Logger.kt",
    "content": "package net.pantasystem.milktea.common\n\n/**\n * Android標準のLogはAndroidに依存してしまっているため、\n * ユニットテストで邪魔になることが多いのと環境によって、出力先を変えたいので抽象化することにした。\n */\ninterface Logger {\n    val defaultTag: String\n    fun debug(msg: String, tag: String = defaultTag, e: Throwable? = null)\n\n    fun debug(tag: String = defaultTag, e: Throwable? = null, message: () -> String)\n\n    fun error(msg: String, e: Throwable? = null, tag: String = defaultTag)\n\n    fun info(msg: String, tag: String = defaultTag, e: Throwable? = null)\n\n    fun warning(msg: String, tag: String = defaultTag, e: Throwable? = null)\n\n    fun log(msg: String) = Unit\n\n    interface Factory {\n        fun create(tag: String = \"MisskeyApp\"): Logger\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/MastodonLinkHeaderDecoder.kt",
    "content": "package net.pantasystem.milktea.common\n\n/**\n * Mastodonの場合次のページネーションのIdがLinkヘッダーに含まれる形で帰ってくるので\n * そのヘッダーから正規表現でmax_idとmin_idを取得するようにしている\n */\nclass MastodonLinkHeaderDecoder(private val headerText: String?) {\n\n    private val maxIdPattern = \"max_id=(\\\\d+)\".toRegex()\n    private val minIdPattern = \"min_id=(\\\\d+)\".toRegex()\n\n    fun getMaxId(): String? {\n        headerText ?: return null\n        return maxIdPattern.find(headerText)?.groupValues?.getOrNull(1)\n    }\n\n    fun getMinId(): String? {\n        headerText ?: return null\n        return minIdPattern.find(headerText)?.groupValues?.getOrNull(1)\n    }\n\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ResultHelper.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport kotlinx.coroutines.CancellationException\n\ninline fun <T, R> T.runCancellableCatching(block: T.() -> R): Result<R> {\n    return try {\n        Result.success(block())\n    } catch (e: CancellationException) {\n        throw e\n    } catch (e: OutOfMemoryError) {\n        throw e\n    } catch (e: Exception) {\n        Result.failure(e)\n    }\n}\n\ninline fun <R> runCancellableCatching(block: () -> R): Result<R> {\n    return try {\n        Result.success(block())\n    } catch (e: CancellationException) {\n        throw e\n    } catch (e: OutOfMemoryError) {\n        throw e\n    } catch (e: Exception) {\n        Result.failure(e)\n    }\n}\n\ninline fun <R, T> Result<T>.mapCancellableCatching(transform: (value: T) -> R): Result<R> {\n    return try {\n        val result = getOrThrow()\n        runCancellableCatching {\n            transform(result)\n        }\n    } catch (e: CancellationException) {\n        throw e\n    } catch (e: OutOfMemoryError) {\n        throw e\n    } catch (e: Exception) {\n        return Result.failure(e)\n    }\n}\n\ninline fun<R, T> Result<T>.flatMapCancellableCatching(transform: (value: T) -> Result<R>): Result<R> {\n    return try {\n        val result = getOrThrow()\n        transform(result)\n    } catch (e: CancellationException) {\n        throw e\n    } catch (e: OutOfMemoryError) {\n        throw e\n    } catch (e: Exception) {\n        return Result.failure(e)\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/SharedPreferenceUtil.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport android.content.Context\nimport android.content.SharedPreferences\n\nfun Context.getPreferenceName(): String{\n    return this.packageName + \"_preferences\"\n}\nfun Context.getPreferences(): SharedPreferences {\n    return this.getSharedPreferences(this.getPreferenceName(), Context.MODE_PRIVATE)\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/collection/LRUCache.kt",
    "content": "package net.pantasystem.milktea.common.collection\n\nclass LRUCache<K, V>(private val capacity: Int) {\n    private val cache = linkedMapOf<K, V>()\n\n    operator fun get(key: K): V? {\n        synchronized(cache) {\n            val value = cache[key]\n\n            if(value != null) {\n                cache.remove(key)\n                cache[key] = value\n            }\n\n            return value\n        }\n    }\n\n    fun put(key: K, value: V) {\n        synchronized(cache) {\n            if(get(key) == null) {\n                if(cache.size >= capacity) {\n                    val firstKey = cache.iterator().next().key\n                    cache.remove(firstKey)\n                }\n\n                cache[key] = value\n            } else {\n                cache.remove(key)\n                cache[key] = value\n            }\n        }\n    }\n\n    operator fun set(key: K, value: V) {\n        put(key, value)\n    }\n\n    fun remove(key: K) {\n        synchronized(cache) {\n            cache.remove(key)\n        }\n    }\n\n    fun clear() {\n        synchronized(cache) {\n            cache.clear()\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/coroutines/CombineExt.kt",
    "content": "package net.pantasystem.milktea.common.coroutines\n\nimport kotlinx.coroutines.flow.Flow\n\ninline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> combine(\n    flow: Flow<T1>,\n    flow2: Flow<T2>,\n    flow3: Flow<T3>,\n    flow4: Flow<T4>,\n    flow5: Flow<T5>,\n    flow6: Flow<T6>,\n    flow7: Flow<T7>,\n    flow8: Flow<T8>,\n    flow9: Flow<T9>,\n    flow10: Flow<T10>,\n    crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R,\n): Flow<R> = kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8, flow9, flow10) { args: Array<*> ->\n    @Suppress(\"UNCHECKED_CAST\")\n    transform(\n        args[0] as T1,\n        args[1] as T2,\n        args[2] as T3,\n        args[3] as T4,\n        args[4] as T5,\n        args[5] as T6,\n        args[6] as T7,\n        args[7] as T8,\n        args[8] as T9,\n        args[9] as T10,\n    )\n}\n\ninline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9,  R> combine(\n    flow: Flow<T1>,\n    flow2: Flow<T2>,\n    flow3: Flow<T3>,\n    flow4: Flow<T4>,\n    flow5: Flow<T5>,\n    flow6: Flow<T6>,\n    flow7: Flow<T7>,\n    flow8: Flow<T8>,\n    flow9: Flow<T9>,\n    crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R,\n): Flow<R> = kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8, flow9) { args: Array<*> ->\n    @Suppress(\"UNCHECKED_CAST\")\n    transform(\n        args[0] as T1,\n        args[1] as T2,\n        args[2] as T3,\n        args[3] as T4,\n        args[4] as T5,\n        args[5] as T6,\n        args[6] as T7,\n        args[7] as T8,\n        args[8] as T9,\n    )\n}\n\ninline fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combine(\n    flow: Flow<T1>,\n    flow2: Flow<T2>,\n    flow3: Flow<T3>,\n    flow4: Flow<T4>,\n    flow5: Flow<T5>,\n    flow6: Flow<T6>,\n    flow7: Flow<T7>,\n    flow8: Flow<T8>,\n    crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R,\n): Flow<R> = kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8) { args: Array<*> ->\n    @Suppress(\"UNCHECKED_CAST\")\n    transform(\n        args[0] as T1,\n        args[1] as T2,\n        args[2] as T3,\n        args[3] as T4,\n        args[4] as T5,\n        args[5] as T6,\n        args[6] as T7,\n        args[7] as T8,\n    )\n}\n\ninline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(\n    flow: Flow<T1>,\n    flow2: Flow<T2>,\n    flow3: Flow<T3>,\n    flow4: Flow<T4>,\n    flow5: Flow<T5>,\n    flow6: Flow<T6>,\n    flow7: Flow<T7>,\n    crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7) -> R,\n): Flow<R> = kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6, flow7) { args: Array<*> ->\n    @Suppress(\"UNCHECKED_CAST\")\n    transform(\n        args[0] as T1,\n        args[1] as T2,\n        args[2] as T3,\n        args[3] as T4,\n        args[4] as T5,\n        args[5] as T6,\n        args[6] as T7,\n    )\n}\n\ninline fun <T1, T2, T3, T4, T5, T6, R> combine(\n    flow: Flow<T1>,\n    flow2: Flow<T2>,\n    flow3: Flow<T3>,\n    flow4: Flow<T4>,\n    flow5: Flow<T5>,\n    flow6: Flow<T6>,\n    crossinline transform: suspend (T1, T2, T3, T4, T5, T6) -> R,\n): Flow<R> = kotlinx.coroutines.flow.combine(flow, flow2, flow3, flow4, flow5, flow6) { args: Array<*> ->\n    @Suppress(\"UNCHECKED_CAST\")\n    transform(\n        args[0] as T1,\n        args[1] as T2,\n        args[2] as T3,\n        args[3] as T4,\n        args[4] as T5,\n        args[5] as T6,\n    )\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/coroutines/PessimisticCollectiveMutex.kt",
    "content": "package net.pantasystem.milktea.common.coroutines\n\nimport androidx.annotation.VisibleForTesting\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\n\nclass PessimisticCollectiveMutex<Key> {\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    var locks: Map<Key, Mutex> = mapOf()\n    private val lock = Mutex()\n\n    suspend fun<T> withLock(key: Key, block: suspend () -> T): T {\n        val l = lock.withLock {\n            var l = locks[key]\n            if (l == null) {\n                l = Mutex()\n                locks = locks + (key to l)\n            }\n            l\n        }\n        return l.withLock {\n            block()\n        }\n    }\n\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/coroutines/Throttle.kt",
    "content": "package net.pantasystem.milktea.common.coroutines\n\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.conflate\nimport kotlinx.coroutines.flow.transform\n\nfun <T> Flow<T>.throttleLatest(delayMillis: Long): Flow<T> = this\n    .conflate()\n    .transform {\n        emit(it)\n        delay(delayMillis)\n    }"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/dhash/ImageDHash.kt",
    "content": "package net.pantasystem.milktea.common.dhash\n\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.graphics.drawable.Drawable\nimport androidx.core.graphics.drawable.toBitmapOrNull\n\nobject ImageDHasher {\n\n    private var WINDOW_SIZE = 8\n    fun hashFromBitmap(bitmap: Bitmap?): Int? {\n        bitmap ?: return null\n        val scaledBitmap = Bitmap.createScaledBitmap(\n            bitmap, WINDOW_SIZE + 1, WINDOW_SIZE + 1, true\n        )\n        val imageDimention = WINDOW_SIZE + 1\n        val pixels = IntArray(imageDimention * imageDimention)\n        scaledBitmap.getPixels(pixels, 0, imageDimention, 0, 0, imageDimention, imageDimention)\n\n        //generate the D-Hash\n        val dHash = generateHash(pixels)\n\n        //clean up\n        scaledBitmap.recycle()\n        return dHash\n    }\n\n    fun hashFromDrawable(drawable: Drawable): Int? {\n        val bitmap = drawable.toBitmapOrNull(WINDOW_SIZE + 1, WINDOW_SIZE + 1)\n            ?: return null\n        return hashFromBitmap(bitmap)\n    }\n\n    fun hashFromPath(path: String?): Int? {\n        val bmOptions = BitmapFactory.Options()\n        bmOptions.inDither = false\n        val bitmap = BitmapFactory.decodeFile(path, bmOptions)\n        val scaledBitmap =\n            Bitmap.createScaledBitmap(bitmap, WINDOW_SIZE + 1, WINDOW_SIZE + 1, true)\n        val imageDimention = WINDOW_SIZE + 1\n        val pixels = IntArray(imageDimention * imageDimention)\n        scaledBitmap.getPixels(pixels, 0, imageDimention, 0, 0, imageDimention, imageDimention)\n\n        //generate the D-Hash\n        val dHash = generateHash(pixels)\n\n        //clean up\n        bitmap.recycle()\n        scaledBitmap.recycle()\n        return dHash\n    }\n\n    private fun generateHash(pixels: IntArray?): Int? {\n        var count = 0\n        var result = 0\n        if (pixels == null || pixels.isEmpty()) {\n            return null\n        }\n        for (y in 0 until WINDOW_SIZE) {\n            for (x in 0 until WINDOW_SIZE) {\n                var index = y * WINDOW_SIZE + x\n                var R = pixels[index] shr 16 and 0xff\n                var G = pixels[index] shr 8 and 0xff\n                var B = pixels[index] and 0xff\n                val greyLeft = (R + G + B) / 3\n                index = y * WINDOW_SIZE + (x + 1)\n                R = pixels[index] shr 16 and 0xff\n                G = pixels[index] shr 8 and 0xff\n                B = pixels[index] and 0xff\n                val greyRight = (R + G + B) / 3\n                if (greyLeft > greyRight) {\n                    var shifted = 1\n                    shifted = shifted shl count\n                    result = result.or(shifted)\n                }\n                count++\n            }\n        }\n        return result\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/errors.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\nimport retrofit2.Response\n\n@Serializable\ndata class Error(\n    val error: Body\n) {\n    @Serializable\n    data class Body(\n        val code: String,\n        val message: String,\n        val id: String,\n        val kind: String? = null\n    )\n}\n\nsealed interface ErrorType {\n    data class Misskey(val error: Error) : ErrorType {\n        val errorCodeeType: MisskeyErrorCodes? by lazy {\n            MisskeyErrorCodes.entries.find { it.code == error.error.code }\n        }\n    }\n    data class Raw(val body: String) : ErrorType\n}\n\n\n\nsealed class APIError(msg: String) : Exception(msg){\n    abstract val error: ErrorType?\n    data class ClientException(override val error: ErrorType?) : APIError(\"error:$error\")\n    data class AuthenticationException(override val error: ErrorType?) : APIError(\"error:$error\")\n    data class ForbiddenException(override val error: ErrorType?) : APIError(\"error:$error\")\n    data class IAmAIException(override val error: ErrorType?) : APIError(\"API Error I am AI Error:$error\")\n    data class InternalServerException(override val error: ErrorType?) : APIError(\"API Error Internal Server Error:$error\")\n    data class SomethingException(override val error: ErrorType?, val statusCode: Int) : APIError(\"API Error:$error, statusCode:$statusCode\")\n    data class NotFoundException(override val error: ErrorType?) : APIError(\"API Error Not Found:$error\")\n    data class ToManyRequestsException(override val error: ErrorType?) : APIError(\"To many requests $error\")\n}\n\nval formatter = Json {\n    ignoreUnknownKeys = true\n}\n\nfun<T> Response<T>.throwIfHasError(): Response<T> {\n    val error = runCancellableCatching {\n        if (code() in 400 .. 599) {\n            this.errorBody()?.string()?.let {\n                runCancellableCatching {\n                    ErrorType.Misskey(formatter.decodeFromString<Error>(it))\n                }.getOrNull() ?: ErrorType.Raw(it)\n            }\n        } else {\n            null\n        }\n    }.getOrNull()\n    throwErrorFromStatusCode(code(), error)\n    return this\n\n}\n\n\nfun throwErrorFromStatusCode(code: Int, error: ErrorType? = null) {\n    when(code) {\n        400 -> throw APIError.ClientException(error)\n        401 -> throw APIError.AuthenticationException(error)\n        403 -> throw APIError.ForbiddenException(error)\n        404 -> throw APIError.NotFoundException(error)\n        418 -> throw APIError.IAmAIException(error)\n        500 -> throw APIError.InternalServerException(error)\n        429 -> throw APIError.ToManyRequestsException(error)\n        else -> if (code in 400..599) {\n            throw APIError.SomethingException(error, code)\n        }\n    }\n}\n\nenum class MisskeyErrorCodes(\n    val code: String\n) {\n\n    InternalError(\"INTERNAL_ERROR\"),\n    UserIsDeleted(\"USER_IS_DELETED\"),\n    FileRequired(\"FILE_REQUIRED\"),\n    NoSuchList(\"NO_SUCH_LIST\"),\n    YouHaveBeenBlocked(\"YOU_HAVE_BEEN_BLOCKED\"),\n    AccessDenied(\"ACCESS_DENIED\"),\n    FailedToResolveRemoteUser(\"FAILED_TO_RESOLVE_REMOTE_USER\"),\n    YourPost(\"YOUR_POST\"),\n    UnknownApiEndpoint(\"UNKNOWN_API_ENDPOINT\"),\n    NoSuchChannel(\"NO_SUCH_CHANNEL\"),\n    NoSuchPage(\"NO_SUCH_PAGE\"),\n    NoSuchNote(\"NO_SUCH_NOTE\"),\n    NoSuchUser(\"NO_SUCH_USER\"),\n    NoSuchClip(\"NO_SUCH_CLIP\"),\n    IncorrectPassword(\"INCORRECT_PASSWORD\"),\n    NoSuchKey(\"NO_SUCH_KEY\"),\n    TooManyAntennas(\"TOO_MANY_ANTENNAS\"),\n    FollowRequestNotFound(\"FOLLOW_REQUEST_NOT_FOUND\"),\n    LtlDisabled(\"LTL_DISABLED\"),\n    NoSuchFile(\"NO_SUCH_FILE\"),\n    NoSuchAntenna(\"NO_SUCH_ANTENNA\"),\n    TooManyMutedWords(\"TOO_MANY_MUTED_WORDS\"),\n    NoSuchRole(\"NO_SUCH_ROLE\"),\n    NoSuchSession(\"NO_SUCH_SESSION\"),\n    TooManyClips(\"TOO_MANY_CLIPS\"),\n    ReactionsNotPublic(\"REACTIONS_NOT_PUBLIC\"),\n    NoSuchFolder(\"NO_SUCH_FOLDER\"),\n    NoSuchReplyTarget(\"NO_SUCH_REPLY_TARGET\"),\n    NoSuchEmoji(\"NO_SUCH_EMOJI\"),\n    Forbidden(\"FORBIDDEN\"),\n    TooManyClipNotes(\"TOO_MANY_CLIP_NOTES\"),\n    TooManyUsers(\"TOO_MANY_USERS\"),\n    PinLimitExceeded(\"PIN_LIMIT_EXCEEDED\"),\n    NoSuchUserList(\"NO_SUCH_USER_LIST\"),\n    NoSuchApp(\"NO_SUCH_APP\"),\n    YourPage(\"YOUR_PAGE\"),\n    YourFlash(\"YOUR_FLASH\"),\n    NoFreeSpace(\"NO_FREE_SPACE\"),\n    RolePermissionDenied(\"ROLE_PERMISSION_DENIED\"),\n    YourAccountMoved(\"YOUR_ACCOUNT_MOVED\"),\n    YourAccountSuspended(\"YOUR_ACCOUNT_SUSPENDED\"),\n    CredentialRequired(\"CREDENTIAL_REQUIRED\"),\n    PermissionDenied(\"PERMISSION_DENIED\"),\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/GlideUtils.kt",
    "content": "package net.pantasystem.milktea.common.glide\n\nimport android.app.Activity\n\nimport android.content.Context\n\n\n\n\nobject GlideUtils {\n    fun isAvailableContextForGlide(context: Context?): Boolean {\n        if (context == null) {\n            return false\n        }\n        if (context is Activity) {\n            if (context.isDestroyed || context.isFinishing) {\n                return false\n            }\n        }\n        return true\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/MiGlideModule.kt",
    "content": "package net.pantasystem.milktea.common.glide\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.drawable.BitmapDrawable\nimport android.graphics.drawable.Drawable\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.Registry\nimport com.bumptech.glide.annotation.GlideModule\nimport com.bumptech.glide.module.AppGlideModule\nimport com.caverock.androidsvg.SVG\nimport com.github.penfeizhou.animation.decode.FrameSeqDecoder\nimport net.pantasystem.milktea.common.glide.apng.ByteBufferApngDecoder\nimport net.pantasystem.milktea.common.glide.apng.FrameSeqDecoderBitmapTranscoder\nimport net.pantasystem.milktea.common.glide.apng.FrameSeqDecoderDrawableTranscoder\nimport net.pantasystem.milktea.common.glide.apng.StreamApngDecoder\nimport net.pantasystem.milktea.common.glide.blurhash.*\nimport net.pantasystem.milktea.common.glide.svg.SvgBitmapTransCoder\nimport net.pantasystem.milktea.common.glide.svg.SvgDecoder\nimport java.io.InputStream\nimport java.nio.ByteBuffer\n\n\n@GlideModule(glideName = \"GlideApp\")\nclass MiGlideModule : AppGlideModule(){\n\n    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {\n        registry\n            .prepend(InputStream::class.java, FrameSeqDecoder::class.java, StreamApngDecoder())\n            .prepend(ByteBuffer::class.java, FrameSeqDecoder::class.java, ByteBufferApngDecoder())\n            .register(FrameSeqDecoder::class.java, Drawable::class.java, FrameSeqDecoderDrawableTranscoder())\n            .register(FrameSeqDecoder::class.java, Bitmap::class.java, FrameSeqDecoderBitmapTranscoder(glide))\n            .register(SVG::class.java, BitmapDrawable::class.java, SvgBitmapTransCoder(context))\n            .append(InputStream::class.java, SVG::class.java, SvgDecoder())\n            .prepend(BlurHashSource::class.java, BlurHash::class.java, BlurHashModelLoader.Factory())\n            .prepend(BlurHash::class.java, BlurHash::class.java, BlurHashResourceDecoder())\n            .register(BlurHash::class.java, BitmapDrawable::class.java, BlurHashTransCoder(context))\n    }\n\n\n    override fun isManifestParsingEnabled(): Boolean {\n        return false\n    }\n}\n\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/apng/ApngDecoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.apng\n\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.ResourceDecoder\nimport com.bumptech.glide.load.engine.Resource\nimport com.github.penfeizhou.animation.apng.decode.APNGDecoder\nimport com.github.penfeizhou.animation.apng.decode.APNGParser\nimport com.github.penfeizhou.animation.decode.FrameSeqDecoder\nimport com.github.penfeizhou.animation.io.ByteBufferReader\nimport com.github.penfeizhou.animation.loader.ByteBufferLoader\nimport com.github.penfeizhou.animation.loader.Loader\nimport java.nio.ByteBuffer\n\n\nclass ByteBufferApngDecoder : ResourceDecoder<ByteBuffer, FrameSeqDecoder<*, *>> {\n    override fun decode(\n        source: ByteBuffer,\n        width: Int,\n        height: Int,\n        options: Options\n    ): Resource<FrameSeqDecoder<*, *>> {\n        return ApngDecoderDelegate.decode(source, width, height, options)\n    }\n\n    override fun handles(source: ByteBuffer, options: Options): Boolean {\n        return ApngDecoderDelegate.handles(source, options)\n    }\n}\n\nobject ApngDecoderDelegate {\n    @JvmStatic\n    private val PNGHeaderBytes =\n        listOf(0x89, 0x50, 0x4E, 0x47)\n            .map { it.toByte() }\n            .toByteArray()\n\n    @JvmStatic\n    private val IENDBytes =\n        listOf(0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82)\n            .map { it.toByte() }\n            .toByteArray()\n\n    @JvmStatic\n    fun decode(\n        source: ByteBuffer,\n        width: Int,\n        height: Int,\n        options: Options\n    ): Resource<FrameSeqDecoder<*, *>> {\n        val sourceBytes = source.array()\n        val iEndChunkPos = findIEndChunkPosition(sourceBytes)\n\n        // IENDチャンクより後にバイト配列がある状態でライブラリに渡すと例外が発生するため、\n        // IENDチャンクの終わる位置が終端となるよう切り詰めておく\n        source.limit(iEndChunkPos + IENDBytes.size)\n\n        val loader: Loader = object : ByteBufferLoader() {\n            override fun getByteBuffer(): ByteBuffer {\n                source.position(0)\n                return source\n            }\n        }\n\n        val decoder = APNGDecoder(loader, null)\n        return FrameSeqDecoderResource(decoder, source.limit())\n    }\n\n    @JvmStatic\n    fun handles(source: ByteBuffer, options: Options): Boolean {\n        val sourceBytes = source.array()\n        if (!checkHeaderBytes(sourceBytes)) {\n            // PNGのヘッダではない\n            return false\n        }\n\n        if (findIEndChunkPosition(sourceBytes) < 0) {\n            // IENDチャンクを持たない\n            return false\n        }\n\n        return APNGParser.isAPNG(ByteBufferReader(source))\n    }\n\n    /**\n     * [source]の先頭がPNGヘッダかどうかを確認する。\n     * PNGヘッダであった場合はtrue、そうでない場合はfalseを返却する。\n     */\n    @JvmStatic\n    private fun checkHeaderBytes(source: ByteArray): Boolean {\n        val headerBytes = source.sliceArray(0..PNGHeaderBytes.size)\n        return headerBytes.contentEquals(PNGHeaderBytes)\n    }\n\n    /**\n     * [source]からIENDチャンクを検索し、IENDチャンクの先頭のインデックスを返却する。\n     * IENDチャンクが見つからない場合は-1を返却する。\n     */\n    @JvmStatic\n    private fun findIEndChunkPosition(source: ByteArray): Int {\n        if (source.size < IENDBytes.size) {\n            return -1\n        }\n\n        // 計算量をなるべく抑えたいので、IENDチャンクのサイズを除外した位置から検索する。\n        // IENDチャンクが終端にある正常なファイルの場合はループせず1回で抜けるはず…\n        val startPos = source.size - IENDBytes.size\n        for (idx in (0..startPos).reversed()) {\n            val curByte = source[idx]\n\n            // 現在のインデックスから取れるバイト値がIENDチャンクの先頭と合致していた場合は、\n            // その位置からIENDチャンクと同じサイズ分だけ配列をスライスし、配列の中身が完全に一致するかを確認する\n            if (curByte == IENDBytes[0]) {\n                val hitTestTargetBytes = source.sliceArray(idx until (idx + IENDBytes.size))\n                if (hitTestTargetBytes.contentEquals(IENDBytes)) {\n                    return idx\n                }\n            }\n        }\n\n        return -1\n    }\n}\n\nprivate class FrameSeqDecoderResource(\n    private val decoder: FrameSeqDecoder<*, *>,\n    private val size: Int\n) : Resource<FrameSeqDecoder<*, *>> {\n    override fun getResourceClass(): Class<FrameSeqDecoder<*, *>> {\n        return FrameSeqDecoder::class.java\n    }\n\n    override fun get(): FrameSeqDecoder<*, *> {\n        return decoder\n    }\n\n    override fun getSize(): Int {\n        return size\n    }\n\n    override fun recycle() {\n        decoder.stop()\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/apng/FrameSeqDecoderBitmapTranscoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.apng\n\nimport android.graphics.Bitmap\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.resource.bitmap.BitmapResource\nimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder\nimport com.github.penfeizhou.animation.decode.FrameSeqDecoder\nimport java.io.IOException\n\nclass FrameSeqDecoderBitmapTranscoder(\n    val glide: Glide\n) : ResourceTranscoder<FrameSeqDecoder<*, *>, Bitmap> {\n    override fun transcode(\n        toTranscode: Resource<FrameSeqDecoder<*, *>>,\n        options: Options\n    ): Resource<Bitmap>? {\n        val frame = toTranscode.get()\n        try {\n            val bitmap = frame.getFrameBitmap(0)\n            return BitmapResource.obtain(bitmap, glide.bitmapPool)\n        } catch(e: IOException) {\n            e.printStackTrace()\n        }\n        return null\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/apng/FrameSeqDecoderDrawableTranscoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.apng\n\nimport android.graphics.drawable.Drawable\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.resource.drawable.DrawableResource\nimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder\nimport com.github.penfeizhou.animation.apng.APNGDrawable\nimport com.github.penfeizhou.animation.apng.decode.APNGDecoder\nimport com.github.penfeizhou.animation.decode.FrameSeqDecoder\n\nclass FrameSeqDecoderDrawableTranscoder : ResourceTranscoder<FrameSeqDecoder<*, *>, Drawable> {\n    override fun transcode(\n        toTranscode: Resource<FrameSeqDecoder<*, *>>,\n        options: Options\n    ): Resource<Drawable> {\n        val apngDrawable = APNGDrawable(toTranscode.get() as APNGDecoder)\n        apngDrawable.setAutoPlay(false)\n        return object : DrawableResource<Drawable>(apngDrawable) {\n            override fun getResourceClass(): Class<Drawable> {\n                return Drawable::class.java\n            }\n\n            override fun getSize(): Int {\n                return apngDrawable.memorySize\n            }\n\n            override fun recycle() {\n                apngDrawable.stop()\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/apng/StreamApngDecoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.apng\n\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.ResourceDecoder\nimport com.bumptech.glide.load.engine.Resource\nimport com.github.penfeizhou.animation.decode.FrameSeqDecoder\nimport java.io.ByteArrayOutputStream\nimport java.io.InputStream\nimport java.nio.ByteBuffer\n\nclass StreamApngDecoder : ResourceDecoder<InputStream, FrameSeqDecoder<*, *>> {\n    companion object {\n        private const val BUFFER_SIZE = 16384\n    }\n\n    override fun decode(\n        source: InputStream,\n        width: Int,\n        height: Int,\n        options: Options,\n    ): Resource<FrameSeqDecoder<*, *>>? {\n        val sourceBuffer = inputStreamToByteBuffer(source) ?: return null\n        return ApngDecoderDelegate.decode(sourceBuffer, width, height, options)\n    }\n\n    override fun handles(source: InputStream, options: Options): Boolean {\n        val sourceBuffer = inputStreamToByteBuffer(source) ?: return false\n        return ApngDecoderDelegate.handles(sourceBuffer, options)\n    }\n\n    private fun inputStreamToByteBuffer(inputStream: InputStream): ByteBuffer? {\n        val result = runCatching {\n            ByteArrayOutputStream(BUFFER_SIZE).use {\n                inputStream.copyTo(it)\n                it.toByteArray()\n            }\n        }\n\n        return result.getOrNull()?.let { ByteBuffer.wrap(it) }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/blurhash/BlurHash.kt",
    "content": "package net.pantasystem.milktea.common.glide.blurhash\n\ninternal data class BlurHash(val hash: String, val width: Int, val height: Int)\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/blurhash/BlurHashModelLoader.kt",
    "content": "package net.pantasystem.milktea.common.glide.blurhash\n\nimport android.content.Context\nimport android.graphics.drawable.BitmapDrawable\nimport com.bumptech.glide.Priority\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.data.DataFetcher\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.model.GlideUrl\nimport com.bumptech.glide.load.model.ModelLoader\nimport com.bumptech.glide.load.model.ModelLoaderFactory\nimport com.bumptech.glide.load.model.MultiModelLoaderFactory\nimport com.bumptech.glide.load.resource.SimpleResource\nimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder\nimport kotlin.math.min\n\n\ninternal class BlurHashFetcher(val hash: BlurHashSource, val width: Int, val height: Int) :\n    DataFetcher<BlurHash> {\n    override fun cancel() = Unit\n\n    override fun cleanup() = Unit\n\n    override fun getDataClass(): Class<BlurHash> {\n        return BlurHash::class.java\n    }\n\n    override fun getDataSource(): DataSource {\n        return DataSource.LOCAL\n    }\n\n    override fun loadData(priority: Priority, callback: DataFetcher.DataCallback<in BlurHash>) {\n        return callback.onDataReady(BlurHash(hash.hash, width = width, height = height))\n    }\n\n}\n\ninternal class BlurHashModelLoader : ModelLoader<BlurHashSource, BlurHash> {\n    override fun buildLoadData(\n        model: BlurHashSource,\n        width: Int,\n        height: Int,\n        options: Options\n    ): ModelLoader.LoadData<BlurHash> {\n        return ModelLoader.LoadData(GlideUrl(model.hash), BlurHashFetcher(model, width = width, height = height))\n    }\n\n\n    override fun handles(model: BlurHashSource): Boolean {\n        return true\n    }\n    class Factory : ModelLoaderFactory<BlurHashSource, BlurHash> {\n        override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader<BlurHashSource, BlurHash> {\n            return BlurHashModelLoader()\n        }\n\n        override fun teardown() = Unit\n    }\n}\n\ninternal class BlurHashTransCoder(val context: Context) : ResourceTranscoder<BlurHash, BitmapDrawable> {\n    override fun transcode(\n        toTranscode: Resource<BlurHash>,\n        options: Options\n    ): Resource<BitmapDrawable> {\n        val blurHash = toTranscode.get()\n        val (width, height) = scaleToMax(blurHash.width, blurHash.height)\n        val bitmap = BlurHashDecoder.decode(toTranscode.get().hash, width = width, height = height)\n        return SimpleResource(BitmapDrawable(context.resources, bitmap))\n    }\n    private fun scaleToMax(width: Int, height: Int): Pair<Int, Int> {\n        val smallWidth = min(480, min(width, height)) / 4\n        val scale = smallWidth.toDouble() / width\n        val smallHeight = scale * height\n        return smallWidth to smallHeight.toInt()\n    }\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/blurhash/BlurHashResourceDecoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.blurhash\n\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.ResourceDecoder\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.resource.SimpleResource\nimport com.bumptech.glide.request.target.Target\n\ninternal class BlurHashResourceDecoder : ResourceDecoder<BlurHash, BlurHash> {\n    override fun decode(\n        source: BlurHash,\n        width: Int,\n        height: Int,\n        options: Options\n    ): Resource<BlurHash> {\n        var bh = source\n        if (width != Target.SIZE_ORIGINAL && height != bh.width) {\n            bh = bh.copy(width = width)\n        }\n        if (height != Target.SIZE_ORIGINAL && height != bh.height) {\n            bh = bh.copy(height = height)\n        }\n        return SimpleResource(bh)\n    }\n\n    override fun handles(source: BlurHash, options: Options): Boolean {\n        return true\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/blurhash/BlurHashSource.kt",
    "content": "package net.pantasystem.milktea.common.glide.blurhash\n\ndata class BlurHashSource(val hash: String)\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/blurhash/BlurhashDecoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.blurhash\n\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.util.SparseIntArray\nimport kotlin.math.cos\nimport kotlin.math.pow\nimport kotlin.math.withSign\n\n\nobject BlurHashDecoder {\n\n    // cache Math.cos() calculations to improve performance.\n    // The number of calculations can be huge for many bitmaps: width * height * numCompX * numCompY * 2 * nBitmaps\n    // the cache is enabled by default, it is recommended to disable it only when just a few images are displayed\n//    private val cacheCosinesX = HashMap<Int, DoubleArray>()\n//    private val cacheCosinesY = HashMap<Int, DoubleArray>()\n\n\n    fun decode(blurHash: String?, width: Int, height: Int, punch: Float = 1f): Bitmap? {\n        if (blurHash == null || blurHash.length < 6) {\n            return null\n        }\n        val numCompEnc = decode83(blurHash, 0, 1)\n        val numCompX = (numCompEnc % 9) + 1\n        val numCompY = (numCompEnc / 9) + 1\n        if (blurHash.length != 4 + 2 * numCompX * numCompY) {\n            return null\n        }\n        val maxAcEnc = decode83(blurHash, 1, 2)\n        val maxAc = (maxAcEnc + 1) / 166f\n        val colors = Array(numCompX * numCompY) { i ->\n            if (i == 0) {\n                val colorEnc = decode83(blurHash, 2, 6)\n                decodeDc(colorEnc)\n            } else {\n                val from = 4 + i * 2\n                val colorEnc = decode83(blurHash, from, from + 2)\n                decodeAc(colorEnc, maxAc * punch)\n            }\n        }\n        return composeBitmap(width, height, numCompX, numCompY, colors)\n    }\n\n    private fun decode83(str: String, from: Int = 0, to: Int = str.length): Int {\n        var result = 0\n        for (i in from until to) {\n            val index = charMap[str[i].code]\n            if (index != -1) {\n                result = result * 83 + index\n            }\n        }\n        return result\n    }\n\n    private fun decodeDc(colorEnc: Int): FloatArray {\n        val r = colorEnc shr 16\n        val g = (colorEnc shr 8) and 255\n        val b = colorEnc and 255\n        return floatArrayOf(srgbToLinear(r), srgbToLinear(g), srgbToLinear(b))\n    }\n\n    private fun srgbToLinear(colorEnc: Int): Float {\n        val v = colorEnc / 255f\n        return if (v <= 0.04045f) {\n            (v / 12.92f)\n        } else {\n            ((v + 0.055f) / 1.055f).pow(2.4f)\n        }\n    }\n\n    private fun decodeAc(value: Int, maxAc: Float): FloatArray {\n        val r = value / (19 * 19)\n        val g = (value / 19) % 19\n        val b = value % 19\n        return floatArrayOf(\n            signedPow2((r - 9) / 9.0f) * maxAc,\n            signedPow2((g - 9) / 9.0f) * maxAc,\n            signedPow2((b - 9) / 9.0f) * maxAc\n        )\n    }\n\n    private fun signedPow2(value: Float) = value.pow(2f).withSign(value)\n\n    private fun composeBitmap(\n        width: Int, height: Int,\n        numCompX: Int, numCompY: Int,\n        colors: Array<FloatArray>,\n    ): Bitmap {\n        // use an array for better performance when writing pixel colors\n        val imageArray = IntArray(width * height)\n        val cosinesX = getArrayForCosinesX(width, numCompX)\n        val cosinesY = getArrayForCosinesY(height, numCompY)\n        for (y in 0 until height) {\n            for (x in 0 until width) {\n                var r = 0f\n                var g = 0f\n                var b = 0f\n                for (j in 0 until numCompY) {\n                    for (i in 0 until numCompX) {\n                        val cosX = cosinesX.getCos(i, numCompX, x, width)\n                        val cosY = cosinesY.getCos(j, numCompY, y, height)\n                        val basis = (cosX * cosY).toFloat()\n                        val color = colors[j * numCompX + i]\n                        r += color[0] * basis\n                        g += color[1] * basis\n                        b += color[2] * basis\n                    }\n                }\n                imageArray[x + width * y] = Color.rgb(linearToSrgb(r), linearToSrgb(g), linearToSrgb(b))\n            }\n        }\n        return Bitmap.createBitmap(imageArray, width, height, Bitmap.Config.ARGB_8888)\n    }\n\n    private fun getArrayForCosinesY(height: Int, numCompY: Int) = DoubleArray(height * numCompY)\n    private fun getArrayForCosinesX(width: Int, numCompX: Int) = DoubleArray(width * numCompX)\n    private fun DoubleArray.getCos(\n        x: Int,\n        numComp: Int,\n        y: Int,\n        size: Int\n    ): Double {\n        this[x + numComp * y] = cos(Math.PI * y * x / size)\n        return this[x + numComp * y]\n    }\n\n    private fun linearToSrgb(value: Float): Int {\n        val v = value.coerceIn(0f, 1f)\n        return if (v <= 0.0031308f) {\n            (v * 12.92f * 255f + 0.5f).toInt()\n        } else {\n            ((1.055f * v.pow(1 / 2.4f) - 0.055f) * 255 + 0.5f).toInt()\n        }\n    }\n\n    private val chars = listOf(\n        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G',\n        'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',\n        'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',\n        'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '#', '$', '%', '*', '+', ',',\n        '-', '.', ':', ';', '=', '?', '@', '[', ']', '^', '_', '{', '|', '}', '~'\n    )\n        .mapIndexed { i, c -> c to i }\n        .toMap()\n\n    private val charMap = SparseIntArray().apply {\n        chars.map {\n            it.key.code to it.value\n        }.forEach {\n            put(it.first, it.second)\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/svg/SvgDecoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.svg\n\nimport android.util.Log\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.ResourceDecoder\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.resource.SimpleResource\nimport com.bumptech.glide.request.target.Target\nimport com.caverock.androidsvg.SVG\nimport com.caverock.androidsvg.SVGParseException\nimport java.io.InputStream\nimport java.nio.ByteBuffer\n\nprivate const val SVG_HEADER: Int = 0x3C737667\nprivate const val SVG_HEADER_STARTS_WITH_XML = 0x3c3f786d\nclass SvgDecoder : ResourceDecoder<InputStream, SVG>{\n\n    companion object {\n        fun isSvg(source: InputStream): Boolean {\n            val buffer = ByteArray(8)\n            val cnt = source.read(buffer)\n            if (cnt < 8) {\n                Log.d(\"SvgDecoder\", \"svgではない\")\n                return false\n            }\n\n            val header = ByteBuffer.wrap(buffer).int\n            return header == SVG_HEADER || header == SVG_HEADER_STARTS_WITH_XML\n        }\n    }\n\n    override fun handles(source: InputStream, options: Options): Boolean {\n        return isSvg(source)\n    }\n\n    override fun decode(\n        source: InputStream,\n        width: Int,\n        height: Int,\n        options: Options\n    ): Resource<SVG>? {\n        return try {\n            val svg = SVG.getFromInputStream(source)\n            if (width != Target.SIZE_ORIGINAL) {\n                svg.documentWidth = width.toFloat()\n            }\n            if (height != Target.SIZE_ORIGINAL) {\n                svg.documentHeight = height.toFloat()\n            }\n            Log.d(\"SvgDecoder\", \"width: $width, height: $height\")\n            SimpleResource(svg)\n        }catch(e: SVGParseException){\n            Log.e(\"SvgDecoder\", \"error\", e)\n            null\n        }\n\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/glide/svg/SvgDrawableTranscoder.kt",
    "content": "package net.pantasystem.milktea.common.glide.svg\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.graphics.drawable.BitmapDrawable\nimport com.bumptech.glide.load.Options\nimport com.bumptech.glide.load.engine.Resource\nimport com.bumptech.glide.load.resource.SimpleResource\nimport com.bumptech.glide.load.resource.transcode.ResourceTranscoder\nimport com.caverock.androidsvg.SVG\n\nclass SvgBitmapTransCoder(val context: Context): ResourceTranscoder<SVG, BitmapDrawable>{\n    override fun transcode(toTranscode: Resource<SVG>, options: Options): Resource<BitmapDrawable> {\n        val svg = toTranscode.get()\n        val bitmap = Bitmap.createBitmap(svg.documentWidth.toInt(), svg.documentHeight.toInt(), Bitmap.Config.ARGB_8888)\n        val canvas = Canvas(bitmap)\n        svg.renderToCanvas(canvas)\n        return SimpleResource(BitmapDrawable(context.resources, bitmap))\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/EntityConverter.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\n\n/**\n * DTOをEntityに変換し共通のDataStoreにEntityを追加するためのInterface\n */\ninterface EntityConverter<DTO, E> {\n    suspend fun convertAll(list: List<DTO>) : List<E>\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/FutureCacheSaver.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\ninterface FutureCacheSaver<E> {\n    suspend fun saveFuture(elements: List<E>)\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/FutureLoader.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\n/**\n * 新たなページを取得するためのAPIのアダプター\n */\ninterface FutureLoader<DTO> {\n    suspend fun loadFuture(): Result<List<DTO>>\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/FuturePaginator.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\ninterface FuturePaginator {\n    suspend fun loadFuture(): Result<Int>\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/FuturePagingController.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\n\n\nclass FuturePagingController<DTO, E>(\n    private val entityConverter: EntityConverter<DTO, E>,\n    private val locker: StateLocker,\n    private val state: PaginationState<E>,\n    private val futureLoader: FutureLoader<DTO>,\n    private val dispatcher: CoroutineDispatcher = Dispatchers.IO\n) : FuturePaginator {\n\n    companion object {\n        fun <T, DTO, E> create(impl: T): FuturePagingController<DTO, E> where T : EntityConverter<DTO, E>, T : StateLocker, T : PaginationState<E>, T : FutureLoader<DTO> {\n            return FuturePagingController(\n                impl,\n                impl,\n                impl,\n                impl\n            )\n        }\n    }\n\n    override suspend fun loadFuture(): Result<Int> {\n        if (locker.mutex.isLocked) {\n            return Result.failure(IllegalStateException(\"ローディング中にさらにローディング処理を実行することはできません\"))\n        }\n        return locker.mutex.withLock {\n\n            val loading = PageableState.Loading.Future(\n                content = state.getState().content\n            )\n            state.setState(loading)\n            runCancellableCatching {\n                withContext(dispatcher) {\n                    val res = futureLoader.loadFuture().getOrThrow()\n\n                    // MisskeyではsinceIdで取得した場合に[1, 2, 3, 4, 5]という順番で取得される\n                    // しかしアプリ上では[5, 4, 3, 2, 1]という順番で扱えた方が好ましいため、\n                    // reverseするようにしている。\n                    // ※ untilIdの場合は[5, 4, 3, 2, 1]という順番で取得される。\n                    entityConverter.convertAll(res).asReversed()\n                }\n            }.onFailure {\n                val errorState = PageableState.Error(\n                    state.getState().content,\n                    it\n                )\n                state.setState(errorState)\n            }.onSuccess {\n                when(val content = this.state.getState().content) {\n                    is StateContent.Exist -> {\n                        val newList = content.rawContent.toMutableList()\n                        newList.addAll(0, it)\n                        state.setState(\n                            PageableState.Fixed(\n                                StateContent.Exist(\n                                    newList\n                                )\n                            )\n                        )\n                    }\n                    is StateContent.NotExist -> {\n                        state.setState(\n                            PageableState.Fixed(\n                                StateContent.Exist(it)\n                            )\n                        )\n                    }\n                }\n            }.map {\n                it.size\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/IdFutureLoader.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport net.pantasystem.milktea.common.PageableState\n\ninterface IdFutureLoader<Id, DTO, E> {\n    suspend fun loadFuture(state: PageableState<List<E>>, id: Id?): Result<List<DTO>>\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/IdGetter.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\n/**\n * ページネーションするためのIdを取得するためのインターフェース\n * IdはAPIやデータベースにアクセスするものと直接的に対応する\n */\ninterface IdGetter<T> {\n    suspend fun getUntilId(): T?\n    suspend fun getSinceId(): T?\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/IdPreviousLoader.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport net.pantasystem.milktea.common.PageableState\n\ninterface IdPreviousLoader<Id, DTO, E> {\n    suspend fun loadPrevious(state: PageableState<List<E>>, id: Id?): Result<List<DTO>>\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/MediatorFuturePagingController.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\n\nclass MediatorFuturePagingController<Id, DTO, Record, E>(\n    private val entityConverter: EntityConverter<DTO, E>,\n    private val localRecordConverter: EntityConverter<Record, E>,\n    private val locker: StateLocker,\n    private val state: PaginationState<E>,\n    private val futureLoader: IdFutureLoader<Id, DTO, E>,\n    private val localFutureLoader: IdFutureLoader<Id, Record, E>,\n    private val idGetter: IdGetter<Id>,\n    private val futureCacheSaver: FutureCacheSaver<DTO>,\n    private val dispatcher: CoroutineDispatcher = Dispatchers.IO\n) : FuturePaginator {\n\n    override suspend fun loadFuture(): Result<Int> {\n        if (locker.mutex.isLocked) {\n            return Result.failure(IllegalStateException())\n        }\n        return locker.mutex.withLock {\n            runCancellableCatching {\n                val beforeUpdateState = state.getState()\n                val id = idGetter.getUntilId()\n                val loading = PageableState.Loading.Future(\n                    content = state.getState().content\n                )\n                state.setState(loading)\n                val localCaches = withContext(dispatcher) {\n                    localFutureLoader.loadFuture(beforeUpdateState, id)\n                }.mapCancellableCatching {\n                    localRecordConverter.convertAll(it)\n                }.getOrThrow()\n\n                applyLocalSourceState(beforeUpdateState, localCaches)\n\n                val futureRawRes = withContext(dispatcher) {\n                    futureLoader.loadFuture(beforeUpdateState, id)\n                }\n                val remoteRes = futureRawRes.mapCancellableCatching {\n                    entityConverter.convertAll(it)\n                }.getOrThrow()\n\n                futureCacheSaver.saveFuture(futureRawRes.getOrThrow())\n\n                applyFinalState(beforeUpdateState, remoteRes)\n\n                remoteRes.size\n            }.onFailure {\n                val errorState = PageableState.Error(\n                    state.getState().content,\n                    it\n                )\n                state.setState(errorState)\n            }\n\n        }\n    }\n\n    private fun applyLocalSourceState(state: PageableState<List<E>>, it: List<E>) {\n        when(val content = state.content) {\n            is StateContent.Exist -> {\n                val newList = content.rawContent.toMutableList()\n                newList.addAll(0, it)\n                this.state.setState(\n                    PageableState.Loading.Future(\n                        StateContent.Exist(\n                            newList\n                        )\n                    )\n                )\n            }\n            is StateContent.NotExist -> {\n                this.state.setState(\n                    PageableState.Loading.Future(\n                        StateContent.Exist(it)\n                    )\n                )\n            }\n        }\n    }\n\n    private fun applyFinalState(state: PageableState<List<E>>, it: List<E>) {\n        when(val content = state.content) {\n            is StateContent.Exist -> {\n                val newList = content.rawContent.toMutableList()\n                newList.addAll(0, it)\n                this.state.setState(\n                    PageableState.Fixed(\n                        StateContent.Exist(\n                            newList\n                        )\n                    )\n                )\n            }\n            is StateContent.NotExist -> {\n                this.state.setState(\n                    PageableState.Fixed(\n                        StateContent.Exist(it)\n                    )\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/MediatorPreviousPagingController.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\n\nclass MediatorPreviousPagingController<Id, DTO, Record, E>(\n    private val entityConverter: EntityConverter<DTO, E>,\n    private val localRecordConverter: EntityConverter<Record, E>,\n    private val locker: StateLocker,\n    private val state: PaginationState<E>,\n    private val previousLoader: IdPreviousLoader<Id, DTO, E>,\n    private val localPreviousLoader: IdPreviousLoader<Id, Record, E>,\n    private val idGetter: IdGetter<Id>,\n    private val previousCacheSaver: PreviousCacheSaver<Id, DTO>,\n    private val dispatcher: CoroutineDispatcher = Dispatchers.IO\n) : PreviousPaginator {\n\n    override suspend fun loadPrevious(): Result<Int> {\n        if (locker.mutex.isLocked) {\n            return Result.failure(IllegalStateException())\n        }\n        return locker.mutex.withLock {\n            runCancellableCatching {\n                val beforeUpdateState = state.getState()\n                val id = idGetter.getUntilId()\n                val loading = PageableState.Loading.Previous(\n                    content = state.getState().content\n                )\n                state.setState(loading)\n                val localCaches = withContext(dispatcher) {\n                    localPreviousLoader.loadPrevious(beforeUpdateState, id)\n                }.mapCancellableCatching {\n                    localRecordConverter.convertAll(it)\n                }.getOrThrow()\n\n                applyLocalSourceState(beforeUpdateState, localCaches)\n\n                val remoteRawRes = withContext(dispatcher) {\n                    previousLoader.loadPrevious(beforeUpdateState, id)\n                }\n                val remoteRes = remoteRawRes.mapCancellableCatching {\n                    entityConverter.convertAll(it)\n                }.getOrThrow()\n\n                withContext(dispatcher) {\n                    previousCacheSaver.savePrevious(id, remoteRawRes.getOrThrow())\n                }\n\n                applyFinalState(beforeUpdateState, remoteRes)\n\n                remoteRes.size\n            }.onFailure {\n                val errorState = PageableState.Error(\n                    state.getState().content,\n                    it\n                )\n                state.setState(errorState)\n            }\n\n        }\n    }\n\n    private fun applyLocalSourceState(state: PageableState<List<E>>, it: List<E>) {\n        when(val content = state.content) {\n            is StateContent.Exist -> {\n                val newList = content.rawContent.toMutableList()\n                newList.addAll(it)\n                this.state.setState(\n                    PageableState.Loading.Previous(\n                        StateContent.Exist(\n                            newList\n                        )\n                    )\n                )\n            }\n            is StateContent.NotExist -> {\n                this.state.setState(\n                    PageableState.Loading.Previous(\n                        StateContent.Exist(it)\n                    )\n                )\n            }\n        }\n    }\n\n    private fun applyFinalState(state: PageableState<List<E>>, it: List<E>) {\n        when(val content = state.content) {\n            is StateContent.Exist -> {\n                val newList = content.rawContent.toMutableList()\n                newList.addAll(it)\n                this.state.setState(\n                    PageableState.Fixed(\n                        StateContent.Exist(\n                            newList\n                        )\n                    )\n                )\n            }\n            is StateContent.NotExist -> {\n                this.state.setState(\n                    PageableState.Fixed(\n                        StateContent.Exist(it)\n                    )\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/PaginationState.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\n\ninterface PaginationState<T> {\n    val state: Flow<PageableState<List<T>>>\n    fun setState(state: PageableState<List<T>>)\n    fun getState(): PageableState<List<T>>\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/PreviousCacheSaver.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\ninterface PreviousCacheSaver<Id, E> {\n    suspend fun savePrevious(key: Id?, elements: List<E>)\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/PreviousLoader.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\n/**\n * 過去のページを取得するためのAPIのアダプター\n */\ninterface PreviousLoader<DTO> {\n    suspend fun loadPrevious(): Result<List<DTO>>\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/PreviousPaginator.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\ninterface PreviousPaginator {\n    suspend fun loadPrevious(): Result<Int>\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/PreviousPagingController.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\n\nclass PreviousPagingController<DTO, E>(\n    private val entityConverter: EntityConverter<DTO, E>,\n    private val locker: StateLocker,\n    private val state: PaginationState<E>,\n    private val previousLoader: PreviousLoader<DTO>,\n    private val dispatcher: CoroutineDispatcher = Dispatchers.IO\n) : PreviousPaginator {\n\n    companion object {\n        fun <T, DTO, E> create(impl: T): PreviousPagingController<DTO, E> where T : EntityConverter<DTO, E>, T : StateLocker, T : PaginationState<E>, T : PreviousLoader<DTO> {\n            return PreviousPagingController(\n                impl,\n                impl,\n                impl,\n                impl\n            )\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<Int> {\n        if (locker.mutex.isLocked) {\n            return Result.failure(IllegalStateException())\n        }\n        val result = locker.mutex.withLock {\n\n            val loading = PageableState.Loading.Previous(\n                content = state.getState().content\n            )\n            state.setState(loading)\n            runCancellableCatching {\n                withContext(dispatcher) {\n                    val res = previousLoader.loadPrevious().getOrThrow()\n                    entityConverter.convertAll(res)\n                }\n            }.onFailure {\n                val errorState = PageableState.Error(\n                    state.getState().content,\n                    it\n                )\n                state.setState(errorState)\n            }.onSuccess {\n                when (val content = this.state.getState().content) {\n                    is StateContent.Exist -> {\n                        val newList = content.rawContent.toMutableList()\n                        newList.addAll(it)\n                        state.setState(\n                            PageableState.Fixed(\n                                StateContent.Exist(\n                                    newList\n                                )\n                            )\n                        )\n                    }\n\n                    is StateContent.NotExist -> {\n                        state.setState(\n                            PageableState.Fixed(\n                                StateContent.Exist(it)\n                            )\n                        )\n                    }\n                }\n            }\n        }\n        return result.map {\n            it.size\n        }\n    }\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/paginator/StateLocker.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.sync.Mutex\n\n/**\n * 状態をロックすることのできることを表すインターフェース\n */\ninterface StateLocker {\n    val mutex: Mutex\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/serializations/DateSerializer.kt",
    "content": "package net.pantasystem.milktea.common.serializations\n\nimport kotlinx.serialization.*\nimport kotlinx.serialization.descriptors.PrimitiveKind\nimport kotlinx.serialization.descriptors.PrimitiveSerialDescriptor\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\nimport java.lang.IllegalStateException\nimport java.text.SimpleDateFormat\nimport java.util.*\n\n@ExperimentalSerializationApi\n@Serializer(forClass = Date::class)\nobject DateSerializer : KSerializer<Date>{\n    private const val DATE_FORMAT = \"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\"\n\n    override val descriptor: SerialDescriptor\n        get() = PrimitiveSerialDescriptor(\"DateSerializer\", PrimitiveKind.STRING)\n\n\n    override fun deserialize(decoder: Decoder): Date {\n        return SimpleDateFormat(DATE_FORMAT, Locale.Builder().build()).parse(decoder.decodeString())\n            ?: throw IllegalStateException(\"Dateでコード時に何らかの異常が発生しました\")\n    }\n\n    override fun serialize(encoder: Encoder, value: Date) {\n        encoder.encodeString(SimpleDateFormat(DATE_FORMAT, Locale.Builder().build()).format(value))\n    }\n\n\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/serializations/EnumIgnoreUnknownSerializer.kt",
    "content": "package net.pantasystem.milktea.common.serializations\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.descriptors.PrimitiveKind\nimport kotlinx.serialization.descriptors.PrimitiveSerialDescriptor\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\n\nabstract class EnumIgnoreUnknownSerializer<T : Enum<T>>(values: Array<out T>, private val defaultValue: T) :\n    KSerializer<T> {\n    // Alternative to taking values in param, take clazz: Class<T>\n    // - private val values = clazz.enumConstants\n    override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(values.first()::class.qualifiedName!!, PrimitiveKind.STRING)\n    // Build maps for faster parsing, used @SerialName annotation if present, fall back to name\n    private val lookup = values.associateBy({ it }, { it.serialName })\n    private val revLookup = values.associateBy { it.serialName }\n\n    private val Enum<T>.serialName: String\n        get() = this::class.java.getField(this.name).getAnnotation(SerialName::class.java)?.value ?: name\n\n    override fun serialize(encoder: Encoder, value: T) {\n        encoder.encodeString(lookup.getValue(value))\n    }\n\n    override fun deserialize(decoder: Decoder): T {\n        // only run 'decoder.decodeString()' once\n        return revLookup[decoder.decodeString()] ?: defaultValue // map.getOrDefault is not available < API-24\n    }\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/serializations/FallbackDefaultValueSerializer.kt",
    "content": "package net.pantasystem.milktea.common.serializations\n\nimport kotlinx.serialization.KSerializer\nimport kotlinx.serialization.descriptors.SerialDescriptor\nimport kotlinx.serialization.encoding.Decoder\nimport kotlinx.serialization.encoding.Encoder\n\nabstract class FallbackDefaultValueSerializer<T>(private val serializer: KSerializer<T>, private val defaultValue: T) :\n    KSerializer<T> {\n\n    // Alternative to taking values in param, take clazz: Class<T>\n    // - private val values = clazz.enumConstants\n    override val descriptor: SerialDescriptor = serializer.descriptor\n\n\n    override fun serialize(encoder: Encoder, value: T) {\n        serializer.serialize(encoder, value)\n    }\n\n    override fun deserialize(decoder: Decoder): T {\n        return try {\n            serializer.deserialize(decoder)\n        } catch (e: Exception) {\n            defaultValue\n        }\n    }\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/state_helper.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.map\n\n\nsealed class ResultState<out T>(val content: StateContent<T>) {\n    companion object\n\n    class Fixed<out T>(content: StateContent<T>) : ResultState<T>(content)\n    class Loading<out T>(content: StateContent<T>) : ResultState<T>(content)\n    class Error<out T>(content: StateContent<T>, val throwable: Throwable) : ResultState<T>(content) {\n        override fun toString(): String {\n            return \"Error(content=$content, throwable=$throwable)\"\n        }\n    }\n\n    fun<O> convert(converter: (T)->O) : ResultState<O> {\n        val content = when(this.content) {\n            is StateContent.Exist -> {\n                StateContent.Exist(converter.invoke(this.content.rawContent))\n            }\n            is StateContent.NotExist -> {\n                StateContent.NotExist()\n            }\n        }\n\n        return when(this) {\n            is Fixed -> Fixed(content)\n            is Loading -> Loading(content)\n            is Error -> Error(content, this.throwable)\n        }\n    }\n    suspend fun<O> suspendConvert(converter: suspend (T)->O) : ResultState<O> {\n        val content = when(this.content) {\n            is StateContent.Exist -> {\n                StateContent.Exist(converter.invoke(this.content.rawContent))\n            }\n            is StateContent.NotExist -> {\n                StateContent.NotExist()\n            }\n        }\n\n        return when(this) {\n            is Fixed -> Fixed(content)\n            is Loading -> Loading(content)\n            is Error -> Error(content, this.throwable)\n        }\n    }\n}\n\nsealed class StateContent<out T> {\n    data class Exist<out T>(val rawContent: T) : StateContent<T>()\n    class NotExist<out T> : StateContent<T>()\n}\n\nfun<T> ResultState.Companion.initialState(): ResultState<T> {\n    return ResultState.Loading(StateContent.NotExist())\n}\n\nsealed class PageableState<T>(val content: StateContent<T>) {\n    companion object\n    class Fixed<T>(content: StateContent<T>) : PageableState<T>(content) {\n        fun init() : Loading.Init<T> {\n            return Loading.Init()\n        }\n\n        fun previous() : Loading.Previous<T> {\n            return Loading.Previous(this.content)\n        }\n\n        fun future() : Loading.Future<T> {\n            return Loading.Future(this.content)\n        }\n    }\n    sealed class Loading<T>(content: StateContent<T>) : PageableState<T>(content) {\n        class Init<T> : Loading<T>(StateContent.NotExist())\n        class Previous<T>(content: StateContent<T>) : Loading<T>(content)\n        class Future<T>(content: StateContent<T>) : Loading<T>(content)\n\n        fun error(throwable: Throwable, content: StateContent<T> = this.content) : Error<T> {\n            return Error(content, throwable)\n        }\n\n        fun fixed(content: StateContent<T>) : Fixed<T> {\n            return Fixed(content)\n        }\n\n        fun init() : Init<T> {\n            return Init()\n        }\n    }\n    class Error<T>(content: StateContent<T>, val throwable: Throwable) : PageableState<T>(content) {\n        fun init() : Loading.Init<T> {\n            return Loading.Init()\n        }\n\n        fun previous() : Loading.Previous<T> {\n            return Loading.Previous(this.content)\n        }\n\n        fun future() : Loading.Future<T> {\n            return Loading.Future(this.content)\n        }\n    }\n\n    fun<O> convert(converter: (T)->O) : PageableState<O> {\n        val content = when(this.content) {\n            is StateContent.Exist -> {\n                StateContent.Exist(converter.invoke(this.content.rawContent))\n            }\n            is StateContent.NotExist -> {\n                StateContent.NotExist()\n            }\n        }\n\n        return when(this) {\n            is Fixed -> Fixed(content)\n            is Loading.Init -> Loading.Init()\n            is Loading.Previous -> Loading.Previous(content)\n            is Loading.Future -> Loading.Future(content)\n            is Error -> Error(content, this.throwable)\n        }\n    }\n    suspend fun<O> suspendConvert(converter: suspend (T)->O) : PageableState<O> {\n        val content = when(this.content) {\n            is StateContent.Exist -> {\n                StateContent.Exist(converter.invoke(this.content.rawContent))\n            }\n            is StateContent.NotExist -> {\n                StateContent.NotExist()\n            }\n        }\n\n        return when(this) {\n            is Fixed -> Fixed(content)\n            is Loading.Init -> Loading.Init()\n            is Loading.Previous -> Loading.Previous(content)\n            is Loading.Future -> Loading.Future(content)\n            is Error -> Error(content, this.throwable)\n        }\n    }\n\n}\n\n@OptIn(ExperimentalCoroutinesApi::class)\nfun<T, R> Flow<PageableState<T>>.convert(converter: suspend (T?) -> Flow<R>): Flow<PageableState<R>> {\n    return flatMapLatest { state ->\n        val content = (state.content as? StateContent.Exist)?.rawContent\n        converter(content).map { convertTo ->\n            state.convert {\n                convertTo\n            }\n        }\n    }\n}\n\nfun<T> PageableState.Companion.initialState(): PageableState<T> {\n    return PageableState.Loading.Init()\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/suspend_state_util.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flow\n\n\nfun<T> (suspend () -> T).asLoadingStateFlow(): Flow<ResultState<T>> {\n\n    return flow {\n        emit(ResultState.Fixed(StateContent.NotExist()))\n        emit(ResultState.Loading(StateContent.NotExist()))\n        runCancellableCatching {\n            this@asLoadingStateFlow.invoke()\n        }.onSuccess {\n            emit(ResultState.Fixed(StateContent.Exist(it)))\n        }.onFailure {\n            emit(ResultState.Error(StateContent.NotExist(), it))\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/text/Levenshtein.kt",
    "content": "package net.pantasystem.milktea.common.text\n\nimport kotlin.math.min\n\nobject LevenshteinDistance {\n    operator fun invoke(s1: String, s2: String): Int {\n        val dp = Array(s1.length + 1) { IntArray(s2.length + 1) }\n\n        for (i in 0..s1.length) {\n            for (j in 0..s2.length) {\n                if (i == 0) {\n                    dp[i][j] = j\n                } else if (j == 0) {\n                    dp[i][j] = i\n                } else {\n                    dp[i][j] = min(\n                        dp[i - 1][j - 1] + (if (s1[i - 1] == s2[j - 1]) 0 else 1),\n                        min(dp[i - 1][j], dp[i][j - 1]) + 1\n                    )\n                }\n            }\n        }\n        return dp[s1.length][s2.length]\n    }\n}\n"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/text/UrlPatternChecker.kt",
    "content": "package net.pantasystem.milktea.common.text\n\nobject UrlPatternChecker {\n    private val urlPattern = Regex(\"\"\"(https?)(://)([-_.!~*'()\\[\\]a-zA-Z0-9;/?:@&=+${'$'},%#]+)\"\"\")\n    fun isMatch(text: String): Boolean {\n        return urlPattern.matches(text)\n    }\n\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ui/ApplyTheme.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\nimport android.content.Context\nimport android.view.Menu\n\ninterface ApplyTheme {\n    operator fun invoke()\n}\ninterface ApplyMenuTint{\n    operator fun invoke(context: Context, menu: Menu)\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ui/AvatarIconView.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport androidx.appcompat.widget.AppCompatImageView\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common.R\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common.glide.blurhash.BlurHashSource\n\nclass AvatarIconView : AppCompatImageView {\n\n    companion object {\n        const val SHAPE_CIRCLE = 0\n        const val SHAPE_ROUNDED_CORNER = 1\n\n        @BindingAdapter(\"imageUrl\", \"blurhash\")\n        @JvmStatic\n        fun setImageUrl(iconView: AvatarIconView, url: String?, blurhash: String?) {\n            GlideApp.with(iconView.context)\n                .load(url)\n                .thumbnail(\n                    GlideApp.with(iconView.context)\n                        .load(blurhash?.let {\n                            BlurHashSource(it)\n                        })\n                )\n                .error(R.drawable.ic_cloud_off_black_24dp)\n                .into(iconView)\n        }\n\n        @BindingAdapter(\"shape\")\n        @JvmStatic\n        fun AvatarIconView.setShape(shape: Int) {\n            setIconShape(shape)\n        }\n    }\n\n    constructor(context: Context) : super(context) {\n        initialize(context, null)\n    }\n\n    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {\n        initialize(context, attrs)\n    }\n\n    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {\n        initialize(context, attrs)\n    }\n\n    private fun initialize(context: Context, attrs: AttributeSet?) {\n        context.theme.obtainStyledAttributes(attrs, R.styleable.AvatarIconView, 0, 0).apply {\n            try {\n                setIconShape(getInteger(R.styleable.AvatarIconView_iconShape, 0))\n            } finally {\n                recycle()\n            }\n        }\n    }\n\n\n    fun setIconShape(shape: Int) {\n        when(shape) {\n            SHAPE_CIRCLE -> {\n                if (outlineProvider !is CircleOutlineProvider) {\n                    outlineProvider = CircleOutlineProvider\n                    clipToOutline = true\n                }\n            }\n            SHAPE_ROUNDED_CORNER -> {\n                if (outlineProvider !is RoundedCornerShapeProvider) {\n                    outlineProvider = RoundedCornerShapeProvider\n                    clipToOutline = true\n                }\n            }\n        }\n    }\n\n    fun setImageUrl(url: String?) {\n        GlideApp.with(this.context)\n            .load(url)\n            .error(R.drawable.ic_cloud_off_black_24dp)\n            .into(this)\n    }\n\n\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ui/CircleImageIconHelper.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\nimport android.graphics.Outline\nimport android.util.TypedValue\nimport android.view.View\nimport android.view.ViewOutlineProvider\nimport android.widget.ImageView\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\nimport net.pantasystem.milktea.common.R\n\nobject CircleImageIconHelper {\n\n    @BindingAdapter(\"circleIcon\")\n    @JvmStatic\n    fun ImageView.setCircleIcon(url: String?){\n\n        Glide.with(this.context)\n            .load(url)\n            .error(R.drawable.ic_cloud_off_black_24dp)\n            .into(this)\n\n        if (outlineProvider !is CircleOutlineProvider) {\n            outlineProvider = CircleOutlineProvider\n            clipToOutline = true\n        }\n    }\n}\n\n\nobject CircleOutlineProvider : ViewOutlineProvider() {\n\n    override fun getOutline(view: View?, outline: Outline?) {\n        view ?: return\n        outline ?: return\n        outline.setOval(0, 0, view.width, view.height)\n    }\n}\n\nobject RoundedCornerShapeProvider : ViewOutlineProvider() {\n    override fun getOutline(view: View?, outline: Outline?) {\n        view ?: return\n        outline ?: return\n        val left = 0\n        val top = 0\n        val right = view.width\n        val bottom = view.height\n        val cornerRadiusDP = 8f\n        val cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, cornerRadiusDP, view.context.resources.displayMetrics).toInt()\n\n        // all corners\n        outline.setRoundRect(left, top, right, bottom, cornerRadius.toFloat())\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ui/LazyColumnScrollStateHelper.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.lazy.LazyListState\nimport androidx.compose.foundation.lazy.grid.LazyGridState\nimport androidx.compose.foundation.lazy.staggeredgrid.LazyStaggeredGridState\n\nfun LazyListState.isScrolledToTheEnd() = layoutInfo.visibleItemsInfo.lastOrNull()?.index == layoutInfo.totalItemsCount - 1\n\nfun LazyGridState.isScrolledToTheEnd() = layoutInfo.visibleItemsInfo.lastOrNull()?.index == layoutInfo.totalItemsCount - 1\n\n@OptIn(ExperimentalFoundationApi::class)\nfun LazyStaggeredGridState.isScrollToTheEnd() = layoutInfo.visibleItemsInfo.lastOrNull()?.index == layoutInfo.totalItemsCount - 1"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ui/PageableView.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\ninterface PageableView"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ui/SimpleElapsedTime.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\n\nsealed interface TimeUnit {\n    data class Year(val value: Long) : TimeUnit\n    data class Month(val value: Long) : TimeUnit\n    data class Day(val value: Long) : TimeUnit\n    data class Hour(val value: Long) : TimeUnit\n    data class Minute(val value: Long) : TimeUnit\n    data class Second(val value: Long) : TimeUnit\n    data object Now : TimeUnit\n    data object Future : TimeUnit\n}\n\nobject SimpleElapsedTime {\n\n    operator fun invoke(date: Instant, now: Instant? = null): TimeUnit {\n        val epoch = date.toEpochMilliseconds()\n        val nowEpoch = (now ?: Clock.System.now()).toEpochMilliseconds()\n\n        return when (val elapsedMilliTime = nowEpoch - epoch) {\n            in Long.MIN_VALUE until 0 -> {\n                // 0秒未満\n                TimeUnit.Future\n            }\n            in 0 until 10 * 1000 -> {\n                // 0秒以上 10秒未満\n                TimeUnit.Now\n            }\n            in 10 * 1000 until 6 * 10 * 1000 -> {\n                // 10秒以上 1分未満\n                TimeUnit.Second(elapsedMilliTime / 1000)\n            }\n            in 6 * 10 * 1000 until 60 * (6 * 10 * 1000) -> {\n                // 1分以上 60分未満\n                TimeUnit.Minute(elapsedMilliTime / (6 * 10 * 1000))\n            }\n            in 1 * (60 * (6 * 10 * 1000)) until 24 * (60 * (6 * 10 * 1000)) -> {\n                // 1時間以上 24時間未満\n                TimeUnit.Hour(elapsedMilliTime / (1 * (60 * (6 * 10 * 1000))))\n\n            }\n            in 1 * (24 * (60 * (6 * 10 * 1000))) until 30 * (24 * (60 * (6 * 10 * 1000L))) -> {\n                // 1日以上 30日未満\n                TimeUnit.Day(elapsedMilliTime / (1 * (24 * (60 * (6 * 10 * 1000)))))\n\n            }\n            in 30 * (24 * (60 * (6 * 10 * 1000L))) until 365 * (24 * (60 * (6 * 10 * 1000L))) -> {\n                // 30日以上 365未満\n                TimeUnit.Month(elapsedMilliTime / (30 * (24 * (60 * (6 * 10 * 1000L)))))\n            }\n            else -> {\n                // 365日以上\n                TimeUnit.Year(elapsedMilliTime / (365 * (24 * (60 * (6 * 10 * 1000L)))))\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common/src/main/java/net/pantasystem/milktea/common/ui/ToolbarSetter.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\nimport androidx.appcompat.widget.Toolbar\n\ninterface ToolbarSetter {\n    fun setToolbar(toolbar: Toolbar, visibleTitle: Boolean = true)\n    fun setTitle(resId: Int)\n}\n"
  },
  {
    "path": "modules/common/src/main/res/drawable/ic_cloud_off_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4c-1.48,0 -2.85,0.43 -4.01,1.17l1.46,1.46C10.21,6.23 11.08,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3 0,1.13 -0.64,2.11 -1.56,2.62l1.45,1.45C23.16,18.16 24,16.68 24,15c0,-2.64 -2.05,-4.78 -4.65,-4.96zM3,5.27l2.75,2.74C2.56,8.15 0,10.77 0,14c0,3.31 2.69,6 6,6h11.73l2,2L21,20.73 4.27,4 3,5.27zM7.73,10l8,8H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h1.73z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common/src/main/res/drawable/ic_content_copy_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"AvatarIconView\">\n        <attr name=\"iconShape\" format=\"enum\">\n            <enum name=\"circle\" value=\"0\" />\n            <enum name=\"square\" value=\"1\" />\n        </attr>\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "modules/common/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"sensitive\">Sensitive</string>\n\n    <string name=\"future\">Future</string>\n    <string name=\"now\">Now</string>\n    <string name=\"year_ago\">YR</string>\n    <string name=\"month_ago\">MOS</string>\n    <string name=\"date_ago\">D</string>\n    <string name=\"hour_ago\">HR</string>\n    <string name=\"minute_ago\">MIN</string>\n    <string name=\"second_ago\">S</string>\n</resources>"
  },
  {
    "path": "modules/common/src/main/res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"sensitive\">センシティブ</string>\n\n    <string name=\"future\">未来</string>\n    <string name=\"now\">今</string>\n    <string name=\"year_ago\">年前</string>\n    <string name=\"month_ago\">ヶ月前</string>\n    <string name=\"date_ago\">日前</string>\n    <string name=\"hour_ago\">時間前</string>\n    <string name=\"minute_ago\">分前</string>\n    <string name=\"second_ago\">秒前</string>\n</resources>"
  },
  {
    "path": "modules/common/src/main/res/values-zh/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"sensitive\">敏感内容</string>\n\n    <string name=\"future\">未来</string>\n    <string name=\"now\">现在</string>\n    <string name=\"year_ago\">年</string>\n    <string name=\"month_ago\">月</string>\n    <string name=\"date_ago\">日</string>\n    <string name=\"hour_ago\">时</string>\n    <string name=\"minute_ago\">分</string>\n    <string name=\"second_ago\">秒</string>\n</resources>"
  },
  {
    "path": "modules/common/src/test/java/net/pantasystem/milktea/common/ByteSizeHelperKtTest.kt",
    "content": "package net.pantasystem.milktea.common\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass ByteSizeHelperKtTest {\n\n    @Test\n    fun convertToHumanReadable_Give_1024() {\n        Assertions.assertEquals(\"1KB\", 1024L.convertToHumanReadable())\n    }\n\n    @Test\n    fun convertToHumanReadable_Give_2049() {\n        Assertions.assertEquals(\"2KB\", 2049L.convertToHumanReadable())\n    }\n\n    @Test\n    fun convertToHumanReadable_Give_4096() {\n        Assertions.assertEquals(\"4KB\", 4096L.convertToHumanReadable())\n    }\n\n    @Test\n    fun convertToHumanReadable_Give_1048576_Returns_1MB() {\n        Assertions.assertEquals(\"1MB\", 1048576L.convertToHumanReadable())\n    }\n\n    @Test\n    fun convertToHumanReadable_Give_1073741824_Returns_1GB() {\n        Assertions.assertEquals(\"1GB\", 1073741824L.convertToHumanReadable())\n    }\n\n\n    @Test\n    fun convertToHumanReadable_Give_1099511627776_Returns_1TB() {\n        Assertions.assertEquals(\"1TB\", 1099511627776L.convertToHumanReadable())\n    }\n\n    @Test\n    fun convertToHumanReadable_Give_1125899906842624_Returns_1PB() {\n        Assertions.assertEquals(\"1PB\", 1125899906842624L.convertToHumanReadable())\n    }\n\n}"
  },
  {
    "path": "modules/common/src/test/java/net/pantasystem/milktea/common/coroutines/PessimisticCollectiveMutexTest.kt",
    "content": "package net.pantasystem.milktea.common.coroutines\n\nimport kotlinx.coroutines.test.runTest\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass PessimisticCollectiveMutexTest {\n    @Test\n    fun withLock() = runTest {\n        val inserter = PessimisticCollectiveMutex<String>()\n        inserter.withLock(\"host\") {\n            Assertions.assertNotNull(inserter.locks[\"host\"])\n            Assertions.assertEquals(inserter.locks[\"host\"]?.isLocked, true)\n        }\n        Assertions.assertNotNull(inserter.locks[\"host\"])\n        Assertions.assertEquals(inserter.locks[\"host\"]?.isLocked, false)\n    }\n}"
  },
  {
    "path": "modules/common/src/test/java/net/pantasystem/milktea/common/paginator/FuturePagingControllerTest.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\n\nclass FuturePagingControllerTest {\n\n    @Test\n    fun loadFuture_whenThrowsError() {\n        val stateEvents = mutableListOf<PageableState<List<Int>>>()\n        val store = object : PaginationState<Int>, IdGetter<String>, FutureLoader<String> {\n            private val localState =\n                MutableStateFlow<PageableState<List<Int>>>(PageableState.Loading.Init())\n            override val state: Flow<PageableState<List<Int>>>\n                get() = localState\n\n            override fun getState(): PageableState<List<Int>> {\n                return localState.value\n            }\n\n            override fun setState(state: PageableState<List<Int>>) {\n                stateEvents.add(state)\n                localState.value = state\n            }\n\n            override suspend fun getSinceId(): String? {\n                return (localState.value.content as? StateContent.Exist)?.rawContent?.firstOrNull()\n                    ?.toString()\n            }\n\n            override suspend fun getUntilId(): String? {\n                return null\n            }\n\n            override suspend fun loadFuture(): Result<List<String>> {\n                throw Exception()\n            }\n        }\n        val futurePagingController = FuturePagingController<String, Int>(\n            entityConverter = object : EntityConverter<String, Int> {\n                override suspend fun convertAll(list: List<String>): List<Int> {\n                    return list.map { it.toInt() }\n                }\n            },\n            locker = object : StateLocker {\n                override val mutex: Mutex = Mutex()\n            },\n            futureLoader = store,\n            state = store\n        )\n\n        runBlocking {\n            futurePagingController.loadFuture()\n        }\n        assertEquals(PageableState.Error::class.java,stateEvents[1].javaClass)\n\n    }\n\n    @Test\n    fun loadFuture() {\n        val stateEvents = mutableListOf<PageableState<List<Int>>>()\n        val store = object : PaginationState<Int>, IdGetter<String>, FutureLoader<String> {\n            private val localState =\n                MutableStateFlow<PageableState<List<Int>>>(PageableState.Loading.Init())\n            override val state: Flow<PageableState<List<Int>>>\n                get() = localState\n\n            override fun getState(): PageableState<List<Int>> {\n                return localState.value\n            }\n\n            override fun setState(state: PageableState<List<Int>>) {\n                stateEvents.add(state)\n                localState.value = state\n            }\n\n            override suspend fun getSinceId(): String? {\n                return (localState.value.content as? StateContent.Exist)?.rawContent?.firstOrNull()\n                    ?.toString()\n            }\n\n            override suspend fun getUntilId(): String? {\n                return null\n            }\n\n            override suspend fun loadFuture(): Result<List<String>> {\n                val nextId = (getSinceId()?.toInt() ?: 61) - 1\n                return runCancellableCatching {\n                    (0.coerceAtLeast(nextId - 20) .. nextId).toList().asReversed().map {\n                        it.toString()\n                    }\n                }\n            }\n        }\n        val futurePagingController = FuturePagingController<String, Int>(\n            entityConverter = object : EntityConverter<String, Int> {\n                override suspend fun convertAll(list: List<String>): List<Int> {\n                    return list.map { it.toInt() }\n                }\n            },\n            locker = object : StateLocker {\n                override val mutex: Mutex = Mutex()\n            },\n            futureLoader = store,\n            state = store,\n            dispatcher = Dispatchers.Default\n        )\n\n        runBlocking {\n            futurePagingController.loadFuture()\n            futurePagingController.loadFuture()\n            futurePagingController.loadFuture()\n        }\n\n        assertEquals(6, stateEvents.size)\n        assertEquals((0..60).toList(), (store.getState().content as StateContent.Exist).rawContent)\n    }\n}"
  },
  {
    "path": "modules/common/src/test/java/net/pantasystem/milktea/common/paginator/PreviousPagingControllerTest.kt",
    "content": "package net.pantasystem.milktea.common.paginator\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\n\nclass PreviousPagingControllerTest {\n\n    @Test\n    fun loadPrevious_throwsError() {\n        val stateEvents = mutableListOf<PageableState<List<Int>>>()\n        val store = object : PaginationState<Int>, IdGetter<String>, PreviousLoader<String> {\n            private val localState =\n                MutableStateFlow<PageableState<List<Int>>>(PageableState.Loading.Init())\n            override val state: Flow<PageableState<List<Int>>>\n                get() = localState\n\n            override fun getState(): PageableState<List<Int>> {\n                return localState.value\n            }\n\n            override fun setState(state: PageableState<List<Int>>) {\n                stateEvents.add(state)\n                localState.value = state\n            }\n\n            override suspend fun getSinceId(): String? {\n                return null\n            }\n\n            override suspend fun getUntilId(): String? {\n                return (localState.value.content as? StateContent.Exist)?.rawContent?.lastOrNull()\n                    ?.toString()\n            }\n\n            override suspend fun loadPrevious(): Result<List<String>> {\n                throw Exception()\n            }\n        }\n        val previousPagingController = PreviousPagingController<String, Int>(\n            entityConverter = object : EntityConverter<String, Int> {\n                override suspend fun convertAll(list: List<String>): List<Int> {\n                    return list.map { it.toInt() }\n                }\n            },\n            locker = object : StateLocker {\n                override val mutex: Mutex = Mutex()\n            },\n            previousLoader = store,\n            state = store,\n            dispatcher = Dispatchers.Default\n        )\n\n        runBlocking {\n            previousPagingController.loadPrevious()\n        }\n        assertEquals(2, stateEvents.size)\n        assertEquals(PageableState.Loading.Previous::class.java,stateEvents[0].javaClass)\n        assertEquals(PageableState.Error::class.java,stateEvents[1].javaClass)\n    }\n\n    @Test\n    fun loadPrevious() {\n        val stateEvents = mutableListOf<PageableState<List<Int>>>()\n        val store = object : PaginationState<Int>, IdGetter<String>, PreviousLoader<String> {\n            private val localState =\n                MutableStateFlow<PageableState<List<Int>>>(PageableState.Loading.Init<List<Int>>())\n            override val state: Flow<PageableState<List<Int>>>\n                get() = localState\n\n            override fun getState(): PageableState<List<Int>> {\n                return localState.value\n            }\n\n            override fun setState(state: PageableState<List<Int>>) {\n                stateEvents.add(state)\n                localState.value = state\n            }\n\n            override suspend fun getSinceId(): String? {\n                return null\n            }\n\n            override suspend fun getUntilId(): String? {\n                return (localState.value.content as? StateContent.Exist)?.rawContent?.lastOrNull()\n                    ?.toString()\n            }\n\n            override suspend fun loadPrevious(): Result<List<String>> {\n                val next = (getUntilId()?.toInt()?: 0) + 1\n                return runCancellableCatching {\n                    (next until (next + 20)).map { it.toString() }\n                }\n            }\n        }\n        val previousPagingController = PreviousPagingController<String, Int>(\n            entityConverter = object : EntityConverter<String, Int> {\n                override suspend fun convertAll(list: List<String>): List<Int> {\n                    return list.map { it.toInt() }\n                }\n            },\n            locker = object : StateLocker {\n                override val mutex: Mutex = Mutex()\n            },\n            previousLoader = store,\n            state = store\n        )\n\n        runBlocking {\n            previousPagingController.loadPrevious()\n            previousPagingController.loadPrevious()\n            previousPagingController.loadPrevious()\n            assertEquals(60, (store.getState().content as StateContent.Exist).rawContent.size)\n        }\n        assertEquals(6, stateEvents.size)\n        assertEquals(PageableState.Loading.Previous::class.java,stateEvents[0].javaClass)\n\n        assertEquals(PageableState.Fixed::class.java,stateEvents[1].javaClass)\n\n        assertEquals(PageableState.Loading.Previous::class.java,stateEvents[2].javaClass)\n        assertEquals(PageableState.Fixed::class.java,stateEvents[3].javaClass)\n\n        assertEquals(PageableState.Loading.Previous::class.java,stateEvents[4].javaClass)\n        assertEquals(PageableState.Fixed::class.java,stateEvents[5].javaClass)\n\n        assertEquals((1..60).toList(), (store.getState().content as StateContent.Exist).rawContent)\n    }\n}"
  },
  {
    "path": "modules/common/src/test/java/net/pantasystem/milktea/common/ui/SimpleElapsedTimeTest.kt",
    "content": "package net.pantasystem.milktea.common.ui\n\nimport kotlinx.datetime.Clock\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\nimport kotlin.time.Duration.Companion.seconds\n\n\nclass SimpleElapsedTimeTest {\n\n    @Test\n    fun giveMinusSecondsAgoReturnsFuture() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus((-1).seconds), now)\n        Assertions.assertEquals(TimeUnit.Future, result)\n    }\n\n    @Test\n    fun give5SecondsAgoReturnsNow() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(5.seconds), now)\n        Assertions.assertEquals(TimeUnit.Now, result)\n    }\n\n    @Test\n    fun give9SecondsAgoReturnsNow() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(9.seconds), now)\n        Assertions.assertEquals(TimeUnit.Now, result)\n    }\n\n    @Test\n    fun give10SecondsAgoReturns10Seconds() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(10.seconds), now)\n        Assertions.assertEquals(TimeUnit.Second(10), result)\n    }\n\n    @Test\n    fun give59SecondsAgoReturns59Seconds() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(59.seconds), now)\n        Assertions.assertEquals(TimeUnit.Second(59), result)\n    }\n\n    @Test\n    fun give60SecondsAgoReturns1Minutes() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(60.seconds), now)\n        Assertions.assertEquals(TimeUnit.Minute(1), result)\n    }\n\n    @Test\n    fun give59MinutesAgoReturns59Minutes() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(59.minutes), now)\n        Assertions.assertEquals(TimeUnit.Minute(59), result)\n    }\n\n    @Test\n    fun give60MinutesAgoReturns1Hours() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(60.minutes), now)\n        Assertions.assertEquals(TimeUnit.Hour(1), result)\n    }\n\n    @Test\n    fun give23HoursAgoReturns23Hours() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(23.hours), now)\n        Assertions.assertEquals(TimeUnit.Hour(23), result)\n    }\n\n    @Test\n    fun give24HoursAgoReturns1Days() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(24.hours), now)\n        Assertions.assertEquals(TimeUnit.Day(1), result)\n    }\n\n    @Test\n    fun give29DaysReturns29Days() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(29.days), now)\n        Assertions.assertEquals(TimeUnit.Day(29), result)\n    }\n\n    @Test\n    fun give30DaysReturns1Month() {\n        val now = Clock.System.now()\n\n        val result = SimpleElapsedTime(now.minus(30.days), now)\n        Assertions.assertEquals(TimeUnit.Month(1), result)\n    }\n\n\n}"
  },
  {
    "path": "modules/common_android/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/common_android/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id('kotlin-kapt')\n    id('dagger.hilt.android.plugin')\n\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.common_android'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_resource')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    implementation project(path: ':modules:model')\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.flexbox\n\n    implementation libs.glide.glide\n    //glide\n    kapt libs.glide.compiler\n    implementation \"com.google.accompanist:accompanist-glide:0.14.0\"\n    implementation 'com.github.penfeizhou.android.animation:apng:2.24.0'\n    implementation 'com.caverock:androidsvg-aar:1.4'\n    implementation libs.kotlin.datetime\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n    implementation libs.mfm.kt\n}"
  },
  {
    "path": "modules/common_android/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/common_android/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/common_android/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.VIBRATE\" />\n</manifest>"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/debug/DebugFeatureFlags.kt",
    "content": "package net.pantasystem.milktea.common_android.debug\n\nimport android.content.Context\n\n/**\n * 開発時専用のフィーチャーフラグ管理。\n * SharedPreferences に保存し、アプリ再起動なしで切り替え可能。\n *\n * **呼び出し側を BuildConfig.DEBUG で囲って本番ビルドへの影響をゼロにすること。**\n */\nobject DebugFeatureFlags {\n\n    private const val PREFS_NAME = \"debug_feature_flags\"\n    private const val KEY_USE_COMPOSE_TIMELINE = \"use_compose_timeline\"\n\n    /**\n     * Compose 製タイムラインを使用するかどうか。\n     * true : ComposeView + LazyColumn + NoteCard\n     * false: 既存 RecyclerView + TimelineListAdapter（デフォルト）\n     */\n    fun isComposeTimelineEnabled(context: Context): Boolean =\n        context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)\n            .getBoolean(KEY_USE_COMPOSE_TIMELINE, false)\n\n    fun setComposeTimelineEnabled(context: Context, enabled: Boolean) {\n        context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)\n            .edit()\n            .putBoolean(KEY_USE_COMPOSE_TIMELINE, enabled)\n            .apply()\n    }\n}\n"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/emoji/V13EmojiUrlResolver.kt",
    "content": "package net.pantasystem.milktea.common_android.emoji\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.reaction.Reaction\n\n/**\n * V13でEmojiのURLの取得方法が変更されたので、特定のソースからURLを解決するためのクラス\n */\nobject V13EmojiUrlResolver {\n\n    /**\n     * MFMParserからの使用を想定\n     */\n    fun resolve(\n        accountHost: String?,\n        tagName: String,\n        emojiHost: String?,\n    ): String {\n        if (emojiHost == null || emojiHost == accountHost) {\n            return \"https://$accountHost/emoji/${tagName}.webp\"\n        }\n        return \"https://$accountHost/emoji/${tagName}@${emojiHost}.webp\"\n    }\n\n    /**\n     * localで使用されているEmojiのURLの解決を想定している\n     */\n    fun resolve(\n        emoji: CustomEmoji,\n        instanceDomain: String\n    ): String {\n        return \"$instanceDomain/emoji/${emoji.name}.webp\"\n    }\n\n    /**\n     * リアクションのEmojiのURLを解決することを想定している\n     */\n    fun resolve(\n        reaction: Reaction,\n        account: Account\n    ): String {\n        return \"https://${account.getHost()}/emoji/${reaction.reaction.replace(\":\", \"\")}.webp\"\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/hilt/HiltCoroutineDispatcherAnnotation.kt",
    "content": "package net.pantasystem.milktea.common_android.hilt\n\nimport javax.inject.Qualifier\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class IODispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class MainDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class DefaultDispatcher\n\n@Qualifier\n@Retention(AnnotationRetention.BINARY)\nannotation class UnconfinedDispatcher"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/hilt/di/module/CoroutineDispatcherModule.kt",
    "content": "package net.pantasystem.milktea.common_android.hilt.di.module\n\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport net.pantasystem.milktea.common_android.hilt.DefaultDispatcher\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.common_android.hilt.MainDispatcher\nimport net.pantasystem.milktea.common_android.hilt.UnconfinedDispatcher\n\n@InstallIn(SingletonComponent::class)\n@Module\nobject CoroutineDispatcherModule {\n    @DefaultDispatcher\n    @Provides\n    fun provideDefaultDispatcher(): CoroutineDispatcher {\n        return Dispatchers.Default\n    }\n\n    @IODispatcher\n    @Provides\n    fun provideIODispatcher(): CoroutineDispatcher {\n        return Dispatchers.IO\n    }\n\n    @MainDispatcher\n    @Provides\n    fun provideMainDispatcher(): CoroutineDispatcher {\n        Dispatchers.Unconfined\n        return Dispatchers.Main\n    }\n\n    @UnconfinedDispatcher\n    @Provides\n    fun provideUnconfinedDispatcher(): CoroutineDispatcher {\n        return Dispatchers.Unconfined\n    }\n\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/html/MastodonHTML.kt",
    "content": "package net.pantasystem.milktea.common_android.html\n\nimport android.text.Spanned\nimport androidx.core.text.parseAsHtml\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParsedResult\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParser\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\n\ndata class MastodonHTML(\n    val spanned: Spanned,\n    val parserResult: CustomEmojiParsedResult,\n    val accountHost: String?,\n)\n\nobject MastodonHTMLParser {\n    fun parse(\n        text: String,\n        emojis: List<CustomEmoji>? = emptyList(),\n        userHost: String? = null,\n        accountHost: String? = null\n    ): MastodonHTML {\n        val spanned = text.replace(\"<br> \", \"<br>&nbsp;\")\n            .replace(\"<br /> \", \"<br />&nbsp;\")\n            .replace(\"<br/> \", \"<br/>&nbsp;\")\n            .replace(\"  \", \"&nbsp;&nbsp;\").parseAsHtml().trim() as Spanned\n        val result = CustomEmojiParser.parse(\n            sourceHost = userHost,\n            text = spanned.toString(),\n            emojis = emojis\n        )\n        return MastodonHTML(\n            spanned = spanned,\n            result,\n            accountHost = accountHost,\n        )\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/mfm/MFMParser.kt",
    "content": "package net.pantasystem.milktea.common_android.mfm\n\nimport dev.misskey.mfm.Mfm\nimport dev.misskey.mfm.node.MfmNode\nimport java.util.regex.Pattern\n\nobject MFMParser {\n\n    private val idPattern = Pattern.compile(\"\"\"^([a-zA-Z0-9]+)$\"\"\")\n\n    fun parse(text: String?): List<MfmNode>? {\n        text ?: return null\n        return Mfm.parse(text)\n    }\n\n    fun convertAppNoteUriIfGiveNoteUrl(accountHost: String?, url: String): String? {\n        accountHost ?: return null\n        val startsPattern = \"https://$accountHost/notes/\"\n        if (url.startsWith(startsPattern)) {\n            val id = url.substring(startsPattern.length)\n            val matcher = idPattern.matcher(id)\n            if (matcher.find()) {\n                return \"milktea://$accountHost/notes/${matcher.group()}\"\n            }\n        }\n        return null\n    }\n\n    fun convertAppChannelUriIfGiveChannelUrl(accountHost: String?, url: String): String? {\n        accountHost ?: return null\n        val startsPattern = \"https://$accountHost/channels/\"\n        if (url.startsWith(startsPattern)) {\n            val id = url.substring(startsPattern.length)\n            val matcher = idPattern.matcher(id)\n            if (matcher.find()) {\n                return \"milktea://channels/${matcher.group()}\"\n            }\n        }\n        return null\n    }\n}\n"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/notification/NotificationUtil.kt",
    "content": "package net.pantasystem.milktea.common_android.notification\n\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.content.Context\nimport android.os.Build\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass NotificationUtil @Inject constructor(\n    @ApplicationContext val context: Context\n){\n    fun makeNotificationManager(\n        id: String,\n        name: String,\n        description: String\n    ): NotificationManager {\n        val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            if (notificationManager.getNotificationChannel(id) == null) {\n                val channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH)\n                channel.description = description\n                notificationManager.createNotificationChannel(channel)\n            }\n        }\n        return notificationManager\n\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/nyaize/Nyaize.kt",
    "content": "package net.pantasystem.milktea.common_android.nyaize\n\nfun nyaize(text: String): String {\n    // 日本語の変換\n    var result = text.replace(\"な\", \"にゃ\").replace(\"ナ\", \"ニャ\").replace(\"ﾅ\", \"ﾆｬ\")\n\n    // 英語の変換\n    result = result.replace(Regex(\"(?<=n)a\", RegexOption.IGNORE_CASE)) {\n        if (it.value == \"A\") \"YA\" else \"ya\"\n    }\n    result = result.replace(Regex(\"(?<=morn)ing\", RegexOption.IGNORE_CASE)) {\n        if (it.value == \"ING\") \"YAN\" else \"yan\"\n    }\n    result = result.replace(Regex(\"(?<=every)one\", RegexOption.IGNORE_CASE)) {\n        if (it.value == \"ONE\") \"NYAN\" else \"nyan\"\n    }\n\n    // 韓国語の変換\n    result = result.replace(Regex(\"[나-낳]\")) {\n        val offset = '냐'.code - '나'.code\n        it.value[0].plus(offset).toChar().toString()\n    }\n    result = result.replace(Regex(\"(다$)|(다(?=[.]))|(다(?= ))|(다(?=!))|(다(?=\\\\?))\", RegexOption.MULTILINE)) {\n        \"다냥\"\n    }\n    result = result.replace(Regex(\"(야(?=\\\\?))|(야$)|(야(?= ))\", RegexOption.MULTILINE)) {\n        \"냥\"\n    }\n\n    return result\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/platform/FlowBroadcastReceiver.kt",
    "content": "package net.pantasystem.milktea.common_android.platform\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.channelFlow\n\n\n@ExperimentalCoroutinesApi\nfun Context.receive(filter: IntentFilter): Flow<Intent?> {\n    return channelFlow {\n        val receiver = object : BroadcastReceiver() {\n            override fun onReceive(context: Context?, intent: Intent?) {\n                this@channelFlow.trySend(intent).isSuccess\n            }\n        }\n\n        registerReceiver(receiver, filter)\n        awaitClose {\n            unregisterReceiver(receiver)\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/platform/NetworkEventFlow.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage net.pantasystem.milktea.common_android.platform\n\nimport android.content.Context\nimport android.content.IntentFilter\nimport android.net.ConnectivityManager\nimport android.net.Network\nimport android.net.NetworkInfo\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.channelFlow\nimport kotlinx.coroutines.flow.map\n\n@RequiresApi(Build.VERSION_CODES.N)\n@ExperimentalCoroutinesApi\nfun ConnectivityManager.activeNetworkFlow(): Flow<Boolean> {\n\n    return channelFlow {\n\n        val callback = object : ConnectivityManager.NetworkCallback() {\n            override fun onAvailable(network: Network) {\n                super.onAvailable(network)\n                trySend(true)\n            }\n\n            override fun onLost(network: Network) {\n                super.onLost(network)\n                trySend(false)\n            }\n\n\n        }\n        registerDefaultNetworkCallback(callback)\n\n        awaitClose {\n            unregisterNetworkCallback(callback)\n        }\n    }\n}\n\n@ExperimentalCoroutinesApi\nfun Context.receiveNetworkEvent() : Flow<NetworkInfo?>{\n    val conn = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager\n    return receive(IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)).map {\n        conn.activeNetworkInfo\n    }\n}\n\n@ExperimentalCoroutinesApi\nfun Context.activeNetworkFlow(): Flow<Boolean> {\n    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {\n        val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager\n        connectivityManager.activeNetworkFlow()\n    }else{\n        receiveNetworkEvent().map {\n            it?.isConnected == true\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/platform/NetworkStatusUtil.kt",
    "content": "package net.pantasystem.milktea.common_android.platform\n\nimport android.content.Context\nimport android.net.ConnectivityManager\nimport android.net.NetworkCapabilities\nimport android.os.Build\n\n@Suppress(\"DEPRECATION\")\nfun Context.isWifiConnected(): Boolean {\n    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager\n\n    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n        val network = connectivityManager.activeNetwork\n        val capabilities = connectivityManager.getNetworkCapabilities(network)\n        capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)\n    } else {\n        val networkInfo = connectivityManager.activeNetworkInfo\n        networkInfo != null && networkInfo.isConnected && networkInfo.type == ConnectivityManager.TYPE_WIFI\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/platform/PermissionUtil.kt",
    "content": "package net.pantasystem.milktea.common_android.platform\n\nimport android.Manifest\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport androidx.core.content.ContextCompat\n\n\nobject PermissionUtil {\n\n    @RequiresApi(33)\n    fun getReadMediaPermissions(): List<String> {\n        return listOf(\n            Manifest.permission.READ_MEDIA_AUDIO,\n            Manifest.permission.READ_MEDIA_IMAGES,\n            Manifest.permission.READ_MEDIA_VIDEO\n        )\n    }\n\n    fun checkReadStoragePermission(context: Context): Boolean {\n        val permissions = if (Build.VERSION.SDK_INT >= 33) {\n            getReadMediaPermissions().all {\n                ContextCompat.checkSelfPermission(\n                    context,\n                    it\n                ) == PackageManager.PERMISSION_GRANTED\n            }\n        } else {\n            val permissionCheck =\n                ContextCompat.checkSelfPermission(\n                    context,\n                    Manifest.permission.READ_EXTERNAL_STORAGE\n                )\n            permissionCheck == PackageManager.PERMISSION_GRANTED\n        }\n        return permissions\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/resource/DpHelper.kt",
    "content": "package net.pantasystem.milktea.common_android.resource\n\nimport android.content.Context\nimport android.util.DisplayMetrics\n\nfun Context.convertDp2Px(dp: Float): Float {\n    val metrics: DisplayMetrics = resources.displayMetrics\n    return dp * metrics.density\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/resource/StringResource.kt",
    "content": "package net.pantasystem.milktea.common_android.resource\n\nimport android.content.Context\nimport androidx.annotation.StringRes\n\nsealed interface StringSource {\n    fun build(getStringResource: GetStringResource): String\n\n    private data class Raw(private val text: String) : StringSource {\n\n        override fun build(getStringResource: GetStringResource): String = text\n    }\n\n    private data class Resource(@StringRes private val textRes: Int) : StringSource {\n\n        override fun build(getStringResource: GetStringResource): String = getStringResource(textRes)\n    }\n\n    private class FormatResource(@StringRes private val textRes: Int, private vararg val formatArgs: Any) : StringSource {\n        override fun build(getStringResource: GetStringResource): String {\n            val formatArgs = formatArgs.map { if (it is StringSource) it.build(getStringResource) else it }.toTypedArray()\n            return getStringResource(textRes, *formatArgs)\n        }\n\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (javaClass != other?.javaClass) return false\n\n            other as FormatResource\n\n            if (textRes != other.textRes) return false\n            if (!formatArgs.contentEquals(other.formatArgs)) return false\n\n            return true\n        }\n\n        override fun hashCode(): Int {\n            var result = textRes\n            result = 31 * result + formatArgs.contentHashCode()\n            return result\n        }\n    }\n\n    private data class StringSourceList(private val list: List<StringSource>) : StringSource {\n        override fun build(getStringResource: GetStringResource): String {\n            return list.joinToString(separator = \"\") { it.build(getStringResource) }\n        }\n    }\n\n    operator fun plus(other: StringSource): StringSource = StringSourceList(listOf(this, other))\n\n    companion object {\n        operator fun invoke(text: String): StringSource = Raw(text)\n\n        operator fun invoke(@StringRes textRes: Int): StringSource = Resource(textRes)\n\n        operator fun invoke(@StringRes textRes: Int, vararg formatArgs: Any): StringSource = FormatResource(textRes, *formatArgs)\n    }\n}\n\ninterface GetStringResource {\n    operator fun invoke(@StringRes textRes: Int): String\n\n    operator fun invoke(@StringRes textRes: Int, vararg formatArgs: Any): String\n\n}\n\nfun StringSource.getString(context: Context): String {\n    return build(object : GetStringResource {\n        override fun invoke(textRes: Int): String = context.getString(textRes)\n\n        override fun invoke(textRes: Int, vararg formatArgs: Any): String = context.getString(textRes, *formatArgs)\n    })\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/ActivityUtils.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.content.Intent\n\n\n\nconst val EXTRA_PARENT = \"jp.panta.misskeyandroidclient.EXTRA_PARENT\"\n\nenum class Activities{\n    ACTIVITY_OUT_APP,\n    ACTIVITY_IN_APP,\n}\n\nfun Intent.putActivity(activities: Activities){\n    this.putExtra(EXTRA_PARENT, activities.ordinal)\n}\n\nfun Intent.getParentActivity(): Activities{\n    return Activities.values()[getIntExtra(EXTRA_PARENT, Activities.ACTIVITY_OUT_APP.ordinal)]\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/AutoCollapsingLayout.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.animation.Animator\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.Gravity\nimport android.view.View\nimport android.widget.FrameLayout\nimport androidx.annotation.AttrRes\nimport androidx.annotation.StyleRes\nimport androidx.core.view.children\nimport androidx.databinding.BindingAdapter\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_android.R\nimport net.pantasystem.milktea.model.setting.NoteExpandedHeightSize\nimport javax.inject.Inject\n\n/**\n * ノートのコンテンツのサイズが言って以上超えた時に\n * 折りたたむためのコンポーネント\n */\n@AndroidEntryPoint\nclass AutoCollapsingLayout : FrameLayout {\n\n\n    private var limitedMaxHeight = 300\n//    private var expandedChangedListener: MutableList<(Boolean) -> Unit> = mutableListOf()\n\n    var isExpanded = false\n\n    private var expandableButtonId: Int? = null\n    private var currentAnimator: Animator? = null\n\n    private var isNeedExpandedButtonVisible: Boolean = false\n\n    @Inject\n    internal lateinit var noteExpandedHeightSize: NoteExpandedHeightSize\n\n    init {\n        limitedMaxHeight = noteExpandedHeightSize.getNoteExpandedHeightSize()\n    }\n\n\n    constructor(context: Context) : super(context)\n    constructor(context: Context, attrs: AttributeSet?)\n            : this(context, attrs, 0)\n\n    constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int)\n            : this(context, attrs, defStyleAttr, 0)\n\n    constructor(\n        context: Context,\n        attrs: AttributeSet?,\n        @AttrRes defStyleAttr: Int,\n        @StyleRes defStyleRes: Int\n    ) : super(context, attrs, defStyleAttr, defStyleRes) {\n        val a = context.obtainStyledAttributes(\n            attrs, R.styleable.AutoCollapsingLayout, defStyleAttr, defStyleRes\n        )\n        a.apply {\n            val buttonId = getResourceId(R.styleable.AutoCollapsingLayout_expandableButton, -1)\n            expandableButtonId = if (buttonId == -1) null else buttonId\n        }\n\n        a.recycle()\n    }\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n\n        val limitedMaxPxHeight = limitedMaxHeight * resources.displayMetrics.density\n        val isExactlyHeight = MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY\n\n        var (maxWidth, maxHeight, expandedButton) = getWidthAndHeightAndButton(\n            widthMeasureSpec,\n            heightMeasureSpec\n        )\n\n        if (!isExpanded && maxHeight > limitedMaxPxHeight) {\n            maxHeight = limitedMaxPxHeight.toInt()\n            if (expandedButton != null) {\n                measureChildWithMargins(expandedButton, widthMeasureSpec, 0, heightMeasureSpec, 0)\n//                if (!expandedButton.isVisible) {\n//                    expandedButton.isVisible = true\n//                }\n            }\n            isNeedExpandedButtonVisible = true\n        } else {\n            isNeedExpandedButtonVisible = false\n//            if (expandedButton?.isVisible == true) {\n//                expandedButton.isVisible = false\n//            }\n        }\n\n        setMeasuredDimension(\n            resolveSizeAndState(maxWidth, widthMeasureSpec, 0),\n            resolveSizeAndState(\n                if (isExactlyHeight) MeasureSpec.getSize(heightMeasureSpec) else maxHeight + paddingTop + paddingBottom,\n                heightMeasureSpec,\n                0\n            )\n        )\n    }\n\n    override fun addChildrenForAccessibility(outChildren: ArrayList<View>?) {\n        super.addChildrenForAccessibility(outChildren)\n    }\n\n    fun findExpandButton(): View? {\n        return children.firstOrNull { it.id == expandableButtonId }\n    }\n\n    fun hideExpandButton() {\n        isExpanded = true\n        invalidate()\n    }\n\n    fun setExpandedAndInvalidate(value: Boolean) {\n        currentAnimator?.cancel()\n        this.isExpanded = value\n        isNeedExpandedButtonVisible = false\n\n        invalidate()\n        requestLayout()\n//        expandedChangedListener.forEach { it.invoke(isExpanded) }\n    }\n\n    fun getWidthAndHeightAndButton(\n        widthMeasureSpec: Int,\n        heightMeasureSpec: Int\n    ): Triple<Int, Int, View?> {\n        var maxHeight = 0\n        var maxWidth = 0\n\n        var button: View? = null\n\n        for (i in 0 until childCount) {\n            val child = getChildAt(i)\n            if (child.id == expandableButtonId) {\n                button = child\n            }\n            if (child.visibility != View.GONE && child.id != expandableButtonId) {\n                measureChildWithMargins(child, widthMeasureSpec, 0, heightMeasureSpec, 0)\n                maxHeight = maxHeight.coerceAtLeast(child.measuredHeight)\n                maxWidth = maxWidth.coerceAtLeast(child.measuredWidth)\n            }\n        }\n        return Triple(maxWidth, maxHeight, button)\n\n    }\n\n    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {\n        layoutChildren(left, top, right, bottom)\n    }\n\n\n    fun setCurrentAnimator(animator: Animator) {\n        currentAnimator?.cancel()\n        currentAnimator = animator\n    }\n\n\n    fun setHeightAndInvalidate(pixels: Int) {\n        layoutParams.height = pixels\n        invalidate()\n        requestLayout()\n    }\n\n\n\n    private fun layoutChildren(left: Int, top: Int, right: Int, bottom: Int) {\n        val count = childCount\n        val parentLeft = 0\n        val parentTop = 0\n        val parentRight = right - left\n        val parentBottom = bottom - top\n\n        for (i in 0 until count) {\n            val child = getChildAt(i)\n            if (child.visibility != View.GONE) {\n                val lp = child.layoutParams as LayoutParams\n                val width = child.measuredWidth\n                val height = child.measuredHeight\n                var childLeft: Int\n                var childTop: Int\n\n                var gravity = lp.gravity\n                if (gravity == -1) {\n                    gravity = DEFAULT_CHILD_GRAVITY\n                }\n                val layoutDirection = this.layoutDirection\n                val absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection)\n                val verticalGravity = gravity and Gravity.VERTICAL_GRAVITY_MASK\n\n                childLeft = when (absoluteGravity and Gravity.HORIZONTAL_GRAVITY_MASK) {\n                    Gravity.CENTER_HORIZONTAL -> parentLeft + (parentRight - parentLeft - width) / 2 +\n                            lp.leftMargin - lp.rightMargin\n\n                    Gravity.RIGHT -> parentRight - width - lp.rightMargin\n                    Gravity.LEFT -> parentLeft + lp.leftMargin\n                    else -> parentLeft + lp.leftMargin\n                }\n                childTop = when (verticalGravity) {\n                    Gravity.TOP -> parentTop + lp.topMargin\n                    Gravity.CENTER_VERTICAL -> parentTop + (parentBottom - parentTop - height) / 2 +\n                            lp.topMargin - lp.bottomMargin\n\n                    Gravity.BOTTOM -> parentBottom - height - lp.bottomMargin\n                    else -> parentTop + lp.topMargin\n                }\n\n                if (child.id == expandableButtonId) {\n                    if (isNeedExpandedButtonVisible) {\n                        child.layout(\n                            childLeft,\n                            childTop,\n                            childLeft + width,\n                            childTop + height\n                        )\n                        child.alpha = 1.0f\n                        child.refreshDrawableState()\n                    } else {\n                        child.layout(0, 0, 0, 0)\n                        child.alpha = 1.0f\n                    }\n\n                } else {\n                    child.layout(\n                        childLeft,\n                        childTop,\n                        childLeft + width,\n                        childTop + height\n                    )\n                }\n            }\n\n\n        }\n    }\n\n\n    companion object {\n        private const val DEFAULT_CHILD_GRAVITY = Gravity.TOP or Gravity.START\n\n\n        @JvmStatic\n        @BindingAdapter(\"overflowExpanded\")\n        fun bindExpanded(viewGroup: AutoCollapsingLayout, expanded: Boolean?) {\n            viewGroup.setExpandedAndInvalidate(expanded ?: false)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/BottomSheetViewPager.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport androidx.viewpager.widget.ViewPager\nimport java.lang.reflect.Field\n\n/**\n * BottomSheetDialogとViewPagerのスクロール問題を解決するためのViewPager\n * 参考\n * https://qiita.com/kafumi/items/9ca1dfefe2289d55c499\n * https://github.com/kafumi/android-bottomsheet-viewpager\n */\nclass BottomSheetViewPager(context: Context, attrs: AttributeSet?) : ViewPager(context, attrs) {\n    constructor(context: Context) : this(context, null)\n    private val positionField: Field =\n        LayoutParams::class.java.getDeclaredField(\"position\").also {\n            it.isAccessible = true\n        }\n\n    init {\n        addOnPageChangeListener(object : SimpleOnPageChangeListener() {\n            override fun onPageSelected(position: Int) {\n                requestLayout()\n            }\n        })\n    }\n\n    override fun getChildAt(index: Int): View {\n        val stackTrace = Throwable().stackTrace\n        val findScrollingChild = stackTrace.getOrNull(1)?.let {\n            it.className == \"com.google.android.material.bottomsheet.BottomSheetBehavior\" &&\n                    it.methodName == \"findScrollingChild\"\n        }\n        if (findScrollingChild != true) {\n            return super.getChildAt(index)\n        }\n\n        // Swap index 0 and `currentItem`\n        val currentView = getCurrentView() ?: return super.getChildAt(index)\n        return if (index == 0) {\n            currentView\n        } else {\n            var view = super.getChildAt(index)\n            if (view == currentView) {\n                view = super.getChildAt(0)\n            }\n            return view\n        }\n    }\n\n    private fun getCurrentView(): View? {\n        for (i in 0 until childCount) {\n            val child = super.getChildAt(i)\n            val lp = child.layoutParams as? LayoutParams\n            if (lp != null) {\n                val position = positionField.getInt(lp)\n                if (!lp.isDecor && currentItem == position) {\n                    return child\n                }\n            }\n        }\n        return null\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/CircleOutlineHelper.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.databinding.BindingAdapter\n\nobject CircleOutlineHelper {\n    @JvmStatic\n    @BindingAdapter(\"rect\")\n    fun ViewGroup.setCircleOutline(rect: Float?){\n\n        outlineProvider = RoundedOutlineProvider.getInstance(rect?: 20F)\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"reactByDp\")\n    fun ViewGroup.setCircleOutline(rect: Int?){\n        rect?: return\n        val r = context.resources.displayMetrics.density * rect\n\n        outlineProvider = RoundedOutlineProvider.getInstance(r)\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"rectByDp\")\n    fun View.setCircleOutlineToView(rect: Int?) {\n        rect?: return\n        val r = context.resources.displayMetrics.density * rect\n        outlineProvider = RoundedOutlineProvider.getInstance(r)\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"rectViewById\")\n    fun View.setCircleOutline(rect: Int?) {\n        rect?: return\n        val r = context.resources.displayMetrics.density * rect\n        outlineProvider = RoundedOutlineProvider.getInstance(r)\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/FontSizeUnitConverter.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.content.Context\nimport android.util.TypedValue\nimport android.widget.TextView\n\nobject FontSizeUnitConverter {\n    fun TextView.setMemoFontPxSize(fontSize: Float) {\n        if (this.textSize == fontSize) {\n            return\n        }\n        this.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)\n    }\n\n    fun TextView.setMemoFontSpSize(fontSize: Float) {\n        val baseHeightPx = TypedValue.applyDimension(\n            TypedValue.COMPLEX_UNIT_SP,\n            fontSize,\n            this.resources.displayMetrics\n        )\n        setMemoFontPxSize(baseHeightPx)\n    }\n\n    fun Context.specialPointToPixel(sp: Float): Float {\n        return TypedValue.applyDimension(\n            TypedValue.COMPLEX_UNIT_SP,\n            sp,\n            this.resources.displayMetrics\n        )\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/MediaLayout.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.annotation.AttrRes\nimport androidx.annotation.StyleRes\nimport androidx.core.view.children\nimport net.pantasystem.milktea.common_android.R\nimport kotlin.math.max\nimport kotlin.math.min\n\n/**\n * タイムラインの投稿のメディアを配置するためのレイアウト\n * 子要素は個数に応じて下記のように配置される。\n * またこのレイアウトの縦幅は親レイアウトから指定された制約を無視するため、注意して使用してください。\n *\n * 要素が1つの時\n * 1|1\n * 1|1\n *\n * 要素が2つの時\n * 1|2\n * 1|2\n *\n * 要素が3つの時\n * 1|2\n * 1|3\n *\n * 要素が4つの時\n * 1|2\n * 3|4\n *\n * 要素が5つの時\n * 1|2\n * 3|4\n * 3|5\n *\n * 要素が6つの時\n * 1|2\n * 3|4\n * 5|6\n *\n * 要素が7つの時\n * 1|2\n * 3|4\n * 5|6\n * 5|7\n *\n * 要素が8つの時\n * 1|2\n * 3|4\n * 5|6\n * 7|8\n *\n * 要素が9つの時\n * 1|2\n * 3|4\n * 5|6\n * 7|8\n * 7|9\n *\n */\nclass MediaLayout : ViewGroup {\n\n    private var spaceMargin = 8\n    private var _visibleChildItemCount = 0\n    private var _visibleChildren = ArrayList<View>(16)\n    private var _isOddVisibleItemCount = false\n\n    private var _height: Int = 0\n    private var _rightElHeight: Double = 0.0\n    private var _leftElHeight: Double = 0.0\n    private var _colCount: Int = 0\n    private var _childWidth: Int = 0\n\n    private var _suspendLayout = false\n\n    constructor(context: Context) : super(context)\n    constructor(context: Context, attrs: AttributeSet?)\n            : this(context, attrs, 0)\n\n    constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int)\n            : this(context, attrs, defStyleAttr, 0)\n\n    constructor(\n        context: Context,\n        attrs: AttributeSet?,\n        @AttrRes defStyleAttr: Int,\n        @StyleRes defStyleRes: Int\n    ) : super(context, attrs, defStyleAttr, defStyleRes) {\n        val a = context.obtainStyledAttributes(\n            attrs, R.styleable.MediaLayout, defStyleAttr, defStyleRes\n        )\n        a.apply {\n            val spaceSize = getDimensionPixelSize(R.styleable.MediaLayout_spaceSize, 8)\n            spaceMargin = spaceSize / 2\n        }\n\n        a.recycle()\n    }\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        _visibleChildren.clear()\n        for (v in children) {\n            if (v.visibility == View.VISIBLE) {\n                _visibleChildren.add(v)\n            }\n        }\n        _visibleChildItemCount = _visibleChildren.size\n        _isOddVisibleItemCount = _visibleChildItemCount % 2 == 1\n        if (_suspendLayout) {\n            return\n        }\n        if (_visibleChildItemCount == 0) {\n            _height = 0\n            setMeasuredDimension(0, 0)\n            return\n        }\n\n        // 2列以上表示したくない\n        _colCount = min(_visibleChildItemCount, 2)\n\n        val leftElCount = if (_colCount == 0) 0 else max(_visibleChildItemCount / _colCount, 1)\n        val rightElCount = _visibleChildItemCount - leftElCount\n\n        val width = MeasureSpec.getSize(widthMeasureSpec)\n//        val height = width * 10.0 / 16.0\n\n        _childWidth = width / max(_colCount, 1)\n        val aspectRatio = 16.0 / 10.0\n        val minChildHeight = if (_visibleChildItemCount == 2) width / aspectRatio else _childWidth / aspectRatio\n        val height = minChildHeight * max(rightElCount, leftElCount)\n\n        _rightElHeight = if (rightElCount == 0) 0.0 else height / rightElCount\n        _leftElHeight = if (leftElCount == 0) 0.0 else height / leftElCount\n\n        for (i in 0 until _visibleChildItemCount) {\n            val child = _visibleChildren[i]\n            val params = child.layoutParams as LayoutParams\n\n            val isOddView = i % 2 == 1\n            val isLast = i == _visibleChildItemCount - 1\n            val isRight = if (_isOddVisibleItemCount) {\n                _visibleChildItemCount > 1 && (isLast || isOddView)\n            } else {\n                i % 2 == 1\n            }\n\n            val childHeight = if (isRight) {\n                _rightElHeight\n            } else {\n                _leftElHeight\n            }.toInt()\n\n            val hasBottomItem = if (_visibleChildItemCount > 3) {\n                if (_isOddVisibleItemCount) {\n                    // 最後ではないこと, 最後から二つ目ではないこと\n                    !isLast && i != _visibleChildItemCount - 3\n                } else {\n                    // 最後から二つ目より前であること\n                    i < _visibleChildItemCount - 2\n                }\n            } else {\n                // 3つ以下の場合は、要素数が3かつ2番目の要素であること\n                _visibleChildItemCount == 3 && i == 1\n            }\n\n            child.measure(\n                MeasureSpec.makeMeasureSpec(_childWidth, MeasureSpec.EXACTLY),\n                MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY)\n            )\n\n            params.updateMemoParams(\n                measuredWidth = _childWidth,\n                measuredHeight = childHeight,\n                isRight = isRight,\n                isLast = isLast,\n                isOddView = isOddView,\n                hasBottomView = hasBottomItem,\n            )\n\n        }\n\n\n        _height = height.toInt()\n        setMeasuredDimension(width, height.toInt())\n    }\n\n\n    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {\n        if (_suspendLayout) {\n            return\n        }\n        val width = right - left\n\n        for (i in 0 until _visibleChildItemCount) {\n            val child = _visibleChildren[i]\n            val params = child.layoutParams as LayoutParams\n\n            val isOddView = params.isOddView\n            val isLast = params.isLast\n            val isRight = params.isRight\n            val childHeight = params.measuredHeight\n            val childTop = (i / 2) * childHeight\n            val childLeft = if (isRight) {\n                width - params.measuredWidth\n            } else {\n                0\n            }\n\n            val childBottom = childTop + childHeight\n            val childRight = childLeft + params.measuredWidth\n\n            val hasRightItem = !isOddView && !isLast && _visibleChildItemCount > 1\n            val hasTopItem = i >= 2\n            val hasBottomItem = params.hasBottomView\n            val childTopMargin = if (hasTopItem) +spaceMargin else 0\n            val childBottomMargin = if (hasBottomItem) -spaceMargin else 0\n            val childLeftMargin = if (isRight) +spaceMargin else 0\n            val childRightMargin = if (hasRightItem) -spaceMargin else 0\n\n            child.layout(\n                childLeft + childLeftMargin,\n                childTop + childTopMargin,\n                childRight + childRightMargin,\n                childBottom + childBottomMargin\n            )\n        }\n\n    }\n\n    override fun generateLayoutParams(attrs: AttributeSet?): LayoutParams {\n        return LayoutParams(context, attrs)\n    }\n\n    /**\n     * レイアウトの更新を一時的に停止する\n     * 目的としては、子要素の追加や削除を行う際に、レイアウトの表示要素が確定するまで、\n     * onMeasureとonLayoutを呼び出さないようにするためです。\n     * それによって、無駄なレイアウトの計算を行わないようにすることができます。\n     * @param block このブロックの中で、複数のレイアウトの更新操作をすることを想定しています。\n     */\n    fun withSuspendLayout(block: () -> Unit) {\n        suspendLayout()\n        block()\n        resumeLayout()\n    }\n\n\n    private fun suspendLayout() {\n        _suspendLayout = true\n    }\n\n    private fun resumeLayout() {\n        _suspendLayout = false\n        requestLayout()\n    }\n\n\n    class LayoutParams : ViewGroup.LayoutParams {\n\n        constructor(c: Context, attrs: AttributeSet?) : super(c, attrs)\n\n        @Suppress(\"unused\")\n        constructor(width: Int, height: Int) : super(width, height)\n\n        @Suppress(\"unused\")\n        constructor(source: ViewGroup.LayoutParams?) : super(source)\n\n        internal var isRight = false\n            private set\n        internal var measuredWidth = 0\n            private set\n\n        internal var measuredHeight = 0\n            private set\n\n        internal var isLast = false\n            private set\n\n        internal var isOddView = false\n            private set\n\n        internal var hasBottomView: Boolean = false\n            private set\n\n\n        internal fun updateMemoParams(\n            measuredWidth: Int,\n            measuredHeight: Int,\n            isRight: Boolean,\n            isLast: Boolean,\n            isOddView: Boolean,\n            hasBottomView: Boolean,\n        ) {\n            this.measuredHeight = measuredHeight\n            this.measuredWidth = measuredWidth\n            this.isRight = isRight\n            this.isLast = isLast\n            this.isOddView = isOddView\n            this.hasBottomView  = hasBottomView\n        }\n    }\n\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/RoundedOutlineProvider.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.graphics.Outline\nimport android.view.View\nimport android.view.ViewOutlineProvider\nimport java.util.concurrent.ConcurrentHashMap\n\nclass RoundedOutlineProvider(val rect: Float) : ViewOutlineProvider(){\n\n    companion object{\n\n        private val rectMap = ConcurrentHashMap<Float, RoundedOutlineProvider>()\n\n        fun getInstance(rect: Float): RoundedOutlineProvider {\n            var provider = rectMap[rect]\n            if(provider == null){\n                provider = RoundedOutlineProvider(rect)\n                rectMap[rect] = provider\n            }\n            return provider\n        }\n\n    }\n\n    override fun getOutline(view: View?, outline: Outline?) {\n        view?: return\n        outline?: return\n        outline.setRoundRect(0, 0, view.width, view.height, rect)\n        view.clipToOutline = true\n    }\n\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/SafeUnbox.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport androidx.databinding.InverseMethod\n\n/**\n * オーバーロードがわからないバカAndroidStudioのDataBindingのせいで名前を変更した関数を追加する\n */\nobject SafeUnbox {\n\n    @JvmStatic\n    @InverseMethod(\"box\")\n    fun unbox(boxed: Boolean?): Boolean {\n        return boxed ?: false\n    }\n\n    @JvmStatic\n    fun box(unboxed: Boolean): Boolean?{\n        return unboxed\n    }\n\n    @JvmStatic\n    @InverseMethod(\"box\")\n    fun unbox(boxed: String?) : String{\n        return boxed?: String()\n    }\n\n    @JvmStatic\n    fun box(unboxed: String): String?{\n        return unboxed\n    }\n\n    @JvmStatic\n    @androidx.databinding.InverseMethod(\"box\")\n    fun unbox(boxed: Float?): Float{\n        return boxed?: 0F\n    }\n\n    @JvmStatic\n    fun box(boxed: Float): Float?{\n        return boxed\n    }\n\n    @JvmStatic\n    @androidx.databinding.InverseMethod(\"box\")\n    fun unbox(boxed: Int?): Int{\n        return boxed?: 0\n    }\n\n    @JvmStatic\n    fun box(boxed: Int): Int?{\n        return boxed\n    }\n\n    @JvmStatic\n    @androidx.databinding.InverseMethod(\"boxString\")\n    fun unboxString(boxed: String?) = boxed?: \"\"\n\n    @JvmStatic\n    fun boxString(unboxed: String): String? = unboxed\n\n    @JvmStatic\n    @androidx.databinding.InverseMethod(\"boxInt\")\n    fun unboxInt(boxed: Int?) = boxed?: 0\n\n    @JvmStatic\n    fun boxInt(unboxed: Int): Int? = unboxed\n\n    @JvmStatic\n    @androidx.databinding.InverseMethod(\"boxBool\")\n    fun unboxBool(boxed: Boolean?) = boxed?: false\n\n    @JvmStatic\n    fun boxBool(unboxed: Boolean): Boolean? = unboxed\n\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/StringHelper.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_android.resource.getString\n\n@BindingAdapter(\"stringSource\")\nfun TextView.setStringSource(source: StringSource?) {\n    text = source?.getString(context)\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/VisibilityHelper.kt",
    "content": "package net.pantasystem.milktea.common_android.ui\n\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.databinding.BindingAdapter\n\n\nobject VisibilityHelper {\n\n    @BindingAdapter(\"memoVisibility\")\n    @JvmStatic\n    fun View.setMemoVisibility(type: Int) {\n        val currentVisibility = this.visibility\n        if (type == currentVisibility) {\n            return\n        }\n        visibility = type\n    }\n\n    @BindingAdapter(\"memoVisibility\")\n    @JvmStatic\n    fun ViewGroup.setMemoVisibility(type: Int) {\n        val currentVisibility = this.visibility\n        if (type == currentVisibility) {\n            return\n        }\n        visibility = type\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/haptic/HapticFeedbackController.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.haptic\n\nimport android.content.Context\nimport android.os.Build\nimport android.os.VibrationEffect\nimport android.os.Vibrator\nimport android.view.HapticFeedbackConstants\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.BindingAdapter\n\nobject HapticFeedbackController {\n\n    fun performClickHapticFeedback(view: View) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            view.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)\n        }\n    }\n\n    fun performLongClickHapticFeedback(view: View) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)\n        }\n    }\n\n    fun performToggledHapticFeedback(view: View, isChecked: Boolean) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {\n            if (isChecked) {\n                view.performHapticFeedback(HapticFeedbackConstants.TOGGLE_OFF)\n            } else {\n                view.performHapticFeedback(HapticFeedbackConstants.TOGGLE_ON)\n            }\n        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n            view.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK)\n        }\n    }\n\n    @Suppress(\"DEPRECATION\")\n    fun performTickVibrateHapticFeedback(context: Context) {\n        val vibratorManager =\n            context.getSystemService(AppCompatActivity.VIBRATOR_SERVICE) as Vibrator\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK).let {\n                vibratorManager.vibrate(it)\n            }\n        }\n    }\n\n\n    @BindingAdapter(\"onClickAndPerformHapticFeedback\")\n    @JvmStatic\n    fun View.onClickAndPerformHapticFeedback(onClick: View.OnClickListener) {\n        setOnClickListener {\n            performClickHapticFeedback(it)\n            onClick.onClick(it)\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/listview/FlexBoxLayoutHelper.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.listview\n\nimport android.content.Context\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.flexbox.*\n\nfun getFlexBoxLayoutManager(context: Context) : FlexboxLayoutManager{\n    val flexBoxLayoutManager = FlexboxLayoutManager(context)\n    flexBoxLayoutManager.flexDirection = FlexDirection.ROW\n    flexBoxLayoutManager.flexWrap = FlexWrap.WRAP\n    flexBoxLayoutManager.justifyContent = JustifyContent.FLEX_START\n    flexBoxLayoutManager.alignItems = AlignItems.STRETCH\n    return flexBoxLayoutManager\n}\n\nfun RecyclerView.applyFlexBoxLayout(context: Context) {\n    this.layoutManager = getFlexBoxLayoutManager(context)\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/text/CustomEmojiDecorator.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.text\n\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.style.RelativeSizeSpan\nimport android.widget.TextView\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParsedResult\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParser\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.EmojiResolvedType\nimport kotlin.math.max\n\nclass CustomEmojiDecorator {\n\n    fun decorate(\n        accountHost: String?,\n        sourceHost: String?,\n        emojis: List<CustomEmoji>?,\n        text: String,\n        view: TextView,\n    ): Spanned {\n\n        val emojiAdapter = EmojiAdapter(view)\n        val builder = SpannableStringBuilder(text)\n\n\n        val result = CustomEmojiParser.parse(\n            sourceHost,\n            emojis,\n            text,\n        )\n        result.emojis.filter {\n            it.result is EmojiResolvedType.Resolved\n        }.map {\n            val span = DrawableEmojiSpan(\n                emojiAdapter,\n                it.result.getUrl(accountHost),\n                (it.result as? EmojiResolvedType.Resolved)?.emoji?.aspectRatio\n            )\n            GlideApp.with(view)\n                .asDrawable()\n                .load(it.result.getUrl(accountHost))\n                .override(view.textSize.toInt())\n                .into(span.target)\n            builder.setSpan(span, it.start, it.end, 0)\n        }\n\n\n        return builder\n    }\n\n    fun decorate(accountHost: String?, result: CustomEmojiParsedResult, view: TextView): Spanned {\n\n        val emojiAdapter = EmojiAdapter(view)\n        val builder = SpannableStringBuilder(result.text)\n\n        result.emojis.filter {\n            it.result is EmojiResolvedType.Resolved\n        }.map {\n            val span = DrawableEmojiSpan(\n                emojiAdapter,\n                it.result.getUrl(accountHost),\n                (it.result as? EmojiResolvedType.Resolved)?.emoji?.aspectRatio\n            )\n            GlideApp.with(view)\n                .asDrawable()\n                .override(view.textSize.toInt())\n                .load(it.result.getUrl(accountHost))\n                .into(span.target)\n            builder.setSpan(span, it.start, it.end, 0)\n        }\n\n\n        return builder\n    }\n\n    fun decorate(\n        spanned: Spanned,\n        accountHost: String?,\n        result: CustomEmojiParsedResult,\n        view: TextView,\n        customEmojiScale: Float = 1f,\n    ): Spanned {\n\n        val emojiAdapter = EmojiAdapter(view)\n        val builder = SpannableStringBuilder(spanned)\n\n        result.emojis.filter {\n            it.result is EmojiResolvedType.Resolved\n        }.map {\n            val aspectRatio = (it.result as? EmojiResolvedType.Resolved)?.emoji?.aspectRatio\n            val span = DrawableEmojiSpan(\n                emojiAdapter,\n                it.result.getUrl(accountHost),\n                aspectRatio,\n            )\n            val height = max(view.textSize * 0.75f, 10f)\n            val width = when(aspectRatio) {\n                null -> height\n                else -> height * aspectRatio\n            }\n\n            GlideApp.with(view)\n                .asDrawable()\n                .load(it.result.getUrl(accountHost))\n                .override((width * customEmojiScale).toInt(), (height * customEmojiScale).toInt())\n                .into(span.target)\n            builder.setSpan(span, it.start, it.end, 0)\n            builder.setSpan(RelativeSizeSpan(customEmojiScale), it.start, it.end, 0)\n        }\n\n\n        return builder\n    }\n\n}\n\n"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/text/CustomEmojiTokenizer.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.text\n\nimport android.util.Log\nimport android.widget.MultiAutoCompleteTextView\n\nclass CustomEmojiTokenizer : MultiAutoCompleteTextView.Tokenizer{\n    var start: Int? = null\n        private set\n\n    override fun findTokenStart(text: CharSequence?, cursor: Int): Int {\n        Log.d(\"CustomEmojiTokenizer\", \"findToTokenStart text: $text, cursor:$cursor\")\n        var i = cursor\n        val textLength = text?.length?: 0\n\n        while(i > 0){\n            if(text?.get(i - 1) == ':'){\n                start = i\n                return i\n            }else{\n                i--\n            }\n        }\n        return textLength\n    }\n\n    override fun findTokenEnd(text: CharSequence?, cursor: Int): Int {\n        Log.d(\"CustomEmojiTokenizer\", \"findTokenEnd text: $text, cursor:$cursor\")\n\n        var i = cursor\n        if(i > 0 && text?.get(i) == ':'){\n            return i\n        }\n\n        while(i > 0 && text?.get(i - 1) != ':'){\n            i --\n        }\n\n        return i\n    }\n\n\n\n    override fun terminateToken(text: CharSequence?): CharSequence {\n        Log.d(\"CustomEmojiTokenizer\", \"terminateToken text: $text\")\n\n        return text?.substring(1, text.length)?: String()\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/text/DateFormatHelper.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.text\n\nimport android.text.SpannableStringBuilder\nimport android.widget.TextView\nimport androidx.core.content.ContextCompat\nimport androidx.databinding.BindingAdapter\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common.ui.SimpleElapsedTime\nimport net.pantasystem.milktea.common_android.R\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.model.note.Visibility\nimport java.text.SimpleDateFormat\nimport java.util.*\nimport kotlin.math.min\n\nobject DateFormatHelper {\n\n    @BindingAdapter(\"dateOnly\")\n    @JvmStatic\n    fun TextView.setDateOnly(dateOnly: Date?) {\n        val date = dateOnly ?: Date()\n        val sdf = SimpleDateFormat(\"yyyy/M/d\", Locale.getDefault())\n        this.text = sdf.format(date)\n    }\n\n    @BindingAdapter(\"timeOnly\")\n    @JvmStatic\n    fun TextView.setTimeOnly(timeOnly: Date?) {\n        val date = timeOnly ?: Date()\n        val sdf = SimpleDateFormat(\"HH:mm\", Locale.getDefault())\n        this.text = sdf.format(date)\n    }\n\n\n\n    @BindingAdapter(\"elapsedTime\", \"isDisplayTimestampsAsAbsoluteDates\")\n    @JvmStatic\n    fun TextView.setElapsedTime(elapsedTime: Instant?, isDisplayTimestampsAsAbsoluteDates: Boolean?) {\n\n        this.text = if (isDisplayTimestampsAsAbsoluteDates == true) {\n            SimpleDateFormat.getDateTimeInstance().format(\n                elapsedTime?.let {\n                    Date(it.toEpochMilliseconds())\n                } ?: Date()\n            )\n        } else {\n            GetElapsedTimeStringSource(\n                SimpleElapsedTime(\n                    elapsedTime ?: Clock.System.now()\n                )\n            ).getString(context)\n        }\n    }\n\n    @BindingAdapter(\"elapsedTime\", \"visibility\", \"isDisplayTimestampsAsAbsoluteDates\")\n    @JvmStatic\n    fun TextView.setElapsedTimeAndVisibility(elapsedTime: Instant?, visibility: Visibility?, isDisplayTimestampsAsAbsoluteDates: Boolean?) {\n        val visibilityIcon = when(visibility ?: Visibility.Public(false)) {\n            is Visibility.Followers -> R.drawable.ic_lock_black_24dp\n            is Visibility.Home -> R.drawable.ic_home_black_24dp\n            is Visibility.Public -> null\n            is Visibility.Specified -> R.drawable.ic_email_black_24dp\n            is Visibility.Limited -> R.drawable.ic_groups\n            Visibility.Mutual -> R.drawable.ic_sync_alt_24px\n            Visibility.Personal -> R.drawable.ic_person_black_24dp\n        }\n        val text = if (isDisplayTimestampsAsAbsoluteDates == true) {\n            SimpleDateFormat.getDateTimeInstance().format(\n                elapsedTime?.let {\n                    Date(it.toEpochMilliseconds())\n                } ?: Date()\n            )\n        } else {\n            GetElapsedTimeStringSource(\n                SimpleElapsedTime(\n                    elapsedTime ?: Clock.System.now()\n                )\n            ).getString(context)\n        }\n\n        this.text = if (visibilityIcon == null) {\n            text\n        } else {\n            val target = \"$text visibility\"\n            SpannableStringBuilder(target).apply {\n                val drawable = ContextCompat.getDrawable(context, visibilityIcon)\n                drawable?.setTint(currentTextColor)\n                val span = DrawableEmojiSpan(EmojiAdapter(this@setElapsedTimeAndVisibility), visibilityIcon)\n                setSpan(span, text.length + 1, target.length,0)\n                GlideApp.with(this@setElapsedTimeAndVisibility)\n                    .load(drawable)\n                    .override(min(textSize.toInt(), 640))\n                    .into(span.target)\n            }\n        }\n    }\n\n    @BindingAdapter(\"createdAt\")\n    @JvmStatic\n    fun TextView.setCreatedAt(createdAt: Instant?) {\n        val date = createdAt ?: Clock.System.now()\n        val javaDate = Date(date.toEpochMilliseconds())\n        this.text = SimpleDateFormat.getDateTimeInstance().format(javaDate)\n    }\n\n    @BindingAdapter(\"createdAt\", \"visibility\")\n    @JvmStatic\n    fun TextView.setCreatedAtWithVisibility(createdAt: Instant?, visibility: Visibility?) {\n        val date = createdAt ?: Clock.System.now()\n        val javaDate = Date(date.toEpochMilliseconds())\n        val visibilityIcon = when(visibility ?: Visibility.Public(false)) {\n            is Visibility.Followers -> R.drawable.ic_lock_black_24dp\n            is Visibility.Home -> R.drawable.ic_home_black_24dp\n            is Visibility.Public -> null\n            is Visibility.Specified -> R.drawable.ic_email_black_24dp\n            is Visibility.Limited -> R.drawable.ic_groups\n            Visibility.Mutual -> R.drawable.ic_sync_alt_24px\n            Visibility.Personal -> R.drawable.ic_person_black_24dp\n        }\n        val text = SimpleDateFormat.getDateTimeInstance().format(javaDate)\n\n        this.text = if (visibilityIcon == null) {\n            text\n        } else {\n            val target = \"visibility $text\"\n            SpannableStringBuilder(target).apply {\n                val drawable = ContextCompat.getDrawable(context, visibilityIcon)\n                drawable?.setTint(currentTextColor)\n                val span = DrawableEmojiSpan(EmojiAdapter(this@setCreatedAtWithVisibility), visibilityIcon)\n                setSpan(span, 0, \"visibility\".length,0)\n                GlideApp.with(this@setCreatedAtWithVisibility)\n                    .load(drawable)\n                    .override(min(textSize.toInt(), 640))\n                    .into(span.target)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/text/DrawableEmojiSpan.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.text\n\n\nimport android.graphics.drawable.AnimatedImageDrawable\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport com.bumptech.glide.load.resource.gif.GifDrawable\nimport com.bumptech.glide.request.target.CustomTarget\nimport com.bumptech.glide.request.transition.Transition\nimport com.github.penfeizhou.animation.apng.APNGDrawable\nimport java.lang.ref.WeakReference\n\nclass DrawableEmojiSpan(\n    var adapter: EmojiAdapter?,\n    k: Any?,\n    aspectRatio: Float? = null,\n    emojiScale: Float = 1f,\n) : EmojiSpan<Any?>(k, aspectRatio = aspectRatio, emojiScale = emojiScale) {\n    //val weakReference: WeakReference<View> = WeakReference(view)\n\n\n//    /**\n//     * invalidateSelfによって呼び出されるコールバックを実装することによって\n//     * invalidateSelfが呼び出されたときに自信のview.invalidateを呼び出し再描画をする\n//     * (GifDrawableはdrawを呼び出すと自動的にcurrentのGifが読み込まれる)\n//     */\n//    inner class Animated : Drawable.Callback{\n//        override fun invalidateDrawable(p0: Drawable) {\n//            //weakReference.get()?.invalidate()\n//            adapter?.update()\n//        }\n//\n//        override fun scheduleDrawable(p0: Drawable, p1: Runnable, p2: Long) {\n//        }\n//\n//        override fun unscheduleDrawable(p0: Drawable, p1: Runnable) {\n//        }\n//    }\n\n\n    val target: CustomTarget<Drawable> = generateTarget()\n//    override val target = object : CustomTarget<Drawable>(){\n//        override fun onResourceReady(\n//            resource: Drawable,\n//            transition: Transition<in Drawable>?\n//        ) {\n//            imageDrawable = resource\n//            imageDrawable?.callback = Animated()\n//            when (resource) {\n//                is GifDrawable -> {\n//                    resource.start()\n//                }\n//                is APNGDrawable -> {\n//                    resource.start()\n//                }\n//                else -> {\n//                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n//                        if (resource is AnimatedImageDrawable) {\n//                            resource.start()\n//                        } else {\n//                            adapter?.update()\n//                        }\n//                    } else {\n//                        adapter?.update()\n//                    }\n//                }\n//            }\n//        }\n//        override fun onLoadCleared(placeholder: Drawable?) {\n//            imageDrawable = placeholder\n//        }\n//    }\n\n\n    private fun generateTarget(): DrawableEmojiTarget {\n        return DrawableEmojiTarget(this)\n    }\n}\n\nprivate class DrawableEmojiTarget(\n    span: DrawableEmojiSpan,\n) : CustomTarget<Drawable>() {\n\n    private val span = WeakReference(span)\n    override fun onResourceReady(\n        resource: Drawable,\n        transition: Transition<in Drawable>?,\n    ) {\n        span.get()?.imageDrawable = resource\n\n        val callback = span.get()?.imageDrawable?.callback\n        resource.callback = object : Drawable.Callback {\n            override fun invalidateDrawable(who: Drawable) {\n                callback?.invalidateDrawable(who)\n                span.get()?.adapter?.update(false)\n            }\n\n            override fun scheduleDrawable(who: Drawable, what: Runnable, `when`: Long) {\n                callback?.scheduleDrawable(who, what, `when`)\n            }\n\n            override fun unscheduleDrawable(who: Drawable, what: Runnable) {\n                callback?.unscheduleDrawable(who, what)\n            }\n        }\n\n        when (resource) {\n            is GifDrawable -> {\n                resource.start()\n            }\n            is APNGDrawable -> {\n                resource.start()\n            }\n            else -> {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n                    if (resource is AnimatedImageDrawable) {\n                        resource.start()\n                    } else {\n                        span.get()?.adapter?.update()\n                    }\n                } else {\n                    span.get()?.adapter?.update()\n                }\n            }\n        }\n    }\n\n    override fun onLoadCleared(placeholder: Drawable?) {\n\n    }\n}\n\n"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/text/EmojiAdapter.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.text\n\nimport android.view.View\nimport java.lang.ref.WeakReference\n\nclass EmojiAdapter (view: View){\n\n    private val weakReference = WeakReference(view)\n\n    private  var beforeExecute: Long = System.nanoTime()\n\n    fun update(invalidateForce: Boolean = true){\n        val now = System.nanoTime()\n        if ((now - beforeExecute) > 60000 || invalidateForce) {\n            weakReference.get()?.invalidate()\n\n        }\n        beforeExecute = now\n    }\n\n\n}"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/text/EmojiSpan.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.text\n\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.graphics.drawable.Drawable\nimport android.text.TextPaint\nimport android.text.style.ReplacementSpan\nimport kotlin.math.min\n\n/**\n * @param key 画像の種別を識別するためのキー値で、画像のURLなどが入る\n * @param aspectRatio 画像の比率が入る\n */\nabstract class EmojiSpan<T: Any?>(val key: T, val aspectRatio: Float? = null, val emojiScale: Float = 1f) : ReplacementSpan(){\n\n    companion object {\n        /**\n         * 変数keyに対応するDrawableの画像サイズをここに保持している。\n         */\n        private val drawableSizeCache = mutableMapOf<Any, EmojiSizeCache>()\n    }\n\n    var imageDrawable: Drawable? = null\n\n\n    /**\n     * 文字サイズなどのスケールに応じて画像サイズをDrawableに反映したorしてないの状態\n     * 反映済みの場合はtrueが入り、そうでない場合はfalseが入る\n     */\n    private var isSizeComputed = false\n\n    /**\n     * imageDrawableがnullの時にupdateImageDrawableSizeが呼び出されるとここに絵文字のサイズが代入される\n     * またDrawableがNullの段階の時にupdateImageDrawableSizeが呼び出された時は画像が正方形として扱われる。\n     */\n    private var beforeTextSize: Int = 0\n\n\n    override fun getSize(\n        paint: Paint,\n        text: CharSequence?,\n        start: Int,\n        end: Int,\n        fm: Paint.FontMetricsInt?\n    ): Int {\n        val textHeight = paint.textSize\n\n        val size = calculateEmojiSize(textHeight * emojiScale)\n        val metrics = paint.fontMetricsInt\n        if (fm != null) {\n            fm.top = metrics.top - (textHeight * emojiScale - textHeight).toInt()\n            fm.ascent = metrics.ascent\n            fm.descent = metrics.descent\n            fm.bottom = metrics.bottom\n        }\n\n        // NOTE: 画像のサイズが不明かつ初めてサイズを取得しようとした時は暫定的なサイズを返す\n        if (size == null || beforeTextSize != 0) {\n            beforeTextSize = (paint.textSize * emojiScale).toInt()\n            return beforeTextSize\n        }\n\n        // NOTE: 暫定的なサイズではない場合はbeforeTextSizeを0にする必要性がある\n        beforeTextSize = 0\n\n        val imageWidth = size.first\n\n        return imageWidth.toInt()\n    }\n\n    override fun updateDrawState(ds: TextPaint) {\n        super.updateDrawState(ds)\n        updateImageDrawableSize(ds)\n    }\n\n\n    override fun draw(\n        canvas: Canvas,\n        text: CharSequence?,\n        start: Int,\n        end: Int,\n        x: Float,\n        top: Int,\n        y: Int,\n        bottom: Int,\n        paint: Paint\n    ) {\n        val drawable = imageDrawable\n        drawable?: return\n\n        canvas.save()\n        updateImageDrawableSize(paint)\n        var transY = (bottom - drawable.bounds.bottom).toFloat()\n        transY -= paint.fontMetrics.descent / 2\n        canvas.translate(x, transY)\n        drawable.draw(canvas)\n        canvas.restore()\n\n    }\n\n\n    /**\n     * サイズが大きな画像をGPUのメモリに展開してしまうと、\n     * GPUに負荷がかかりフレーム落ちの原因につながる可能性があるので、\n     * Drawableのサイズを必要なサイズにリサイズを行う処理\n     */\n    private fun updateImageDrawableSize(paint: Paint) {\n        val emojiHeight = min((paint.textSize * emojiScale).toInt(), 128)\n        val size = calculateEmojiSize(min((paint.textSize * emojiScale), 128f))\n        val imageWidth = size?.first ?: -1f\n        val imageHeight = size?.second?: -1f\n\n        // 計算された画像サイズが適切なものかチェックする\n        val unknownEmojiSize = imageWidth <= 0 || imageHeight <= 0\n\n        // 画像サイズが暫定的なサイズかつ、暫定的なサイズと画像のサイズが一致しない場合は処理を終了する\n        if (beforeTextSize != 0 && beforeTextSize != emojiHeight || unknownEmojiSize) {\n            if (!isSizeComputed) {\n                beforeTextSize = emojiHeight\n                imageDrawable?.setBounds(0, 0, emojiHeight, emojiHeight)\n                isSizeComputed = imageDrawable != null\n            }\n            return\n        }\n\n        if (!isSizeComputed) {\n            isSizeComputed = imageDrawable != null\n            imageDrawable?.setBounds(0, 0, imageWidth.toInt(), imageHeight.toInt())\n        }\n    }\n\n    private fun calculateEmojiSize(textSize: Float): Pair<Float, Float>? {\n        val drawable = imageDrawable\n        val size = key?.let {\n            drawableSizeCache[key]\n        } ?: drawable?.let {\n            // NOTE: drawableSizeCacheに画像のサイズが登録されていない場合は、drawableからサイズを取得する\n            EmojiSizeCache(\n                intrinsicHeight = it.intrinsicHeight,\n                intrinsicWidth = it.intrinsicWidth\n            )\n        } ?: aspectRatio?.let {\n            // NOTE: drawableが読み込まれていない状態の時は、文字の高さと画像の比率から横幅のサイズを取得する\n            EmojiSizeCache(\n                intrinsicHeight = textSize.toInt(),\n                intrinsicWidth = (textSize * aspectRatio).toInt()\n            )\n        }\n\n        // NOTE: keyが存在しかつdrawableが存在する場合は、drawableSizeCacheを更新する\n        key?.run {\n            drawableSizeCache[key] ?: drawable?.let {\n                EmojiSizeCache(\n                    intrinsicHeight = it.intrinsicHeight,\n                    intrinsicWidth = it.intrinsicWidth\n                )\n            }\n        }\n\n        // NOTE: 画像のサイズが不明なときはnullを返す\n        if (size == null) {\n            return null\n        }\n        key?.run {\n            drawableSizeCache[key] = size\n        }\n\n        val imageWidth = size.intrinsicWidth\n        val imageHeight = size.intrinsicHeight\n\n        // 画像がテキストの高さよりも大きい場合、画像をテキストと同じ高さに縮小する\n        val scale = textSize / imageHeight\n\n        // テキストの高さに合わせた画像の幅\n        val width = imageWidth * scale\n\n        return width to textSize\n    }\n\n}\n\ndata class EmojiSizeCache(\n    val intrinsicWidth: Int,\n    val intrinsicHeight: Int,\n)"
  },
  {
    "path": "modules/common_android/src/main/java/net/pantasystem/milktea/common_android/ui/text/GetElapsedTimeStringSource.kt",
    "content": "package net.pantasystem.milktea.common_android.ui.text\n\nimport net.pantasystem.milktea.common.ui.TimeUnit\nimport net.pantasystem.milktea.common_android.R\nimport net.pantasystem.milktea.common_android.resource.StringSource\n\nobject GetElapsedTimeStringSource {\n    \n    operator fun invoke(timeUnit: TimeUnit): StringSource {\n        return when(timeUnit) {\n            is TimeUnit.Day -> StringSource(R.string.time_with_date_ago, timeUnit.value.toString())\n            TimeUnit.Future -> StringSource(R.string.future)\n            is TimeUnit.Hour -> StringSource(R.string.time_with_hour_ago, timeUnit.value.toString())\n            is TimeUnit.Minute -> StringSource(R.string.time_with_minute_ago, timeUnit.value.toString())\n            is TimeUnit.Month -> StringSource(R.string.time_with_month_ago, timeUnit.value.toString())\n            TimeUnit.Now -> StringSource(R.string.now)\n            is TimeUnit.Second -> StringSource(R.string.time_with_second_ago, timeUnit.value.toString())\n            is TimeUnit.Year -> StringSource(R.string.time_with_year_ago, timeUnit.value.toString())\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android/src/main/res/drawable/ic_close_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_android/src/main/res/values/attrs.xml",
    "content": "<resources>\n\n    <!-- Declare custom theme attributes that allow changing which styles are\n         used for button bars depending on the API level.\n         ?android:attr/buttonBarStyle is new as of API 11 so this is\n         necessary to support previous API levels. -->\n    <declare-styleable name=\"ButtonBarContainerTheme\">\n        <attr name=\"metaButtonBarStyle\" format=\"reference\" />\n        <attr name=\"metaButtonBarButtonStyle\" format=\"reference\" />\n    </declare-styleable>\n    <declare-styleable name=\"AutoCollapsingLayout\">\n        <attr name=\"expandableButton\" format=\"reference\" />\n    </declare-styleable>\n    <declare-styleable name=\"MediaLayout\">\n        <attr name=\"spaceSize\" format=\"dimension\" />\n    </declare-styleable>\n</resources>\n"
  },
  {
    "path": "modules/common_android_ui/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/common_android_ui/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id('kotlin-kapt')\n    id('dagger.hilt.android.plugin')\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n        compose true\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.common_android_ui'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_resource')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_navigation')\n\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.glide.glide\n    kapt libs.glide.compiler\n    implementation libs.accompanist.glide\n\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.fragment.ktx\n    implementation libs.activity.ktx\n    implementation libs.animation.apng\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n    implementation libs.flexbox\n\n    implementation libs.mfm.kt\n}"
  },
  {
    "path": "modules/common_android_ui/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/common_android_ui/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/common_android_ui/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/common_android_ui/src/main/java/StringSourceHelper.kt",
    "content": "import androidx.compose.runtime.Composable\nimport androidx.compose.ui.platform.LocalContext\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_android.resource.getString\n\n@Composable\nfun getStringFromStringSource(src: StringSource): String {\n    return src.getString(LocalContext.current)\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/APIErrorStringConverter.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport javax.inject.Inject\n\nclass APIErrorStringConverter @Inject constructor() {\n\n    operator fun invoke(error: APIError): StringSource {\n        return when(error) {\n            is APIError.AuthenticationException -> StringSource(R.string.unauthorized_error)\n            is APIError.ClientException -> StringSource(R.string.parameter_error)\n            is APIError.ForbiddenException -> StringSource(R.string.auth_error)\n            is APIError.IAmAIException -> StringSource(R.string.bot_error)\n            is APIError.InternalServerException -> StringSource(R.string.server_error)\n            is APIError.NotFoundException -> StringSource(R.string.not_found_error)\n            is APIError.SomethingException -> {\n                if (error.statusCode >= 500) {\n                    StringSource(R.string.server_error)\n                } else {\n                    StringSource(\"error :${error.statusCode}\")\n                }\n            }\n            is APIError.ToManyRequestsException -> StringSource(R.string.rate_limit_error)\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/AvatarIconViewBindingAdapter.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport androidx.databinding.BindingAdapter\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common.ui.AvatarIconView\nimport net.pantasystem.milktea.model.setting.DefaultConfig\n\nobject AvatarIconViewBindingAdapter  {\n    @JvmStatic\n    @BindingAdapter(\"applyShapeFromConfig\")\n    fun AvatarIconView.applyShapeFromConfig(apply: Boolean) {\n        if (apply) {\n            val type = EntryPointAccessors.fromApplication<BindingProvider>(this.context.applicationContext).configRepository().get().getOrElse {\n                DefaultConfig.config\n            }.avatarIconShapeType.value\n            this.setIconShape(type)\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/BindingProvider.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport dagger.hilt.EntryPoint\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common_navigation.MediaNavigation\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioStore\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.EmojiImageCacheStore\nimport net.pantasystem.milktea.model.setting.ColorSettingStore\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\n\n\n@EntryPoint\n@InstallIn(ActivityComponent::class)\ninterface NavigationEntryPointForBinding {\n    fun mediaNavigation(): MediaNavigation\n    fun userDetailNavigation(): UserDetailNavigation\n    fun searchNavigation(): SearchNavigation\n}\n\n@EntryPoint\n@InstallIn(SingletonComponent::class)\ninterface BindingProvider {\n    fun settingStore(): SettingStore\n    fun accountStore(): AccountStore\n\n    fun customEmojiRepository(): CustomEmojiRepository\n\n    fun colorSettingStore(): ColorSettingStore\n\n    fun customEmojiAspectRatioStore(): CustomEmojiAspectRatioStore\n\n    fun configRepository(): LocalConfigRepository\n\n    fun emojiImageCacheStore(): EmojiImageCacheStore\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/DecorateTextHelper.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.app.Activity\nimport android.graphics.drawable.AnimatedImageDrawable\nimport android.os.Build\nimport android.text.Spannable\nimport android.text.method.LinkMovementMethod\nimport android.text.style.ClickableSpan\nimport android.text.style.URLSpan\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.widget.TextView\nimport androidx.core.text.getSpans\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.load.resource.gif.GifDrawable\nimport com.github.penfeizhou.animation.apng.APNGDrawable\nimport dagger.hilt.android.EntryPointAccessors\nimport dagger.hilt.android.internal.managers.FragmentComponentManager\nimport net.pantasystem.milktea.common_android.html.MastodonHTMLParser\nimport net.pantasystem.milktea.common_android.mfm.MFMParser\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiDecorator\nimport net.pantasystem.milktea.common_android.ui.text.DrawableEmojiSpan\nimport net.pantasystem.milktea.common_navigation.SearchNavType\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\n\nobject DecorateTextHelper {\n\n    @BindingAdapter(\"textNode\")\n    @JvmStatic\n    fun TextView.decorate(result: LazyDecorateResult?) {\n        result ?: return\n        this.movementMethod = LinkMovementMethod.getInstance()\n        stopDrawableAnimations(this)\n        this.setText(\n            MFMDecorator.decorate(this, result),\n            TextView.BufferType.SPANNABLE,\n        )\n    }\n\n    fun stopDrawableAnimations(textView: TextView) {\n        val beforeText = textView.text\n        if (beforeText is Spannable) {\n            val drawableEmojiSpans = beforeText.getSpans<DrawableEmojiSpan>()\n            drawableEmojiSpans.forEach {\n                when (val imageDrawable = it.imageDrawable) {\n                    is GifDrawable -> {\n                        imageDrawable.stop()\n                        imageDrawable.clearAnimationCallbacks()\n                    }\n                    is APNGDrawable -> {\n                        imageDrawable.stop()\n                        imageDrawable.clearAnimationCallbacks()\n                    }\n                    else -> {\n                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {\n                            if (imageDrawable is AnimatedImageDrawable) {\n                                imageDrawable.stop()\n                                imageDrawable.clearAnimationCallbacks()\n                            }\n                        }\n                    }\n                }\n                it.imageDrawable?.callback = null\n                it.imageDrawable = null\n                it.adapter = null\n            }\n        }\n    }\n\n    @BindingAdapter(\"textTypeSource\", \"customEmojiScale\")\n    @JvmStatic\n    fun TextView.decorate(textType: TextType?, customEmojiScale: Float?) {\n        textType ?: return\n        stopDrawableAnimations(this)\n\n        val emojiScale = customEmojiScale ?: 1.0f\n        when (textType) {\n            is TextType.Mastodon -> {\n                val decoratedText = CustomEmojiDecorator().decorate(\n                    textType.html.spanned,\n                    textType.html.accountHost,\n                    textType.html.parserResult,\n                    this,\n                    emojiScale,\n                )\n                this.setText(\n                    decoratedText,\n                    TextView.BufferType.SPANNABLE,\n                )\n                this.movementMethod = ClickListenableLinkMovementMethod { url ->\n                    val urlSpans = decoratedText.getSpans(0, decoratedText.length, URLSpan::class.java)\n                    var textHashTag: CharSequence? = null\n                    for (urlSpan in urlSpans) {\n                        val start = decoratedText.getSpanStart(urlSpan)\n                        val end = decoratedText.getSpanEnd(urlSpan)\n                        val spannedText = decoratedText.subSequence(start, end)\n                        if (spannedText.isNotEmpty() && spannedText[0] == '#') {\n                            if (urlSpan.url == url) {\n                                textHashTag = spannedText\n                            }\n                        }\n                    }\n                    val tag = textType.tags.firstOrNull {\n                        it.url == url || it.url == url.lowercase()\n                    }\n                    val mention = textType.mentions.firstOrNull {\n                        it.url == url\n                    }\n                    Log.d(\"DecorateTextHelper\", \"clicked url:$url, tag:$tag, mention:$mention, tags:${textType.tags}\")\n                    val activity = FragmentComponentManager.findActivity(context) as Activity\n                    val navigationEntryPoint = EntryPointAccessors.fromActivity(\n                        activity,\n                        NavigationEntryPointForBinding::class.java\n                    )\n                    when {\n                        tag != null -> {\n                            val intent = navigationEntryPoint.searchNavigation().newIntent(\n                                SearchNavType.ResultScreen(searchWord = \"#${tag.name}\")\n                            )\n                            context.startActivity(intent)\n                            true\n                        }\n                        textHashTag != null -> {\n                            val intent = navigationEntryPoint.searchNavigation().newIntent(\n                                SearchNavType.ResultScreen(searchWord = textHashTag.toString())\n                            )\n                            context.startActivity(intent)\n                            true\n                        }\n                        mention != null -> {\n                            val intent = navigationEntryPoint\n                                .userDetailNavigation()\n                                .newIntent(UserDetailNavigationArgs.UserName(userName = mention.acct))\n                            context.startActivity(intent)\n                            true\n                        }\n                        else -> false\n                    }\n                }\n            }\n            is TextType.Misskey -> {\n                this.movementMethod = LinkMovementMethod.getInstance()\n                val spanned = MFMDecorator.decorate(this, textType.lazyDecorateResult, emojiScale)\n                this.setText(spanned, TextView.BufferType.SPANNABLE)\n            }\n        }\n    }\n\n    @BindingAdapter(\"sourceText\", \"emojis\", \"account\", \"host\")\n    @JvmStatic\n    fun TextView.decorateWithLowPerformance(\n        sourceText: String?,\n        emojis: List<CustomEmoji>?,\n        account: Account?,\n        host: String?,\n    ) {\n        sourceText ?: return\n        emojis ?: return\n        account ?: return\n        host ?: return\n        when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val nodes = MFMParser.parse(sourceText) ?: return\n                val emojiMap = emojis.associateBy { it.name }\n                val lazy = MFMDecorator.decorate(\n                    sourceText = sourceText,\n                    nodes = nodes,\n                    emojiNameMap = emojiMap,\n                    instanceEmojiNameMap = emptyMap(),\n                    userHost = host,\n                    accountHost = account.getHost(),\n                    isRequireProcessNyaize = false,\n                    holder = LazyDecorateSkipElementsHolder(),\n                )\n                this.movementMethod = LinkMovementMethod.getInstance()\n                this.text = MFMDecorator.decorate(this, lazy)\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                this.decorate(\n                    TextType.Mastodon(\n                        MastodonHTMLParser.parse(\n                            sourceText,\n                            emojis,\n                            userHost = host,\n                            accountHost = account.getHost()\n                        ),\n                        tags = emptyList(),\n                        mentions = emptyList()\n                    ),\n                    1.0f\n                )\n            }\n        }\n    }\n}\n\nclass ClickListenableLinkMovementMethod(private val onClick: ((url: String) -> Boolean)) :\n    LinkMovementMethod() {\n    override fun onTouchEvent(widget: TextView, buffer: Spannable, event: MotionEvent): Boolean {\n        val url = getUrl(widget, buffer, event)\n        return when {\n            event.action == MotionEvent.ACTION_UP && url != null && onClick(url) -> true\n            else -> super.onTouchEvent(widget, buffer, event)\n        }\n    }\n\n    companion object {\n        private fun getUrl(widget: TextView, buffer: Spannable, event: MotionEvent): String? {\n            val x = event.x.toInt() - widget.totalPaddingLeft + widget.scrollX\n            val y = event.y.toInt() - widget.totalPaddingTop + widget.scrollY\n            val off =\n                widget.layout.run { getOffsetForHorizontal(getLineForVertical(y), x.toFloat()) }\n            return (buffer.getSpans(off, off, ClickableSpan::class.java)\n                .getOrNull(0) as? URLSpan)?.url\n        }\n    }\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/DrawableTintCompat.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.graphics.PorterDuff\nimport android.graphics.drawable.Drawable\nimport android.os.Build\nimport android.widget.TextView\nimport androidx.core.graphics.drawable.DrawableCompat\nimport androidx.databinding.BindingAdapter\n\nobject DrawableTintCompat {\n\n    @JvmStatic\n    @BindingAdapter(\"drawableTintCompat\")\n    fun TextView.setDrawableTintCompat(c: Int?){\n\n        val color: Int = c?: this.currentTextColor\n\n        val drawables = this.compoundDrawables\n        drawables.forEachIndexed { i, d ->\n            if (d != null) {\n                val drawable: Drawable = DrawableCompat.wrap(d)\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n                    drawable.setTint(color)\n                    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN)\n                    drawables[i] = drawable\n                }\n            }\n\n        }\n        this.setCompoundDrawablesWithIntrinsicBounds(drawables[0], drawables[1], drawables[2], drawables[3])\n\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/EmojiText.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.text.InlineTextContent\nimport androidx.compose.foundation.text.appendInlineContent\nimport androidx.compose.material3.LocalTextStyle\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.text.Placeholder\nimport androidx.compose.ui.text.PlaceholderVerticalAlign\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.buildAnnotatedString\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.sp\nimport coil.compose.AsyncImage\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParsedResult\nimport net.pantasystem.milktea.model.emoji.EmojiResolvedType\n\n/**\n * カスタム絵文字（:emoji_name:）のみをインライン画像として描画し、\n * それ以外の文字はプレーンテキストとして表示する Composable。\n *\n * MfmText とは異なり、MFM 構文全体をパースするのではなく\n * [CustomEmojiParsedResult] の絵文字位置情報のみを使用するため、\n * 意図しない書式変換が発生しない。\n * ユーザーの表示名（displayName）の描画に適している。\n *\n * @param parsedResult [CustomEmojiParser.parse] で得られたパース結果\n * @param accountHost 自アカウントのホスト名（未解決絵文字の URL 生成に使用）\n */\n@Composable\nfun EmojiText(\n    parsedResult: CustomEmojiParsedResult,\n    accountHost: String?,\n    modifier: Modifier = Modifier,\n    style: TextStyle = LocalTextStyle.current,\n    fontWeight: FontWeight? = null,\n    maxLines: Int = Int.MAX_VALUE,\n    overflow: TextOverflow = TextOverflow.Clip,\n) {\n    val baseFontSize = if (style.fontSize == TextUnit.Unspecified) 14.sp else style.fontSize\n    val effectiveStyle = if (fontWeight != null) style.copy(fontWeight = fontWeight) else style\n\n    val annotatedString = remember(parsedResult, baseFontSize) {\n        buildAnnotatedString {\n            var cursor = 0\n            for (emojiPos in parsedResult.emojis) {\n                if (cursor < emojiPos.start) {\n                    append(parsedResult.text.substring(cursor, emojiPos.start))\n                }\n                val id = \":${emojiPos.result.tag}:\"\n                appendInlineContent(id = id, alternateText = id)\n                cursor = emojiPos.end\n            }\n            if (cursor < parsedResult.text.length) {\n                append(parsedResult.text.substring(cursor))\n            }\n        }\n    }\n\n    // InlineTextContent は @Composable コンテンツを含むため remember 外で構築する\n    val context = LocalContext.current\n    val inlineContents = parsedResult.emojis.associate { emojiPos ->\n        val id = \":${emojiPos.result.tag}:\"\n        val url = emojiPos.result.getUrl(accountHost)\n        val resolvedEmoji = (emojiPos.result as? EmojiResolvedType.Resolved)?.emoji\n        val aspectRatio = when (val r = emojiPos.result) {\n            is EmojiResolvedType.Resolved -> (r.emoji.aspectRatio ?: 1f).coerceIn(0.1f, 3f)\n            is EmojiResolvedType.UnResolved -> 1f\n        }\n        id to InlineTextContent(\n            placeholder = Placeholder(\n                width = (baseFontSize.value * aspectRatio).sp,\n                height = baseFontSize,\n                placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline,\n            )\n        ) {\n            AsyncImage(\n                model = url,\n                contentDescription = null,\n                modifier = Modifier.fillMaxSize(),\n                onSuccess = { state ->\n                    if (resolvedEmoji != null) {\n                        val drawable = state.result.drawable\n                        val imageAspectRatio =\n                            drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight\n                        val ep = EntryPointAccessors.fromApplication(\n                            context.applicationContext,\n                            BindingProvider::class.java,\n                        )\n                        ep.customEmojiAspectRatioStore().save(resolvedEmoji, imageAspectRatio)\n                        ep.emojiImageCacheStore().save(resolvedEmoji)\n                    }\n                },\n            )\n        }\n    }\n\n    Text(\n        text = annotatedString,\n        modifier = modifier,\n        style = effectiveStyle,\n        maxLines = maxLines,\n        overflow = overflow,\n        inlineContent = inlineContents,\n    )\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MFMDecorator.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.app.Activity\nimport android.app.SearchManager\nimport android.content.Intent\nimport android.graphics.Color\nimport java.net.URLDecoder\nimport android.graphics.Typeface\nimport android.net.Uri\nimport android.text.Layout\nimport android.text.SpannableString\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.SpannedString\nimport android.text.style.AlignmentSpan\nimport android.text.style.BackgroundColorSpan\nimport android.text.style.ClickableSpan\nimport android.text.style.ForegroundColorSpan\nimport android.text.style.QuoteSpan\nimport android.text.style.RelativeSizeSpan\nimport android.text.style.StrikethroughSpan\nimport android.text.style.ScaleXSpan\nimport android.text.style.StyleSpan\nimport android.text.style.TypefaceSpan\nimport java.text.DateFormat\nimport java.util.Date\nimport android.view.View\nimport android.widget.TextView\nimport dagger.hilt.android.EntryPointAccessors\nimport dagger.hilt.android.internal.managers.FragmentComponentManager\nimport dev.misskey.mfm.node.Bold\nimport dev.misskey.mfm.node.Center\nimport dev.misskey.mfm.node.CodeBlock\nimport dev.misskey.mfm.node.EmojiCode\nimport dev.misskey.mfm.node.Fn\nimport dev.misskey.mfm.node.Hashtag\nimport dev.misskey.mfm.node.InlineCode\nimport dev.misskey.mfm.node.Italic\nimport dev.misskey.mfm.node.Link\nimport dev.misskey.mfm.node.MathBlock\nimport dev.misskey.mfm.node.MathInline\nimport dev.misskey.mfm.node.Mention\nimport dev.misskey.mfm.node.MfmNode\nimport dev.misskey.mfm.node.MfmText\nimport dev.misskey.mfm.node.Plain\nimport dev.misskey.mfm.node.Quote\nimport dev.misskey.mfm.node.Search\nimport dev.misskey.mfm.node.Small\nimport dev.misskey.mfm.node.Strike\nimport dev.misskey.mfm.node.UnicodeEmoji\nimport dev.misskey.mfm.node.Url\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common_android.emoji.V13EmojiUrlResolver\nimport net.pantasystem.milktea.common_android.mfm.MFMParser\nimport net.pantasystem.milktea.common_android.nyaize.nyaize\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.putActivity\nimport net.pantasystem.milktea.common_android.ui.text.DrawableEmojiSpan\nimport net.pantasystem.milktea.common_android.ui.text.EmojiAdapter\nimport net.pantasystem.milktea.common_navigation.SearchNavType\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.instance.HostWithVersion\nimport java.lang.ref.WeakReference\nimport kotlin.math.max\n\nobject MFMDecorator {\n\n    fun decorate(\n        textView: TextView,\n        lazyDecorateResult: LazyDecorateResult?,\n        customEmojiScale: Float = 1f,\n        skipEmojis: SkipEmojiHolder = SkipEmojiHolder(),\n    ): Spanned? {\n        lazyDecorateResult ?: return null\n        val emojiAdapter = EmojiAdapter(textView)\n        textView.setTag(R.id.TEXT_VIEW_MFM_TAG_ID, lazyDecorateResult.sourceText)\n\n        return LazyEmojiDecorator(\n            WeakReference(textView),\n            lazyDecorateResult,\n            skipEmojis,\n            emojiAdapter,\n            customEmojiScale,\n        ).decorate()\n    }\n\n    fun decorate(\n        sourceText: String,\n        nodes: List<MfmNode>,\n        emojiNameMap: Map<String, CustomEmoji>,\n        instanceEmojiNameMap: Map<String, CustomEmoji>,\n        userHost: String?,\n        accountHost: String?,\n        isRequireProcessNyaize: Boolean,\n        holder: LazyDecorateSkipElementsHolder,\n    ): LazyDecorateResult {\n        val spanned = NodeDecorator(\n            emojiNameMap = emojiNameMap,\n            instanceEmojiNameMap = instanceEmojiNameMap,\n            userHost = userHost,\n            accountHost = accountHost,\n            isRequireProcessNyaize = isRequireProcessNyaize,\n            holder = holder,\n        ).decorateNodes(nodes)\n        return LazyDecorateResult(\n            sourceText = sourceText,\n            spanned = spanned,\n            skippedEmojis = holder.skipped.toList(),\n        )\n    }\n\n    class NodeDecorator(\n        private val emojiNameMap: Map<String, CustomEmoji>,\n        private val instanceEmojiNameMap: Map<String, CustomEmoji>,\n        private val userHost: String?,\n        private val accountHost: String?,\n        private val isRequireProcessNyaize: Boolean,\n        private val holder: LazyDecorateSkipElementsHolder,\n    ) {\n        fun decorateNodes(nodes: List<MfmNode>, offset: Int = 0): SpannableStringBuilder {\n            val builder = SpannableStringBuilder()\n            var currentOffset = offset\n            for (node in nodes) {\n                val spanned = decorateNode(node, currentOffset)\n                builder.append(spanned)\n                currentOffset += spanned.length\n            }\n            return builder\n        }\n\n        private fun decorateNode(node: MfmNode, offset: Int): Spanned {\n            return when (node) {\n                is MfmText -> {\n                    val text = if (isRequireProcessNyaize) nyaize(node.text) else node.text\n                    SpannedString(text)\n                }\n                is Bold -> {\n                    val inner = decorateNodes(node.children, offset)\n                    inner.setSpan(StyleSpan(Typeface.BOLD), 0, inner.length, 0)\n                    inner\n                }\n                is Italic -> {\n                    val inner = decorateNodes(node.children, offset)\n                    inner.setSpan(StyleSpan(Typeface.ITALIC), 0, inner.length, 0)\n                    inner\n                }\n                is Strike -> {\n                    val inner = decorateNodes(node.children, offset)\n                    inner.setSpan(StrikethroughSpan(), 0, inner.length, 0)\n                    inner\n                }\n                is Small -> {\n                    val inner = decorateNodes(node.children, offset)\n                    inner.setSpan(RelativeSizeSpan(0.6f), 0, inner.length, 0)\n                    inner\n                }\n                is Center -> {\n                    val inner = decorateNodes(node.children, offset)\n                    inner.setSpan(AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER), 0, inner.length, 0)\n                    inner\n                }\n                is Quote -> {\n                    val inner = decorateNodes(node.children, offset)\n                    inner.setSpan(QuoteSpan(), 0, inner.length, 0)\n                    inner\n                }\n                is Plain -> {\n                    val inner = SpannableStringBuilder()\n                    node.children.forEach { inner.append(it.text) }\n                    inner\n                }\n                is CodeBlock -> {\n                    val spanned = SpannableString(node.code)\n                    spanned.setSpan(BackgroundColorSpan(Color.parseColor(\"#000000\")), 0, node.code.length, 0)\n                    spanned.setSpan(ForegroundColorSpan(Color.WHITE), 0, node.code.length, 0)\n                    spanned\n                }\n                is InlineCode -> {\n                    val spanned = SpannableString(node.code)\n                    spanned.setSpan(BackgroundColorSpan(Color.parseColor(\"#000000\")), 0, node.code.length, 0)\n                    spanned.setSpan(ForegroundColorSpan(Color.WHITE), 0, node.code.length, 0)\n                    spanned\n                }\n                is Search -> makeClickableSpan(\"${node.query} Search\") {\n                    Intent(Intent.ACTION_SEARCH).apply {\n                        putExtra(SearchManager.QUERY, node.query)\n                    }\n                }\n                is Mention -> decorateMention(node)\n                is Hashtag -> decorateHashtag(node)\n                is Link -> {\n                    val inner = decorateNodes(node.children, offset)\n                    val url = node.url\n                    inner.setSpan(object : ClickableSpan() {\n                        override fun onClick(view: View) {\n                            view.context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(url)))\n                        }\n                    }, 0, inner.length, 0)\n                    inner\n                }\n                is Url -> {\n                    val convertedUrl = MFMParser.convertAppNoteUriIfGiveNoteUrl(accountHost, node.url)\n                        ?: MFMParser.convertAppChannelUriIfGiveChannelUrl(accountHost, node.url)\n                        ?: node.url\n                    val displayUrl = try {\n                        URLDecoder.decode(node.url, \"UTF-8\")\n                    } catch (_: Exception) {\n                        node.url\n                    }\n                    makeClickableSpan(displayUrl) {\n                        Intent(Intent.ACTION_VIEW, Uri.parse(convertedUrl))\n                    }\n                }\n                is EmojiCode -> decorateEmojiCode(node, offset)\n                is UnicodeEmoji -> SpannedString(node.emoji)\n                is MathBlock -> SpannedString(node.formula)\n                is MathInline -> SpannedString(node.formula)\n                is Fn -> {\n                    val inner = decorateNodes(node.children, offset)\n                    when (node.name) {\n                        \"x2\" -> inner.setSpan(RelativeSizeSpan(2.0f), 0, inner.length, 0)\n                        \"x3\" -> inner.setSpan(RelativeSizeSpan(3.0f), 0, inner.length, 0)\n                        \"x4\" -> inner.setSpan(RelativeSizeSpan(4.0f), 0, inner.length, 0)\n                        \"fg\" -> {\n                            val color = parseMfmColor(node.args[\"color\"])\n                            if (color != null) {\n                                inner.setSpan(ForegroundColorSpan(color), 0, inner.length, 0)\n                            }\n                        }\n                        \"bg\" -> {\n                            val color = parseMfmColor(node.args[\"color\"])\n                            if (color != null) {\n                                inner.setSpan(BackgroundColorSpan(color), 0, inner.length, 0)\n                            }\n                        }\n                        \"font\" -> {\n                            val family = when {\n                                node.args.containsKey(\"serif\") -> \"serif\"\n                                node.args.containsKey(\"monospace\") -> \"monospace\"\n                                node.args.containsKey(\"cursive\") -> \"cursive\"\n                                node.args.containsKey(\"fantasy\") -> \"fantasy\"\n                                else -> null\n                            }\n                            if (family != null) {\n                                inner.setSpan(TypefaceSpan(family), 0, inner.length, 0)\n                            }\n                        }\n                        \"unixtime\" -> {\n                            val epochSec = inner.toString().trim().toLongOrNull()\n                            if (epochSec != null) {\n                                val formatted = DateFormat\n                                    .getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT)\n                                    .format(Date(epochSec * 1000L))\n                                return SpannedString(formatted)\n                            }\n                        }\n                        \"scale\" -> {\n                            val scaleX = node.args[\"x\"]?.toFloatOrNull()\n                            val scaleY = node.args[\"y\"]?.toFloatOrNull()\n                            if (scaleX != null) {\n                                inner.setSpan(ScaleXSpan(scaleX), 0, inner.length, 0)\n                            }\n                            if (scaleY != null) {\n                                inner.setSpan(RelativeSizeSpan(scaleY), 0, inner.length, 0)\n                            }\n                        }\n                        \"ruby\" -> {\n                            val raw = inner.toString()\n                            val splitIndex = raw.lastIndexOf(' ')\n                            if (splitIndex > 0) {\n                                val baseText = raw.substring(0, splitIndex)\n                                val rubyText = raw.substring(splitIndex + 1)\n                                val spanned = SpannableString(baseText)\n                                spanned.setSpan(\n                                    MfmRubySpan(baseText, rubyText),\n                                    0, baseText.length,\n                                    0\n                                )\n                                return spanned\n                            }\n                        }\n                        \"flip\" -> {\n                            val h = !node.args.containsKey(\"v\") || node.args.containsKey(\"h\")\n                            val v = node.args.containsKey(\"v\")\n                            inner.setSpan(MfmFlipSpan(h, v), 0, inner.length, 0)\n                        }\n                        \"rotate\" -> {\n                            val deg = node.args[\"deg\"]?.toFloatOrNull() ?: 0f\n                            inner.setSpan(MfmRotateSpan(deg), 0, inner.length, 0)\n                        }\n                        \"border\" -> {\n                            val style = node.args[\"style\"] ?: \"solid\"\n                            val width = node.args[\"width\"]?.toFloatOrNull() ?: 1f\n                            val color = parseMfmColor(node.args[\"color\"]) ?: Color.BLACK\n                            val radius = node.args[\"radius\"]?.toFloatOrNull() ?: 0f\n                            inner.setSpan(MfmBorderSpan(style, width, color, radius), 0, inner.length, 0)\n                        }\n                    }\n                    inner\n                }\n                else -> SpannedString(\"\")\n            }\n        }\n\n        private fun decorateMention(mention: Mention): Spanned {\n            val displayText = buildMentionText(mention)\n            return makeClickableSpan(displayText) { view ->\n                val activity = FragmentComponentManager.findActivity(view.context) as Activity\n                val intent = EntryPointAccessors.fromActivity(\n                    activity,\n                    NavigationEntryPointForBinding::class.java\n                ).userDetailNavigation()\n                    .newIntent(UserDetailNavigationArgs.UserName(userName = displayText))\n                intent.putActivity(Activities.ACTIVITY_IN_APP)\n                intent\n            }\n        }\n\n        private fun buildMentionText(mention: Mention): String {\n            val mentionHost = mention.host\n            return if (mentionHost == null) {\n                \"@${mention.username}\"\n            } else if (accountHost != null && mentionHost == accountHost && userHost == accountHost) {\n                \"@${mention.username}\"\n            } else {\n                \"@${mention.username}@$mentionHost\"\n            }\n        }\n\n        private fun decorateHashtag(hashtag: Hashtag): Spanned {\n            val tag = \"#${hashtag.hashtag}\"\n            return makeClickableSpan(tag) { view ->\n                val activity = FragmentComponentManager.findActivity(view.context) as Activity\n                val navigation = EntryPointAccessors.fromActivity(\n                    activity,\n                    NavigationEntryPointForBinding::class.java\n                )\n                navigation.searchNavigation()\n                    .newIntent(SearchNavType.ResultScreen(tag))\n            }\n        }\n\n        private fun decorateEmojiCode(node: EmojiCode, offset: Int): Spanned {\n            val emoji = resolveEmoji(node.name) ?: return SpannedString(\":${node.name}:\")\n            val text = \":${node.name}:\"\n            val spanned = SpannableString(text)\n            holder.add(SkippedEmoji(spanned, emoji, offset, offset + text.length))\n            return spanned\n        }\n\n        private fun resolveEmoji(name: String): CustomEmoji? {\n            val resolved = emojiNameMap[name] ?: instanceEmojiNameMap[name]\n            if (resolved != null) return resolved\n            if (userHost.isNullOrBlank() || accountHost == userHost) return null\n            if (!HostWithVersion.isOverV13(accountHost)) return null\n            val url = V13EmojiUrlResolver.resolve(accountHost, name, userHost)\n            return CustomEmoji(name = name, url = url, uri = url, host = userHost)\n        }\n\n        private fun parseMfmColor(hex: String?): Int? {\n            hex ?: return null\n            return try {\n                val expanded = when (hex.length) {\n                    3 -> hex.map { \"$it$it\" }.joinToString(\"\")\n                    6 -> hex\n                    else -> return null\n                }\n                Color.parseColor(\"#$expanded\")\n            } catch (_: IllegalArgumentException) {\n                null\n            }\n        }\n\n        private fun makeClickableSpan(text: String, makeIntent: (View) -> Intent): SpannableString {\n            val spanned = SpannableString(text)\n            spanned.setSpan(object : ClickableSpan() {\n                override fun onClick(view: View) {\n                    view.context.startActivity(makeIntent(view))\n                }\n            }, 0, text.length, 0)\n            return spanned\n        }\n    }\n\n    class LazyEmojiDecorator(\n        private val textView: WeakReference<TextView>,\n        private val lazyDecorateResult: LazyDecorateResult,\n        private val skipEmojis: SkipEmojiHolder,\n        private val emojiAdapter: EmojiAdapter,\n        private val customEmojiScale: Float,\n    ) {\n        private val spannableString = SpannableString(lazyDecorateResult.spanned)\n\n        fun decorate(): Spanned {\n            lazyDecorateResult.skippedEmojis.forEach { decorateEmoji(it) }\n            return spannableString\n        }\n\n        private fun decorateEmoji(skippedEmoji: SkippedEmoji) {\n            val emoji = skippedEmoji.customEmoji\n            if (skipEmojis.contains(emoji)) return\n            textView.get()?.let { textView ->\n                val emojiSpan = DrawableEmojiSpan(emojiAdapter, emoji.url, emoji.aspectRatio)\n                spannableString.setSpan(emojiSpan, skippedEmoji.start, skippedEmoji.end, 0)\n                spannableString.setSpan(RelativeSizeSpan(customEmojiScale), skippedEmoji.start, skippedEmoji.end, 0)\n                val height = max(textView.textSize * 0.75f, 10f)\n                val width = when (val aspectRatio = emoji.aspectRatio) {\n                    null -> height\n                    else -> height * aspectRatio\n                }\n                val windowWidthSize = textView.resources.displayMetrics.widthPixels\n                val finalEmojiWidth: Int\n                val finalEmojiHeight: Int\n                if ((width * customEmojiScale).toInt() > windowWidthSize && windowWidthSize > 0) {\n                    val scale = windowWidthSize.toFloat() / (width * customEmojiScale)\n                    finalEmojiWidth = windowWidthSize\n                    finalEmojiHeight = (height * customEmojiScale * scale).toInt()\n                } else {\n                    finalEmojiWidth = (width * customEmojiScale).toInt()\n                    finalEmojiHeight = (height * customEmojiScale).toInt()\n                }\n                GlideApp.with(textView)\n                    .load(emoji.cachePath)\n                    .error(\n                        GlideApp.with(textView)\n                            .load(emoji.url ?: emoji.uri)\n                            .override(finalEmojiWidth, finalEmojiHeight)\n                    )\n                    .override(finalEmojiWidth, finalEmojiHeight)\n                    .into(emojiSpan.target)\n            }\n        }\n    }\n}\n\ndata class LazyDecorateResult(\n    val sourceText: String,\n    val spanned: Spanned,\n    val skippedEmojis: List<SkippedEmoji>,\n)\n\ndata class SkippedEmoji(\n    val spanned: Spanned,\n    val customEmoji: CustomEmoji,\n    val start: Int,\n    val end: Int,\n)\n\nclass LazyDecorateSkipElementsHolder {\n    val skipped = mutableListOf<SkippedEmoji>()\n    fun add(skipped: SkippedEmoji) {\n        this.skipped.add(skipped)\n    }\n}\n\nclass SkipEmojiHolder {\n    private val skipEmojis = mutableSetOf<CustomEmoji>()\n    fun add(emoji: CustomEmoji): SkipEmojiHolder {\n        skipEmojis.add(emoji)\n        return this\n    }\n    fun contains(emoji: CustomEmoji): Boolean = skipEmojis.contains(emoji)\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MediaPreviewAspectLayout.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.widget.FrameLayout\nimport androidx.annotation.AttrRes\nimport androidx.annotation.StyleRes\nimport androidx.core.view.children\n\nclass MediaPreviewAspectLayout : FrameLayout {\n\n\n    constructor(context: Context) : super(context)\n    constructor(context: Context, attrs: AttributeSet?)\n            : this(context, attrs, 0)\n\n    constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int)\n            : this(context, attrs, defStyleAttr, 0)\n\n    constructor(\n        context: Context,\n        attrs: AttributeSet?,\n        @AttrRes defStyleAttr: Int,\n        @StyleRes defStyleRes: Int\n    ) : super(context, attrs, defStyleAttr, defStyleRes)\n\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {\n//        super.onMeasure(widthMeasureSpec, heightMeasureSpec)\n        val width = MeasureSpec.getSize(widthMeasureSpec)\n        val height = width * 10.0 / 16.0\n        children.forEach {\n            it.measure(\n                MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),\n                MeasureSpec.makeMeasureSpec(height.toInt(), MeasureSpec.EXACTLY)\n            )\n        }\n\n        setMeasuredDimension(width, height.toInt())\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MfmBorderSpan.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.graphics.Canvas\nimport android.graphics.DashPathEffect\nimport android.graphics.Paint\nimport android.graphics.RectF\nimport android.text.style.ReplacementSpan\nimport kotlin.math.roundToInt\n\n/**\n * MFM の `$[border ...]` 構文用 Span。\n * テキストの周囲に枠線を描画する。\n *\n * サポートする style: solid / dotted / dashed / double\n * (groove / ridge / inset / outset は solid にフォールバック)\n */\ninternal class MfmBorderSpan(\n    private val style: String,\n    private val strokeWidth: Float,\n    private val color: Int,\n    private val radius: Float,\n) : ReplacementSpan() {\n\n    private val padding get() = strokeWidth + CONTENT_PADDING\n\n    override fun getSize(\n        paint: Paint,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        fm: Paint.FontMetricsInt?,\n    ): Int {\n        if (fm != null) {\n            paint.getFontMetricsInt(fm)\n            val extra = (padding * 2).roundToInt()\n            fm.top    -= extra\n            fm.ascent -= extra\n            fm.bottom += extra\n            fm.descent += extra\n        }\n        return (paint.measureText(text, start, end) + padding * 2).roundToInt()\n    }\n\n    override fun draw(\n        canvas: Canvas,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        x: Float,\n        top: Int,\n        y: Int,\n        bottom: Int,\n        paint: Paint,\n    ) {\n        val textWidth = paint.measureText(text, start, end)\n        val left   = x\n        val right  = x + textWidth + padding * 2\n        val rectTop    = top.toFloat()\n        val rectBottom = bottom.toFloat()\n\n        when (style) {\n            \"double\" -> drawDouble(canvas, left, rectTop, right, rectBottom, paint)\n            else     -> drawSingle(canvas, left, rectTop, right, rectBottom, paint)\n        }\n\n        // テキストを枠内に描画（左パディング分オフセット）\n        canvas.drawText(text, start, end, x + padding, y.toFloat(), paint)\n    }\n\n    private fun borderPaint(base: Paint): Paint = Paint(base).apply {\n        style  = Paint.Style.STROKE\n        color  = this@MfmBorderSpan.color\n        strokeWidth = this@MfmBorderSpan.strokeWidth\n        pathEffect = when (this@MfmBorderSpan.style) {\n            \"dotted\" -> DashPathEffect(floatArrayOf(strokeWidth * 2, strokeWidth * 2), 0f)\n            \"dashed\" -> DashPathEffect(floatArrayOf(strokeWidth * 4, strokeWidth * 2), 0f)\n            else     -> null\n        }\n    }\n\n    private fun drawSingle(\n        canvas: Canvas, left: Float, top: Float, right: Float, bottom: Float, base: Paint,\n    ) {\n        canvas.drawRoundRect(RectF(left, top, right, bottom), radius, radius, borderPaint(base))\n    }\n\n    private fun drawDouble(\n        canvas: Canvas, left: Float, top: Float, right: Float, bottom: Float, base: Paint,\n    ) {\n        val p = borderPaint(base)\n        val gap = strokeWidth * 1.5f\n        canvas.drawRoundRect(RectF(left, top, right, bottom), radius, radius, p)\n        canvas.drawRoundRect(\n            RectF(left + gap, top + gap, right - gap, bottom - gap),\n            (radius - gap).coerceAtLeast(0f), (radius - gap).coerceAtLeast(0f), p\n        )\n    }\n\n    companion object {\n        private const val CONTENT_PADDING = 4f\n    }\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MfmFlipSpan.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.text.style.ReplacementSpan\nimport kotlin.math.roundToInt\n\n/**\n * MFM の `$[flip ...]` / `$[flip.v ...]` / `$[flip.h,v ...]` 構文用 Span。\n * Canvas を反転させてテキストを描画する。\n */\ninternal class MfmFlipSpan(\n    private val horizontal: Boolean,\n    private val vertical: Boolean,\n) : ReplacementSpan() {\n\n    override fun getSize(\n        paint: Paint,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        fm: Paint.FontMetricsInt?,\n    ): Int {\n        if (fm != null) {\n            paint.getFontMetricsInt(fm)\n        }\n        return paint.measureText(text, start, end).roundToInt()\n    }\n\n    override fun draw(\n        canvas: Canvas,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        x: Float,\n        top: Int,\n        y: Int,\n        bottom: Int,\n        paint: Paint,\n    ) {\n        val w = paint.measureText(text, start, end)\n        val cx = x + w / 2f\n        val cy = (top + bottom) / 2f\n        canvas.save()\n        canvas.scale(\n            if (horizontal) -1f else 1f,\n            if (vertical) -1f else 1f,\n            cx, cy,\n        )\n        canvas.drawText(text, start, end, x, y.toFloat(), paint)\n        canvas.restore()\n    }\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MfmRotateSpan.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.text.style.ReplacementSpan\nimport kotlin.math.abs\nimport kotlin.math.cos\nimport kotlin.math.roundToInt\nimport kotlin.math.sin\n\n/**\n * MFM の `$[rotate.deg=30 ...]` 構文用 Span。\n * テキストを指定角度だけ回転して描画する。\n * getSize() では回転後のバウンディングボックス幅を近似計算する。\n */\ninternal class MfmRotateSpan(private val degrees: Float) : ReplacementSpan() {\n\n    override fun getSize(\n        paint: Paint,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        fm: Paint.FontMetricsInt?,\n    ): Int {\n        if (fm != null) {\n            paint.getFontMetricsInt(fm)\n        }\n        val w = paint.measureText(text, start, end)\n        val rad = Math.toRadians(degrees.toDouble())\n        // 回転後の水平方向占有幅を近似\n        return (w * abs(cos(rad)) + paint.textSize * abs(sin(rad))).roundToInt()\n    }\n\n    override fun draw(\n        canvas: Canvas,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        x: Float,\n        top: Int,\n        y: Int,\n        bottom: Int,\n        paint: Paint,\n    ) {\n        val w = paint.measureText(text, start, end)\n        val cx = x + w / 2f\n        val cy = (top + bottom) / 2f\n        canvas.save()\n        canvas.rotate(degrees, cx, cy)\n        canvas.drawText(text, start, end, x, y.toFloat(), paint)\n        canvas.restore()\n    }\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MfmRubySpan.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.graphics.Canvas\nimport android.graphics.Paint\nimport android.text.style.ReplacementSpan\nimport kotlin.math.max\nimport kotlin.math.roundToInt\n\n/**\n * MFM の `$[ruby 本文 ルビ]` 構文用 Span。\n * 本文の上部にルビを小さく描画する。\n */\ninternal class MfmRubySpan(\n    private val baseText: String,\n    private val rubyText: String,\n) : ReplacementSpan() {\n\n    companion object {\n        private const val RUBY_SIZE_RATIO = 0.5f\n    }\n\n    override fun getSize(\n        paint: Paint,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        fm: Paint.FontMetricsInt?,\n    ): Int {\n        val baseWidth = paint.measureText(baseText)\n        val rubyPaint = rubyPaint(paint)\n        val rubyWidth = rubyPaint.measureText(rubyText)\n\n        if (fm != null) {\n            val rubyMetrics = Paint.FontMetricsInt()\n            rubyPaint.getFontMetricsInt(rubyMetrics)\n            val rubyLineHeight = rubyMetrics.descent - rubyMetrics.ascent\n\n            // ルビ分だけ行の上部に余白を追加\n            fm.top    = (fm.top    - rubyLineHeight)\n            fm.ascent = (fm.ascent - rubyLineHeight)\n        }\n\n        return max(baseWidth, rubyWidth).roundToInt()\n    }\n\n    override fun draw(\n        canvas: Canvas,\n        text: CharSequence,\n        start: Int,\n        end: Int,\n        x: Float,\n        top: Int,\n        y: Int,\n        bottom: Int,\n        paint: Paint,\n    ) {\n        val baseWidth = paint.measureText(baseText)\n        val rubyPaint = rubyPaint(paint)\n        val rubyWidth = rubyPaint.measureText(rubyText)\n        val totalWidth = max(baseWidth, rubyWidth)\n\n        // ルビ: 本文の上に中央揃えで描画\n        val rubyX = x + (totalWidth - rubyWidth) / 2f\n        val rubyMetrics = Paint.FontMetricsInt()\n        rubyPaint.getFontMetricsInt(rubyMetrics)\n        val rubyY = y + paint.ascent() - rubyMetrics.descent\n        canvas.drawText(rubyText, rubyX, rubyY, rubyPaint)\n\n        // 本文: 中央揃えで描画\n        val baseX = x + (totalWidth - baseWidth) / 2f\n        canvas.drawText(baseText, baseX, y.toFloat(), paint)\n    }\n\n    private fun rubyPaint(base: Paint): Paint = Paint(base).apply {\n        textSize *= RUBY_SIZE_RATIO\n    }\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/MfmText.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.text.InlineTextContent\nimport androidx.compose.foundation.text.appendInlineContent\nimport androidx.compose.material3.LocalTextStyle\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.text.AnnotatedString\nimport androidx.compose.ui.text.LinkAnnotation\nimport androidx.compose.ui.text.ParagraphStyle\nimport androidx.compose.ui.text.Placeholder\nimport androidx.compose.ui.text.PlaceholderVerticalAlign\nimport androidx.compose.ui.text.SpanStyle\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.text.buildAnnotatedString\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.text.style.TextDecoration\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.text.withLink\nimport androidx.compose.ui.text.withStyle\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.sp\nimport coil.compose.AsyncImage\nimport dagger.hilt.android.EntryPointAccessors\nimport dev.misskey.mfm.node.Bold\nimport dev.misskey.mfm.node.Center\nimport dev.misskey.mfm.node.CodeBlock\nimport dev.misskey.mfm.node.EmojiCode\nimport dev.misskey.mfm.node.Fn\nimport dev.misskey.mfm.node.Hashtag\nimport dev.misskey.mfm.node.InlineCode\nimport dev.misskey.mfm.node.Italic\nimport dev.misskey.mfm.node.Link\nimport dev.misskey.mfm.node.MathBlock\nimport dev.misskey.mfm.node.MathInline\nimport dev.misskey.mfm.node.Mention\nimport dev.misskey.mfm.node.MfmNode\nimport dev.misskey.mfm.node.Plain\nimport dev.misskey.mfm.node.Quote\nimport dev.misskey.mfm.node.Search\nimport dev.misskey.mfm.node.Small\nimport dev.misskey.mfm.node.Strike\nimport dev.misskey.mfm.node.UnicodeEmoji\nimport dev.misskey.mfm.node.Url\nimport net.pantasystem.milktea.common_android.mfm.MFMParser\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport java.text.DateFormat\nimport java.util.Date\nimport android.graphics.Color as AndroidColor\nimport dev.misskey.mfm.node.MfmText as MfmTextNode\n\n/**\n * MFM (Markup For Misskey) テキストを Compose の Text でリッチ表示するコンポーザブル。\n * 事前にパース済みの MfmNode リストを受け取るオーバーロード。\n *\n * タイムライン等でパース結果を ViewModel でキャッシュして再利用する場合はこちらを使用する。\n *\n * - テキスト装飾（太字・斜体・打消し線・小文字・中央揃え）は AnnotatedString の SpanStyle/ParagraphStyle で表現\n * - カスタム絵文字（:emoji_name:）は InlineTextContent + Coil で画像表示\n * - ruby/flip/rotate/border は Compose では再現困難なため子テキストのプレーン表示にフォールバック\n */\n@Composable\nfun MfmText(\n    nodes: List<MfmNode>,\n    modifier: Modifier = Modifier,\n    emojiNameMap: Map<String, CustomEmoji> = emptyMap(),\n    style: TextStyle = LocalTextStyle.current,\n    color: Color = Color.Unspecified,\n    maxLines: Int = Int.MAX_VALUE,\n    overflow: TextOverflow = TextOverflow.Clip,\n    onUrlClick: (String) -> Unit = {},\n    onMentionClick: (String) -> Unit = {},\n    onHashtagClick: (String) -> Unit = {},\n    onLinkClick: (String) -> Unit = {}\n) {\n    val primaryColor = MaterialTheme.colorScheme.primary\n    val onSurfaceVariantColor = MaterialTheme.colorScheme.onSurfaceVariant\n    val baseFontSize = if (style.fontSize == TextUnit.Unspecified) 14.sp else style.fontSize\n\n    // AnnotatedString 構築（non-composable なので remember 内で実行可能）\n    val annotatedString =\n        remember(nodes, emojiNameMap, primaryColor, onSurfaceVariantColor, baseFontSize) {\n            buildAnnotatedString {\n                appendMfmNodes(\n                    nodes = nodes,\n                    emojiNameMap = emojiNameMap,\n                    baseFontSize = baseFontSize.value,\n                    primaryColor = primaryColor,\n                    onSurfaceVariantColor = onSurfaceVariantColor,\n                    onUrlClick = onUrlClick,\n                    onMentionClick = onMentionClick,\n                    onHashtagClick = onHashtagClick,\n                    onLinkClick = onLinkClick,\n                )\n            }\n        }\n\n    // EmojiCode ノードの ID → CustomEmoji マップを収集（InlineTextContent 構築に使用）\n    val emojiEntries = remember(nodes, emojiNameMap) {\n        buildEmojiMap(nodes, emojiNameMap)\n    }\n\n    // InlineTextContent は @Composable コンテンツを含むため remember 外で構築する\n    val context = LocalContext.current\n    val inlineContents = emojiEntries.entries.associate { (id, emoji) ->\n        val url = emoji.url ?: emoji.uri\n        // aspectRatio (width/height) を幅に反映。極端に広い絵文字は 3x までキャップ。\n        val aspectRatio = (emoji.aspectRatio ?: 1f).coerceIn(0.1f, 3f)\n        id to InlineTextContent(\n            placeholder = Placeholder(\n                width = (baseFontSize.value * aspectRatio).sp,\n                height = baseFontSize,\n                placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline,\n            )\n        ) {\n            AsyncImage(\n                model = url,\n                contentDescription = null,\n                modifier = Modifier.fillMaxSize(),\n                onSuccess = { state ->\n                    val drawable = state.result.drawable\n                    val imageAspectRatio =\n                        drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight\n                    val ep = EntryPointAccessors.fromApplication(\n                        context.applicationContext,\n                        BindingProvider::class.java,\n                    )\n                    ep.customEmojiAspectRatioStore().save(emoji, imageAspectRatio)\n                    ep.emojiImageCacheStore().save(emoji)\n                },\n            )\n        }\n    }\n\n    Text(\n        text = annotatedString,\n        modifier = modifier,\n        style = style,\n        color = color,\n        maxLines = maxLines,\n        overflow = overflow,\n        inlineContent = inlineContents,\n    )\n}\n\n/**\n * MFM (Markup For Misskey) テキストを Compose の Text でリッチ表示するコンポーザブル。\n * テキスト文字列を受け取り、内部で MFMParser によるパースを行うオーバーロード。\n *\n * パース結果を外部でキャッシュしない用途（ReplyPreview 等の簡易表示）に使用する。\n * パースに失敗した場合はプレーンテキストにフォールバックする。\n */\n@Composable\nfun MfmText(\n    text: String,\n    modifier: Modifier = Modifier,\n    emojiNameMap: Map<String, CustomEmoji> = emptyMap(),\n    style: TextStyle = LocalTextStyle.current,\n    color: Color = Color.Unspecified,\n    maxLines: Int = Int.MAX_VALUE,\n    overflow: TextOverflow = TextOverflow.Clip,\n    onUrlClick: (String) -> Unit = {},\n    onMentionClick: (String) -> Unit = {},\n    onHashtagClick: (String) -> Unit = {},\n    onLinkClick: (String) -> Unit = {}\n) {\n    val nodes = remember(text) { MFMParser.parse(text) }\n\n    if (nodes == null) {\n        Text(\n            text = text,\n            modifier = modifier,\n            style = style,\n            color = color,\n            maxLines = maxLines,\n            overflow = overflow,\n        )\n        return\n    }\n\n    MfmText(\n        nodes = nodes,\n        modifier = modifier,\n        emojiNameMap = emojiNameMap,\n        style = style,\n        color = color,\n        maxLines = maxLines,\n        overflow = overflow,\n        onMentionClick = onMentionClick,\n        onHashtagClick = onHashtagClick,\n        onUrlClick = onUrlClick,\n        onLinkClick = onLinkClick\n    )\n}\n\n/**\n * ノードツリーを走査してカスタム絵文字の ID（\":name:\"）→ CustomEmoji マップを収集する。\n */\nprivate fun buildEmojiMap(\n    nodes: List<MfmNode>,\n    emojiNameMap: Map<String, CustomEmoji>,\n): Map<String, CustomEmoji> {\n    val result = mutableMapOf<String, CustomEmoji>()\n    fun traverse(nodes: List<MfmNode>) {\n        for (node in nodes) {\n            when (node) {\n                is EmojiCode -> {\n                    val emoji = emojiNameMap[node.name]\n                    if (emoji != null) {\n                        result[\":${node.name}:\"] = emoji\n                    }\n                }\n\n                is Bold -> traverse(node.children)\n                is Italic -> traverse(node.children)\n                is Strike -> traverse(node.children)\n                is Small -> traverse(node.children)\n                is Center -> traverse(node.children)\n                is Quote -> traverse(node.children)\n                is Link -> traverse(node.children)\n                is Fn -> traverse(node.children)\n                else -> {}\n            }\n        }\n    }\n    traverse(nodes)\n    return result\n}\n\n/**\n * MfmNode リストを再帰的に処理して AnnotatedString.Builder に追記する。\n * baseFontSize は sp 値（Float）として渡す。\n */\nprivate fun AnnotatedString.Builder.appendMfmNodes(\n    nodes: List<MfmNode>,\n    emojiNameMap: Map<String, CustomEmoji>,\n    baseFontSize: Float,\n    primaryColor: Color,\n    onSurfaceVariantColor: Color,\n    onUrlClick: (String) -> Unit = {},\n    onMentionClick: (String) -> Unit = {},\n    onHashtagClick: (String) -> Unit = {},\n    onLinkClick: (String) -> Unit = {}\n) {\n    for (node in nodes) {\n        appendMfmNode(\n            node,\n            emojiNameMap,\n            baseFontSize,\n            primaryColor,\n            onSurfaceVariantColor,\n            onMentionClick = onMentionClick,\n            onHashtagClick = onHashtagClick,\n            onUrlClick = onUrlClick,\n            onLinkClick = onLinkClick\n        )\n    }\n}\n\n@Suppress(\"CyclomaticComplexMethod\")\nprivate fun AnnotatedString.Builder.appendMfmNode(\n    node: MfmNode,\n    emojiNameMap: Map<String, CustomEmoji>,\n    baseFontSize: Float,\n    primaryColor: Color,\n    onSurfaceVariantColor: Color,\n    onUrlClick: (String) -> Unit = {},\n    onMentionClick: (String) -> Unit = {},\n    onHashtagClick: (String) -> Unit = {},\n    onLinkClick: (String) -> Unit = {}\n) {\n    fun recurse(children: List<MfmNode>) {\n        appendMfmNodes(children, emojiNameMap, baseFontSize, primaryColor, onSurfaceVariantColor)\n    }\n\n    when (node) {\n        is MfmTextNode -> append(node.text)\n\n        is Bold -> withStyle(SpanStyle(fontWeight = FontWeight.Bold)) {\n            recurse(node.children)\n        }\n\n        is Italic -> withStyle(SpanStyle(fontStyle = FontStyle.Italic)) {\n            recurse(node.children)\n        }\n\n        is Strike -> withStyle(SpanStyle(textDecoration = TextDecoration.LineThrough)) {\n            recurse(node.children)\n        }\n\n        is Small -> withStyle(SpanStyle(fontSize = (baseFontSize * 0.6f).sp)) {\n            recurse(node.children)\n        }\n\n        is Center -> withStyle(ParagraphStyle(textAlign = TextAlign.Center)) {\n            recurse(node.children)\n        }\n\n        is Quote -> withStyle(SpanStyle(color = onSurfaceVariantColor)) {\n            append(\"│ \")\n            recurse(node.children)\n        }\n\n        is Plain -> node.children.forEach { append(it.text) }\n\n        is InlineCode -> withStyle(\n            SpanStyle(\n                fontFamily = FontFamily.Monospace,\n                background = Color(0xFF1E1E1E),\n                color = Color.White,\n            )\n        ) {\n            append(node.code)\n        }\n\n        is CodeBlock -> withStyle(\n            SpanStyle(\n                fontFamily = FontFamily.Monospace,\n                background = Color(0xFF1E1E1E),\n                color = Color.White,\n            )\n        ) {\n            append(node.code)\n        }\n\n        is Mention -> withLink(\n            LinkAnnotation.Clickable(\n                tag = \"mention\",\n                linkInteractionListener = {\n                    val host = node.host\n                    onMentionClick(\n                        if (host == null) \"@${node.username}\" else \"@${node.username}@$host\"\n                    )\n                }\n            )\n        ) {\n            withStyle(SpanStyle(color = primaryColor)) {\n                val host = node.host\n                if (host == null) append(\"@${node.username}\") else append(\"@${node.username}@$host\")\n            }\n        }\n\n        is Hashtag -> withLink(\n            LinkAnnotation.Clickable(\n                tag = \"hashtag\",\n                linkInteractionListener = {\n                    onHashtagClick(node.hashtag)\n                }\n            )\n        ) {\n            withStyle(SpanStyle(color = primaryColor)) {\n                append(\"#${node.hashtag}\")\n            }\n        }\n\n        is Url -> withLink(\n            LinkAnnotation.Clickable(\n                tag = \"url\",\n                linkInteractionListener = {\n                    onUrlClick(node.url)\n                }\n            )\n        ) {\n            withStyle(SpanStyle(color = primaryColor, textDecoration = TextDecoration.Underline)) {\n                append(node.url)\n            }\n        }\n\n        is Link -> withLink(\n            LinkAnnotation.Clickable(\n                tag = \"Link\",\n                linkInteractionListener = {\n                    onLinkClick(node.url)\n                }\n            )\n        ) {\n            withStyle(SpanStyle(color = primaryColor, textDecoration = TextDecoration.Underline)) {\n                recurse(node.children)\n            }\n        }\n\n        is UnicodeEmoji -> append(node.emoji)\n\n        is EmojiCode -> {\n            val id = \":${node.name}:\"\n            if (emojiNameMap.containsKey(node.name)) {\n                appendInlineContent(id = id, alternateText = id)\n            } else {\n                append(id)\n            }\n        }\n\n        is MathBlock -> append(node.formula)\n        is MathInline -> append(node.formula)\n\n        is Search -> withStyle(SpanStyle(color = primaryColor)) {\n            append(\"${node.query} Search\")\n        }\n\n        is Fn -> appendFnNode(node, emojiNameMap, baseFontSize, primaryColor, onSurfaceVariantColor)\n\n        else -> {} // 未知ノードは無視\n    }\n}\n\nprivate fun AnnotatedString.Builder.appendFnNode(\n    node: Fn,\n    emojiNameMap: Map<String, CustomEmoji>,\n    baseFontSize: Float,\n    primaryColor: Color,\n    onSurfaceVariantColor: Color,\n) {\n    fun recurse(children: List<MfmNode>) {\n        appendMfmNodes(children, emojiNameMap, baseFontSize, primaryColor, onSurfaceVariantColor)\n    }\n\n    when (node.name) {\n        // サイズ拡大: プレビュー表示の崩れ防止のため 1.5x にキャップ\n        \"x2\", \"x3\", \"x4\" -> withStyle(SpanStyle(fontSize = (baseFontSize * 1.5f).sp)) {\n            recurse(node.children)\n        }\n\n        \"fg\" -> {\n            val color = parseMfmColor(node.args[\"color\"])?.let { Color(it) }\n            if (color != null) {\n                withStyle(SpanStyle(color = color)) { recurse(node.children) }\n            } else {\n                recurse(node.children)\n            }\n        }\n\n        \"bg\" -> {\n            val color = parseMfmColor(node.args[\"color\"])?.let { Color(it) }\n            if (color != null) {\n                withStyle(SpanStyle(background = color)) { recurse(node.children) }\n            } else {\n                recurse(node.children)\n            }\n        }\n\n        \"font\" -> {\n            val family = when {\n                node.args.containsKey(\"serif\") -> FontFamily.Serif\n                node.args.containsKey(\"monospace\") -> FontFamily.Monospace\n                node.args.containsKey(\"cursive\") -> FontFamily.Cursive\n                else -> null\n            }\n            if (family != null) {\n                withStyle(SpanStyle(fontFamily = family)) { recurse(node.children) }\n            } else {\n                recurse(node.children)\n            }\n        }\n\n        \"unixtime\" -> {\n            val innerText = buildAnnotatedString { recurse(node.children) }.text\n            val epochSec = innerText.trim().toLongOrNull()\n            if (epochSec != null) {\n                append(\n                    DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT)\n                        .format(Date(epochSec * 1000L))\n                )\n            } else {\n                recurse(node.children)\n            }\n        }\n\n        \"scale\" -> {\n            val scaleY = node.args[\"y\"]?.toFloatOrNull() ?: 1f\n            val cappedScale = scaleY.coerceIn(0.5f, 1.5f)\n            withStyle(SpanStyle(fontSize = (baseFontSize * cappedScale).sp)) {\n                recurse(node.children)\n            }\n        }\n\n        // ruby/flip/rotate/border/blur 等: 子テキストをプレーン表示\n        else -> recurse(node.children)\n    }\n}\n\n/**\n * MFM カラー文字列（3桁または6桁の HEX）を Android Color Int に変換する。\n * MFMDecorator.NodeDecorator.parseMfmColor と同一ロジック。\n */\nprivate fun parseMfmColor(hex: String?): Int? {\n    hex ?: return null\n    return try {\n        val expanded = when (hex.length) {\n            3 -> hex.map { \"$it$it\" }.joinToString(\"\")\n            6 -> hex\n            else -> return null\n        }\n        AndroidColor.parseColor(\"#$expanded\")\n    } catch (_: IllegalArgumentException) {\n        null\n    }\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/PageableFragmentFactory.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport androidx.fragment.app.Fragment\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\n\ninterface PageableFragmentFactory {\n    fun create(page: Page): Fragment\n    fun create(pageable: Pageable): Fragment\n    fun create(accountId: Long?, pageable: Pageable): Fragment\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/ReactionViewHelper.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.content.Context\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common_android.ui.VisibilityHelper.setMemoVisibility\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\n\nobject ReactionViewHelper {\n    @BindingAdapter(\"reactionImageView\", \"reactionStringView\", \"reaction\")\n    @JvmStatic\n    fun LinearLayout.setReaction(\n        reactionImageView: ImageView,\n        reactionStringView: TextView,\n        reaction: String\n    ) {\n        setReaction(this.context, reactionImageView, reactionStringView, reaction)\n\n    }\n\n    @BindingAdapter(\"reactionImageView\", \"reactionStringView\", \"reaction\")\n    @JvmStatic\n    fun FrameLayout.setReaction(\n        reactionImageView: ImageView,\n        reactionStringView: TextView,\n        reaction: String\n    ) {\n        setReaction(this.context, reactionImageView, reactionStringView, reaction)\n    }\n\n    @BindingAdapter(\"emojis\", \"reaction\")\n    @JvmStatic\n    fun ImageView.setCustomEmoji(\n        emojis: List<CustomEmoji>?,\n        reaction: String?,\n    ) {\n        reaction ?: return\n        val emoji = emojis?.firstOrNull {\n            \":${it.name}:\" == reaction\n        } ?: return\n\n        GlideApp.with(this)\n            .load(emoji.url)\n            .centerCrop()\n            .into(this)\n    }\n\n\n    private fun setReaction(\n        context: Context,\n        reactionImageView: ImageView,\n        reactionStringView: TextView,\n        reaction: String\n    ) {\n\n        val entryPoint = EntryPointAccessors.fromApplication(\n            context.applicationContext,\n            BindingProvider::class.java\n        )\n        val cache = entryPoint.customEmojiRepository()\n        val accountStore = entryPoint.accountStore()\n\n\n        //Log.d(\"ReactionViewHelper\", \"reaction $reaction\")\n        if (reaction.startsWith(\":\") && reaction.endsWith(\":\")) {\n            val account = accountStore.currentAccount\n            val emojis = if (account?.getHost() != null) {\n                cache.getAndConvertToMap(account.getHost()) ?: emptyMap()\n            } else {\n                emptyMap()\n            }\n\n            val emoji = emojis[reaction.replace(\":\", \"\")]\n\n            if (emoji != null) {\n                //Log.d(\"ReactionViewHelper\", \"カスタム絵文字を発見した: ${emoji}\")\n                if (emoji.cachePath == null) {\n                    GlideApp.with(reactionImageView.context)\n                        .load(emoji.url ?: emoji.uri)\n                        .into(reactionImageView)\n                } else {\n                    GlideApp.with(reactionImageView.context)\n                        .load(emoji.cachePath)\n                        .error(\n                            GlideApp.with(reactionImageView.context)\n                                .load(emoji.url ?: emoji.uri)\n                        )\n                        .into(reactionImageView)\n                }\n\n                reactionImageView.setMemoVisibility(View.VISIBLE)\n                reactionStringView.setMemoVisibility(View.GONE)\n                return\n            } else {\n                reactionImageView.setMemoVisibility(View.GONE)\n                reactionStringView.setMemoVisibility(View.VISIBLE)\n            }\n\n        }\n\n        val constantReaction = LegacyReaction.reactionMap[reaction]\n        if (constantReaction != null) {\n\n            reactionStringView.text = constantReaction\n            reactionImageView.setMemoVisibility(View.GONE)\n            reactionStringView.setMemoVisibility(View.VISIBLE)\n        } else {\n            //Log.d(\"ReactionViewHelper\", \"どれにも当てはまらなかった\")\n            reactionStringView.text = reaction\n            reactionImageView.setMemoVisibility(View.GONE)\n            reactionStringView.setMemoVisibility(View.VISIBLE)\n        }\n\n    }\n\n\n\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/TextType.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport dev.misskey.mfm.node.Link\nimport dev.misskey.mfm.node.MfmNode\nimport dev.misskey.mfm.node.Url\nimport net.pantasystem.milktea.common_android.html.MastodonHTML\nimport net.pantasystem.milktea.common_android.html.MastodonHTMLParser\nimport net.pantasystem.milktea.common_android.mfm.MFMParser\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\n\nsealed interface TextType {\n    data class Misskey(\n        val lazyDecorateResult: LazyDecorateResult?,\n        val nodes: List<MfmNode>,\n    ) : TextType {\n        fun getUrls(): List<String> = extractUrls(nodes)\n\n        private fun extractUrls(nodes: List<MfmNode>): List<String> {\n            return nodes.flatMap { node ->\n                when (node) {\n                    is Url -> listOf(node.url)\n                    is Link -> listOf(node.url) + extractUrls(node.children)\n                    else -> {\n                        val children = when (node) {\n                            is dev.misskey.mfm.node.Bold -> node.children\n                            is dev.misskey.mfm.node.Italic -> node.children\n                            is dev.misskey.mfm.node.Strike -> node.children\n                            is dev.misskey.mfm.node.Small -> node.children\n                            is dev.misskey.mfm.node.Center -> node.children\n                            is dev.misskey.mfm.node.Quote -> node.children\n                            is dev.misskey.mfm.node.Fn -> node.children\n                            else -> emptyList()\n                        }\n                        extractUrls(children)\n                    }\n                }\n            }\n        }\n    }\n    data class Mastodon(\n        val html: MastodonHTML,\n        val mentions: List<Note.Type.Mastodon.Mention>,\n        val tags: List<Note.Type.Mastodon.Tag>\n    ) : TextType\n}\n\nfun getTextType(\n    account: Account,\n    note: NoteRelation,\n    instanceEmojis: Map<String, CustomEmoji>?,\n    isRequirePerformNyaize: Boolean = false,\n): TextType? {\n    return when (account.instanceType) {\n        Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n            val text = note.note.text ?: return null\n            val nodes = MFMParser.parse(text) ?: emptyList()\n            val lazyDecorateResult = nodes.takeIf { it.isNotEmpty() }?.let {\n                MFMDecorator.decorate(\n                    sourceText = text,\n                    nodes = it,\n                    emojiNameMap = note.note.emojiNameMap ?: emptyMap(),\n                    instanceEmojiNameMap = instanceEmojis ?: emptyMap(),\n                    userHost = note.user.host,\n                    accountHost = account.getHost(),\n                    isRequireProcessNyaize = isRequirePerformNyaize,\n                    holder = LazyDecorateSkipElementsHolder(),\n                )\n            }\n            TextType.Misskey(lazyDecorateResult, nodes)\n        }\n        Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n            note.note.text?.let {\n                val option = note.note.type as? Note.Type.Mastodon\n                TextType.Mastodon(\n                    MastodonHTMLParser.parse(\n                        it,\n                        note.note.emojis ?: emptyList(),\n                        userHost = note.user.host,\n                        accountHost = account.getHost()\n                    ),\n                    tags = option?.tags ?: emptyList(),\n                    mentions = option?.mentions ?: emptyList()\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/UserPinnedNotesFragmentFactory.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport androidx.fragment.app.Fragment\nimport net.pantasystem.milktea.model.user.User\n\ninterface UserPinnedNotesFragmentFactory {\n    fun create(userId: User.Id): Fragment\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/UserTransitionHelper.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.app.Activity\nimport android.view.View\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.databinding.BindingAdapter\nimport dagger.hilt.android.EntryPointAccessors\nimport dagger.hilt.android.internal.managers.FragmentComponentManager\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.common_android.ui.putActivity\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.user.User\n\nobject UserTransitionHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"transitionDestinationUser\")\n    fun View.showUserDetail(user: User?){\n        user?: return\n        this.setOnClickListener { view ->\n            HapticFeedbackController.performClickHapticFeedback(view)\n            val context = view.context\n\n\n            val activity = FragmentComponentManager.findActivity(context) as Activity\n            val intent = EntryPointAccessors.fromActivity(activity, NavigationEntryPointForBinding::class.java)\n                .userDetailNavigation()\n                .newIntent(UserDetailNavigationArgs.UserId(user.id))\n\n            intent.putActivity(Activities.ACTIVITY_IN_APP)\n            if(context is Activity){\n                val compat = ActivityOptionsCompat.makeSceneTransitionAnimation(context, view, \"user\")\n                context.startActivity(intent, compat.toBundle())\n            }else{\n                context.startActivity(intent)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/ViewBackgroundColorHelper.kt",
    "content": "package net.pantasystem.milktea.common_android_ui\n\nimport android.util.TypedValue\nimport androidx.cardview.widget.CardView\nimport androidx.databinding.BindingAdapter\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common.ColorUtil\nimport net.pantasystem.milktea.common_android.R\n\nobject ViewBackgroundColorHelper {\n\n    @BindingAdapter(\"setCardViewSurfaceColor\")\n    @JvmStatic\n    fun CardView.setSurfaceColor(setCardViewSurfaceColor: Int?){\n        if (setCardViewSurfaceColor != null) {\n            this.setCardBackgroundColor(setCardViewSurfaceColor)\n        }\n        val cardView = this\n        val entryPoint = EntryPointAccessors.fromApplication(context.applicationContext, BindingProvider::class.java)\n        val store = entryPoint.colorSettingStore()\n        val typedValue = TypedValue()\n        cardView.context.theme.resolveAttribute(R.attr.colorSurface, typedValue, true)\n        cardView.setCardBackgroundColor(ColorUtil.matchOpaqueAndColor(store.surfaceColorOpaque, typedValue.data))\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/account/AccountSwitchingDialog.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.account\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.AccountSettingNavigation\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass AccountSwitchingDialog : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"AccountSwitchingDialog\"\n    }\n\n    @Inject\n    internal lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    internal lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var accountSettingNavigation: AccountSettingNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel: AccountViewModel by activityViewModels()\n\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return super.onCreateDialog(savedInstanceState).apply {\n            val view = ComposeView(requireContext()).apply {\n                setContent {\n                    MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                        val uiState by viewModel.uiState.collectAsState()\n                        AccountSwitchingDialogLayout(\n                            uiState = uiState,\n                            onSettingButtonClicked = {\n                                startActivity(accountSettingNavigation.newIntent(Unit))\n                                dismiss()\n                            },\n                            onAvatarIconClicked = { accountInfo ->\n                                startActivity(\n                                    userDetailNavigation.newIntent(UserDetailNavigationArgs.UserName(accountInfo.user?.let {\n                                        \"@${it.userName}@${it.host}\"\n                                    } ?: \"@${accountInfo.account.userName}@${accountInfo.account.getHost()}\"))\n                                )\n                                dismiss()\n                            },\n                            onAccountClicked = {\n                                viewModel.setSwitchTargetConnectionInstance(it.account)\n                                dismiss()\n                            },\n                            onAddAccountButtonClicked = {\n                                requireActivity().startActivity(authorizationNavigation.newIntent(AuthorizationArgs.New))\n                                dismiss()\n                            }\n                        )\n                    }\n                }\n            }\n            setContentView(view)\n        }\n    }\n\n\n\n}\n\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/account/AccountSwitchingDialogLayout.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.account\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.PersonAdd\nimport androidx.compose.material.icons.filled.Settings\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.common_android_ui.R\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountInfo\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModelUiState\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun AccountSwitchingDialogLayout(\n    uiState: AccountViewModelUiState,\n    onSettingButtonClicked: () -> Unit,\n    onAvatarIconClicked: (AccountInfo) -> Unit,\n    onAccountClicked: (AccountInfo) -> Unit,\n    onAddAccountButtonClicked: () -> Unit,\n) {\n    Surface(Modifier.fillMaxWidth(), shape = RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp)) {\n        Column(\n            Modifier.fillMaxWidth(),\n            horizontalAlignment = Alignment.CenterHorizontally\n        ) {\n            Row(\n                Modifier\n                    .fillMaxWidth(),\n                verticalAlignment = Alignment.CenterVertically,\n            ) {\n                Spacer(modifier = Modifier.width(56.dp))\n                Text(\n                    stringResource(id = R.string.account),\n                    fontSize = 18.sp,\n                    fontWeight = FontWeight.Bold,\n                    modifier = Modifier.weight(1f),\n                    textAlign = TextAlign.Center\n                )\n                IconButton(onClick = onSettingButtonClicked) {\n                    Icon(Icons.Default.Settings, contentDescription = null)\n                }\n            }\n            LazyColumn(\n                Modifier\n                    .fillMaxWidth()\n                    .height(250.dp)\n                    .nestedScroll(\n                        rememberNestedScrollInteropConnection()\n                    )\n            ) {\n                items(uiState.accounts) { account ->\n                    AccountTile(account = account, onClick = onAccountClicked, onAvatarClick = onAvatarIconClicked)\n                }\n            }\n\n            Button(\n                onClick = onAddAccountButtonClicked,\n                shape = RoundedCornerShape(32.dp),\n                contentPadding = PaddingValues(horizontal = 32.dp)\n            ) {\n                Icon(Icons.Default.PersonAdd, contentDescription = null)\n                Spacer(modifier = Modifier.width(4.dp))\n                Text(stringResource(id = R.string.add_account))\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/account/AccountTile.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.account\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.CheckCircle\nimport androidx.compose.material.icons.outlined.Circle\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountInfo\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\n\n@Composable\nfun AccountTile(\n    modifier: Modifier = Modifier,\n    account: AccountInfo,\n    onClick: (AccountInfo) -> Unit,\n    onAvatarClick: (AccountInfo) -> Unit,\n) {\n    Surface(\n        modifier = modifier.clickable {\n            onClick(account)\n        }\n    ) {\n        Row(\n            Modifier\n                .fillMaxWidth()\n                .padding(\n                    vertical = 12.dp,\n                    horizontal = 16.dp\n                ),\n        ) {\n            AvatarIcon(\n                url = account.user?.avatarUrl,\n                size = 56.dp,\n                onAvatarClick = {\n                    onAvatarClick(account)\n                },\n            )\n\n            Spacer(modifier = Modifier.width(8.dp))\n\n            Column(\n                modifier = Modifier.weight(1f),\n                verticalArrangement = Arrangement.Top\n            ) {\n                Row(\n                    modifier = Modifier.fillMaxWidth(),\n                    verticalAlignment = Alignment.CenterVertically\n                ) {\n                    if (account.user?.name != null) {\n                        CustomEmojiText(\n                            text = account.user.name ?: \"\", emojis = account.user.emojis,\n                            fontSize = 16.sp,\n                            fontWeight = FontWeight.Bold,\n                            accountHost = account.account.getHost(),\n                            sourceHost = account.user.host,\n                        )\n                        Spacer(modifier = Modifier.width(4.dp))\n                    }\n                    Text(\n                        account.user?.shortDisplayName ?: account.account.userName,\n                        fontSize = 16.sp,\n                        fontWeight = FontWeight.Bold\n                    )\n                }\n                Row(\n                    modifier = Modifier.fillMaxWidth(),\n                    verticalAlignment = Alignment.CenterVertically\n                ) {\n                    if (account.instanceMeta?.iconUrl != null) {\n                        Image(\n                            painter = rememberAsyncImagePainter(account.instanceMeta.iconUrl),\n                            contentDescription = null,\n                            modifier = Modifier\n                                .size(14.dp)\n                                .clip(\n                                    RoundedCornerShape(4.dp)\n                                ),\n                            contentScale = ContentScale.Crop\n                        )\n                    }\n                    Text(account.account.getHost())\n                }\n            }\n\n            CircleCheckbox(\n                selected = account.isCurrentAccount,\n                modifier = Modifier.align(Alignment.CenterVertically)\n            )\n        }\n    }\n}\n\n\n@Composable\n@Stable\nprivate fun CircleCheckbox(modifier: Modifier = Modifier, selected: Boolean) {\n\n    val color = MaterialTheme.colorScheme\n    val imageVector = if (selected) Icons.Filled.CheckCircle else Icons.Outlined.Circle\n    val tint = color.primary\n    val background = if (selected) Color.White else Color.Transparent\n\n    Icon(\n        imageVector = imageVector, tint = tint,\n        modifier = modifier.background(background, shape = CircleShape),\n        contentDescription = \"checkbox\"\n    )\n}\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/account/page/PageTypeHelper.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.account.page\n\nimport android.content.Context\nimport net.pantasystem.milktea.common_android_ui.R\nimport net.pantasystem.milktea.model.account.page.PageType\nimport net.pantasystem.milktea.model.account.page.PageType.ANTENNA\nimport net.pantasystem.milktea.model.account.page.PageType.CALCKEY_RECOMMENDED_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.CHANNEL_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.CLIP_NOTES\nimport net.pantasystem.milktea.model.account.page.PageType.DETAIL\nimport net.pantasystem.milktea.model.account.page.PageType.FAVORITE\nimport net.pantasystem.milktea.model.account.page.PageType.FEATURED\nimport net.pantasystem.milktea.model.account.page.PageType.GALLERY_FEATURED\nimport net.pantasystem.milktea.model.account.page.PageType.GALLERY_POPULAR\nimport net.pantasystem.milktea.model.account.page.PageType.GALLERY_POSTS\nimport net.pantasystem.milktea.model.account.page.PageType.GLOBAL\nimport net.pantasystem.milktea.model.account.page.PageType.HOME\nimport net.pantasystem.milktea.model.account.page.PageType.I_LIKED_GALLERY_POSTS\nimport net.pantasystem.milktea.model.account.page.PageType.LOCAL\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_BOOKMARK_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_HOME_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_LIST_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_LOCAL_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_MENTION_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_PUBLIC_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_SEARCH_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_TAG_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_TREND_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MASTODON_USER_TIMELINE\nimport net.pantasystem.milktea.model.account.page.PageType.MENTION\nimport net.pantasystem.milktea.model.account.page.PageType.MY_GALLERY_POSTS\nimport net.pantasystem.milktea.model.account.page.PageType.NOTIFICATION\nimport net.pantasystem.milktea.model.account.page.PageType.SEARCH\nimport net.pantasystem.milktea.model.account.page.PageType.SEARCH_HASH\nimport net.pantasystem.milktea.model.account.page.PageType.SOCIAL\nimport net.pantasystem.milktea.model.account.page.PageType.USER\nimport net.pantasystem.milktea.model.account.page.PageType.USERS_GALLERY_POSTS\nimport net.pantasystem.milktea.model.account.page.PageType.USER_LIST\n\n\nobject PageTypeHelper{\n\n\n    fun nameByPageType(context: Context, pageType: PageType): String{\n\n        return when(pageType){\n            GLOBAL -> context.getString(R.string.global_timeline)\n            SOCIAL -> context.getString(R.string.hybrid_timeline)\n            LOCAL -> context.getString(R.string.local_timeline)\n            HOME -> context.getString(R.string.home_timeline)\n            SEARCH -> context.getString(R.string.search)\n            SEARCH_HASH -> context.getString(R.string.tag)\n            USER -> context.getString(R.string.user)\n            FAVORITE -> context.getString(R.string.favorite)\n            FEATURED -> context.getString(R.string.featured)\n            DETAIL -> context.getString(R.string.conversation)\n            USER_LIST -> context.getString(R.string.list)\n            MENTION -> context.getString(R.string.mention)\n            NOTIFICATION -> context.getString(R.string.notification)\n            ANTENNA -> context.getString(R.string.antenna)\n            GALLERY_FEATURED -> context.getString(R.string.featured) + String.format(\"(%s)\", context.getString(R.string.gallery))\n            GALLERY_POPULAR -> context.getString(R.string.popular_posts) + String.format(\"(%s)\", context.getString(R.string.gallery))\n            GALLERY_POSTS -> context.getString(R.string.gallery)\n            USERS_GALLERY_POSTS -> context.getString(R.string.gallery) + \"(User)\"\n            MY_GALLERY_POSTS -> context.getString(R.string.my_posts) + String.format(\"(%s)\", context.getString(R.string.gallery))\n            I_LIKED_GALLERY_POSTS -> context.getString(R.string.my_liking) + String.format(\"(%s)\", context.getString(R.string.gallery))\n            CHANNEL_TIMELINE -> context.getString(R.string.channel)\n            MASTODON_LOCAL_TIMELINE -> context.getString(R.string.local_timeline)\n            MASTODON_PUBLIC_TIMELINE -> context.getString(R.string.global_timeline)\n            MASTODON_HOME_TIMELINE -> context.getString(R.string.home_timeline)\n            MASTODON_LIST_TIMELINE -> context.getString(R.string.list)\n            MASTODON_USER_TIMELINE -> context.getString(R.string.user)\n            CALCKEY_RECOMMENDED_TIMELINE -> context.getString(R.string.calckey_recomended_timeline)\n            CLIP_NOTES -> context.getString(R.string.clip)\n            MASTODON_BOOKMARK_TIMELINE -> context.getString(R.string.bookmark)\n            MASTODON_SEARCH_TIMELINE -> context.getString(R.string.search)\n            MASTODON_TAG_TIMELINE -> context.getString(R.string.tag)\n            MASTODON_TREND_TIMELINE -> context.getString(R.string.featured)\n            MASTODON_MENTION_TIMELINE -> context.getString(R.string.mention)\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/account/viewmodel/AccountViewModel.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.account.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.SignOutUseCase\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.SyncMetaExecutor\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@HiltViewModel\nclass AccountViewModel @Inject constructor(\n    loggerFactory: Logger.Factory,\n    instanceInfoService: InstanceInfoService,\n    private val accountStore: AccountStore,\n    private val userRepository: UserRepository,\n    private val signOutUseCase: SignOutUseCase,\n    private val syncMetaExecutor: SyncMetaExecutor,\n    configRepository: LocalConfigRepository,\n) : ViewModel() {\n\n    private val logger = loggerFactory.create(\"AccountViewModel\")\n\n\n    private val uiStateHelper = AccountViewModelUiStateHelper(\n        accountStore.observeCurrentAccount,\n        accountStore,\n        userRepository,\n        instanceInfoService,\n        viewModelScope\n    )\n\n\n    val uiState = uiStateHelper.uiState\n    val currentAccount =\n        accountStore.observeCurrentAccount.stateIn(viewModelScope, SharingStarted.Lazily, null)\n\n    val user = currentAccount.filterNotNull().flatMapLatest { account ->\n        userRepository.observe(User.Id(account.accountId, account.remoteId)).map {\n            it as? User.Detail\n        }\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null,\n    )\n\n    val config = configRepository.observe().stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        DefaultConfig.config,\n    )\n\n    private val _switchAccountEvent = MutableSharedFlow<Unit>(\n        extraBufferCapacity = 10,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val switchAccountEvent = _switchAccountEvent.asSharedFlow()\n\n\n    private val _showFollowersEvent = MutableSharedFlow<User.Id>(\n        extraBufferCapacity = 10,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val showFollowersEvent = _showFollowersEvent.asSharedFlow()\n\n    private val _showFollowingsEvent = MutableSharedFlow<User.Id>(\n        extraBufferCapacity = 10,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val showFollowingsEvent = _showFollowingsEvent.asSharedFlow()\n\n    private val _showProfileEvent = MutableSharedFlow<Account>(\n        extraBufferCapacity = 10,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val showProfileEvent = _showProfileEvent.asSharedFlow()\n\n\n    init {\n        accountStore.observeCurrentAccount.filterNotNull().onEach { ac ->\n            userRepository\n                .sync(User.Id(ac.accountId, ac.remoteId))\n        }.catch { e ->\n            logger.error(\"現在のアカウントの取得に失敗した\", e = e)\n        }.launchIn(viewModelScope + Dispatchers.IO)\n\n    }\n\n    fun setSwitchTargetConnectionInstance(account: Account) {\n        viewModelScope.launch {\n            accountStore.setCurrent(account)\n            syncMetaExecutor(account.normalizedInstanceUri)\n        }\n    }\n\n    fun showSwitchDialog() {\n        _switchAccountEvent.tryEmit(Unit)\n    }\n\n    fun showFollowers(userId: User.Id?) {\n        userId?.let {\n            _showFollowersEvent.tryEmit(it)\n        }\n    }\n\n    fun showFollowings(userId: User.Id?) {\n        userId?.let {\n            _showFollowingsEvent.tryEmit(it)\n        }\n    }\n\n    fun showProfile(account: Account?) {\n        if (account == null) {\n            logger.debug { \"showProfile account未取得のためキャンセル\" }\n            return\n        }\n        _showProfileEvent.tryEmit(account)\n    }\n\n\n    fun signOut(account: Account) {\n        viewModelScope.launch {\n            signOutUseCase(account).onFailure { e ->\n                logger.error(\"ログアウト処理失敗\", e)\n            }\n        }\n    }\n\n    fun addPage(page: Page) {\n        viewModelScope.launch {\n            try {\n                accountStore.addPage(page)\n            } catch (e: Throwable) {\n                logger.error(\"pageの追加に失敗\", e = e)\n            }\n        }\n    }\n\n\n}\n\n"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/account/viewmodel/AccountViewModelUiState.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.account.viewmodel\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.user.User\n\ndata class AccountInfo(\n    val account: Account,\n    val user: User?,\n    val instanceMeta: InstanceInfoType?,\n    val isCurrentAccount: Boolean,\n)\n\ndata class AccountViewModelUiState(\n    val currentAccount: Account? = null,\n    val accounts: List<AccountInfo> = emptyList(),\n) {\n    val currentAccountInfo: AccountInfo? by lazy {\n        accounts.firstOrNull {\n            it.account.accountId == currentAccount?.accountId\n        }\n    }\n}\n\nfun List<Account>.toAccountInfoList(\n    currentAccount: Account?,\n    instanceInfoList: List<InstanceInfoType?>,\n    users: List<User>,\n): List<AccountInfo> {\n    val userMap = users.associateBy {\n        it.id.accountId\n    }\n    val metaMap = instanceInfoList.filterNotNull().associateBy {\n        it.uri\n    }\n    return map {\n        AccountInfo(\n            it,\n            userMap[it.accountId],\n            metaMap[it.normalizedInstanceUri],\n            currentAccount?.accountId == it.accountId\n        )\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/account/viewmodel/AccountViewModelUiStateHelper.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.account.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\n\nclass AccountViewModelUiStateHelper(\n    currentAccountFlow: Flow<Account?>,\n    accountStore: AccountStore,\n    private val userRepository: UserRepository,\n    private val instanceInfoService: InstanceInfoService,\n    viewModelScope: CoroutineScope,\n) {\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val users = accountStore.observeAccounts.flatMapLatest { accounts ->\n        val flows = accounts.map {\n            userRepository.observe(User.Id(it.accountId, it.remoteId)).flowOn(Dispatchers.IO)\n        }\n        combine(flows) {\n            it.toList()\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val metaList = accountStore.observeAccounts.flatMapLatest { accounts ->\n        instanceInfoService.observeIn(accounts.map { it.normalizedInstanceUri })\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    private val accountWithUserList = combine(\n        accountStore.observeAccounts,\n        users,\n        currentAccountFlow,\n        metaList,\n    ) { accounts, users, current, metaList ->\n        accounts.toAccountInfoList(current, metaList, users)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    val uiState = combine(\n        currentAccountFlow,\n        accountWithUserList\n    ) { current, accounts ->\n        AccountViewModelUiState(\n            currentAccount = current,\n            accounts = accounts\n        )\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), AccountViewModelUiState())\n\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/error/UserActionAppGlobalErrorListener.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.error\n\nimport android.app.Dialog\nimport android.content.Context\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.coroutineScope\nimport androidx.lifecycle.flowWithLifecycle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.app_store.handler.AppGlobalError\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorAction\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorStore\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.APIErrorStringConverter\nimport net.pantasystem.milktea.common_android_ui.R\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport java.io.IOException\nimport javax.inject.Inject\n\nclass UserActionAppGlobalErrorListener @Inject constructor(\n    private val userActionAppGlobalErrorStore: UserActionAppGlobalErrorStore,\n    @ApplicationContext private val context: Context,\n) {\n\n    operator fun invoke(\n        lifecycle: Lifecycle,\n        fragmentManager: FragmentManager,\n    ) {\n        userActionAppGlobalErrorStore.errorFlow.onEach { appGlobalError ->\n            when (appGlobalError.level) {\n                AppGlobalError.ErrorLevel.Info -> {}\n                AppGlobalError.ErrorLevel.Warning -> {\n                    // toastで表示する\n                    Toast.makeText(\n                        context,\n                        appGlobalError.message.getString(context),\n                        Toast.LENGTH_SHORT\n                    )\n                        .show()\n                }\n\n                AppGlobalError.ErrorLevel.Error -> {\n                    val body = when (val error = appGlobalError.throwable) {\n                        is IOException -> {\n                            context.getString(R.string.network_error)\n                        }\n\n                        is APIError -> {\n                            APIErrorStringConverter()(error).getString(context)\n                        }\n\n                        is UnauthorizedException -> {\n                            context.getString(R.string.unauthorized_error)\n                        }\n\n                        else -> \"Unknown error\"\n\n                    }\n                    val dialogInstance = UserActionAppGlobalErrorDialog.newInstance(\n                        title = appGlobalError.message.getString(context),\n                        message = body,\n                        detail = appGlobalError.throwable?.toString(),\n                        id = appGlobalError.id,\n                        retryable = appGlobalError.retryable,\n                        tag = appGlobalError.tag,\n                    )\n                    fragmentManager.findFragmentByTag(\"error_dialog\")?.let {\n                        fragmentManager.beginTransaction().remove(it).commit()\n                    }\n                    dialogInstance.show(fragmentManager, \"error_dialog\")\n                }\n            }\n        }.flowWithLifecycle(\n            lifecycle,\n            Lifecycle.State.RESUMED,\n        ).launchIn(lifecycle.coroutineScope)\n    }\n}\n\n@AndroidEntryPoint\n\nclass UserActionAppGlobalErrorDialog : DialogFragment() {\n\n    @Inject\n    internal lateinit var userActionAppGlobalErrorStore: UserActionAppGlobalErrorStore\n\n    companion object {\n        const val EXTRA_TITLE = \"title\"\n        const val EXTRA_MESSAGE = \"message\"\n        const val EXTRA_DETAIL = \"detail\"\n        const val EXTRA_ERROR_ID = \"error_id\"\n        const val EXTRA_RETRYABLE = \"retryable\"\n        const val EXTRA_TAG = \"error_tag\"\n\n        fun newInstance(id: String, tag: String, title: String?, message: String, detail: String?, retryable: Boolean): UserActionAppGlobalErrorDialog {\n            return UserActionAppGlobalErrorDialog().apply {\n                arguments = Bundle().apply {\n                    putString(EXTRA_TITLE, title)\n                    putString(EXTRA_MESSAGE, message)\n                    // 1MB未満にする\n                    putString(EXTRA_DETAIL, detail?.take(1024 * 1024 - 1))\n                    putBoolean(EXTRA_RETRYABLE, retryable)\n                    putString(EXTRA_ERROR_ID, id)\n                    putString(EXTRA_TAG, tag)\n                }\n            }\n        }\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .also {  dialog ->\n                if (arguments?.getString(EXTRA_TITLE) != null) {\n                    dialog.setTitle(\n                        arguments?.getString(EXTRA_TITLE) ?: \"\"\n                    )\n                }\n                if (arguments?.getString(EXTRA_DETAIL) != null) {\n                    dialog.setNeutralButton(R.string.detail) { _, _ ->\n                        val detail = arguments?.getString(EXTRA_DETAIL) ?: \"\"\n                        if (detail.isNotEmpty()) {\n                            val d = newInstance(\n                                title = null,\n                                message = detail,\n                                detail = null,\n                                id = arguments?.getString(EXTRA_ERROR_ID) ?: \"\",\n                                retryable = arguments?.getBoolean(EXTRA_RETRYABLE) ?: false,\n                                tag = arguments?.getString(EXTRA_TAG) ?: \"\",\n                            )\n                            d.show(parentFragmentManager, \"error_dialog\")\n                        }\n                    }\n                }\n                if (arguments?.getBoolean(EXTRA_RETRYABLE) == true) {\n                    dialog.setPositiveButton(R.string.retry) { _, _ ->\n                        userActionAppGlobalErrorStore.onAction(\n                            UserActionAppGlobalErrorAction(\n                                errorId = arguments?.getString(EXTRA_ERROR_ID) ?: \"\",\n                                tag = arguments?.getString(EXTRA_TAG) ?: \"\",\n                                type = UserActionAppGlobalErrorAction.Type.Retry,\n                            )\n                        )\n                    }\n                    dialog.setNegativeButton(R.string.cancel) { _, _ ->\n                        dismiss()\n                    }\n                } else {\n                    dialog.setPositiveButton(android.R.string.ok) { _, _ ->\n                        dismiss()\n                    }\n                }\n            }\n            .setMessage(\n                arguments?.getString(EXTRA_MESSAGE) ?: \"\"\n            )\n\n            .create()\n    }\n\n    override fun onDismiss(dialog: DialogInterface) {\n        super.onDismiss(dialog)\n        userActionAppGlobalErrorStore.onAction(\n            UserActionAppGlobalErrorAction(\n                errorId = arguments?.getString(EXTRA_ERROR_ID) ?: \"\",\n                tag = arguments?.getString(EXTRA_TAG) ?: \"\",\n                type = UserActionAppGlobalErrorAction.Type.Dismiss,\n            )\n        )\n    }\n\n    override fun onCancel(dialog: DialogInterface) {\n        super.onCancel(dialog)\n        userActionAppGlobalErrorStore.onAction(\n            UserActionAppGlobalErrorAction(\n                errorId = arguments?.getString(EXTRA_ERROR_ID) ?: \"\",\n                tag = arguments?.getString(EXTRA_TAG) ?: \"\",\n                type = UserActionAppGlobalErrorAction.Type.Cancel,\n            )\n        )\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/reaction/ReactionAutoCompleteArrayAdapter.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.reaction\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.BaseAdapter\nimport android.widget.Filter\nimport android.widget.Filterable\nimport androidx.databinding.DataBindingUtil\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.common_android_ui.R\nimport net.pantasystem.milktea.common_android_ui.databinding.ItemReactionPreviewBinding\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\n\nclass ReactionAutoCompleteArrayAdapter(\n    private val account: Account,\n    private val context: Context,\n    private val customEmojiRepository: CustomEmojiRepository,\n) : BaseAdapter(), Filterable{\n\n    var suggestions = listOf<String>()\n        private set\n\n    override fun getCount(): Int {\n        return suggestions.size\n    }\n\n    override fun getItem(position: Int): String {\n        return suggestions[position]\n    }\n\n    override fun getItemId(position: Int): Long {\n        return position.toLong()\n    }\n\n    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {\n        var view = convertView\n        val binding: ItemReactionPreviewBinding\n        if(view == null){\n            val inflater = LayoutInflater.from(context)\n            binding = DataBindingUtil.inflate(inflater, R.layout.item_reaction_preview, parent, false)\n            view = binding.root\n            view.tag = binding\n        }else{\n            binding = view.tag as ItemReactionPreviewBinding\n        }\n        binding.reaction = getItem(position)\n\n        return binding.root\n    }\n\n    private val mFilter = object : Filter(){\n        override fun performFiltering(constraint: CharSequence?): FilterResults {\n            var suggestions = listOf<String>()\n\n            val text = constraint?.toString()\n            if(text != null){\n                suggestions = runBlocking {\n                    customEmojiRepository.search(account.getHost(), text.replace(\":\", \"\")).getOrElse { emptyList() }.map {\n                        \":${it.name}:\"\n                    }\n                }\n            }\n\n            val results = FilterResults()\n            results.values = suggestions\n            results.count = suggestions.size\n            return results\n        }\n\n        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {\n            val resultCount = results?.count?: 0\n            suggestions = (results?.values as? List<*>?)?.mapNotNull {\n                it as? String\n            } ?: emptyList()\n            if(resultCount > 0){\n                notifyDataSetChanged()\n            }else{\n                notifyDataSetInvalidated()\n            }\n        }\n    }\n    override fun getFilter(): Filter {\n        return mFilter\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/reaction/ReactionChoicesAdapter.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.reaction\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport net.pantasystem.milktea.common_android_ui.R\nimport net.pantasystem.milktea.common_android_ui.databinding.ItemReactionChoiceBinding\nimport net.pantasystem.milktea.model.note.reaction.ReactionSelection\n\nclass ReactionChoicesAdapter(\n    val reactionSelection: ReactionSelection\n) : ListAdapter<String, ReactionChoicesAdapter.Holder>(\n    DiffUtilItemCallback()\n){\n    class DiffUtilItemCallback : DiffUtil.ItemCallback<String>(){\n        override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {\n            return oldItem == newItem\n        }\n\n        override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {\n            return oldItem == newItem\n        }\n    }\n    class Holder(val binding : ItemReactionChoiceBinding) : RecyclerView.ViewHolder(binding.root)\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {\n        val binding =\n            DataBindingUtil.inflate<ItemReactionChoiceBinding>(\n                LayoutInflater.from(parent.context),\n                R.layout.item_reaction_choice,\n                parent,\n                false\n            )\n        return Holder(\n            binding\n        )\n    }\n    override fun onBindViewHolder(holder: Holder, position: Int) {\n        holder.binding.reaction = getItem(position)\n        holder.binding.reactionSelection = reactionSelection\n        holder.binding.executePendingBindings()\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/report/ReportDialog.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.report\n\nimport android.app.Dialog\nimport android.content.DialogInterface\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.core.widget.addTextChangedListener\nimport androidx.fragment.app.activityViewModels\nimport net.pantasystem.milktea.common_android_ui.R\nimport net.pantasystem.milktea.common_android_ui.databinding.DialogReportBinding\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\nclass ReportDialog : AppCompatDialogFragment(){\n\n    companion object {\n        const val FRAGMENT_TAG = \"ReportDialog\"\n        private const val EXTRA_USER_ID = \"USER_ID\"\n        private const val EXTRA_ACCOUNT_ID = \"ACCOUNT_ID\"\n        private const val EXTRA_TEXT = \"TEXT\"\n        private const val EXTRA_NOTE_IDS = \"NOTE_IDS\"\n        fun newInstance(userId: User.Id) : ReportDialog {\n            return ReportDialog().also {\n                it.arguments = Bundle().apply {\n                    putString(EXTRA_USER_ID, userId.id)\n                    putLong(EXTRA_ACCOUNT_ID, userId.accountId)\n                }\n            }\n        }\n\n        fun newInstance(userId: User.Id, text: String, noteIds: List<Note.Id>) : ReportDialog {\n            return ReportDialog().also { reportDialog ->\n                reportDialog.arguments = Bundle().apply {\n                    putString(EXTRA_USER_ID, userId.id)\n                    putLong(EXTRA_ACCOUNT_ID, userId.accountId)\n                    putString(EXTRA_TEXT, text)\n                    putStringArray(EXTRA_NOTE_IDS, noteIds.map { it.noteId }.toTypedArray())\n                }\n            }\n        }\n    }\n\n    private var _binding: DialogReportBinding? = null\n    private val binding: DialogReportBinding\n        get() = _binding!!\n\n    private val viewModel: ReportViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n        val view = View.inflate(dialog.context, R.layout.dialog_report, null)\n\n        val uId = arguments?.getString(EXTRA_USER_ID)!!\n        val aId = arguments?.getLong(EXTRA_ACCOUNT_ID)!!\n        val noteIds = arguments?.getStringArray(EXTRA_NOTE_IDS)?.toList()?.map {\n            Note.Id(aId, it)\n        } ?: emptyList()\n        val comment = arguments?.getString(EXTRA_TEXT)\n\n        viewModel.newState(User.Id(aId, uId), comment = comment, noteIds = noteIds)\n\n        dialog.setContentView(view)\n        _binding = DialogReportBinding.bind(view)\n        binding.input.addTextChangedListener {\n            viewModel.changeComment(it?.toString())\n        }\n\n        binding.sendButton.setOnClickListener {\n            viewModel.submit()\n            dismiss()\n        }\n        binding.cancelButton.setOnClickListener {\n            dismiss()\n        }\n\n        binding.lifecycleOwner = requireActivity()\n        binding.reportViewModel = viewModel\n\n        return dialog\n    }\n\n\n    override fun onDismiss(dialog: DialogInterface) {\n        super.onDismiss(dialog)\n\n        _binding?.lifecycleOwner = null\n        _binding = null\n\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/report/ReportViewModel.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.report\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.report.ReportState\nimport net.pantasystem.milktea.model.user.report.SendReportUseCase\nimport javax.inject.Inject\n\n\n\n\n@HiltViewModel\nclass ReportViewModel @Inject constructor(\n    val sendReportUseCase: SendReportUseCase,\n): ViewModel(){\n\n\n    private val _state = MutableStateFlow<ReportState>(ReportState.None)\n    val state: StateFlow<ReportState> = _state\n\n    val successOrFailureEvent = state.distinctUntilChangedBy {\n        it is ReportState.Sending.Success\n                || it is ReportState.Sending.Failed\n    }.shareIn(viewModelScope, SharingStarted.WhileSubscribed(5_000))\n\n    val comment = state.map {\n        (it as? ReportState.Specify)?.comment\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, null)\n\n    val userId = state.map {\n        (it as? ReportState.Specify)?.userId\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, null)\n\n    val canSend = state.map {\n        it is ReportState.Specify && it.canSend\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, false)\n\n\n    fun changeComment(text: String?) {\n        if(state.value is ReportState.Sending) {\n            return\n        }\n        _state.value = (state.value as? ReportState.Specify)?.copy(\n            comment = text ?: \"\"\n        ) ?: ReportState.None\n    }\n\n\n    fun clear() {\n        _state.value = ReportState.None\n    }\n\n    fun newState(userId: User.Id, comment: String?, noteIds: List<Note.Id>) {\n        _state.value = ReportState.Specify(userId, noteIds,comment ?: \"\")\n    }\n\n    fun submit() {\n        viewModelScope.launch {\n            sendReportUseCase.invoke(state.value).collect {\n                _state.value = it\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/tab/TabViewCompositeClickListener.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.tab\n\n\nimport com.google.android.material.tabs.TabLayout\nimport java.util.*\n\nclass TabViewCompositeClickListener(private val mTabLayout: TabLayout) {\n\n    private val listeners: MutableList<(tab: TabLayout.Tab, position: Int) -> Unit> = ArrayList()\n\n    fun addListener(listener: (tab: TabLayout.Tab, position: Int) -> Unit) {\n        listeners.add(listener)\n    }\n\n    fun removeListener(listener: (tab: TabLayout.Tab, position: Int) -> Unit) {\n        listeners.remove(listener)\n    }\n\n    fun build() {\n        for (i in 0 until mTabLayout.tabCount) {\n            mTabLayout.getTabAt(i)!!.view.setOnClickListener {\n                for (listener in listeners) {\n                    listener(mTabLayout.getTabAt(i)!!, i)\n                }\n            }\n        }\n    }\n\n    fun getListeners(): List<(tab: TabLayout.Tab, position: Int) -> Unit> {\n        return listeners\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/tab/TabbedFlexboxListMediator.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.tab\n\n\nimport androidx.recyclerview.widget.LinearSmoothScroller\nimport androidx.recyclerview.widget.RecyclerView\nimport androidx.recyclerview.widget.RecyclerView.SmoothScroller\nimport com.google.android.flexbox.FlexboxLayoutManager\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayout.OnTabSelectedListener\n\n/**\n * This class is made to provide the ability to sync between RecyclerView's specific items with\n * TabLayout tabs.\n *\n * @param mRecyclerView     The RecyclerView that is going to be synced with the TabLayout\n * @param mTabLayout        The TabLayout that is going to be synced with the RecyclerView specific\n *                          items.\n * @param mIndices          The indices of the RecyclerView's items that is going to be playing a\n *                          role of \"check points\" for the syncing operation.\n * @param mIsSmoothScroll   Defines the ability of smooth scroll when clicking the tabs of the\n *                          TabLayout.\n */\nclass TabbedFlexboxListMediator(\n    private val mRecyclerView: RecyclerView,\n    private val mTabLayout: TabLayout,\n    private var mIndices: List<Int>,\n    private var mIsSmoothScroll: Boolean = false\n) {\n\n    private var mIsAttached = false\n\n    private var mRecyclerState = RecyclerView.SCROLL_STATE_IDLE\n    private var mTabClickFlag = false\n\n    private val smoothScroller: SmoothScroller =\n        object : LinearSmoothScroller(mRecyclerView.context) {\n            override fun getVerticalSnapPreference(): Int {\n                return SNAP_TO_START\n            }\n        }\n\n    private var tabViewCompositeClickListener: TabViewCompositeClickListener =\n        TabViewCompositeClickListener(mTabLayout)\n\n    /**\n     * Calling this method will ensure that the data that has been provided to the mediator is\n     * valid for use, and start syncing between the the RecyclerView and the TabLayout.\n     *\n     * Call this method when you have:\n     *      1- provided a RecyclerView Adapter,\n     *      2- provided a TabLayout with the appropriate number of tabs,\n     *      3- provided indices of the recyclerview items that you are syncing the tabs with. (You\n     *         need to be providing indices of at most the number of Tabs inflated in the TabLayout.)\n     */\n    fun attach() {\n        mRecyclerView.adapter\n            ?: throw RuntimeException(\"Cannot attach with no Adapter provided to RecyclerView\")\n\n        if (mTabLayout.tabCount == 0)\n            throw RuntimeException(\"Cannot attach with no tabs provided to TabLayout\")\n\n        if (mIndices.size > mTabLayout.tabCount)\n            throw RuntimeException(\"Cannot attach using more indices than the available tabs\")\n\n        notifyIndicesChanged()\n        mIsAttached = true\n    }\n\n    /**\n     * Calling this method will ensure to stop the synchronization between the RecyclerView and\n     * the TabLayout.\n     */\n\n    fun detach() {\n        clearListeners()\n        mIsAttached = false\n    }\n\n    /**\n     * This method will ensure that the synchronization is up-to-date with the data provided.\n     */\n    private fun reAttach() {\n        detach()\n        attach()\n    }\n\n    /**\n     * Calling this method will\n     */\n    fun updateMediatorWithNewIndices(newIndices: List<Int>): TabbedFlexboxListMediator {\n        mIndices = newIndices\n\n        if (mIsAttached) {\n            reAttach()\n        }\n\n        return this\n    }\n\n    /**\n     * This method will ensure that any listeners that have been added by the mediator will be\n     * removed, including the one listener from\n     * @see TabbedListMediator#addOnViewOfTabClickListener((TabLayout.Tab, int) -> Unit)\n     */\n\n    private fun clearListeners() {\n        mRecyclerView.clearOnScrollListeners()\n        for (i in 0 until mTabLayout.tabCount) {\n            mTabLayout.getTabAt(i)!!.view.setOnClickListener(null)\n        }\n        for (i in tabViewCompositeClickListener.getListeners().indices) {\n            tabViewCompositeClickListener.getListeners().toMutableList().removeAt(i)\n        }\n        mTabLayout.removeOnTabSelectedListener(onTabSelectedListener)\n        mRecyclerView.removeOnScrollListener(onScrollListener)\n    }\n\n    /**\n     * This method will attach the listeners required to make the synchronization possible.\n     */\n\n    private fun notifyIndicesChanged() {\n        tabViewCompositeClickListener.addListener { _, _ -> mTabClickFlag = true }\n        tabViewCompositeClickListener.build()\n        mTabLayout.addOnTabSelectedListener(onTabSelectedListener)\n        mRecyclerView.addOnScrollListener(onScrollListener)\n    }\n\n    private val onTabSelectedListener = object : OnTabSelectedListener {\n        override fun onTabSelected(tab: TabLayout.Tab) {\n\n            if (!mTabClickFlag) return\n\n            val position = tab.position\n\n            if (mIsSmoothScroll) {\n                smoothScroller.targetPosition = mIndices[position]\n                mRecyclerView.layoutManager?.startSmoothScroll(smoothScroller)\n            } else {\n//                (mRecyclerView.layoutManager as FlexboxLayoutManager?)?.scrollToPositionWithOffset(\n//                    mIndices[position],\n//                    0\n//                )\n                (mRecyclerView.layoutManager as FlexboxLayoutManager?)?.scrollToPosition(mIndices[position])\n                mTabClickFlag = false\n            }\n        }\n\n        override fun onTabUnselected(tab: TabLayout.Tab) {}\n        override fun onTabReselected(tab: TabLayout.Tab) {}\n    }\n\n    private val onScrollListener = object : RecyclerView.OnScrollListener() {\n        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n            mRecyclerState = newState\n            if (mIsSmoothScroll && newState == RecyclerView.SCROLL_STATE_IDLE) {\n                mTabClickFlag = false\n            }\n        }\n\n        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n            super.onScrolled(recyclerView, dx, dy)\n            if (mTabClickFlag) {\n                return\n            }\n\n            val flexboxLayoutManager: FlexboxLayoutManager =\n                recyclerView.layoutManager as FlexboxLayoutManager?\n                    ?: throw RuntimeException(\"No FlexboxLayoutManager attached to the RecyclerView.\")\n\n            var itemPosition =\n                flexboxLayoutManager.findFirstCompletelyVisibleItemPosition()\n\n            if (itemPosition == -1) {\n                itemPosition =\n                    flexboxLayoutManager.findFirstVisibleItemPosition()\n            }\n\n            if (mRecyclerState == RecyclerView.SCROLL_STATE_DRAGGING\n                || mRecyclerState == RecyclerView.SCROLL_STATE_SETTLING\n            ) {\n                for (i in mIndices.indices) {\n                    if (itemPosition == mIndices[i]) {\n                        if (!mTabLayout.getTabAt(i)!!.isSelected) {\n                            mTabLayout.getTabAt(i)!!.select()\n                        }\n                        if (flexboxLayoutManager.findLastCompletelyVisibleItemPosition() == mIndices[mIndices.size - 1]) {\n                            if (!mTabLayout.getTabAt(mIndices.size - 1)!!.isSelected) {\n                                mTabLayout.getTabAt(mIndices.size - 1)!!.select()\n                            }\n                            return\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * @return the state of the mediator, either attached or not.\n     */\n\n    fun isAttached(): Boolean {\n        return mIsAttached\n    }\n\n    /**\n     * @return the state of the mediator, is smooth scrolling or not.\n     */\n\n    fun isSmoothScroll(): Boolean {\n        return mIsSmoothScroll\n    }\n\n    /**\n     * @param smooth sets up the mediator with smooth scrolling\n     */\n\n    fun setSmoothScroll(smooth: Boolean) {\n        mIsSmoothScroll = smooth\n    }\n\n    /**\n     * @param listener the listener the will applied on \"the view\" of the tab. This method is useful\n     * when attaching a click listener on the tabs of the TabLayout.\n     * Note that this method is REQUIRED in case of the need of adding a click listener on the view\n     * of a tab layout. Since the mediator uses a click flag @see TabbedListMediator#mTabClickFlag\n     * it's taking the place of the normal on click listener, and thus the need of the composite click\n     * listener pattern, so adding listeners should be done using this method.\n     */\n\n    fun addOnViewOfTabClickListener(\n        listener: (tab: TabLayout.Tab, position: Int) -> Unit\n    ) {\n        tabViewCompositeClickListener.addListener(listener)\n        if (mIsAttached) {\n            notifyIndicesChanged()\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/user/FollowRequestsFragmentFactory.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.user\n\nimport androidx.fragment.app.Fragment\n\ninterface FollowRequestsFragmentFactory {\n    fun create(): Fragment\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/user/UserChipListAdapter.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.user\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport net.pantasystem.milktea.common_android_ui.R\nimport net.pantasystem.milktea.common_android_ui.databinding.ItemUserChipBinding\nimport net.pantasystem.milktea.common_viewmodel.UserViewData\n\nclass UserChipListAdapter(val lifecycleOwner: LifecycleOwner) :\n    ListAdapter<UserViewData, UserChipListAdapter.VH>(Diff()) {\n    class VH(val binding: ItemUserChipBinding) : RecyclerView.ViewHolder(binding.root)\n\n    class Diff : DiffUtil.ItemCallback<UserViewData>() {\n        override fun areContentsTheSame(oldItem: UserViewData, newItem: UserViewData): Boolean {\n            return oldItem.userId == newItem.userId && oldItem.user.value == newItem.user.value\n        }\n\n        override fun areItemsTheSame(oldItem: UserViewData, newItem: UserViewData): Boolean {\n            return oldItem.userId == newItem.userId\n        }\n    }\n\n    override fun onBindViewHolder(holder: VH, position: Int) {\n        holder.binding.userViewData = getItem(position)\n        holder.binding.lifecycleOwner = lifecycleOwner\n        holder.binding.executePendingBindings()\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {\n\n        return VH(\n            DataBindingUtil.inflate(\n                LayoutInflater.from(parent.context),\n                R.layout.item_user_chip,\n                parent,\n                false\n            )\n        )\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/java/net/pantasystem/milktea/common_android_ui/user/UserTextHelper.kt",
    "content": "package net.pantasystem.milktea.common_android_ui.user\n\nimport android.view.View\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiDecorator\nimport net.pantasystem.milktea.common_android_ui.BindingProvider\nimport net.pantasystem.milktea.common_android_ui.DecorateTextHelper\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\n\nobject UserTextHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"mainNameView\", \"subNameView\", \"user\", \"account\")\n    fun View.setUserInfo(\n        mainNameView: TextView?,\n        subNameView: TextView?,\n        user: User?,\n        account: Account?,\n    ) {\n        val isUserNameDefault = EntryPointAccessors.fromApplication(\n            this.context.applicationContext,\n            BindingProvider::class.java\n        )\n            .settingStore()\n            .isUserNameDefault\n        setUserInfo(\n            mainNameView = mainNameView,\n            subNameView = subNameView,\n            user = user,\n            account = account,\n            isUserNameDefault = isUserNameDefault\n        )\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"mainNameView\", \"subNameView\", \"user\", \"account\", \"isUserNameDefault\")\n    fun View.setUserInfo(\n        mainNameView: TextView?,\n        subNameView: TextView?,\n        user: User?,\n        account: Account?,\n        isUserNameDefault: Boolean = false\n    ) {\n        user ?: return\n\n        val userName: TextView?\n        val name: TextView?\n        if (isUserNameDefault) {\n            name = subNameView\n            userName = mainNameView\n        } else {\n            name = mainNameView\n            userName = subNameView\n        }\n        name?.let {\n            DecorateTextHelper.stopDrawableAnimations(it)\n            name.setText(\n                CustomEmojiDecorator().decorate(\n                    accountHost = account?.getHost(),\n                    result = user.parsedResult,\n                    name\n                ),\n                TextView.BufferType.SPANNABLE,\n            )\n        }\n        userName?.let {\n            userName.setText(\n                user.displayUserName,\n                TextView.BufferType.NORMAL\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/common_android_ui/src/main/res/layout/dialog_report.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <data>\n        <variable\n                name=\"reportViewModel\"\n                type=\"net.pantasystem.milktea.common_android_ui.report.ReportViewModel\" />\n    </data>\n\n    <RelativeLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\">\n        <TextView\n                android:id=\"@+id/titleView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/report\"\n                android:textSize=\"@dimen/dialog_title_font_size\"\n                android:textColor=\"?android:attr/textColorPrimary\"\n                android:layout_marginBottom=\"8dp\"\n                />\n        <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/inputReportDetailLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:layout_below=\"@id/titleView\"\n                style=\"?textInputOutlinedStyle\"\n                >\n            <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/input\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/detail\"\n                    android:singleLine=\"true\"\n                    android:inputType=\"textMultiLine\"\n                    android:text=\"@{reportViewModel.comment}\"\n                    />\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <Button\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/inputReportDetailLayout\"\n                android:id=\"@+id/cancelButton\"\n                android:layout_toStartOf=\"@id/sendButton\"\n                android:layout_marginEnd=\"8dp\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:text=\"@android:string/cancel\"\n                />\n        <Button\n                android:id=\"@+id/sendButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/inputReportDetailLayout\"\n                android:layout_alignParentEnd=\"true\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:text=\"@string/send\"\n                android:enabled=\"@{reportViewModel.canSend}\"\n                />\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "modules/common_android_ui/src/main/res/layout/dialog_switch_account.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:orientation=\"vertical\"\n        android:padding=\"8dp\"\n        android:background=\"?attr/colorSurface\"\n\n        >\n\n    <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:srcCompat=\"@drawable/ic_expand_more_black_24dp\"\n            android:layout_gravity=\"center\"\n            tools:ignore=\"ContentDescription\"\n            app:tint=\"?attr/normalIconTint\" />\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/accounts_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"300dp\">\n\n    </androidx.recyclerview.widget.RecyclerView>\n\n    <Button\n            android:id=\"@+id/add_account\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/add_account\"\n            />\n\n</LinearLayout>"
  },
  {
    "path": "modules/common_android_ui/src/main/res/layout/item_reaction_choice.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <data>\n        <variable\n                name=\"reaction\"\n                type=\"String\" />\n       <variable\n                name=\"reactionSelection\"\n                type=\"net.pantasystem.milktea.model.note.reaction.ReactionSelection\" />\n    </data>\n    <FrameLayout\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:padding=\"8dp\"\n            reactionImageView=\"@{reactionImagePreview}\"\n            reactionStringView=\"@{reactionStringPreview}\"\n            reaction=\"@{reaction}\"\n            android:onClick=\"@{ ()-> reactionSelection.selectReaction(reaction) }\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:theme=\"@style/EmojiPickerLayoutStyle\"\n            >\n        <ImageView\n                android:id=\"@+id/reactionImagePreview\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_gravity=\"center\"\n                tools:visibility=\"gone\"\n                tools:ignore=\"ContentDescription\" />\n        <TextView\n                android:id=\"@+id/reactionStringPreview\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                tools:text=\"😇\"\n                tools:visibility=\"visible\"\n                android:gravity=\"center\"\n                android:textColor=\"?android:textColorPrimary\"\n                />\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "modules/common_android_ui/src/main/res/layout/item_reaction_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <variable\n                name=\"reaction\"\n                type=\"java.lang.String\" />\n\n    </data>\n\n    <LinearLayout\n            android:orientation=\"horizontal\" android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"10dp\"\n            reactionImageView=\"@{reactionImagePreview}\"\n            reactionStringView=\"@{reactionStringPreview}\"\n            reaction=\"@{reaction}\"\n            android:background=\"?attr/colorSurface\"\n            >\n\n        <ImageView\n                android:id=\"@+id/reactionImagePreview\"\n                android:layout_width=\"25dp\"\n                android:layout_height=\"25dp\"\n                android:layout_gravity=\"center\"\n                android:layout_marginEnd=\"4dp\"\n                tools:ignore=\"ContentDescription\" />\n        <TextView\n                android:id=\"@+id/reactionStringPreview\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"😇\"\n                android:layout_gravity=\"center\"\n            />\n\n        <TextView\n                android:id=\"@+id/textView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:layout_gravity=\"center\"\n                android:text=\"@{reaction}\" />\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/common_android_ui/src/main/res/layout/item_user_chip.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <variable\n                name=\"userViewData\"\n                type=\"net.pantasystem.milktea.common_viewmodel.UserViewData\" />\n\n        <import type=\"net.pantasystem.milktea.model.user.User\" />\n    </data>\n    <LinearLayout\n            android:background=\"@drawable/shape_chip\"\n            android:layout_height=\"wrap_content\"\n            android:layout_width=\"wrap_content\"\n            android:padding=\"4dp\"\n            android:layout_margin=\"4dp\"\n            android:orientation=\"horizontal\"\n            tools:ignore=\"UseCompoundDrawables\"\n            app:mainNameView=\"@{mainName}\"\n            app:subNameView=\"@{null}\"\n            app:user=\"@{userViewData.user}\"\n            app:account=\"@{userViewData.account}\"\n            >\n        <net.pantasystem.milktea.common.ui.AvatarIconView\n                android:layout_width=\"25dp\"\n                android:layout_height=\"25dp\"\n                tools:src=\"@drawable/ic_person_black_24dp\"\n                app:imageUrl=\"@{userViewData.user.avatarUrl}\"\n                app:blurhash=\"@{userViewData.user.avatarBlurhash}\"\n                app:iconShape=\"circle\"\n                tools:ignore=\"ContentDescription\"\n                android:layout_gravity=\"center_vertical\"\n                android:layout_marginEnd=\"4dp\"\n                applyShapeFromConfig=\"@{true}\"\n            />\n        <TextView\n                android:id=\"@+id/mainName\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"UserName\"\n                android:layout_gravity=\"center_vertical\"\n                android:text=\"@{((User.Detail)userViewData.user).shortDisplayName }\"/>\n    </LinearLayout>\n\n</layout>\n\n"
  },
  {
    "path": "modules/common_android_ui/src/main/res/values/tags.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"TEXT_VIEW_MFM_TAG_ID\" type=\"id\" />\n</resources>"
  },
  {
    "path": "modules/common_compose/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/common_compose/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        compose true\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.common_compose'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_resource')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    implementation libs.kotlin.datetime\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/common_compose/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/common_compose/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/common_compose/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.VIBRATE\" />\n</manifest>"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/AvatarIcon.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.compositionLocalOf\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\nimport coil.compose.AsyncImage\n\n\n@Composable\nfun AvatarIcon(\n    url: String?,\n    onAvatarClick: () -> Unit,\n    modifier: Modifier = Modifier,\n    shape: Shape = Shape.Undefined,\n    size: Dp = 50.dp,\n    borderStrokeWidth: Dp = 0.dp,\n    borderStrokeColor: Color = Color.Transparent,\n    blurhash: String? = null,\n) {\n    val shapeLocal = LocalAvatarIconShape.current\n    val clip = when(shape) {\n        Shape.Circle -> CircleShape\n        Shape.RoundedCorner -> RoundedCornerShape(8.dp)\n        Shape.Undefined -> when(shapeLocal) {\n            Shape.Circle -> CircleShape\n            Shape.RoundedCorner -> RoundedCornerShape(8.dp)\n            Shape.Undefined -> CircleShape\n        }\n    }\n    val placeholder = rememberBlurhashPainter(blurhash)\n    AsyncImage(\n        model = url,\n        contentDescription = null,\n        modifier = modifier\n            .size(size)\n            .clip(clip)\n            .border(borderStrokeWidth, borderStrokeColor, clip)\n            .clickable { onAvatarClick() },\n        placeholder = placeholder,\n        contentScale = ContentScale.Crop,\n    )\n}\n\n@Composable\nfun AvatarIcon(\n    url: String?,\n    modifier: Modifier = Modifier,\n    shape: Shape = Shape.Undefined,\n    size: Dp = 50.dp,\n    borderStrokeWidth: Dp = 0.dp,\n    borderStrokeColor: Color = Color.Transparent,\n    blurhash: String? = null,\n) {\n    val shapeLocal = LocalAvatarIconShape.current\n    val clip = when(shape) {\n        Shape.Circle -> CircleShape\n        Shape.RoundedCorner -> RoundedCornerShape(8.dp)\n        Shape.Undefined -> when(shapeLocal) {\n            Shape.Circle -> CircleShape\n            Shape.RoundedCorner -> RoundedCornerShape(8.dp)\n            Shape.Undefined -> CircleShape\n        }\n    }\n    val placeholder = rememberBlurhashPainter(blurhash)\n    AsyncImage(\n        model = url,\n        contentDescription = null,\n        modifier = modifier\n            .size(size)\n            .clip(clip)\n            .border(borderStrokeWidth, borderStrokeColor, clip),\n        placeholder = placeholder,\n        contentScale = ContentScale.Crop,\n    )\n}\nenum class Shape {\n    Circle,\n    RoundedCorner,\n    Undefined\n}\n\nval LocalAvatarIconShape = compositionLocalOf<Shape> {\n    Shape.Circle\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/BlurhashPainter.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport android.annotation.SuppressLint\nimport android.graphics.Bitmap\nimport android.util.LruCache\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.produceState\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.graphics.asImageBitmap\nimport androidx.compose.ui.graphics.painter.BitmapPainter\nimport androidx.compose.ui.graphics.painter.Painter\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.glide.blurhash.BlurHashDecoder\n\n/**\n * デコード済み Bitmap を保持する LruCache（プロセス全体で共有）。\n * 最大 2MB まで保持し、古いエントリを自動的に evict する。\n * キー: \"${hash}_${width}x${height}\"\n */\nprivate val blurhashBitmapCache = object : LruCache<String, Bitmap>(2 * 1024 * 1024) {\n    override fun sizeOf(key: String, value: Bitmap): Int = value.byteCount\n}\n\nprivate fun cacheKey(hash: String, width: Int, height: Int) = \"${hash}_${width}x${height}\"\n\n/**\n * Blurhash 文字列を非同期でデコードし、[Painter] として返す Composable。\n *\n * - デコード結果は [LruCache] にキャッシュされ、同じ hash は再デコードしない。\n * - デコードは [Dispatchers.IO] 上で実行するため UI スレッドをブロックしない。\n * - [blurhash] が null の場合は null を返す（プレースホルダーなし）。\n *\n * @param blurhash Blurhash 文字列\n * @param width    デコードするビットマップの幅（px）。デフォルト 32\n * @param height   デコードするビットマップの高さ（px）。デフォルト 32\n */\n@Composable\nfun rememberBlurhashPainter(\n    blurhash: String?,\n    width: Int = 32,\n    height: Int = 32,\n): Painter? {\n    if (blurhash == null) return null\n\n    // Composition 時にキャッシュを同期チェック\n    val cachedBitmap = remember(blurhash, width, height) {\n        blurhashBitmapCache.get(cacheKey(blurhash, width, height))\n    }\n\n    @SuppressLint(\"ProduceStateDoesNotAssignValue\")\n    val painter by produceState<Painter?>(\n        initialValue = cachedBitmap?.let { BitmapPainter(it.asImageBitmap()) },\n        key1 = blurhash,\n        key2 = width,\n        key3 = height,\n    ) {\n        if (cachedBitmap != null) {\n            value = BitmapPainter(cachedBitmap.asImageBitmap())\n            return@produceState\n        }\n        withContext(Dispatchers.IO) {\n            val bitmap = BlurHashDecoder.decode(blurhash, width, height) ?: return@withContext\n            blurhashBitmapCache.put(cacheKey(blurhash, width, height), bitmap)\n            value = BitmapPainter(bitmap.asImageBitmap())\n        }\n    }\n\n    return painter\n}\n"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/CircleCheckbox.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.CheckCircle\nimport androidx.compose.material.icons.outlined.Circle\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\n\n@Composable\n@Stable\nfun CircleCheckbox(modifier: Modifier = Modifier, selected: Boolean) {\n\n    val color = MaterialTheme.colorScheme\n    val imageVector = if (selected) Icons.Filled.CheckCircle else Icons.Outlined.Circle\n    val tint = color.primary\n    val background = if (selected) Color.White else Color.Transparent\n\n    Icon(\n        imageVector = imageVector, tint = tint,\n        modifier = modifier.background(background, shape = CircleShape),\n        contentDescription = \"checkbox\"\n    )\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/ComposeAndFragment.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.saveable.Saver\nimport androidx.compose.runtime.saveable.rememberSaveable\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\n\n@Composable\nfun <T : Fragment> rememberFragment(\n    vararg inputs: Any?,\n    fragmentManager: FragmentManager,\n    initial: () -> T,\n): T {\n    return rememberSaveable(\n        inputs = inputs,\n        saver = Saver(\n            save = { fragment ->\n                if (fragment in fragmentManager.fragments) {\n                    fragmentManager\n                        .saveFragmentInstanceState(fragment)\n                } else {\n                    null\n                }\n            },\n            restore = { savedState ->\n                initial().also { fragment ->\n                    fragment.setInitialSavedState(savedState)\n                }\n            },\n        ),\n    ) {\n        initial()\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/CustomEmojiText.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.text.InlineTextContent\nimport androidx.compose.foundation.text.appendInlineContent\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.text.Placeholder\nimport androidx.compose.ui.text.PlaceholderVerticalAlign\nimport androidx.compose.ui.text.buildAnnotatedString\nimport androidx.compose.ui.text.font.FontFamily\nimport androidx.compose.ui.text.font.FontStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParsedResult\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParser\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.EmojiResolvedType\nimport net.pantasystem.milktea.model.instance.HostWithVersion\n\n\n@Composable\n@Stable\nfun CustomEmojiText(\n    modifier: Modifier = Modifier,\n    text: String,\n    emojis: List<CustomEmoji>,\n    accountHost: String? = null,\n    sourceHost: String? = null,\n    parsedResult: CustomEmojiParsedResult? = null,\n    fontSize: TextUnit = 14.sp,\n    fontStyle: FontStyle? = null,\n    fontWeight: FontWeight? = null,\n    fontFamily: FontFamily? = null,\n    textAlign: TextAlign? = null,\n    maxLines: Int = Int.MAX_VALUE,\n    overflow: TextOverflow = TextOverflow.Clip,\n) {\n\n\n    val result = remember(text, emojis, accountHost, sourceHost) {\n        parsedResult ?: CustomEmojiParser.parse(\n            sourceHost = sourceHost,\n            emojis = emojis,\n            text = text\n        ).let { result ->\n            result.copy(\n                emojis = result.emojis.filter {\n                    HostWithVersion.isOverV13(accountHost) || it.result is EmojiResolvedType.Resolved\n                }\n            )\n        }\n    }\n\n\n    val annotatedText = buildAnnotatedString {\n        var pos = 0\n\n        for (r in result.emojis) {\n            if (pos != r.start) {\n                append(result.text.substring(pos, r.start))\n            }\n            appendInlineContent(r.result.tag, text.substring(r.start, r.end))\n            pos = r.end\n        }\n        if (pos != text.length && text.isNotBlank()) {\n            append(text.substring(pos, text.length))\n        }\n\n    }\n\n    val inlineContents = result.emojis.associate { emojiPos ->\n        emojiPos.result.tag to InlineTextContent(\n            Placeholder(\n                width = fontSize,\n                height = fontSize,\n                placeholderVerticalAlign = PlaceholderVerticalAlign.AboveBaseline\n            )\n        ) {\n            Image(\n                painter = rememberAsyncImagePainter(model = emojiPos.result.getUrl(accountHost)),\n                contentDescription = null\n            )\n        }\n    }\n\n    Text(\n        annotatedText,\n        inlineContent = inlineContents,\n        fontSize = fontSize,\n        fontStyle = fontStyle,\n        fontWeight = fontWeight,\n        fontFamily = fontFamily,\n        maxLines = maxLines,\n        modifier = modifier,\n        textAlign = textAlign,\n        overflow = overflow\n    )\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/ElapsedTimeUtil.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.res.stringResource\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.common.ui.SimpleElapsedTime\nimport net.pantasystem.milktea.common.ui.TimeUnit\n\n@Composable\n@Stable\nfun getSimpleElapsedTime(time: Instant): String {\n    return getStr(SimpleElapsedTime.invoke(time))\n}\n\n@Composable\n@Stable\nprivate fun getStr(unit: TimeUnit): String {\n    return when(unit){\n        is TimeUnit.Day -> stringResource(R.string.time_with_date_ago, unit.value.toString())\n        TimeUnit.Future -> stringResource(R.string.future)\n        is TimeUnit.Hour -> stringResource(R.string.time_with_hour_ago, unit.value.toString())\n        is TimeUnit.Minute -> stringResource(R.string.time_with_minute_ago, unit.value.toString())\n        is TimeUnit.Month -> stringResource(R.string.time_with_month_ago, unit.value.toString())\n        TimeUnit.Now -> stringResource(R.string.now)\n        is TimeUnit.Second -> stringResource(R.string.time_with_second_ago, unit.value.toString())\n        is TimeUnit.Year -> stringResource(R.string.time_with_year_ago, unit.value.toString())\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/FavoriteButton.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Favorite\nimport androidx.compose.material.icons.filled.FavoriteBorder\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.tooling.preview.Preview\n\n@Composable\nfun FavoriteButton(\n    isFavorite: Boolean,\n    modifier: Modifier = Modifier,\n    onClick: ()->Unit,\n) {\n    val iconResource = if(isFavorite) {\n        Icons.Default.Favorite\n    }else{\n        Icons.Default.FavoriteBorder\n    }\n    IconButton(onClick = onClick, modifier = modifier) {\n        Color.Blue\n        Icon(iconResource, contentDescription = null, tint = Color(0xFFFF655B))\n    }\n\n}\n\n@Preview\n@Composable\nfun PreviewFavoriteButton() {\n    FavoriteButton(isFavorite = true) {\n\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/HorizontalFilePreviewList.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport android.net.Uri\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyRow\nimport androidx.compose.material3.DropdownMenu\nimport androidx.compose.material3.DropdownMenuItem\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.*\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\n\n\n@Composable\nfun HorizontalFilePreviewList(\n    modifier: Modifier = Modifier,\n    isMisskey: Boolean = true,\n    files: List<FilePreviewSource>,\n    allowMaxFileSize: Long? = null,\n    onShow: (FilePreviewSource) -> Unit,\n    onDetach: (FilePreviewSource) -> Unit,\n    onToggleSensitive: (FilePreviewSource) -> Unit,\n    onEditFileCaption: ((FilePreviewSource) -> Unit)? = null,\n    onEditFileName: ((FilePreviewSource) -> Unit)? = null,\n) {\n    LazyRow(\n        modifier\n    ) {\n        items(count = files.size) { index ->\n            FilePreview(\n                isMisskey = isMisskey,\n                file = files[index],\n                allowMaxFileSize = allowMaxFileSize,\n                onShow = onShow,\n                onDetach = onDetach,\n                onToggleSensitive = onToggleSensitive,\n                onEditFileName = onEditFileName,\n                onEditFileCaption = onEditFileCaption,\n            )\n        }\n    }\n}\n\n\n\n@Composable\nfun FilePreview(\n    isMisskey: Boolean = true,\n    file: FilePreviewSource,\n    allowMaxFileSize: Long?,\n    onShow: (FilePreviewSource) -> Unit,\n    onDetach: (FilePreviewSource) -> Unit,\n    onToggleSensitive: (FilePreviewSource) -> Unit,\n    onEditFileCaption: ((FilePreviewSource) -> Unit)? = null,\n    onEditFileName: ((FilePreviewSource) -> Unit)? = null,\n) {\n    var dropDownTarget: FilePreviewSource? by remember {\n        mutableStateOf(null)\n    }\n    Column {\n        when (file) {\n            is FilePreviewSource.Local -> {\n                LocalFilePreview(\n                    file = file.file,\n                    allowMaxFileSize = allowMaxFileSize,\n                    onClick = {\n                        dropDownTarget = FilePreviewSource.Local(it)\n                    }\n                )\n            }\n            is FilePreviewSource.Remote -> {\n                RemoteFilePreview(\n                    fileProperty = file.fileProperty,\n                    onClick = {\n                        dropDownTarget = FilePreviewSource.Remote(\n                            AppFile.Remote(it.id),\n                            it\n                        )\n                    }\n                )\n            }\n        }\n        val target = dropDownTarget\n        FilePreviewActionDropDown(\n            isMisskey = isMisskey,\n            isSensitive = target != null\n                    && (\n                    (target is FilePreviewSource.Local && target.file.isSensitive)\n                            || (target is FilePreviewSource.Remote && target.fileProperty.isSensitive)\n                    ),\n            expanded = dropDownTarget != null,\n            onToggleSensitive = {\n                onToggleSensitive(dropDownTarget!!)\n            },\n            onDetach = {\n                onDetach(dropDownTarget!!)\n\n            },\n            onShow = {\n                onShow(dropDownTarget!!)\n\n            },\n            onDismissRequest = {\n                dropDownTarget = null\n            },\n            onEditFileCaption = onEditFileCaption?.let{\n                {\n                    it(dropDownTarget!!)\n                }\n\n            },\n            onEditFileName = onEditFileName?.let {\n                {\n                    it(dropDownTarget!!)\n                }\n            }\n        )\n    }\n\n}\n\n@Composable\nfun LocalFilePreview(\n    file: AppFile.Local,\n    allowMaxFileSize: Long?,\n    onClick: (AppFile.Local) -> Unit\n) {\n    val uri = Uri.parse(file.path)\n    Box(\n        modifier = Modifier\n            .size(100.dp)\n            .padding(horizontal = 2.dp)\n            .clickable {\n                onClick(file)\n            }\n    ) {\n        Box {\n            Image(\n                painter = rememberAsyncImagePainter(model = uri),\n                contentDescription = null,\n                modifier = Modifier.fillMaxSize(),\n                contentScale = ContentScale.Crop\n            )\n            if (file.isSensitive) {\n                SensitiveIcon(\n                    modifier = Modifier.align(Alignment.TopEnd)\n                )\n            }\n\n            if (allowMaxFileSize != null && file.fileSize != null) {\n                if (allowMaxFileSize < (file.fileSize ?: 0)) {\n                    Icon(\n                        Icons.Default.Warning,\n                        contentDescription = null,\n                        tint = Color.Yellow,\n                        modifier = Modifier.padding(2.dp)\n                    )\n                }\n            }\n\n        }\n\n    }\n}\n\n@Composable\nfun RemoteFilePreview(\n    fileProperty: FileProperty,\n    onClick: (FileProperty) -> Unit\n) {\n\n\n    Box(\n        modifier = Modifier\n            .size(100.dp)\n            .padding(horizontal = 2.dp)\n            .clickable {\n                onClick(fileProperty)\n            }\n    ) {\n        Box(contentAlignment = Alignment.TopEnd) {\n            Image(\n                painter = rememberAsyncImagePainter(\n                    fileProperty.thumbnailUrl\n                ),\n                contentDescription = null,\n                modifier = Modifier.fillMaxSize(),\n                contentScale = ContentScale.Crop,\n            )\n            if (fileProperty.isSensitive) {\n                SensitiveIcon()\n            }\n        }\n    }\n\n}\n\n\n@Composable\nfun FilePreviewActionDropDown(\n    isMisskey: Boolean = true,\n    isSensitive: Boolean,\n    onToggleSensitive: (Boolean) -> Unit,\n    onDetach: () -> Unit,\n    onShow: () -> Unit,\n    expanded: Boolean,\n    onDismissRequest: () -> Unit,\n    onEditFileName: (() -> Unit)?,\n    onEditFileCaption: (() -> Unit)?,\n) {\n    DropdownMenu(\n        expanded = expanded,\n        onDismissRequest = onDismissRequest,\n        modifier = Modifier.wrapContentWidth(),\n    ) {\n        DropdownMenuItem(\n            text = { Text(stringResource(id = R.string.remove_attachment)) },\n            leadingIcon = {\n                Icon(\n                    Icons.Filled.RemoveCircle,\n                    contentDescription = stringResource(id = R.string.remove_attachment),\n                    modifier = Modifier.size(24.dp)\n                )\n            },\n            onClick = {\n                onDetach()\n                onDismissRequest()\n            }\n        )\n\n        if (isMisskey) {\n            DropdownMenuItem(\n                text = { Text(if (isSensitive) stringResource(id = R.string.drive_undo_nsfw) else stringResource(id = R.string.drive_mark_as_nsfw)) },\n                leadingIcon = {\n                    Icon(\n                        if (isSensitive) Icons.Filled.Image else Icons.Filled.HideImage,\n                        contentDescription = null,\n                        modifier = Modifier.size(24.dp)\n                    )\n                },\n                onClick = {\n                    onToggleSensitive(!isSensitive)\n                    onDismissRequest()\n                }\n            )\n        }\n\n        DropdownMenuItem(\n            text = { Text(stringResource(id = R.string.show)) },\n            leadingIcon = {\n                Icon(\n                    Icons.Filled.Details,\n                    contentDescription = stringResource(id = R.string.show),\n                    modifier = Modifier.size(24.dp)\n                )\n            },\n            onClick = {\n                onShow()\n                onDismissRequest()\n            }\n        )\n\n        if (isMisskey) {\n            if (onEditFileName != null) {\n                DropdownMenuItem(\n                    text = { Text(stringResource(R.string.edit_file_name)) },\n                    leadingIcon = { Icon(Icons.Filled.Edit, contentDescription = stringResource(id = R.string.edit_file_name), modifier = Modifier.size(24.dp)) },\n                    onClick = {\n                        onEditFileName()\n                        onDismissRequest()\n                    }\n                )\n            }\n        }\n\n        if (onEditFileCaption != null) {\n            DropdownMenuItem(\n                text = { Text(stringResource(id = R.string.edit_file_caption)) },\n                leadingIcon = { Icon(Icons.Filled.Comment, contentDescription = stringResource(id = R.string.edit_file_caption)) },\n                onClick = {\n                    onEditFileCaption()\n                    onDismissRequest()\n                }\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/MilkteaTheme.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.material3.ColorScheme\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.darkColorScheme\nimport androidx.compose.material3.lightColorScheme\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.graphics.Color\nimport net.pantasystem.milktea.model.setting.AvatarIconShapeType\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.Theme\n\n// White テーマ（ライト、インディゴ）\nprivate val MilkteaWhiteColorScheme: ColorScheme = lightColorScheme(\n    primary = Color(0xFF3F51B5),\n    secondary = Color(0xFF575DAE),\n    surface = Color(0xFFFFFFFF),\n    background = Color(0xFFFFFFFF),\n)\n\n// Dark テーマ（ダーク、インディゴ）\nprivate val MilkteaDarkColorScheme: ColorScheme = darkColorScheme(\n    primary = Color(0xFF9FA8DA),\n    secondary = Color(0xFF6D7FE1),\n    surface = Color(0xFF1E1E1E),\n    background = Color(0xFF0E0E0E),\n)\n\n// Black テーマ（ダーク、真黒）\nprivate val MilkteaBlackColorScheme: ColorScheme = darkColorScheme(\n    primary = Color(0xFF9FA8DA),\n    secondary = Color(0xFF6D7FE1),\n    surface = Color(0xFF000000),\n    background = Color(0xFF000000),\n)\n\n// Bread テーマ（ライト、パン色）\nprivate val MilkteaBreadColorScheme: ColorScheme = lightColorScheme(\n    primary = Color(0xFFD9A042),\n    secondary = Color(0xFF8BC34A),\n    surface = Color(0xFFF8F5C9),\n    background = Color(0xFFF8F5C9),\n)\n\n// ElephantDark テーマ（ダーク、マストドン紫）\nprivate val MilkteaElephantDarkColorScheme: ColorScheme = darkColorScheme(\n    primary = Color(0xFF8C8DFE),\n    secondary = Color(0xFF595AFF),\n    surface = Color(0xFF282C37),\n    background = Color(0xFF191B22),\n)\n\n/**\n * ユーザーが選択したテーマに対応する M3 ColorScheme を返す。\n * ThemeUtil.kt で Activity に適用される XML テーマと同じ Theme enum で同期される。\n */\nfun Theme.toColorScheme(): ColorScheme = when (this) {\n    Theme.White -> MilkteaWhiteColorScheme\n    Theme.Dark -> MilkteaDarkColorScheme\n    Theme.Black -> MilkteaBlackColorScheme\n    Theme.Bread -> MilkteaBreadColorScheme\n    Theme.ElephantDark -> MilkteaElephantDarkColorScheme\n}\n\n@Composable\nfun MilkteaStyleConfigApplyAndTheme(\n    configRepository: LocalConfigRepository,\n    content: @Composable () -> Unit,\n) {\n    val config by configRepository.observe().collectAsState(initial = DefaultConfig.config)\n    MaterialTheme(colorScheme = config.theme.toColorScheme()) {\n        CompositionLocalProvider(\n            LocalAvatarIconShape provides when (config.avatarIconShapeType) {\n                AvatarIconShapeType.Circle -> Shape.Circle\n                AvatarIconShapeType.Square -> Shape.RoundedCorner\n            },\n        ) {\n            content()\n        }\n    }\n}\n"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/RadioTile.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.RadioButton\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\n\n@Composable\nfun RadioTile(selected: Boolean, onClick: () -> Unit, title: @Composable RowScope.() -> Unit) {\n    Row(\n        modifier = Modifier\n            .padding(horizontal = 16.dp)\n            .fillMaxWidth()\n            .clickable { onClick.invoke() },\n        horizontalArrangement = Arrangement.SpaceBetween,\n        verticalAlignment = Alignment.CenterVertically\n    ) {\n        RadioButton(selected = selected, onClick = onClick)\n\n        Box(modifier = Modifier.weight(1f)) {\n            title.invoke(this@Row)\n        }\n\n    }\n}\n\n@Preview\n@Composable\nfun PreviewRadioTile() {\n    Column {\n        RadioTile(selected = true, onClick = { /*TODO*/ }) {\n            Text(\"はるのん\")\n        }\n        RadioTile(selected = false, onClick = { /*TODO*/ }) {\n            Text(\"ぬるきゃ\")\n        }\n        RadioTile(selected = false, onClick = { /*TODO*/ }) {\n            Text(\"あずきゃ\")\n        }\n        RadioTile(selected = false, onClick = { /*TODO*/ }) {\n            Text(\"村上さん\")\n        }\n    }\n\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/SensitiveIcon.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.foundation.background\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.HideImage\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport net.pantasystem.milktea.common.R\n\n@Composable\nfun SensitiveIcon(\n    modifier: Modifier = Modifier\n) {\n    Icon(\n        Icons.Default.HideImage,\n        contentDescription = stringResource(R.string.sensitive),\n        modifier = modifier.background(MaterialTheme.colorScheme.secondary)\n    )\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/Spinner.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.material3.DropdownMenu\nimport androidx.compose.material3.DropdownMenuItem\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\n\n@Composable\nfun <T> Spinner(\n    modifier: Modifier = Modifier,\n    dropDownModifier: Modifier = Modifier,\n    items: List<T>,\n    selectedItem: T,\n    onItemSelected: (T) -> Unit,\n    selectedItemFactory: @Composable (Modifier, T) -> Unit,\n    dropdownItemFactory: @Composable (T, Int) -> Unit,\n) {\n    var expanded: Boolean by remember { mutableStateOf(false) }\n\n    Box(modifier = modifier.wrapContentSize(Alignment.TopStart)) {\n        selectedItemFactory(\n            Modifier\n                .clickable { expanded = true },\n            selectedItem\n        )\n\n        DropdownMenu(\n            expanded = expanded,\n            onDismissRequest = { expanded = false },\n            modifier = dropDownModifier\n        ) {\n            items.forEachIndexed { index, element ->\n                DropdownMenuItem(\n                    text = { dropdownItemFactory(element, index) },\n                    onClick = {\n                        onItemSelected(items[index])\n                        expanded = false\n                    }\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/SwitchTile.kt",
    "content": "package net.pantasystem.milktea.common_compose\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.material3.Switch\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\n\n@Composable\nfun SwitchTile(\n    modifier: Modifier = Modifier,\n    checked: Boolean,\n    onChanged: (Boolean) -> Unit,\n    enabled: Boolean = true,\n    label: @Composable RowScope.() -> Unit\n) {\n    Row(\n        modifier = modifier.clickable { \n            onChanged.invoke(!checked)\n        },\n        horizontalArrangement = Arrangement.SpaceBetween,\n        verticalAlignment = Alignment.CenterVertically\n    ) {\n        Box(modifier = Modifier.weight(1f)) {\n            label.invoke(this@Row)\n        }\n\n        Switch(checked = checked, onCheckedChange = onChanged, enabled = enabled)\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/drive/EditCaptionDialogLayout.kt",
    "content": "package net.pantasystem.milktea.common_compose.drive\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.common_compose.R\n\n@Composable\nfun EditCaptionDialogLayout(\n    value: String,\n    onCancelButtonClicked: () -> Unit,\n    onTextChanged: (String) -> Unit,\n    onSaveButtonClicked: () -> Unit,\n) {\n    Surface(\n        shape = MaterialTheme.shapes.medium,\n        color = MaterialTheme.colorScheme.surface,\n        shadowElevation = 24.dp\n    ) {\n        Column(\n            modifier = Modifier.padding(16.dp)\n        ) {\n            Text(\n                stringResource(R.string.edit_caption),\n                fontSize = 24.sp,\n            )\n            Spacer(modifier = Modifier.height(8.dp))\n            TextField(\n                value = value,\n                placeholder = {\n                    Text(stringResource(R.string.input_caption))\n                },\n                onValueChange = onTextChanged\n            )\n            Row(\n                Modifier.fillMaxWidth(),\n                horizontalArrangement = Arrangement.End\n            ) {\n                TextButton(onClick = onCancelButtonClicked) {\n                    Text(stringResource(R.string.cancel))\n                }\n                TextButton(onClick = onSaveButtonClicked) {\n                    Text(stringResource(R.string.save))\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/drive/EditFileNameDialogLayout.kt",
    "content": "package net.pantasystem.milktea.common_compose.drive\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.common_compose.R\n\n@Composable\nfun EditFileNameDialogLayout(\n    value: String,\n    onTextChanged: (String) -> Unit,\n    onSaveButtonClicked: () -> Unit,\n    onCancelButtonClicked: () -> Unit,\n) {\n    Surface(\n        shape = MaterialTheme.shapes.medium,\n        color = MaterialTheme.colorScheme.surface,\n        shadowElevation = 24.dp\n    ) {\n        Column(\n            modifier = Modifier.padding(16.dp)\n        ) {\n            Text(\n                stringResource(id = R.string.edit_file_name),\n                fontSize = 24.sp,\n            )\n            Spacer(modifier = Modifier.height(8.dp))\n            TextField(\n                value = value,\n                placeholder = {\n                    Text(stringResource(R.string.input_caption))\n                },\n                onValueChange = onTextChanged\n            )\n            Row(\n                Modifier.fillMaxWidth(),\n                horizontalArrangement = Arrangement.End\n            ) {\n                TextButton(onClick = onCancelButtonClicked) {\n                    Text(stringResource(id = R.string.cancel))\n                }\n                TextButton(onClick = onSaveButtonClicked) {\n                    Text(stringResource(id = R.string.save))\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/java/net/pantasystem/milktea/common_compose/haptic/HapticFeedback.kt",
    "content": "package net.pantasystem.milktea.common_compose.haptic\n\nimport android.content.Context\nimport android.os.Build\nimport android.os.VibrationEffect\nimport android.os.Vibrator\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.platform.LocalContext\n\ninterface HapticFeedback {\n    fun performClickHapticFeedback()\n    fun performLongClickHapticFeedback()\n    fun performTickVibrateHapticFeedback()\n}\n\n@Composable\nfun rememberHapticFeedback(): HapticFeedback {\n    val context = LocalContext.current\n    return remember {\n        object : HapticFeedback {\n            override fun performClickHapticFeedback() {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                    VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK).let {\n                        getVibrator().vibrate(it)\n                    }\n                }\n            }\n\n            override fun performLongClickHapticFeedback() {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                    VibrationEffect.createPredefined(VibrationEffect.EFFECT_HEAVY_CLICK).let {\n                        getVibrator().vibrate(it)\n                    }\n                }\n            }\n\n\n            override fun performTickVibrateHapticFeedback() {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                    VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK).let {\n                        getVibrator().vibrate(it)\n                    }\n                }\n\n            }\n\n            @Suppress(\"DEPRECATION\")\n            private fun getVibrator() = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator\n        }\n    }\n}"
  },
  {
    "path": "modules/common_compose/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"show\">Show</string>\n    <string name=\"drive_undo_nsfw\">Undo NSFW</string>\n    <string name=\"drive_mark_as_nsfw\">Mark as NSFW</string>\n    <string name=\"remove_attachment\">Remove attachment</string>\n\n\n    <string name=\"future\">Future</string>\n    <string name=\"now\">Now</string>\n    <string name=\"year_ago\">YR</string>\n    <string name=\"month_ago\">MOS</string>\n    <string name=\"date_ago\">D</string>\n    <string name=\"hour_ago\">HR</string>\n    <string name=\"minute_ago\">MIN</string>\n    <string name=\"second_ago\">S</string>\n    <string name=\"edit_file_name\">Edit name</string>\n    <string name=\"edit_file_caption\">Edit caption</string>\n    <string name=\"instance\">Instance</string>\n    <string name=\"online_user_count_message\">%d people online</string>\n</resources>"
  },
  {
    "path": "modules/common_compose/src/main/res/values-ja-rJP/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"show\">見る</string>\n    <string name=\"drive_undo_nsfw\">閲覧注意解除</string>\n    <string name=\"drive_mark_as_nsfw\">閲覧注意にする</string>\n    <string name=\"remove_attachment\">添付取りやめ</string>\n\n    <string name=\"future\">未来</string>\n    <string name=\"now\">今</string>\n    <string name=\"year_ago\">年前</string>\n    <string name=\"month_ago\">ヶ月前</string>\n    <string name=\"date_ago\">日前</string>\n    <string name=\"hour_ago\">時間前</string>\n    <string name=\"minute_ago\">分前</string>\n    <string name=\"second_ago\">秒前</string>\n    <string name=\"edit_file_name\">ファイル名を変更</string>\n    <string name=\"edit_file_caption\">キャプションを編集</string>\n    <string name=\"instance\">インスタンス</string>\n    <string name=\"online_user_count_message\">%d人がオンライン</string>\n</resources>"
  },
  {
    "path": "modules/common_compose/src/main/res/values-zh/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"show\">展示</string>\n    <string name=\"drive_undo_nsfw\">取消NSFW标签</string>\n    <string name=\"drive_mark_as_nsfw\">将内容标记为NSFW</string>\n    <string name=\"remove_attachment\">删除附件</string>\n\n    <string name=\"future\">未来</string>\n    <string name=\"now\">现在</string>\n    <string name=\"year_ago\">年</string>\n    <string name=\"month_ago\">月</string>\n    <string name=\"date_ago\">日</string>\n    <string name=\"hour_ago\">时</string>\n    <string name=\"minute_ago\">分</string>\n    <string name=\"second_ago\">秒</string>\n    <string name=\"edit_file_name\">重新命名文件</string>\n    <string name=\"edit_file_caption\">编辑标题</string>\n    <string name=\"instance\">Instance</string>\n    <string name=\"online_user_count_message\">%d people online</string>\n</resources>"
  },
  {
    "path": "modules/common_navigation/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/common_navigation/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.common_navigation'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/common_navigation/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/common_navigation/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/common_navigation/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/AccountSettingNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\ninterface AccountSettingNavigation : ActivityNavigation<Unit>"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/ActivityNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport android.content.Intent\n\ninterface ActivityNavigation<T> {\n\n    fun newIntent(args: T): Intent\n}"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/AntennaNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\ninterface AntennaNavigation : ActivityNavigation<AntennaNavigationArgs> {\n}\n\ndata class AntennaNavigationArgs(\n    val specifiedAccountId: Long? = null,\n    val addTabToAccountId: Long? = null,\n)"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/AuthorizationNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.account.Account\n\n\ninterface AuthorizationNavigation : ActivityNavigation<AuthorizationArgs>\n\nsealed interface AuthorizationArgs {\n    data object New : AuthorizationArgs\n    data class ReAuth(val account: Account?) : AuthorizationArgs\n}"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/ChannelNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.channel.Channel\n\ninterface ChannelNavigation : ActivityNavigation<ChannelNavigationArgs>\ndata class ChannelNavigationArgs(\n    val specifiedAccountId: Long? = null,\n    val addTabToAccountId: Long? = null,\n)\n\ninterface ChannelDetailNavigation : ActivityNavigation<Channel.Id>"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/ClipNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.clip.ClipId\n\ninterface ClipListNavigation : ActivityNavigation<ClipListNavigationArgs>\n\ndata class ClipListNavigationArgs(\n    val accountId: Long? = null,\n    val mode: Mode = Mode.View,\n    val addTabToAccountId: Long? = null,\n) {\n    enum class Mode {\n        AddToTab,\n        View,\n    }\n}\n\ninterface ClipDetailNavigation : ActivityNavigation<ClipId>"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/DriveNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.drive.FileProperty\n\nconst val EXTRA_INT_SELECTABLE_FILE_MAX_SIZE =\n    \"jp.panta.misskeyandroidclient.EXTRA_INT_SELECTABLE_FILE_SIZE\"\nconst val EXTRA_SELECTED_FILE_PROPERTY_IDS =\n    \"jp.panta.misskeyandroiclient.EXTRA_STRING_ARRAY_LIST_SELECTED_FILES_ID\"\nconst val EXTRA_ACCOUNT_ID = \"jp.panta.misskeyandroidclient.EXTRA_ACCOUNT_ID\"\n\ninterface DriveNavigation : ActivityNavigation<DriveNavigationArgs>\n\n\ndata class DriveNavigationArgs(\n    val selectableFileMaxSize: Int? = null,\n    val selectedFilePropertyIds: List<FileProperty.Id>? = null,\n    val accountId: Long? = null,\n)"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/MainNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\ninterface MainNavigation : ActivityNavigation<Unit>"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/MediaNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.file.FilePreviewSource\n\ninterface MediaNavigation : ActivityNavigation<MediaNavigationArgs>\n\nsealed interface MediaNavigationArgs {\n    data class Files(\n        val files: List<FilePreviewSource>, val index: Int\n    ) : MediaNavigationArgs\n\n    data class AFile(\n        val file: FilePreviewSource\n    ) : MediaNavigationArgs\n}\n\nobject MediaNavigationKeys {\n    const val TAG = \"MediaActivity\"\n    const val EXTRA_FILE = \"net.pantasystem.milktea.media.MediaActivity.EXTRA_FILE\"\n    const val EXTRA_FILES = \"net.pantasystem.milktea.media.MediaActivity.EXTRA_FILES\"\n    const val EXTRA_FILE_CURRENT_INDEX = \"net.pantasystem.milktea.media.MediaActivity.EXTRA_FILES_CURRENT_INDEX\"\n\n\n}"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/MessageNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.messaging.MessagingId\n\ninterface MessageNavigation :  ActivityNavigation<MessageNavigationArgs>\n\ndata class MessageNavigationArgs(\n    val messagingId: MessagingId\n)"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/SearchAndSelectUserNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.user.User\nimport java.io.Serializable\n\ninterface SearchAndSelectUserNavigation : ActivityNavigation<SearchAndSelectUserNavigationArgs> {\n    companion object {\n        const val EXTRA_SELECTABLE_MAXIMUM_SIZE =\n            \"jp.panta.misskeyandroidclient.EXTRA_SELECTABLE_MAXIMUM_SIZE\"\n        const val EXTRA_SELECTED_USER_IDS =\n            \"jp.panta.misskeyandroidclient.EXTRA_SELECTED_USER_IDS\"\n\n        const val EXTRA_SELECTED_USER_CHANGED_DIFF =\n            \"jp.panta.misskeyandroidclient.EXTRA_SELECTED_USER_CHANGED_DIFF\"\n    }\n\n}\n\ndata class SearchAndSelectUserNavigationArgs(\n    val selectableMaximumSize: Int = Int.MAX_VALUE,\n    val selectedUserIds: List<User.Id> = emptyList(),\n    val accountId: Long? = null,\n)\n\ndata class ChangedDiffResult(\n    val selected: List<User.Id>,\n    val added: List<User.Id>,\n    val removed: List<User.Id>,\n    val selectedUserNames: List<String>,\n) : Serializable\n"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/SearchNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\ninterface SearchNavigation : ActivityNavigation<SearchNavType>\n\nsealed interface SearchNavType {\n    val searchWord: String?\n    val acct: String?\n    val accountId: Long?\n\n    data class ResultScreen(\n        override val searchWord: String, override val acct: String? = null,\n        override val accountId: Long? = null,\n    ) : SearchNavType\n\n    data class SearchScreen(\n        override val searchWord: String? = null, override val acct: String? = null,\n        override val accountId: Long? = null,\n    ) : SearchNavType\n\n}"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/TimelineMachineNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\ninterface TimeMachineNavigation : ActivityNavigation<TimeMachineArgs>\n\ndata class TimeMachineArgs(\n    val initialStartAt: Long\n)"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/UserDetailNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.user.User\n\ninterface UserDetailNavigation : ActivityNavigation<UserDetailNavigationArgs>\n\nsealed interface UserDetailNavigationArgs {\n    data class UserId(val userId: User.Id): UserDetailNavigationArgs\n    data class UserName(val userName: String): UserDetailNavigationArgs\n}"
  },
  {
    "path": "modules/common_navigation/src/main/java/net/pantasystem/milktea/common_navigation/UserListNavigation.kt",
    "content": "package net.pantasystem.milktea.common_navigation\n\nimport net.pantasystem.milktea.model.user.User\n\ninterface UserListNavigation : ActivityNavigation<UserListArgs>\n\ndata class UserListArgs(\n    val userId: User.Id? = null,\n    val specifiedAccountId: Long? = null,\n    val addTabToAccountId: Long? = null,\n)"
  },
  {
    "path": "modules/common_resource/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/common_resource/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.common_resource'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/common_resource/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/common_resource/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/common_resource/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/bottom_navigation_colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n            android:state_checked=\"true\"\n            android:color=\"?attr/colorBottomNavigationSelected\"\n    />\n    <item\n            android:state_checked=\"false\"\n            android:color=\"?attr/colorBottomNavigationNotSelect\"/>\n    <item android:color=\"?attr/colorBottomNavigationNotSelect\"/>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_access_time_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"48dp\"\n        android:height=\"48dp\"\n        android:viewportWidth=\"48\"\n        android:viewportHeight=\"48\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M31.35,33.65 L33.6,31.4 25.65,23.4V13.35H22.65V24.6ZM24,44Q19.9,44 16.25,42.425Q12.6,40.85 9.875,38.125Q7.15,35.4 5.575,31.75Q4,28.1 4,24Q4,19.9 5.575,16.25Q7.15,12.6 9.875,9.875Q12.6,7.15 16.25,5.575Q19.9,4 24,4Q28.1,4 31.75,5.575Q35.4,7.15 38.125,9.875Q40.85,12.6 42.425,16.25Q44,19.9 44,24Q44,28.1 42.425,31.75Q40.85,35.4 38.125,38.125Q35.4,40.85 31.75,42.425Q28.1,44 24,44ZM24,24Q24,24 24,24Q24,24 24,24Q24,24 24,24Q24,24 24,24Q24,24 24,24Q24,24 24,24Q24,24 24,24Q24,24 24,24ZM24,41Q31,41 36,36Q41,31 41,24Q41,17 36,12Q31,7 24,7Q17,7 12,12Q7,17 7,24Q7,31 12,36Q17,41 24,41Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_account_circle_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M5.85,17.1Q7.125,16.125 8.7,15.562Q10.275,15 12,15Q13.725,15 15.3,15.562Q16.875,16.125 18.15,17.1Q19.025,16.075 19.513,14.775Q20,13.475 20,12Q20,8.675 17.663,6.337Q15.325,4 12,4Q8.675,4 6.338,6.337Q4,8.675 4,12Q4,13.475 4.488,14.775Q4.975,16.075 5.85,17.1ZM12,13Q10.525,13 9.512,11.988Q8.5,10.975 8.5,9.5Q8.5,8.025 9.512,7.012Q10.525,6 12,6Q13.475,6 14.488,7.012Q15.5,8.025 15.5,9.5Q15.5,10.975 14.488,11.988Q13.475,13 12,13ZM12,22Q9.925,22 8.1,21.212Q6.275,20.425 4.925,19.075Q3.575,17.725 2.788,15.9Q2,14.075 2,12Q2,9.925 2.788,8.1Q3.575,6.275 4.925,4.925Q6.275,3.575 8.1,2.787Q9.925,2 12,2Q14.075,2 15.9,2.787Q17.725,3.575 19.075,4.925Q20.425,6.275 21.212,8.1Q22,9.925 22,12Q22,14.075 21.212,15.9Q20.425,17.725 19.075,19.075Q17.725,20.425 15.9,21.212Q14.075,22 12,22ZM12,20Q13.325,20 14.5,19.613Q15.675,19.225 16.65,18.5Q15.675,17.775 14.5,17.387Q13.325,17 12,17Q10.675,17 9.5,17.387Q8.325,17.775 7.35,18.5Q8.325,19.225 9.5,19.613Q10.675,20 12,20ZM12,11Q12.65,11 13.075,10.575Q13.5,10.15 13.5,9.5Q13.5,8.85 13.075,8.425Q12.65,8 12,8Q11.35,8 10.925,8.425Q10.5,8.85 10.5,9.5Q10.5,10.15 10.925,10.575Q11.35,11 12,11ZM12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5Q12,9.5 12,9.5ZM12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Q12,18.5 12,18.5Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_account_circle_40px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M227.04,695.05Q285.88,653.2 347.89,630.35Q409.91,607.5 480.09,607.5Q550.27,607.5 612.79,630.59Q675.32,653.68 733.63,695.13Q774.07,645.22 792.51,592.39Q810.94,539.55 810.94,480Q810.94,340.24 715.36,244.65Q619.78,149.06 480.03,149.06Q340.27,149.06 244.67,244.65Q149.06,340.24 149.06,480Q149.06,539.46 167.71,592.26Q186.36,645.05 227.04,695.05ZM479.88,515.17Q420.85,515.17 380.63,474.85Q340.41,434.53 340.41,375.61Q340.41,316.68 380.75,276.37Q421.09,236.06 480.12,236.06Q539.16,236.06 579.38,276.49Q619.59,316.93 619.59,375.86Q619.59,434.78 579.25,474.97Q538.91,515.17 479.88,515.17ZM480.21,886.7Q396.31,886.7 322.13,854.71Q247.96,822.73 192.62,767.39Q137.28,712.05 105.29,638.02Q73.3,563.98 73.3,479.8Q73.3,395.8 105.32,321.86Q137.34,247.92 192.63,192.63Q247.92,137.34 321.96,105.24Q396.01,73.15 480.2,73.15Q564.2,73.15 638.14,105.24Q712.08,137.34 767.37,192.63Q822.66,247.92 854.76,321.9Q886.85,395.89 886.85,479.79Q886.85,563.69 854.76,637.88Q822.66,712.08 767.37,767.37Q712.08,822.66 638.1,854.68Q564.11,886.7 480.21,886.7ZM480,810.94Q533.46,810.94 582.85,795.63Q632.24,780.31 679.24,744.78Q631.92,711.51 582.55,694.31Q533.19,677.12 480,677.12Q426.81,677.12 377.57,694.31Q328.32,711.51 281,744.78Q328,780.31 377.27,795.63Q426.54,810.94 480,810.94ZM480,445.39Q510.52,445.39 530.13,425.87Q549.74,406.35 549.74,375.73Q549.74,345.12 530.13,325.47Q510.52,305.83 480,305.83Q449.48,305.83 429.87,325.47Q410.26,345.12 410.26,375.73Q410.26,406.35 429.87,425.87Q449.48,445.39 480,445.39ZM480,375.65Q480,375.65 480,375.65Q480,375.65 480,375.65Q480,375.65 480,375.65Q480,375.65 480,375.65Q480,375.65 480,375.65Q480,375.65 480,375.65Q480,375.65 480,375.65Q480,375.65 480,375.65ZM480.24,744.11Q480.24,744.11 480.24,744.11Q480.24,744.11 480.24,744.11Q480.24,744.11 480.24,744.11Q480.24,744.11 480.24,744.11Q480.24,744.11 480.24,744.11Q480.24,744.11 480.24,744.11Q480.24,744.11 480.24,744.11Q480.24,744.11 480.24,744.11Z\"\n      tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_account_circle_48px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M222,705Q285,661 347,637.5Q409,614 480,614Q551,614 613.5,637.5Q676,661 739,705Q783,651 801.5,596Q820,541 820,480Q820,335 722.5,237.5Q625,140 480,140Q335,140 237.5,237.5Q140,335 140,480Q140,541 159,596Q178,651 222,705ZM479.81,510Q422,510 382.5,470.31Q343,430.63 343,372.81Q343,315 382.69,275.5Q422.37,236 480.19,236Q538,236 577.5,275.69Q617,315.37 617,373.19Q617,431 577.31,470.5Q537.63,510 479.81,510ZM480.47,880Q398,880 325,848.5Q252,817 197.5,762.5Q143,708 111.5,635.23Q80,562.47 80,479.73Q80,397 111.5,324.5Q143,252 197.5,197.5Q252,143 324.77,111.5Q397.53,80 480.27,80Q563,80 635.5,111.5Q708,143 762.5,197.5Q817,252 848.5,324.53Q880,397.06 880,479.53Q880,562 848.5,635Q817,708 762.5,762.5Q708,817 635.47,848.5Q562.94,880 480.47,880ZM480,820Q535,820 587.5,804Q640,788 691,748Q640,712 587,693Q534,674 480,674Q426,674 373,693Q320,712 269,748Q320,788 372.5,804Q425,820 480,820ZM480,450Q514,450 535.5,428.5Q557,407 557,373Q557,339 535.5,317.5Q514,296 480,296Q446,296 424.5,317.5Q403,339 403,373Q403,407 424.5,428.5Q446,450 480,450ZM480,373Q480,373 480,373Q480,373 480,373Q480,373 480,373Q480,373 480,373Q480,373 480,373Q480,373 480,373Q480,373 480,373Q480,373 480,373ZM480,747Q480,747 480,747Q480,747 480,747Q480,747 480,747Q480,747 480,747Q480,747 480,747Q480,747 480,747Q480,747 480,747Q480,747 480,747Z\"\n      tools:ignore=\"VectorPath\" />\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_add_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M13,7h-2v4L7,11v2h4v4h2v-4h4v-2h-4L13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_add_to_tab_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19L3,19L3,5h10v4h8v10z\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M8.0943,12.7075h8v2h-8z\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M11.1139,9.679h2v8h-2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_arrow_back_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"36dp\"\n        android:height=\"36dp\"\n        android:viewportWidth=\"36\"\n        android:viewportHeight=\"36\"\n        android:tint=\"?attr/colorControlNormal\"\n        android:autoMirrored=\"true\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M30,16.5H11.74l8.38,-8.38L18,6 6,18l12,12 2.12,-2.12 -8.38,-8.38H30v-3z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_attach_file_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16.5,6v11.5c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4V5c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5v10.5c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V6H10v9.5c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5V5c0,-2.21 -1.79,-4 -4,-4S7,2.79 7,5v12.5c0,3.04 2.46,5.5 5.5,5.5s5.5,-2.46 5.5,-5.5V6h-1.5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_attachment_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M7.5,17.5Q5.2,17.5 3.6,15.9Q2,14.3 2,12Q2,9.7 3.6,8.1Q5.2,6.5 7.5,6.5H18Q19.65,6.5 20.825,7.675Q22,8.85 22,10.5Q22,12.15 20.825,13.325Q19.65,14.5 18,14.5H8.5Q7.45,14.5 6.725,13.775Q6,13.05 6,12Q6,10.95 6.725,10.225Q7.45,9.5 8.5,9.5H18V11H8.5Q8.075,11 7.788,11.287Q7.5,11.575 7.5,12Q7.5,12.425 7.788,12.712Q8.075,13 8.5,13H18Q19.05,13 19.775,12.275Q20.5,11.55 20.5,10.5Q20.5,9.45 19.775,8.725Q19.05,8 18,8H7.5Q5.85,8 4.675,9.175Q3.5,10.35 3.5,12Q3.5,13.65 4.675,14.825Q5.85,16 7.5,16H18V17.5Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_edit_calendar_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M12,22H5c-1.11,0 -2,-0.9 -2,-2L3.01,6c0,-1.1 0.88,-2 1.99,-2h1V2h2v2h8V2h2v2h1c1.1,0 2,0.9 2,2v6h-2v-2H5v10h7V22zM22.13,16.99l0.71,-0.71c0.39,-0.39 0.39,-1.02 0,-1.41l-0.71,-0.71c-0.39,-0.39 -1.02,-0.39 -1.41,0l-0.71,0.71L22.13,16.99zM21.42,17.7l-5.3,5.3H14v-2.12l5.3,-5.3L21.42,17.7z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_favorite_border_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_hide_image_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M21,5c0,-1.1 -0.9,-2 -2,-2H5.83L21,18.17V5z\"/>\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M2.81,2.81L1.39,4.22L3,5.83V19c0,1.1 0.9,2 2,2h13.17l1.61,1.61l1.41,-1.41L2.81,2.81zM6,17l3,-4l2.25,3l0.82,-1.1l2.1,2.1H6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_image_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_radio_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M3.24,6.15C2.51,6.43 2,7.17 2,8v12c0,1.1 0.89,2 2,2h16c1.11,0 2,-0.9 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2L8.3,6l8.26,-3.34L15.88,1 3.24,6.15zM7,20c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM20,12h-2v-2h-2v2L4,12L4,8h16v4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_report_gmailerrorred_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M15.73,3H8.27L3,8.27v7.46L8.27,21h7.46L21,15.73V8.27L15.73,3zM19,14.9L14.9,19H9.1L5,14.9V9.1L9.1,5h5.8L19,9.1V14.9z\"/>\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M11,7h2v6h-2z\"/>\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M11,15h2v2h-2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_report_problem_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M1,21h22L12,2 1,21zM13,18h-2v-2h2v2zM13,14h-2v-4h2v4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_baseline_translate_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M12.87,15.07l-2.54,-2.51 0.03,-0.03c1.74,-1.94 2.98,-4.17 3.71,-6.53L17,6L17,4h-7L10,2L8,2v2L1,4v1.99h11.17C11.5,7.92 10.44,9.75 9,11.35 8.07,10.32 7.3,9.19 6.69,8h-2c0.73,1.63 1.73,3.17 2.98,4.56l-5.09,5.02L4,19l5,-5 3.11,3.11 0.76,-2.04zM18.5,10h-2L12,22h2l1.12,-3h4.75L21,22h2l-4.5,-12zM15.88,17l1.62,-4.33L19.12,17h-3.24z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_call_received_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,5.41L18.59,4 7,15.59V9H5v10h10v-2H8.41z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_chat_bubble_outline_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,2L4,2c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,16L6,16l-2,2L4,4h16v12z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_check_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_chevron_right_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_clear_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_cloud_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_cloud_queue_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.35,10.04C18.67,6.59 15.64,4 12,4 9.11,4 6.6,5.64 5.35,8.04 2.34,8.36 0,10.91 0,14c0,3.31 2.69,6 6,6h13c2.76,0 5,-2.24 5,-5 0,-2.64 -2.05,-4.78 -4.65,-4.96zM19,18H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h0.71C7.37,7.69 9.48,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3s-1.34,3 -3,3z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_compass.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"32dp\"\n    android:height=\"32dp\"\n    android:viewportWidth=\"32\"\n    android:viewportHeight=\"32\">\n  <path\n      android:pathData=\"M16,30C8.268,30 2,23.732 2,16C2,8.268 8.268,2 16,2C23.732,2 30,8.268 30,16C30,23.732 23.732,30 16,30ZM18.8284,18.8284C17.0607,20.5962 8.2218,23.7782 8.2218,23.7782C8.2218,23.7782 11.4038,14.9393 13.1716,13.1716C14.9393,11.4038 23.7782,8.2218 23.7782,8.2218C23.7782,8.2218 20.5962,17.0607 18.8284,18.8284ZM16,28C22.6274,28 28,22.6274 28,16C28,9.3726 22.6274,4 16,4C9.3726,4 4,9.3726 4,16C4,22.6274 9.3726,28 16,28ZM14.5858,17.4142C15.3668,18.1953 16.6332,18.1953 17.4142,17.4142C18.1953,16.6332 18.1953,15.3668 17.4142,14.5858C16.6332,13.8047 15.3668,13.8047 14.5858,14.5858C13.8047,15.3668 13.8047,16.6332 14.5858,17.4142ZM14.5858,17.4142\"\n      android:strokeWidth=\"1\"\n      android:fillColor=\"#000000\"\n      android:fillType=\"evenOdd\"\n      android:strokeColor=\"#00000000\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_delete_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_done_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_drafts_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21.99,8c0,-0.72 -0.37,-1.35 -0.94,-1.7L12,1 2.95,6.3C2.38,6.65 2,7.28 2,8v10c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2l-0.01,-10zM12,13L3.74,7.84 12,3l8.26,4.84L12,13z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_edit_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_email_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2zM20,8l-8,5 -8,-5L4,6l8,5 8,-5v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_expand_less_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,8l-6,6 1.41,1.41L12,10.83l4.59,4.58L18,14z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_expand_more_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16.59,8.59L12,13.17 7.41,8.59 6,10l6,6 6,-6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_folder_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2h-8l-2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_folder_open_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,6h-8l-2,-2L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM20,18L4,18L4,8h16v10z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_follow.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"210dp\"\n    android:height=\"297dp\"\n    android:viewportWidth=\"210\"\n    android:viewportHeight=\"297\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M105.077,88.735m-40,0a40,40 0,1 1,80 0a40,40 0,1 1,-80 0\"\n      android:strokeWidth=\"0.26458332\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M64.256,144.298h80.887v114.905h-80.887z\"\n      android:strokeWidth=\"0.238786\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M117.929,167.354a24.946,23.057 0,1 0,49.893 0a24.946,23.057 0,1 0,-49.893 0z\"\n      android:strokeWidth=\"0.26458332\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M39.31,167.354a24.946,23.057 0,1 0,49.893 0a24.946,23.057 0,1 0,-49.893 0z\"\n      android:strokeWidth=\"0.26458332\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M39.593,165.937L167.427,165.937A0.283,0.283 0,0 1,167.711 166.22L167.711,265.478A0.283,0.283 0,0 1,167.427 265.762L39.593,265.762A0.283,0.283 0,0 1,39.31 265.478L39.31,166.22A0.283,0.283 0,0 1,39.593 165.937z\"\n      android:strokeWidth=\"0.26458332\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M152.702,113.304h57.452v15.119h-57.452z\"\n      android:strokeWidth=\"0.26458332\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M189.744,89.869l-0,57.452l-15.119,0l-0,-57.452z\"\n      android:strokeWidth=\"0.26458332\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_format_list_bulleted_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M4,10.5c-0.83,0 -1.5,0.67 -1.5,1.5s0.67,1.5 1.5,1.5 1.5,-0.67 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM4,4.5c-0.83,0 -1.5,0.67 -1.5,1.5S3.17,7.5 4,7.5 5.5,6.83 5.5,6 4.83,4.5 4,4.5zM4,16.5c-0.83,0 -1.5,0.68 -1.5,1.5s0.68,1.5 1.5,1.5 1.5,-0.68 1.5,-1.5 -0.67,-1.5 -1.5,-1.5zM7,19h14v-2L7,17v2zM7,13h14v-2L7,11v2zM7,5v2h14L21,5L7,5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_format_quote_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,17h3l2,-4L11,7L5,7v6h3zM14,17h3l2,-4L19,7h-6v6h3z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_groups.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"48dp\"\n        android:height=\"48dp\"\n        android:viewportWidth=\"48\"\n        android:viewportHeight=\"48\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M0,36V33.35Q0,31.4 2.1,30.2Q4.2,29 7.5,29Q8.15,29 8.7,29.025Q9.25,29.05 9.8,29.15Q9.4,30 9.2,30.875Q9,31.75 9,32.75V36ZM12,36V32.75Q12,29.5 15.325,27.5Q18.65,25.5 24,25.5Q29.4,25.5 32.7,27.5Q36,29.5 36,32.75V36ZM39,36V32.75Q39,31.75 38.825,30.875Q38.65,30 38.25,29.15Q38.8,29.05 39.35,29.025Q39.9,29 40.5,29Q43.9,29 45.95,30.2Q48,31.4 48,33.35V36ZM24,28.5Q20,28.5 17.5,29.7Q15,30.9 15,32.75V33H33V32.7Q33,30.9 30.525,29.7Q28.05,28.5 24,28.5ZM7.5,27.5Q6.05,27.5 5.025,26.475Q4,25.45 4,24Q4,22.55 5.025,21.525Q6.05,20.5 7.5,20.5Q8.95,20.5 9.975,21.525Q11,22.55 11,24Q11,25.45 9.975,26.475Q8.95,27.5 7.5,27.5ZM40.5,27.5Q39.05,27.5 38.025,26.475Q37,25.45 37,24Q37,22.55 38.025,21.525Q39.05,20.5 40.5,20.5Q41.95,20.5 42.975,21.525Q44,22.55 44,24Q44,25.45 42.975,26.475Q41.95,27.5 40.5,27.5ZM24,24Q21.5,24 19.75,22.25Q18,20.5 18,18Q18,15.45 19.75,13.725Q21.5,12 24,12Q26.55,12 28.275,13.725Q30,15.45 30,18Q30,20.5 28.275,22.25Q26.55,24 24,24ZM24,15Q22.75,15 21.875,15.85Q21,16.7 21,18Q21,19.25 21.875,20.125Q22.75,21 24,21Q25.3,21 26.15,20.125Q27,19.25 27,18Q27,16.7 26.15,15.85Q25.3,15 24,15ZM24,33Q24,33 24,33Q24,33 24,33Q24,33 24,33Q24,33 24,33ZM24,18Q24,18 24,18Q24,18 24,18Q24,18 24,18Q24,18 24,18Q24,18 24,18Q24,18 24,18Q24,18 24,18Q24,18 24,18Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_history_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M13,3c-4.97,0 -9,4.03 -9,9L1,12l3.89,3.89 0.07,0.14L9,12L6,12c0,-3.87 3.13,-7 7,-7s7,3.13 7,7 -3.13,7 -7,7c-1.93,0 -3.68,-0.79 -4.94,-2.06l-1.42,1.42C8.27,19.99 10.51,21 13,21c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,8v5l4.28,2.54 0.72,-1.21 -3.5,-2.08L13.5,8L12,8z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_home_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,20v-6h4v6h5v-8h3L12,3 2,12h3v8z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_info_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_insert_link_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_keyboard_arrow_right_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M8.59,16.34l4.58,-4.59 -4.58,-4.59L10,5.75l6,6 -6,6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_keyboard_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,5L4,5c-1.1,0 -1.99,0.9 -1.99,2L2,17c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2zM11,8h2v2h-2L11,8zM11,11h2v2h-2v-2zM8,8h2v2L8,10L8,8zM8,11h2v2L8,13v-2zM7,13L5,13v-2h2v2zM7,10L5,10L5,8h2v2zM16,17L8,17v-2h8v2zM16,13h-2v-2h2v2zM16,10h-2L14,8h2v2zM19,13h-2v-2h2v2zM19,10h-2L17,8h2v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_language_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM18.92,8h-2.95c-0.32,-1.25 -0.78,-2.45 -1.38,-3.56 1.84,0.63 3.37,1.91 4.33,3.56zM12,4.04c0.83,1.2 1.48,2.53 1.91,3.96h-3.82c0.43,-1.43 1.08,-2.76 1.91,-3.96zM4.26,14C4.1,13.36 4,12.69 4,12s0.1,-1.36 0.26,-2h3.38c-0.08,0.66 -0.14,1.32 -0.14,2 0,0.68 0.06,1.34 0.14,2L4.26,14zM5.08,16h2.95c0.32,1.25 0.78,2.45 1.38,3.56 -1.84,-0.63 -3.37,-1.9 -4.33,-3.56zM8.03,8L5.08,8c0.96,-1.66 2.49,-2.93 4.33,-3.56C8.81,5.55 8.35,6.75 8.03,8zM12,19.96c-0.83,-1.2 -1.48,-2.53 -1.91,-3.96h3.82c-0.43,1.43 -1.08,2.76 -1.91,3.96zM14.34,14L9.66,14c-0.09,-0.66 -0.16,-1.32 -0.16,-2 0,-0.68 0.07,-1.35 0.16,-2h4.68c0.09,0.65 0.16,1.32 0.16,2 0,0.68 -0.07,1.34 -0.16,2zM14.59,19.56c0.6,-1.11 1.06,-2.31 1.38,-3.56h2.95c-0.96,1.65 -2.49,2.93 -4.33,3.56zM16.36,14c0.08,-0.66 0.14,-1.32 0.14,-2 0,-0.68 -0.06,-1.34 -0.14,-2h3.38c0.16,0.64 0.26,1.31 0.26,2s-0.1,1.36 -0.26,2h-3.38z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:height=\"108dp\"\n        android:width=\"108dp\"\n        android:viewportHeight=\"108\"\n        android:viewportWidth=\"108\">\n    <path android:fillColor=\"#008577\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_light.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512dp\"\n    android:height=\"512dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n  <path\n      android:pathData=\"M256,0c-79.391,0 -143.75,64.344 -143.75,143.75c0,33.828 11.688,64.922 31.25,89.484c26.328,33.063 40.234,46.234 40.234,84.766c0,17.672 8.031,25.703 20.875,25.703h102.781c12.859,0 20.891,-8.031 20.891,-25.703c0,-38.531 13.891,-51.703 40.219,-84.766c19.563,-24.563 31.25,-55.656 31.25,-89.484C399.75,64.344 335.391,0 256,0z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M256,512c17.797,0 32.219,-14.422 32.219,-32.219h-64.438C223.781,497.578 238.203,512 256,512z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M311.25,366.219h-110.5c-9.594,0 -17.375,7.781 -17.375,17.375c0,9.609 7.781,17.391 17.375,17.391h110.5c9.594,0 17.391,-7.781 17.391,-17.391C328.641,374 320.844,366.219 311.25,366.219z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M311.25,422.344h-110.5c-9.594,0 -17.375,7.797 -17.375,17.406c0,9.594 7.781,17.375 17.375,17.375h110.5c9.594,0 17.391,-7.781 17.391,-17.375C328.641,430.141 320.844,422.344 311.25,422.344z\"\n      android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_lightbulb_outline_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,21c0,0.55 0.45,1 1,1h4c0.55,0 1,-0.45 1,-1v-1L9,20v1zM12,2C8.14,2 5,5.14 5,9c0,2.38 1.19,4.47 3,5.74L8,17c0,0.55 0.45,1 1,1h6c0.55,0 1,-0.45 1,-1v-2.26c1.81,-1.27 3,-3.36 3,-5.74 0,-3.86 -3.14,-7 -7,-7zM14.85,13.1l-0.85,0.6L14,16h-4v-2.3l-0.85,-0.6C7.8,12.16 7,10.63 7,9c0,-2.76 2.24,-5 5,-5s5,2.24 5,5c0,1.63 -0.8,3.16 -2.15,4.1z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_list_add_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M14,10L2,10v2h12v-2zM14,6L2,6v2h12L14,6zM18,14v-4h-2v4h-4v2h4v4h2v-4h4v-2h-4zM2,16h8v-2L2,14v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_lock_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM12,17c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM15.1,8L8.9,8L8.9,6c0,-1.71 1.39,-3.1 3.1,-3.1 1.71,0 3.1,1.39 3.1,3.1v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_mention.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512dp\"\n    android:height=\"512dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n  <path\n      android:pathData=\"M476.741,129.962C476.658,129.773 476.67,129.804 476.741,129.962L476.741,129.962z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M476.741,129.962c0.344,0.768 2.132,4.792 6.374,14.314C492.696,165.778 477.733,132.192 476.741,129.962z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M483.115,144.276C393.486,-56.942 101.555,-43.768 24.468,159.333c-79.871,210.431 143.055,438.656 350.166,320.186c-3.748,-7.078 -14.076,-35.546 -20.956,-37.902c-34.827,19.912 -75.284,27.242 -115.267,23.874c-80.693,-6.801 -147.99,-64.165 -174.165,-140.074C7.655,161.366 165.91,-12.405 333.464,57.027c73.56,30.438 126.67,102.749 126.67,183.37c0,29.853 -6.121,66.04 -29.797,86.925c-20.039,17.754 -56.147,14.187 -67.044,-11.744c-12.526,-30.232 0.822,-75.078 5.773,-106.568c3.02,-19.248 6.057,-38.504 9.078,-57.752c0.475,-2.974 -37.12,-7.702 -42.64,-8.636c-0.601,3.812 -1.202,7.623 -1.802,11.435c-87.557,-63.366 -197.574,21.945 -197.574,118.224c-0.079,96.391 129.138,148.07 192.876,72.224c30.209,51.078 103.911,49.267 140.256,6.105C515.807,295.311 510.872,206.584 483.115,144.276zM298.464,312.131c-55.134,74.423 -160.658,-24.728 -97.869,-101.325c25.052,-30.548 73.813,-44.142 107.865,-20.046C338.526,212.04 316.272,288.036 298.464,312.131z\"\n      android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_menu_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_menu_camera.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0\"/>\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M9,2L7.17,4H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2H9zm3,15c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_menu_gallery.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M22,16V4c0,-1.1 -0.9,-2 -2,-2H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zm-11,-4l2.03,2.71L16,11l4,5H8l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2H4V6H2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_menu_manage.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M22.7,19l-9.1,-9.1c0.9,-2.3 0.4,-5 -1.5,-6.9 -2,-2 -5,-2.4 -7.4,-1.3L9,6 6,9 1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1c1.9,1.9 4.6,2.4 6.9,1.5l9.1,9.1c0.4,0.4 1,0.4 1.4,0l2.3,-2.3c0.5,-0.4 0.5,-1.1 0.1,-1.4z\"/>\n</vector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_menu_send.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_menu_share.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_menu_slideshow.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n            android:fillColor=\"#FF000000\"\n            android:pathData=\"M4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6zm16,-4H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zm-8,12.5v-9l6,4.5 -6,4.5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_message_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_mode_edit_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_more_horiz_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_more_vert_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_music_note_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_notifications_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.89,2 2,2zM18,16v-5c0,-3.07 -1.64,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.63,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_notifications_fill_40px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M153.3,766.7L153.3,690.94L230.91,690.94L230.91,401.64Q230.91,315.55 281.58,247.26Q332.24,178.97 415.46,160.25L415.46,137.85Q415.46,110.89 434.28,92.02Q453.11,73.15 480,73.15Q506.89,73.15 525.72,92.02Q544.54,110.89 544.54,137.85L544.54,160.25Q627.84,178.81 678.54,247.12Q729.25,315.42 729.25,401.64L729.25,690.94L806.85,690.94L806.85,766.7L153.3,766.7ZM480.16,889.01Q446.21,889.01 422.03,864.83Q397.85,840.65 397.85,806.7L562.39,806.7Q562.39,840.73 538.2,864.87Q514.01,889.01 480.16,889.01Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_notifications_fill_48px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M160,760L160,700L240,700L240,396Q240,312 289.5,245.5Q339,179 420,162L420,140Q420,115 437.5,97.5Q455,80 480,80Q505,80 522.5,97.5Q540,115 540,140L540,162Q621,179 670.5,245.5Q720,312 720,396L720,700L800,700L800,760L160,760ZM480,880Q447,880 423.5,856.5Q400,833 400,800L560,800Q560,833 536.5,856.5Q513,880 480,880Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_notifications_none_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,22c1.1,0 2,-0.9 2,-2h-4c0,1.1 0.9,2 2,2zM18,16v-5c0,-3.07 -1.63,-5.64 -4.5,-6.32L13.5,4c0,-0.83 -0.67,-1.5 -1.5,-1.5s-1.5,0.67 -1.5,1.5v0.68C7.64,5.36 6,7.92 6,11v5l-2,2v1h16v-1l-2,-2zM16,17L8,17v-6c0,-2.48 1.51,-4.5 4,-4.5s4,2.02 4,4.5v6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_notifications_outlined_40px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M153.3,766.7L153.3,690.94L230.91,690.94L230.91,401.64Q230.91,315.55 281.58,247.26Q332.24,178.97 415.46,160.25L415.46,137.85Q415.46,110.89 434.28,92.02Q453.11,73.15 480,73.15Q506.89,73.15 525.72,92.02Q544.54,110.89 544.54,137.85L544.54,160.25Q627.84,178.81 678.54,247.12Q729.25,315.42 729.25,401.64L729.25,690.94L806.85,690.94L806.85,766.7L153.3,766.7ZM480,459.7L480,459.7L480,459.7L480,459.7Q480,459.7 480,459.7Q480,459.7 480,459.7Q480,459.7 480,459.7Q480,459.7 480,459.7ZM480.16,889.01Q446.21,889.01 422.03,864.83Q397.85,840.65 397.85,806.7L562.39,806.7Q562.39,840.73 538.2,864.87Q514.01,889.01 480.16,889.01ZM306.67,690.94L653.33,690.94L653.33,401.64Q653.33,329.8 602.67,279.05Q552,228.3 480,228.3Q408,228.3 357.33,279.05Q306.67,329.8 306.67,401.64L306.67,690.94Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_notifications_outlined_48px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M160,760L160,700L240,700L240,396Q240,312 289.5,245.5Q339,179 420,162L420,140Q420,115 437.5,97.5Q455,80 480,80Q505,80 522.5,97.5Q540,115 540,140L540,162Q621,179 670.5,245.5Q720,312 720,396L720,700L800,700L800,760L160,760ZM480,458L480,458L480,458L480,458Q480,458 480,458Q480,458 480,458Q480,458 480,458Q480,458 480,458ZM480,880Q447,880 423.5,856.5Q400,833 400,800L560,800Q560,833 536.5,856.5Q513,880 480,880ZM300,700L660,700L660,396Q660,321 607.5,268.5Q555,216 480,216Q405,216 352.5,268.5Q300,321 300,396L300,700Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_person_add_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_person_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM12,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_play_circle_outline_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M10,16.5l6,-4.5 -6,-4.5v9zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_poll_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,3L5,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2zM9,17L7,17v-7h2v7zM13,17h-2L11,7h2v10zM17,17h-2v-4h2v4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_re_note.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_refresh_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\"\n        android:tint=\"?attr/colorControlNormal\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_remove_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,13H5v-2h14v2z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_remove_circle_outline_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M7,11v2h10v-2L7,11zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_remove_to_tab_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19L3,19L3,5h10v4h8v10z\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M8.0943,12.7075h8v2h-8z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_reply_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"20dp\"\n        android:height=\"20dp\"\n        android:viewportWidth=\"20\"\n        android:viewportHeight=\"20\"\n        android:tint=\"?attr/colorControlNormal\"\n        android:autoMirrored=\"true\">\n    <path\n            android:fillColor=\"@android:color/white\"\n            android:pathData=\"M8,7.5V4l-6,6 6,6v-3.5c4.44,0 7.78,1.39 10,4.5 -0.89,-4.44 -3.78,-8.61 -10,-9.5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_save_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M17,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,7l-4,-4zM12,19c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3 3,1.34 3,3 -1.34,3 -3,3zM15,9L5,9L5,5h10v4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_search_40px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"40dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M791.68,846.83L530.83,586.14Q501.07,610.66 461.55,624.6Q422.03,638.54 377.07,638.54Q266.8,638.54 190.33,562.02Q113.86,485.5 113.86,376.67Q113.86,267.83 190.38,191.31Q266.91,114.79 376.07,114.79Q485.24,114.79 561.43,191.31Q637.62,267.83 637.62,376.77Q637.62,420.48 624.01,459.79Q610.41,499.09 584.54,532.11L846.14,792.45L791.68,846.83ZM376.46,562.79Q453.9,562.79 507.88,508.35Q561.86,453.91 561.86,376.67Q561.86,299.42 507.86,244.98Q453.85,190.54 376.46,190.54Q298.52,190.54 244.07,244.98Q189.62,299.42 189.62,376.67Q189.62,453.91 244.04,508.35Q298.47,562.79 376.46,562.79Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_search_48px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"48dp\"\n    android:height=\"48dp\"\n    android:viewportWidth=\"960\"\n    android:viewportHeight=\"960\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M796,839L533,576Q503,602 463.04,616.5Q423.08,631 378,631Q269.84,631 194.92,556Q120,481 120,375Q120,269 195,194Q270,119 376.5,119Q483,119 557.5,194Q632,269 632,375.15Q632,418 618,458Q604,498 576,533L840,795L796,839ZM377,571Q458.25,571 515.13,513.5Q572,456 572,375Q572,294 515.13,236.5Q458.25,179 377,179Q294.92,179 237.46,236.5Q180,294 180,375Q180,456 237.46,513.5Q294.92,571 377,571Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_search_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_selectable_drive.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/ic_cloud_queue_black_24dp\" android:state_checked=\"false\"/>\n    <item android:drawable=\"@drawable/ic_cloud_black_24dp\" android:state_checked=\"true\"/>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_selectable_file.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/ic_folder_black_24dp\" android:state_checked=\"true\"/>\n    <item android:drawable=\"@drawable/ic_folder_open_black_24dp\" android:state_checked=\"false\"/>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_selectable_message.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/ic_message_black_24dp\" android:state_checked=\"true\" />\n    <item android:drawable=\"@drawable/ic_chat_bubble_outline_black_24dp\" android:state_checked=\"false\"/>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_selectable_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/ic_notifications_fill_40px\" android:state_checked=\"true\"/>\n    <item android:drawable=\"@drawable/ic_notifications_outlined_40px\" android:state_checked=\"false\"/>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_settings_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24\"\n        android:viewportHeight=\"24\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19.1,12.9a2.8,2.8 0,0 0,0.1 -0.9,2.8 2.8,0 0,0 -0.1,-0.9l2.1,-1.6a0.7,0.7 0,0 0,0.1 -0.6L19.4,5.5a0.7,0.7 0,0 0,-0.6 -0.2l-2.4,1a6.5,6.5 0,0 0,-1.6 -0.9l-0.4,-2.6a0.5,0.5 0,0 0,-0.5 -0.4H10.1a0.5,0.5 0,0 0,-0.5 0.4L9.3,5.4a5.6,5.6 0,0 0,-1.7 0.9l-2.4,-1a0.4,0.4 0,0 0,-0.5 0.2l-2,3.4c-0.1,0.2 0,0.4 0.2,0.6l2,1.6a2.8,2.8 0,0 0,-0.1 0.9,2.8 2.8,0 0,0 0.1,0.9L2.8,14.5a0.7,0.7 0,0 0,-0.1 0.6l1.9,3.4a0.7,0.7 0,0 0,0.6 0.2l2.4,-1a6.5,6.5 0,0 0,1.6 0.9l0.4,2.6a0.5,0.5 0,0 0,0.5 0.4h3.8a0.5,0.5 0,0 0,0.5 -0.4l0.3,-2.6a5.6,5.6 0,0 0,1.7 -0.9l2.4,1a0.4,0.4 0,0 0,0.5 -0.2l2,-3.4c0.1,-0.2 0,-0.4 -0.2,-0.6ZM12,15.6A3.6,3.6 0,1 1,15.6 12,3.6 3.6,0 0,1 12,15.6Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_sharp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"512dp\"\n    android:height=\"512dp\"\n    android:viewportWidth=\"512\"\n    android:viewportHeight=\"512\">\n  <path\n      android:pathData=\"M418.562,173.34c5.999,-1.291 10.281,-6.582 10.281,-12.724V103.86c0,-3.927 -1.775,-7.649 -4.834,-10.124c-3.058,-2.466 -7.07,-3.425 -10.912,-2.6l-51.621,11.093V30.884c0,-3.856 -1.713,-7.515 -4.672,-9.99c-2.964,-2.475 -6.869,-3.507 -10.662,-2.816l-38.686,7.013c-6.192,1.121 -10.694,6.51 -10.694,12.805v78.242l-80.658,17.333V64.117c0,-3.856 -1.713,-7.514 -4.672,-9.99c-2.958,-2.475 -6.864,-3.506 -10.662,-2.816l-38.69,7.004c-6.192,1.12 -10.693,6.511 -10.693,12.806v76.25l-57.948,12.456c-5.999,1.282 -10.281,6.59 -10.281,12.724v56.756c0,3.927 1.776,7.649 4.834,10.124c3.062,2.466 7.07,3.426 10.917,2.601l52.478,-11.281v108.39l-57.948,12.456c-5.999,1.282 -10.281,6.582 -10.281,12.715v56.737c0,3.928 1.776,7.649 4.834,10.125c3.062,2.466 7.07,3.425 10.917,2.6l52.478,-11.281v76.492c0,3.856 1.712,7.515 4.672,9.99c2.959,2.476 6.864,3.507 10.662,2.816l38.686,-6.995c6.192,-1.12 10.698,-6.51 10.698,-12.805v-83.397l80.658,-17.334v74.502c0,3.865 1.712,7.524 4.672,9.99c2.96,2.475 6.865,3.506 10.662,2.815l38.686,-7.004c6.192,-1.121 10.694,-6.51 10.694,-12.805V377.35l57.087,-12.267c5.999,-1.291 10.281,-6.582 10.281,-12.724v-56.729c0,-3.927 -1.775,-7.649 -4.834,-10.124c-3.058,-2.466 -7.07,-3.426 -10.912,-2.6l-51.621,11.093v-108.39L418.562,173.34zM296.761,307.906l-80.658,17.326V216.85l80.658,-17.334V307.906z\"\n      android:fillColor=\"#FF000000\"/>\n  <path\n      android:pathData=\"M364.421,0.036c0.022,0 0.04,0 0.062,-0.009L364.65,0L364.421,0.036z\"\n      android:fillColor=\"#FF000000\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_star.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"36dp\"\n    android:height=\"36dp\"\n    android:viewportWidth=\"36\"\n    android:viewportHeight=\"36\">\n  <path\n      android:pathData=\"M27.287,34.627c-0.404,0 -0.806,-0.124 -1.152,-0.371L18,28.422l-8.135,5.834c-0.693,0.496 -1.623,0.496 -2.312,-0.008 -0.689,-0.499 -0.979,-1.385 -0.721,-2.194l3.034,-9.792 -8.062,-5.681c-0.685,-0.505 -0.97,-1.393 -0.708,-2.203 0.264,-0.808 1.016,-1.357 1.866,-1.363L12.947,13l3.179,-9.549c0.268,-0.809 1.023,-1.353 1.874,-1.353 0.851,0 1.606,0.545 1.875,1.353L23,13l10.036,0.015c0.853,0.006 1.606,0.556 1.867,1.363 0.263,0.81 -0.022,1.698 -0.708,2.203l-8.062,5.681 3.034,9.792c0.26,0.809 -0.033,1.695 -0.72,2.194 -0.347,0.254 -0.753,0.379 -1.16,0.379z\"\n      android:fillColor=\"#FFAC33\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_star_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_star_border_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_star_state.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/ic_star_black_24dp\" android:state_checked=\"true\" />\n    <item android:drawable=\"@drawable/ic_star_border_black_24dp\" android:state_checked=\"false\"/>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_supervisor_account_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16.5,12c1.38,0 2.49,-1.12 2.49,-2.5S17.88,7 16.5,7C15.12,7 14,8.12 14,9.5s1.12,2.5 2.5,2.5zM9,11c1.66,0 2.99,-1.34 2.99,-3S10.66,5 9,5C7.34,5 6,6.34 6,8s1.34,3 3,3zM16.5,14c-1.83,0 -5.5,0.92 -5.5,2.75L11,19h11v-2.25c0,-1.83 -3.67,-2.75 -5.5,-2.75zM9,13c-2.33,0 -7,1.17 -7,3.5L2,19h7v-2.25c0,-0.85 0.33,-2.34 2.37,-3.47C10.5,13.1 9.66,13 9,13z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_sync_alt_24px.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M7,21 L2,16 7,11 8.425,12.4 5.825,15H21V17H5.825L8.425,19.6ZM17,13 L15.575,11.6 18.175,9H3V7H18.175L15.575,4.4L17,3L22,8Z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_visibility_off_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,7c2.76,0 5,2.24 5,5 0,0.65 -0.13,1.26 -0.36,1.83l2.92,2.92c1.51,-1.26 2.7,-2.89 3.43,-4.75 -1.73,-4.39 -6,-7.5 -11,-7.5 -1.4,0 -2.74,0.25 -3.98,0.7l2.16,2.16C10.74,7.13 11.35,7 12,7zM2,4.27l2.28,2.28 0.46,0.46C3.08,8.3 1.78,10.02 1,12c1.73,4.39 6,7.5 11,7.5 1.55,0 3.03,-0.3 4.38,-0.84l0.42,0.42L19.73,22 21,20.73 3.27,3 2,4.27zM7.53,9.8l1.55,1.55c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.66 1.34,3 3,3 0.22,0 0.44,-0.03 0.65,-0.08l1.55,1.55c-0.67,0.33 -1.41,0.53 -2.2,0.53 -2.76,0 -5,-2.24 -5,-5 0,-0.79 0.2,-1.53 0.53,-2.2zM11.84,9.02l3.15,3.15 0.02,-0.16c0,-1.66 -1.34,-3 -3,-3l-0.17,0.01z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/ic_zoom_out_map_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15,3l2.3,2.3 -2.89,2.87 1.42,1.42L18.7,6.7 21,9L21,3zM3,9l2.3,-2.3 2.87,2.89 1.42,-1.42L6.7,5.3 9,3L3,3zM9,21l-2.3,-2.3 2.89,-2.87 -1.42,-1.42L5.3,17.3 3,15v6zM21,15l-2.3,2.3 -2.87,-2.89 -1.42,1.42 2.89,2.87L15,21h6z\"/>\n</vector>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/shape_chip.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n\n                    android:radius=\"30dp\"\n\n                    />\n            <solid\n                    android:color=\"?attr/colorNormalReactionCounterBackground\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/shape_message_recipient.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n                    android:topRightRadius=\"15dp\"\n                    android:bottomRightRadius=\"15dp\"\n                    android:topLeftRadius=\"15dp\"\n                    android:bottomLeftRadius=\"15dp\"\n\n                    />\n            <solid\n                    android:color=\"?attr/colorMessageRecipient\"\n                    tools:color=\"@color/colorMessageRecipient\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/shape_message_self.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n                    android:topLeftRadius=\"15dp\"\n                    android:bottomLeftRadius=\"15dp\"\n                    android:topRightRadius=\"15dp\"\n                    android:bottomRightRadius=\"15dp\"\n\n                    />\n            <solid\n                    android:color=\"?attr/colorMessageSelf\"\n                    tools:color=\"@color/colorMessageSelf\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/shape_messages_badge.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n\n                    android:radius=\"24dp\"\n                    />\n            <solid\n                    android:color=\"?attr/colorAccent\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/shape_normal_reaction_backgruond.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n                    android:topRightRadius=\"8dp\"\n                    android:bottomRightRadius=\"8dp\"\n                    android:topLeftRadius=\"8dp\"\n                    android:bottomLeftRadius=\"8dp\"\n\n                    />\n            <solid\n                    android:color=\"?attr/colorNormalReactionCounterBackground\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/shape_rounded_square_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n                    android:topRightRadius=\"8dp\"\n                    android:bottomRightRadius=\"8dp\"\n                    android:topLeftRadius=\"8dp\"\n                    android:bottomLeftRadius=\"8dp\"\n\n                    />\n            <stroke android:color=\"?attr/colorSeparator\"\n                    android:width=\"1dp\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/shape_selected_reaction_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n                    android:topRightRadius=\"8dp\"\n                    android:bottomRightRadius=\"8dp\"\n                    android:topLeftRadius=\"8dp\"\n                    android:bottomLeftRadius=\"8dp\"\n\n                    />\n            <solid\n                    android:color=\"?attr/colorSelectedReactionCounterBackground\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/side_nav_bar.xml",
    "content": "<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <gradient\n            android:angle=\"135\"\n            android:centerColor=\"#03A9F4\"\n            android:endColor=\"#007381\"\n            android:startColor=\"#004D57\"\n            android:type=\"linear\"/>\n</shape>"
  },
  {
    "path": "modules/common_resource/src/main/res/drawable/tab_dot_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_selected=\"true\">\n        <shape\n                android:shape=\"ring\"\n                android:innerRadius=\"0dp\"\n                android:thickness=\"4dp\"\n                android:useLevel=\"false\">\n            <solid android:color=\"?attr/colorDotTabSelected\"/>\n        </shape>\n    </item>\n    <item>\n        <shape\n                android:shape=\"ring\"\n                android:innerRadius=\"0dp\"\n                android:thickness=\"3dp\"\n                android:useLevel=\"false\">\n            <solid android:color=\"?attr/colorDotTabNormal\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/activity_auth_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n            android:id=\"@+id/menu_sign_in\"\n            android:title=\"@string/sign_in\"\n            app:showAsAction=\"ifRoom\"/>\n    <item\n            android:id=\"@+id/menu_custom_app\"\n            android:title=\"@string/custom_app\"\n            app:showAsAction=\"ifRoom\"/>\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/activity_custom_app_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n            android:id=\"@+id/menu_auth\"\n            android:title=\"@string/auth\"\n            app:showAsAction=\"ifRoom\"/>\n    <item\n            android:id=\"@+id/menu_sign_in\"\n            android:title=\"@string/sign_in\"\n            app:showAsAction=\"ifRoom\"/>\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/activity_main_drawer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        tools:showIn=\"navigation_view\">\n\n    <group android:checkableBehavior=\"single\">\n\n        <item\n                android:id=\"@+id/nav_switch_account\"\n                android:icon=\"@drawable/ic_supervisor_account_black_24dp\"\n                android:title=\"@string/switch_account\"\n            />\n        <item\n                android:id=\"@+id/nav_favorite\"\n                android:icon=\"@drawable/ic_star_black_24dp\"\n                android:title=\"@string/nav_like\" />\n        <item\n                android:id=\"@+id/nav_list\"\n                android:icon=\"@drawable/ic_format_list_bulleted_black_24dp\"\n                android:title=\"@string/nav_list\" />\n\n        <item\n                android:id=\"@+id/nav_drive\"\n                android:icon=\"@drawable/ic_cloud_black_24dp\"\n                android:title=\"@string/nav_cloud\" />\n        <item\n                android:id=\"@+id/nav_channel\"\n                android:title=\"@string/channel\"\n                android:icon=\"@drawable/ic_baseline_radio_24\" />\n        <item\n                android:id=\"@+id/nav_antenna\"\n                android:icon=\"@drawable/ic_call_received_black_24dp\"\n                android:title=\"@string/antenna\" />\n        <item\n                android:id=\"@+id/nav_draft\"\n                android:icon=\"@drawable/ic_drafts_black_24dp\"\n                android:title=\"@string/draft_notes\" />\n        <item\n                android:id=\"@+id/nav_gallery\"\n                android:title=\"@string/gallery\"\n                android:icon=\"@drawable/ic_menu_gallery\" />\n\n        <item\n                android:id=\"@+id/nav_clip\"\n                android:title=\"@string/clip\"\n                android:icon=\"@drawable/ic_attachment_24px\" />\n        <item\n                android:id=\"@+id/nav_group\"\n                android:icon=\"@drawable/ic_groups\"\n                android:title=\"@string/groups\" />\n        <item\n                android:id=\"@+id/nav_setting\"\n                android:title=\"@string/setting\"\n                android:icon='@drawable/ic_settings_black_24dp' />\n\n\n    </group>\n\n\n</menu>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/activity_search_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n            android:id=\"@+id/nav_search_add_to_tab\"\n            android:title=\"@string/add_to_tab\"\n            android:icon=\"@drawable/ic_add_black_24dp\"\n            app:showAsAction=\"ifRoom\"\n            />\n    <item\n            android:id=\"@+id/search\"\n            android:title=\"@string/search\"\n            app:showAsAction=\"ifRoom\"\n            android:icon=\"@drawable/ic_search_black_24dp\"\n            />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/activity_sign_in_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n            android:id=\"@+id/menu_custom_app\"\n            android:title=\"@string/custom_app\"\n            app:showAsAction=\"ifRoom\"\n            />\n    <item\n            android:id=\"@+id/menu_auth\"\n            android:title=\"@string/auth\"\n            app:showAsAction=\"ifRoom\"/>\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/activity_user_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item   android:id=\"@+id/nav_search_by_user\"\n            android:title=\"@string/search\"\n            android:icon=\"@drawable/ic_search_black_24dp\"\n            app:showAsAction=\"ifRoom\" />\n    <item\n            android:id=\"@+id/nav_add_to_tab\"\n            android:title=\"@string/add_to_tab\"\n            android:icon=\"@drawable/ic_add_black_24dp\"\n            app:showAsAction=\"ifRoom\"/>\n    <item\n            android:id=\"@+id/mute\"\n            android:title=\"@string/mute\"\n            android:icon=\"@drawable/ic_visibility_off_black_24dp\" />\n    <item\n            android:id=\"@+id/unmute\"\n            android:title=\"@string/unmute\"\n        />\n    <item\n            android:id=\"@+id/block\"\n            android:title=\"@string/block\"\n        />\n    <item\n            android:id=\"@+id/unblock\"\n            android:title=\"@string/unblock\"\n            />\n\n    <item\n            android:id=\"@+id/renoteMute\"\n            android:title=\"@string/user_detail_mute_renotes\"\n        />\n    <item\n            android:id=\"@+id/renoteUnmute\"\n            android:title=\"@string/user_detail_unmute_renotes\"\n        />\n    <item\n            android:id=\"@+id/add_list\"\n            android:title=\"@string/add_to_list\"/>\n\n    <item\n            android:id=\"@+id/notify_about_new_posts\"\n            android:title=\"@string/notify_about_new_posts\" />\n\n    <item\n            android:id=\"@+id/stop_notify_about_new_posts\"\n            android:title=\"@string/stop_notify_about_new_posts\" />\n\n    <item\n            android:id=\"@+id/report_user\"\n            android:title=\"@string/report\"/>\n    <item\n            android:id=\"@+id/share\"\n            android:title=\"@string/share\"/>\n\n    <item\n            android:id=\"@+id/nav_switch_account\"\n            android:title=\"@string/switch_account\"\n        />\n\n    <item\n        android:id=\"@+id/show_qr_code\"\n        android:title=\"@string/qr_code\"\n        />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/bottom_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:tools=\"http://schemas.android.com/tools\"\n      tools:showIn=\"navigation_view\"\n>\n\n\n    <item\n            android:id=\"@+id/navigation_home\"\n            android:icon=\"@drawable/ic_home_black_24dp\"\n            android:title=\"@string/menu_home\" />\n    <item\n            android:id=\"@+id/navigation_search\"\n            android:title=\"@string/search\"\n            android:icon=\"@drawable/ic_search_40px\"/>\n    <item\n            android:id=\"@+id/navigation_notification\"\n            android:title=\"@string/notification\" android:icon=\"@drawable/ic_selectable_notification\"/>\n    <item\n            android:id=\"@+id/navigation_message_list\"\n            android:title=\"@string/message\" android:icon=\"@drawable/ic_account_circle_40px\"/>\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n            android:id=\"@+id/action_notification\"\n            android:title=\"@string/notification\"\n            android:icon=\"@drawable/ic_notifications_none_black_24dp\"\n            app:showAsAction=\"ifRoom\"\n            />\n    <item\n            android:id=\"@+id/action_search\"\n            android:title=\"@string/search\"\n            app:showAsAction=\"ifRoom\"\n            android:icon=\"@drawable/ic_search_black_24dp\"/>\n    <item\n            android:id=\"@+id/action_messaging\"\n            android:title=\"@string/message\"\n            app:showAsAction=\"ifRoom\"\n            android:icon=\"@drawable/ic_selectable_message\"\n            />\n\n    <item\n            android:id=\"@+id/action_tab_setting\"\n            android:title=\"@string/nav_setting_tab\"\n            app:showAsAction=\"never\"\n\n        />\n\n</menu>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/menu_drive.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n            android:id=\"@+id/action_open\"\n            android:title=\"@string/open\"\n            app:showAsAction=\"ifRoom\"\n            />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/menu_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n            android:id=\"@+id/app_bar_search\"\n            android:icon=\"@drawable/ic_search_black_24dp\"\n            android:title=\"@string/search\"\n            app:showAsAction=\"ifRoom\"\n            app:actionViewClass=\"android.widget.SearchView\" />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/menu_user_list_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n            android:id=\"@+id/action_update_list_user\"\n            android:icon=\"@drawable/ic_edit_black_24dp\"\n            android:title=\"@string/update_user_list\"\n            tools:ignore=\"PrivateResource\"\n            app:showAsAction=\"ifRoom\"/>\n\n    <item\n            android:id=\"@+id/action_add_user\"\n            android:icon=\"@drawable/ic_person_add_black_24dp\"\n            android:title=\"@string/add_user\"\n            app:showAsAction=\"ifRoom\"/>\n    <item\n            android:id=\"@+id/action_add_to_tab\"\n            android:icon=\"@drawable/ic_add_black_24dp\"\n            android:title=\"@string/add_to_tab\"\n            app:showAsAction=\"ifRoom\"/>\n\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/note_detail_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/nav_switch_account\"\n        android:title=\"@string/switch_account\"\n        android:icon=\"@drawable/ic_account_circle_24px\"\n        app:showAsAction=\"ifRoom\"\n        />\n    <item\n            android:id=\"@+id/nav_add_to_tab\"\n            android:title=\"@string/add_to_tab\"\n            android:icon=\"@drawable/ic_add_to_tab_24px\"\n            app:showAsAction=\"ifRoom\"\n            />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/search_top_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/search\"\n        android:title=\"@string/search\"\n        app:showAsAction=\"ifRoom\"\n        android:icon=\"@drawable/ic_search_black_24dp\"\n        />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/tab_pager_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/edit_tab\"\n        android:icon=\"@drawable/ic_edit_black_24dp\"\n        android:title=\"@string/edit_tab\"\n        app:showAsAction=\"never\" />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/menu/tab_setting_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n            android:id=\"@+id/save\"\n            android:title=\"@string/save_setting\"\n            android:icon=\"@drawable/ic_save_black_24dp\"\n            app:showAsAction=\"ifRoom\"\n            />\n</menu>"
  },
  {
    "path": "modules/common_resource/src/main/res/values/arrays.xml",
    "content": "<resources>\n    <!-- Reply Preference -->\n    <string-array name=\"reply_entries\">\n        <item>Reply</item>\n        <item>Reply to all</item>\n    </string-array>\n\n    <string-array name=\"reply_values\">\n        <item>reply</item>\n        <item>reply_all</item>\n    </string-array>\n\n    <string-array name=\"theme_entries\">\n        <item>ライト</item>\n        <item>ブラック</item>\n    </string-array>\n    <string-array name=\"theme_values\">\n        <item>light</item>\n        <item>black</item>\n    </string-array>\n\n    <string-array name=\"deadline_choices\">\n        <item>@string/indefinite_period</item>\n        <item>@string/date_and_time_specification</item>\n    </string-array>\n    <string-array name=\"reaction_picker_type\">\n        <item>@string/list_picker</item>\n        <item>@string/simple_picker</item>\n    </string-array>\n\n    <string-array name=\"receiving_source_type\">\n        <item>@string/all_notes</item>\n        <item>@string/notes_from_following_users</item>\n        <item>@string/notes_from_specific_users</item>\n        <item>@string/notes_from_specific_list</item>\n        <item>@string/notes_from_users_in_the_specified_group</item>\n    </string-array>\n</resources>"
  },
  {
    "path": "modules/common_resource/src/main/res/values/attrs.xml",
    "content": "<resources>\n\n    <!-- Declare custom theme attributes that allow changing which styles are\n         used for button bars depending on the API level.\n         ?android:attr/buttonBarStyle is new as of API 11 so this is\n         necessary to support previous API levels. -->\n    <declare-styleable name=\"ButtonBarContainerTheme\">\n        <attr name=\"metaButtonBarStyle\" format=\"reference\" />\n        <attr name=\"metaButtonBarButtonStyle\" format=\"reference\" />\n    </declare-styleable>\n    <declare-styleable name=\"AutoCollapsingLayout\">\n        <attr name=\"expandableButton\" format=\"reference\" />\n    </declare-styleable>\n</resources>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!--Normal Theme-->\n    <color name=\"colorPrimary\">#FFFFFF</color>\n    <color name=\"colorPrimaryDark\">#FFFFFF</color>\n    <color name=\"colorLightSurface\">#FFFFFF</color>\n    <color name=\"colorAccent\">#252525</color>\n    <color name=\"colorNormalIconTint\">#263238</color>\n    <color name=\"colorItemNotSelected\">#727272</color>\n    <color name=\"colorItemSelected\">#202020</color>\n\n    <color name=\"colorNormalReaction\">#CCCCCC</color>\n    <color name=\"colorSelectedReaction\">#FB8C00</color>\n    <color name=\"colorMessageSelf\">#FFA95B</color>\n    <color name=\"colorMessageRecipient\">#FFFFFF</color>\n    <color name=\"colorSeparator\">#BEBEBE</color>\n    <color name=\"navigationColor\">#C6C3C3</color>\n    <color name=\"colorTextColorPrimary\">#000000</color>\n    <color name=\"colorTextColorSecondaryLight\">#2B2B2B</color>\n\n    <!--Black Theme-->\n    <color name=\"colorBlackPrimary\">#FC000000</color>\n    <color name=\"colorBlackPrimaryDark\">#000000</color>\n    <color name=\"colorBlackWindowBackground\">#121212</color>\n    <color name=\"colorBlackAccent\">#03DAC5</color>\n    <color name=\"colorBlackSurface\">#000000</color>\n    <color name=\"colorBlackTextColor\">#C5C5C5</color>\n    <color name=\"colorBlackIconTint\">#838383</color>\n\n    <!--Dark Theme-->\n    <color name=\"colorDarkPrimary\">#262626</color>\n    <color name=\"colorDarkPrimaryDark\">#1B1B1B</color>\n    <color name=\"colorDarkWindowBackground\">#0E0E0E</color>\n    <color name=\"colorDarkAccent\">#00ACC1</color>\n    <color name=\"colorDarkSurface\">#191919</color>\n    <color name=\"colorDarkTextColor\">#C5C5C5</color>\n    <color name=\"colorDarkBottomNavSelected\">#FFFFFF</color>\n    <color name=\"colorDarkBottomNavNormal\">#80FFFFFF</color>\n    <color name=\"colorTextColorPrimaryColorDarkDark\">#FFFFFF</color>\n    <color name=\"colorIconTintDark\">#C5C5C5</color>\n    <color name=\"colorTextColorSecondary\">#C5C5C5</color>\n    <color name=\"colorSeparatorDark\">#262626</color>\n    <color name=\"colorMessageSelfDark\">#3200B4</color>\n    <color name=\"colorMessageRecipientDark\">#262626</color>\n    <color name=\"navigationDarkColor\">#1B1B1B</color>\n\n    <!--Bread Theme-->\n    <color name=\"colorBreadPrimary\">#D9A042</color>\n    <color name=\"colorBreadPrimaryDark\">#995633</color>\n    <color name=\"colorBreadSurface\">#F8F5C9</color>\n    <color name=\"colorBreadAccent\">#69BAD6</color>\n    <color name=\"colorBreadBottomNavSelected\">#69BAD6</color>\n\n    <color name=\"black_overlay\">#66000000</color>\n</resources>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n    <dimen name=\"nav_header_vertical_spacing\">8dp</dimen>\n    <dimen name=\"nav_header_height\">176dp</dimen>\n    <dimen name=\"fab_margin\">16dp</dimen>\n\n    <dimen name=\"dialog_title_font_size\">24sp</dimen>\n\n\n</resources>"
  },
  {
    "path": "modules/common_resource/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#000000</color>\n</resources>"
  },
  {
    "path": "modules/common_resource/src/main/res/values/strings.xml",
    "content": "<resources xmlns:tools=\"http://schemas.android.com/tools\">\n    <string name=\"app_name\">Milktea</string>\n    <string name=\"navigation_drawer_open\">Open navigation drawer</string>\n    <string name=\"navigation_drawer_close\">Close navigation drawer</string>\n    <string name=\"nav_header_title\">Android Studio</string>\n    <string name=\"nav_header_subtitle\">android.studio@android.com</string>\n    <string name=\"nav_header_desc\">Navigation header</string>\n    <string name=\"action_settings\">Settings</string>\n\n    <string name=\"menu_home\">Home</string>\n    <string name=\"menu_gallery\">Gallery</string>\n    <string name=\"menu_slideshow\">Slideshow</string>\n    <string name=\"menu_tools\">Tools</string>\n    <string name=\"share\">Share</string>\n    <string name=\"menu_send\">Send</string>\n    <string name=\"search\">Search</string>\n    <string name=\"notification\">Notifications</string>\n    <string name=\"message\">Messages</string>\n    <string name=\"start_auth\">Authenticate</string>\n    <string name=\"selecting_instance\">Selected instance</string>\n    <!--    <string name=\"welcome\">Welcome</string>-->\n    <!--    <string name=\"san\">-san</string>-->\n    <string name=\"following\">Following</string>\n    <string name=\"follower\">Followers</string>\n    <string name=\"renote\">Renote</string>\n    <string name=\"renote_in_channel\">Renote in channel</string>\n    <string name=\"quote_renote\">Quote renote</string>\n    <string name=\"quote_renote_in_channel\">Quote renote in channel</string>\n    <string name=\"discovery\">Discovery</string>\n    <string name=\"renote_was\">Renote</string>\n    <string name=\"input_custom_emoji\">Emoji</string>\n    <string name=\"title_activity_settings\">Settings</string>\n\n    <string name=\"reply_title\">Default reply action</string>\n\n    <!-- Sync Preferences -->\n    <string name=\"sync_title\">Sync periodically</string>\n    <string name=\"attachment_title\">Download incoming attachments</string>\n    <string name=\"attachment_summary_on\">Automatically download attachments for incoming requests\n    </string>\n    <string name=\"attachment_summary_off\">Only download attachments when manually requested</string>\n    <string name=\"setting\">Settings</string>\n    <string name=\"nav_like\">Favorites</string>\n    <string name=\"nav_list\">Lists</string>\n    <string name=\"nav_cloud\">Drive</string>\n    <string name=\"nav_setting_tab\">Set tab</string>\n    <string name=\"add_search\">Add search</string>\n    <string name=\"save_setting\">Save settings</string>\n    <string name=\"tab_selected\">Added</string>\n    <string name=\"tab_selectable\">Add from below</string>\n    <string name=\"title_featured\">Highlights</string>\n\n    <!--    <string name=\"create_folder\">Create folder</string>-->\n    <string name=\"add_account\">Add account</string>\n    <string name=\"post\">Post</string>\n    <string name=\"notes_and_replies\">Notes and replies</string>\n    <string name=\"please_speak\">What\\'s on your mind?</string>\n    <string name=\"open\">Open</string>\n    <string name=\"multiple_answer\">Multiple answers</string>\n    <string name=\"add_choice\">Add answer</string>\n    <string name=\"cw_hint\">Alt text (optional)</string>\n    <string name=\"show_reply\">Show replies</string>\n    <string name=\"show_conversation\">View conversation</string>\n    <string name=\"copy_url\">Copy URL</string>\n    <string name=\"copy_content\">Copy content</string>\n    <string name=\"show_detail\">Detail</string>\n    <string name=\"favorite\">Favorite</string>\n    <string name=\"remove_favorite\">Remove favorites</string>\n    <string name=\"remove\">Remove</string>\n\n    <string name=\"pin\">Pin</string>\n    <string name=\"media\">Media</string>\n    <string name=\"follow\">Follow</string>\n\n    <string name=\"include_local_renotes\">Show local renotes on the timeline</string>\n    <string name=\"include_renoted_my_notes\">Show renotes of your notes on the timeline</string>\n    <string name=\"include_my_renotes\">Show your renotes on the timeline</string>\n    <string name=\"auto_load_timeline\">Load timeline automatically</string>\n    <string name=\"timeline\">Timeline</string>\n\n    <string name=\"capture_note_when_stopped\" tools:ignore=\"Typos\">Look for notes notes when the instance\\'s server is stopped</string>\n    <string name=\"auto_load_when_stopped\" tools:ignore=\"Typos\">Automatically look for notes notes when the instance\\'s server is stopped</string>\n    <string name=\"sync\">Sync</string>\n\n    <string name=\"movement\">Movement</string>\n    <string name=\"remove_note\">Delete notes</string>\n\n    <string name=\"hide_removed_note\">Hide deleted notes</string>\n\n    <string name=\"appearance\">Appearance</string>\n    <string name=\"theme\">Theme</string>\n    <string name=\"theme_white\">White</string>\n    <string name=\"theme_black\">AMOLED</string>\n    <string name=\"theme_dark\">Dark</string>\n    <string name=\"theme_bread\">Pancake</string>\n    <string name=\"theme_mastodon_dark\">Elephant Dark</string>\n\n    <string name=\"title_activity_media\">MediaActivity</string>\n    <string name=\"dummy_button\">Dummy Button</string>\n    <string name=\"dummy_content\">DUMMY\\nCONTENT</string>\n\n    <string name=\"sensitive_content\">Sensitive content</string>\n\n    <string name=\"thumbnail\">Thumbnail</string>\n    <string name=\"play_media\">Play</string>\n    <string name=\"avataricon\">avatarIcon</string>\n    <string name=\"reaction\">Reaction</string>\n    <string name=\"followed_by\">Followed by %s</string>\n    <string name=\"replied_by\">Reply from %s</string>\n    <string name=\"quoted_by\">Quoted by %s</string>\n    <string name=\"voted_by\">poll voted in by %s</string>\n    <string name=\"total_vote_count\">%s votes in total</string>\n    <string name=\"mention_by\">mentioned by %s</string>\n    <string name=\"reacted_by\">reaction sent by %s</string>\n    <string name=\"renoted_by\">renoted by %s</string>\n\n    <string name=\"input_message\">What\\'s up?</string>\n\n    <string name=\"manifest_user_name_pattern\">\"@\"\\w([\\w-]*\\w)?(?:@[\\w.\\-]+\\w)?</string>\n    <string name=\"followee_state\">Followed</string>\n    <string name=\"mute\">Mute</string>\n    <string name=\"block\">Block</string>\n    <string name=\"unmute\">Unmute</string>\n    <string name=\"unblock\">Unblock</string>\n\n    <string name=\"add_to_tab\">Add to tab</string>\n\n    <string name=\"detail\">Detail</string>\n\n    <string name=\"instance_domain\">Instance URL</string>\n    <string name=\"sign_in\">Login</string>\n    <string name=\"user_name\">Username</string>\n    <string name=\"password\">Password</string>\n    <string name=\"sign_out\">Logout</string>\n    <string name=\"token\">Token</string>\n\n    <string name=\"add_app\">Add app</string>\n    <string name=\"selected_account\">Selected account</string>\n    <string name=\"account\">Account</string>\n    <string name=\"selected_app\">Selected app</string>\n    <string name=\"custom_app\">Custom app</string>\n\n    <string name=\"custom_app_name\">App name</string>\n    <string name=\"custom_app_description\">Application overview</string>\n\n    <string name=\"your_app_name\">Custom app name</string>\n    <string name=\"description_of_app_description\">Displayed during authentication</string>\n    <string name=\"create\">Create</string>\n\n    <string name=\"auth_failed\">Failed</string>\n    <string name=\"expired\">Expired</string>\n\n    <string name=\"auth_required\">Authentication required</string>\n    <string name=\"invalid_url\">Invalid URL</string>\n    <string name=\"invalid_pw_id\">Invalid password/ID</string>\n\n    <string name=\"auth\">Authentication</string>\n\n    <string name=\"often_use\">Often use</string>\n    <string name=\"all\">All</string>\n\n    <string name=\"visibility_public\">Public</string>\n    <string name=\"visibility_home\">Home</string>\n    <string name=\"visibility_follower\">Followers only</string>\n    <string name=\"visibility_specified\">Direct</string>\n    <string name=\"visibility_public_local_only\">Public (local only)</string>\n    <string name=\"visibility_home_local_only\">Home (local only)</string>\n    <string name=\"visibility_follower_local_only\">Followers only (local only)</string>\n\n    <string name=\"show\">Show</string>\n    <string name=\"user_list\">User list</string>\n    <string name=\"update_user_list\">Edit list</string>\n    <string name=\"add_user\">Add user</string>\n    <string name=\"list_name\">List name</string>\n    <string name=\"create_user_list\">Create list</string>\n    <string name=\"at_mark\">\\@</string>\n\n    <string name=\"host\">Host</string>\n    <string name=\"select_user\">Select user</string>\n    <string name=\"selecting_users\">Selecting user</string>\n    <string name=\"https\">https://</string>\n    <string name=\"conversation\">Conversation</string>\n    <string name=\"add_address\">Add address</string>\n\n    <string name=\"indefinite_period\">Indefinite period</string>\n    <string name=\"date_and_time_specification\">Specific date and time</string>\n\n    <string name=\"future\">Future</string>\n    <string name=\"now\">Now</string>\n\n\n    <string name=\"time_with_year_ago\">%sYR</string>\n    <string name=\"time_with_month_ago\">%sMOS</string>\n    <string name=\"time_with_date_ago\">%sD</string>\n    <string name=\"time_with_hour_ago\">%sHR</string>\n    <string name=\"time_with_minute_ago\">%sMIN</string>\n    <string name=\"time_with_second_ago\">%sS</string>\n\n    <string name=\"select_file\">Select file</string>\n\n    <string name=\"network_error\">Network error</string>\n\n    <!--    <string name=\"folder_name\">Folder name</string>-->\n    <string name=\"selected\">Selected</string>\n    <string name=\"more\">More</string>\n\n    <string name=\"delete_and_edit\">Delete and redraft</string>\n    <string name=\"license\">License</string>\n    <string name=\"standard_reaction\">Standard reaction</string>\n    <string name=\"set_the_reaction_displayed_in_the_reaction_picker\">Set the reaction displayed in the reaction picker</string>\n    <string name=\"reaction_picker\">Reaction picker</string>\n    <string name=\"list_picker\">List picker</string>\n    <string name=\"simple_picker\">Simple picker</string>\n    <string name=\"enter_reaction\">Enter reaction</string>\n    <string name=\"click_to_delete_the_reaction\">Tap to remove the reaction</string>\n    <string name=\"confirm_delete_reaction\">Confirm reaction removal</string>\n    <string name=\"delete_reaction\">Remove reaction</string>\n    <string name=\"user\">User</string>\n    <string name=\"note_opacity\">Note opacity</string>\n    <string name=\"transparent\">Transparent</string>\n    <string name=\"opaque\">Opaque</string>\n    <string name=\"background_image\">Background image</string>\n    <string name=\"hide_bottom_navigation\">Hide bottom menu</string>\n    <string name=\"user_name_as_default_display_name\">Set username as default display name</string>\n    <string name=\"successfully_created_the_app\">Successfully created the app</string>\n    <string name=\"continue_auth\">Continue</string>\n\n    <string name=\"home_timeline\">Home</string>\n    <string name=\"global_timeline\">Global</string>\n    <string name=\"local_timeline\">Local</string>\n    <string name=\"hybrid_timeline\">Social</string>\n    <string name=\"mention\">Mentions</string>\n    <string name=\"add_tab\">Add tab</string>\n    <string name=\"list\">Lists</string>\n    <string name=\"tag\">Hashtags</string>\n    <string name=\"featured\">Featured</string>\n    <string name=\"antenna\">Antennas</string>\n    <string name=\"rename\">Rename</string>\n    <string name=\"edit\">Edit</string>\n    <string name=\"delete\">Delete</string>\n\n    <string name=\"update_timeline_in_background\">Update timeline in background</string>\n\n    <string name=\"edit_tab\">Edit tab</string>\n\n    <string name=\"follow_request_accepted_by\">Follow request accepted by %s</string>\n    <string name=\"poll_ended\">Poll ended</string>\n    <string name=\"confirm_deletion\">Confirm deletion</string>\n    <string name=\"name\">name</string>\n    <string name=\"receiving_source\">Receiving source</string>\n\n    <string name=\"all_notes\">All notes</string>\n    <string name=\"notes_from_following_users\">Notes from users you follow</string>\n    <string name=\"notes_from_specific_users\">Notes from specific users</string>\n    <string name=\"notes_from_specific_list\">Notes from specific list</string>\n    <string name=\"notes_from_users_in_the_specified_group\">Notes from users in the specified group</string>\n    <string name=\"include_replies\">Include replies</string>\n    <string name=\"keywords_to_receive\">Keywords to receive</string>\n    <string name=\"keyword_input_method\">Separate with spaces for AND condition. Separate with line breaks for OR.</string>\n    <string name=\"keywords_to_exclude\">Keywords to exclude</string>\n    <string name=\"case_sensitive\">Case sensitive</string>\n    <string name=\"notify_notes\">Notify of new notes</string>\n    <string name=\"with_files\">Filter only notes with file attached</string>\n    <string name=\"group\">Group</string>\n    <string name=\"save\">Save</string>\n    <string name=\"unrenote\">Unrenote</string>\n    <string name=\"confirm_delete_and_edit_note_description\">Are you sure you want to delete this note and edit it? You will lose all reactions, renotes and replies to it.</string>\n    <string name=\"via\">via</string>\n    <string name=\"search_emojis\">Search emojis</string>\n\n    <string name=\"success\">Success</string>\n    <string name=\"failure\">Failure</string>\n    <string name=\"explore_fediverse\">Fediverse</string>\n    <string name=\"explore\">Explore</string>\n    <string name=\"trending_users\">Trending users</string>\n    <string name=\"users_with_recent_activity\">Users with recent activity</string>\n    <string name=\"newly_joined_users\">New users</string>\n    <string name=\"newly_discovered_users\">Newly discovered users</string>\n    <string name=\"trending_tag\">Trending hashtags</string>\n    <string name=\"save_draft\">Save draft</string>\n    <string name=\"save_the_note_as_a_draft\">Save the note as a draft</string>\n    <string name=\"draft_notes\">Draft notes</string>\n    <string name=\"toggle_content_visibility\">Toggle content visibility</string>\n    <string name=\"delete_draft_note\">Delete draft note</string>\n    <string name=\"show_remotely\">Display remotely</string>\n    <string name=\"incomplete_information_for_remote_user\">Incomplete information for remote user</string>\n    <string name=\"local_only\">Local only</string>\n    <string name=\"post_button_at_the_bottom\">Place the post button at the bottom of the screen.</string>\n    <string name=\"please_again_to_finish\">Press again to finish</string>\n\n    <string name=\"url_preview\">URL preview</string>\n    <string name=\"summaly_server_url\">Summaly server URL</string>\n    <string name=\"displayed_url_preview\">Displayed URL preview</string>\n    <string name=\"preview_display_test\">Preview display test</string>\n    <string name=\"test_url\">Test URL</string>\n    <string name=\"from_misskey_api\">From Misskey API</string>\n    <string name=\"specify_summaly_server\">Specify Summaly server</string>\n    <string name=\"use_app_implementation_deprecated\">Use app implementation (deprecated)</string>\n\n    <string name=\"use_simple_editor\">Use simple editor</string>\n    <string name=\"retry\">Retry</string>\n    <string name=\"failed_to_get_the_note\">Failed to get note</string>\n\n\n    <string name=\"refresh\">Refresh</string>\n\n    <string name=\"long_text\">Collapsed automatically because it is too long(size:%d)</string>\n    <string name=\"show_more\">Show more(%s)</string>\n    <string name=\"hide\">Hide</string>\n\n    <string name=\"text_length_limit\">Text length limit</string>\n    <string name=\"height_limit\">Height limit</string>\n    <string name=\"disable_height_limit\">Disable height limit</string>\n    <string name=\"returns_limit\">Returns limit</string>\n    <string name=\"auto_note_folding\">Automatic note folding</string>\n    <string name=\"add_to_list\">Add to list</string>\n    <string name=\"promotion\">Promotion</string>\n    <string name=\"waiting_4_approval\">Waaaiting for approval</string>\n    <!--    <string name=\"i_have_approved\">Approved</string>-->\n    <!--    <string name=\"waiting_4_u_to_approve\">Waiting for you to approve</string>-->\n    <string name=\"learn_note_visibility\">Learn note visibility</string>\n    <string name=\"accept\">Accept</string>\n    <string name=\"reject\">Reject</string>\n    <string name=\"follow_requested_by\">Receive follow requested by %s</string>\n    <string name=\"local\">Local</string>\n    <string name=\"add_user_list\">Add user list</string>\n    <string name=\"edit_note\">Edit note</string>\n    <string name=\"gallery_favorite_button\">Gallery favorite button</string>\n    <string name=\"popular_posts\">Popular posts</string>\n    <string name=\"gallery\">Gallery</string>\n    <string name=\"my_posts\">My Posts</string>\n    <string name=\"my_liking\">Liked</string>\n    <string name=\"websocket_error\">WebSocket error</string>\n    <string name=\"connecting\">Connecting…</string>\n    <string name=\"connected\">Connected</string>\n    <string name=\"closing\">Closing…</string>\n    <string name=\"closed\">Closed</string>\n    <string name=\"create_gallery\">Create gallery</string>\n    <string name=\"title\">Title</string>\n    <string name=\"description\">Description</string>\n    <string name=\"pick_image\">Pick image</string>\n    <string name=\"pick_image_from_device\">Pick image from device</string>\n    <string name=\"pick_image_from_drive\">Pick image from drive</string>\n    <string name=\"successfully_created_note\">Successfully created the note</string>\n    <string name=\"note_creation_failure\">Note creation failure</string>\n    <string name=\"sensitive\">Sensitive</string>\n    <string name=\"request_follow\">%s wants to follow to you</string>\n\n    <string name=\"copied_to_clipboard\">Copied to clipboard</string>\n    <string name=\"follow_approval_pending\">Follow approval pending</string>\n    <string name=\"request_follow_from_u\">Request follow</string>\n    <string name=\"unfollow\">Unfollow</string>\n    <string name=\"unknown_notification\">Unknown notification</string>\n    <string name=\"unknown_notification_msg\" formatted=\"false\">Unknown notification. Please report the screenshot to the developer. notificationId:%s, type:%s, senderID: %s, </string>\n\n    <string name=\"translated_from_s\">Translated from %s: \\n</string>\n    <string name=\"error_s\">Error %s</string>\n    <string name=\"translate\">Translate</string>\n    <string name=\"report\">Report</string>\n    <string name=\"send\">Send</string>\n    <string name=\"successful_report\">Successful report</string>\n    <string name=\"report_failed\">Report Failed</string>\n    <string name=\"mark_as_nsfw\">Mark as NSFW</string>\n    <string name=\"undo_nsfw\">Undo NSFW</string>\n    <string name=\"cancel\">Cancel</string>\n    <string name=\"remove_attachment\">Remove attachment</string>\n    <string name=\"warning_s\">Warning:%s</string>\n    <string name=\"reservation_at\">Post date and time</string>\n    <string name=\"warning_reservation_msg\">May be posted at different times</string>\n    <string name=\"create_mention\">Create mention</string>\n    <string name=\"change_nickname\">Change nickname</string>\n    <string name=\"nickname\">Nickname</string>\n    <string name=\"delete_nickname\">Delete nickname</string>\n    <string name=\"suggested_emojis\">Suggested Emojis</string>\n    <string name=\"the_remote_emoji_does_not_exist_in_this_instance\">The remote emoji does not exist in this instance.</string>\n    <string name=\"view_in_browser\">View in browser</string>\n    <string name=\"channel\">Channel</string>\n\n    <string name=\"animation\">Animation</string>\n    <string name=\"avatar_icon_animation\">Avatar icon animation</string>\n    <string name=\"security_setting\">Security</string>\n    <string name=\"send_a_crash_report\">Send a crash report</string>\n    <string name=\"crash_reports_are_useful_for_development\">Crash reports are useful for development.</string>\n    <string name=\"agree\">Agree</string>\n    <string name=\"enable_google_analytics\">Enable Google Analytics</string>\n    <string name=\"consent_to_collect_behavior_history\">Consent to collect behavior history</string>\n    <string name=\"consent_to_collect_behavior_history_message\">Behavior history is collected by Google Analytics and is useful for development.</string>\n    <string name=\"disagree\">Disagree</string>\n    <string name=\"search_custom_emojis\">Search Custom Emojis…</string>\n    <string name=\"notification_group_invited_message\">You\\'ve been invited to a group: %s</string>\n\n    <string name=\"groups\">Groups</string>\n\n    <string name=\"is_enable_instance_ticker\">Show Instance information</string>\n    <string name=\"successfully_created_schedule_note\">Successfully created a schedule post</string>\n    <string name=\"switch_account\">Switch Account</string>\n    <string name=\"mute_thread\">Mute thread</string>\n    <string name=\"unmute_thread\">Unmute thread</string>\n\n\n    <string name=\"edit_caption\">Edit caption</string>\n    <string name=\"input_caption\">Input caption</string>\n    <string name=\"other\">Other</string>\n    <string name=\"recently_used\">Recently used</string>\n    <string name=\"char_count\">%1$d characters</string>\n    <string name=\"file_count\">%1$d file(s)</string>\n    <string name=\"poll\">poll</string>\n    <string name=\"add_to_bookmark\">Add to Bookmark</string>\n    <string name=\"remove_bookmark\">Remove Bookmark</string>\n    <string name=\"visibility_personal\">Personal</string>\n    <string name=\"visibility_limited\">Circle</string>\n    <string name=\"visibility_mutual\">Mutual Follow</string>\n    <string name=\"calckey_recomended_timeline\">Recommended</string>\n    <string name=\"notification_favorited_by\">Favorited by %s</string>\n    <string name=\"notification_posted_by\">Posted by %s</string>\n    <string name=\"clip\">Clip</string>\n\n\n    <string name=\"server_error\">Server error</string>\n    <string name=\"bot_error\">Are you human?</string>\n    <string name=\"auth_error\">Authentication error</string>\n    <string name=\"parameter_error\">Parameter error</string>\n    <string name=\"unauthorized_error\">Unauthorized error</string>\n    <string name=\"rate_limit_error\">Rate limit error</string>\n    <string name=\"not_found_error\">404 Not found error</string>\n    <string name=\"show_more_reactions\">Show more Reactions</string>\n    <string name=\"pick_file_from_device\">Pick file from device</string>\n    <string name=\"note_editor_file_max_size_validation_error_message\">Cannot attach more than %d files</string>\n    <string name=\"auth_sign_up\">Sign up</string>\n    <string name=\"auth_sign_up_button\">Sign up</string>\n    <string name=\"auth_sign_in\">Sign in</string>\n    <string name=\"auth_join_milktea_title\">Let\\'s start Misskey with Milktea</string>\n    <string name=\"auth_find_instance\">Find a server</string>\n    <string name=\"auth_find_instance_next_button_text\">Next</string>\n    <string name=\"auth_find_instance_show_in_web_browser_message\">A registration screen will appear in your browser.</string>\n    <string name=\"settings_note\">Note</string>\n    <string name=\"settings_note_divider\">Show horizontal separator lines in notes</string>\n    <string name=\"auth_qr_code_message\">Authenticate on another device</string>\n\n    <string name=\"settings_show_bottom_menu\">Show bottom menu</string>\n    <string name=\"settings_app_restart_required\">App restart required.</string>\n\n    <string name=\"note_editor_poll_choice_n\">Choice %d</string>\n    <string name=\"settings_visible_instance_domain_in_toolbar\">Show the instance\\'s domain in the toolbar</string>\n    <string name=\"settings_hide_media_when_mobile_network\">Hide media when mobile network</string>\n    <string name=\"settings_always_show_media\">Always show media</string>\n    <string name=\"notes_media_click_to_load_image\">Click to load Image</string>\n    <string name=\"notifications_follow_requests\">Follow request</string>\n    <string name=\"content_not_exists_message\">No content</string>\n    <string name=\"user_detail_mute_renotes\">Mute Renotes</string>\n    <string name=\"user_detail_unmute_renotes\">Unmute renotes</string>\n    <string name=\"settings_renote_mute_title\">Renote mutes</string>\n    <string name=\"bookmark\">Bookmark</string>\n\n    <string name=\"milktea_catchphrase\">Would you like Milktea with Fediverse?</string>\n    <string name=\"donation\">Donation</string>\n    <string name=\"privacy_policy\">Privacy policy</string>\n    <string name=\"terms_of_service\">Terms of service</string>\n    <string name=\"settings_display_icons_as_squares\">Display icons as squares</string>\n\n\n\n    <!-- Authorization Start -->\n    <string name=\"auth_custom_app_name\">App name</string>\n    <string name=\"auth_app_name\">Milktea</string>\n    <string name=\"auth_successfully_created_the_app\">Successfully created the app</string>\n    <string name=\"auth_warning_s\">Warning:%s</string>\n    <string name=\"auth_error_s\">Error %s</string>\n    <string name=\"auth_continue_auth\">Continue</string>\n    <string name=\"auth_copied_to_clipboard\">Copied to clipboard</string>\n    <string name=\"auth_instance_domain\">Instance URL</string>\n    <string name=\"auth_https\">https://</string>\n    <string name=\"auth_waiting_4_u_to_approve\">Waiting for you to approve</string>\n    <string name=\"auth_i_have_approved\">Approved</string>\n    <string name=\"auth_waiting_4_approval\">Waiting for approval</string>\n    <string name=\"auth_authentication_url\">Authentication URL</string>\n    <string name=\"auth_copy_the_url_of_the_authentication_destination_to_the_clipboard\">Copy authentication\n        destination URL to clipboard.\n    </string>\n    <string name=\"auth_welcome\">Welcome</string>\n    <string name=\"san\">-san</string>\n    <string name=\"auth_open_in_webview\">Open in WebView</string>\n\n    <string name=\"auth_privacy_policy_agreeation\">I agree to the Privacy Policy</string>\n    <string name=\"auth_terms_of_service_agreeation\">I agree to the Terms of service</string>\n    <string name=\"auth_accpet_mastodon_alpha_test\">I understand that the features related to Mastodon are still in the alpha stage and there may be features that are not yet implemented or not working, and I agree not to hold the developers responsible for this.</string>\n    <!-- Authorization End -->\n\n    <!-- Channel -->\n    <string name=\"channel_n_people\">%d people</string>\n    <string name=\"channel_n_posts\">%d posts</string>\n    <string name=\"channel_owned\">Owned</string>\n    <!-- Channel -->\n\n    <!-- Drive -->\n    <string name=\"drive_undo_nsfw\">Undo NSFW</string>\n    <string name=\"drive_file_deletion_confirmation\">File deletion confirmation</string>\n    <string name=\"drive_do_u_want_2_delete_s\">Do you want to delete %s?</string>\n    <string name=\"drive_mark_as_nsfw\">Mark as NSFW</string>\n    <string name=\"drive\">Drive</string>\n    <string name=\"drive_file\">File</string>\n    <string name=\"drive_folder\">Folder</string>\n    <string name=\"drive_create_folder\">Create folder</string>\n    <string name=\"drive_folder_name\">Folder name</string>\n    <!-- Drive -->\n\n    <!-- Gallery -->\n    <string name=\"gallery_sensitive_content\">Sensitive content</string>\n    <string name=\"gallery_pick_image\">Pick image</string>\n    <string name=\"gallery_pick_image_from_device\">Pick image from device</string>\n    <string name=\"gallery_pick_image_from_drive\">Pick image from drive</string>\n    <!-- Gallery -->\n\n    <!-- Group -->\n    <string name=\"group_name\">Group name</string>\n    <string name=\"create_group\">Create group</string>\n    <string name=\"edit_group\">Edit group</string>\n    <!-- Group -->\n\n    <!-- Media -->\n    <string name=\"download\">Download</string>\n    <string name=\"start_downloading_placeholder\">Start downloading %s</string>\n    <string name=\"success_download_file_message\">Download successful</string>\n    <string name=\"failed_download_file_message\">Download failed</string>\n    <!-- Media -->\n\n    <!-- Messaging -->\n    <string name=\"messaging_input_message\">What\\'s up?</string>\n    <!-- Messaging -->\n\n    <!-- Note -->\n    <string name=\"time_machine\">Back to the future</string>\n    <string name=\"dialog_timemachine_message\">Please specify the time of the timeline you want to display</string>\n    <string name=\"show_error\">Show Error</string>\n\n    <string name=\"timeout_error\">Timeout</string>\n\n    <string name=\"reauthenticate\">Reauthenticate</string>\n    <string name=\"expand\">Expand</string>\n\n    <string name=\"file_size_warning_dialog_title\">File size warning</string>\n    <string name=\"file_size_warning_dialog_message\">%1$s does not allow attachments larger than %2$s.\\nDo you want to continue?</string>\n    <string name=\"file_size_warning_dialo_positive_button\">Continue</string>\n    <string name=\"file_size_warning_dialog_negative_button\">Cancel attachment</string>\n\n    <string name=\"mark_media_as_sensitive\">Mark media as sensitive</string>\n    <string name=\"successfully_added_to_favorites\">Successfully added to Favorites</string>\n    <string name=\"failed_to_add_to_favorites\">Failed to add to favorites</string>\n    <string name=\"removed_from_favorites\">Removed from Favorites</string>\n    <string name=\"failed_to_delete_favorites\">Failed to delete favorites</string>\n    <string name=\"successfully_deleted\">Successfully deleted</string>\n    <string name=\"dialog_add_emoji_to_user_settings_title\">Add emoji to settings</string>\n    <string name=\"dialog_add_emoji_to_user_settings_message\">Add %s to user emoji settings.</string>\n    <!-- Note -->\n\n    <!-- Notification -->\n    <string name=\"no_notifications\">No notifications</string>\n    <string name=\"notification_menu_mark_as_all_read_notifications_label\">Mark as all read notifications</string>\n    <!-- Notification -->\n\n    <!-- Settings -->\n    <string name=\"client_word_mute\">Client Word mute</string>\n    <string name=\"client_word_mute_format_description\">Delimiting with a space results in an AND specification, and delimiting with a line break results in an OR specification. \\nSlashes around the keyword make it a regular expression.</string>\n    <string name=\"import_reactions_from_the_web\">Import reactions from the web</string>\n    <string name=\"import_reactions\">Import reactions</string>\n    <string name=\"overwrite_save\">Overwrite save</string>\n    <string name=\"notification_sound\">Notification Sound</string>\n    <string name=\"inapp_notification_sound\">Enable In-app notification sound</string>\n    <string name=\"streaming\">Automatic updating</string>\n    <string name=\"is_stop_timeline_streaming_when_background\">Do not update timeline when in background</string>\n    <string name=\"is_stop_note_capture_when_background\">Do not capture notes in background</string>\n    <string name=\"enable_automic_updates\">Enable automatic updates</string>\n    <string name=\"please_login\">Please login</string>\n    <string name=\"settings_edit_tab_only_media\">Only Media</string>\n    <string name=\"settings_about_milktea\">About Milktea</string>\n    <string name=\"settings_about_milktea_source_code\">Source code(GitHub)</string>\n    <string name=\"settings_note_content_font_size\">Note content font size(%fsp)</string>\n    <string name=\"settings_note_header_font_size\">Note header font size(%fsp)</string>\n    <string name=\"settings_note_reaction_counter_font_size\">Note reaction counter font size(%fsp, %fsp)</string>\n    <string name=\"settings_note_custom_emoji_scale_size_in_text\">Magnification for custom emoji in text(%fX)</string>\n    <string name=\"settings_emoji_picker\">Emoji picker</string>\n    <string name=\"settings_emoji_display_size\">Emoji display size</string>\n\n    <!-- Settings -->\n\n    <!-- User -->\n    <string name=\"user_birthday\">Birthday: %s</string>\n    <string name=\"user_registration_date\">Registered on the %s</string>\n    <string name=\"confirm_user_block_title\">Confirmation</string>\n    <string name=\"confirm_user_block_description\">Are you sure you want to block %s?</string>\n\n    <string name=\"user_mute_specify_time_15_minutes_later\">15 minutes later</string>\n    <string name=\"user_mute_specify_time_30_minutes_later\">30 minutes later</string>\n    <string name=\"user_mute_specify_time_1_hours_later\">1 hour later</string>\n    <string name=\"user_mute_specify_time_1_day_later\">1 day later</string>\n    <string name=\"user_mute_specify_time_1_week_later\">1 week later</string>\n    <string name=\"user_mute_specify_time_1_month_later\">1 month later</string>\n    <string name=\"user_mute_specify_time_indefinite_period\">Indefinite perio</string>\n    <string name=\"view_remotely\">View remotely</string>\n    <string name=\"follows_you\">Follows you</string>\n    <string name=\"suggestion_users\">Suggestions</string>\n    <!-- User -->\n\n\n    <string name=\"trend_posted_person_count_msg\">%d people posting</string>\n    <string name=\"notes_confirm_attach_quote_note_by_url\">Attach as a quote post?</string>\n    <string name=\"select_draft_post\">Select draft post</string>\n    <string name=\"remember_scroll_position\">Remember scroll position</string>\n    <string name=\"post_only\">Post only</string>\n    <string name=\"settings_display_timestamps_as_absolute_dates\">Display timestamps as absolute dates</string>\n    <string name=\"settings_cache_config\">Cache settings</string>\n    <string name=\"settings_note_cache\">Note cache</string>\n    <string name=\"settings_custom_emoji_cache\">Custom emoji cache</string>\n    <string name=\"move_files_here\">Move files here</string>\n\n    <!-- reaction-acceptance -->\n    <string name=\"reaction_acceptance\">Reaction acceptance</string>\n    <string name=\"reaction_acceptance_all\">All</string>\n    <string name=\"reaction_acceptance_like_only_for_remote\">All (Only likes for remote instances)</string>\n    <string name=\"reaction_acceptance_non_sensitive_only\">Non-sensitive only</string>\n    <string name=\"reaction_acceptance_non_sensitive_only_likes_from_remote\">Non-sensitive only (Only likes from remote)</string>\n    <string name=\"reaction_acceptance_only_likes\">Only likes</string>\n    <string name=\"media_display_mode_default\">Default</string>\n    <string name=\"media_display_mode_always\">Always hide media</string>\n    <string name=\"misskey_role_drive_no_free_space_error_message\">Cannot upload the file because you have no free space of drive.</string>\n    <string name=\"qr_code\">QR Code</string>\n    <string name=\"copy\">Copy</string>\n    <string name=\"no_app_available_to_open_this_file\">No app available to open this file</string>\n    <string name=\"notification_sync_download_custom_emoji_title\">Downloading custom emoji</string>\n    <string name=\"alarm_permission_description_title\">Requires alarm permission</string>\n    <string name=\"alarm_permission_description_message\">Scheduled posting uses the mechanism of the alarm function, so it is necessary to grant alarm permission to Milktea from the settings.</string>\n    <string name=\"exclude_replies\">Exclude replies</string>\n    <string name=\"exclude_reposts\">Exclude reposts</string>\n    <string name=\"notify_about_new_posts\">Notify about new posts</string>\n    <string name=\"stop_notify_about_new_posts\">Stop notify about new posts</string>\n    <string name=\"settings_user_cache\">User cache</string>\n    <string name=\"jump_to_new_post\">Jump to new post</string>\n    <string name=\"exclude_if_exists_sensitive_media\">Exclude if exists sensitive media</string>\n    <string name=\"enable_safe_search\">Enable Safe Search</string>\n    <string name=\"safe_search_description_dialog_title\">Safe Search is enabled</string>\n    <string name=\"safe_search_description_dialog_message\">Safe Search has been enabled to comply with Google Play\\'s User Content Policy. When Safe Search is enabled, posts containing sensitive media will not be displayed on your timeline. To disable Safe Search, go to Settings > Motion > Enable Safe Search and turn it off.</string>\n    <string name=\"safe_search_description_dialog_positive_button\">Go to Settings</string>\n    <string name=\"safe_search_description_dialog_negative_button\">Keep Safe Search enabled</string>\n\n    <string name=\"confirm_display_sensitive_media_dialog_title\">Confirm Media Display</string>\n    <string name=\"confirm_display_sensitive_media_dialog_message\">There is a risk that violent or sexual media will be displayed. Are you sure you want to view it?</string>\n    <string name=\"confirm_display_sensitive_media_dialog_positive_button\">Display</string>\n    <string name=\"confirm_display_sensitive_media_dialog_neutral_button\">Do not warn</string>\n    <!-- reaction-acceptance -->\n\n    <string name=\"settings_enable_haptic_feedback_on_new_post\">Enable haptic feedback on new post</string>\n\n    <!-- poll -->\n    <string name=\"poll_votes_count\">%d votes</string>\n    <string name=\"poll_expires_in\">Closes %s</string>\n\n    <!-- developer options -->\n    <string name=\"settings_developer_options\">Developer options</string>\n    <string name=\"settings_dev_compose_timeline\">Compose timeline</string>\n    <string name=\"settings_dev_compose_timeline_description\">Use Compose-based timeline on next launch</string>\n\n</resources>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <declare-styleable name=\"MyMaterialDesign\">\n        <attr name=\"colorSurface\" format=\"color\" />\n        <attr name=\"colorNormalReactionCounterBackground\" format=\"color\" />\n        <attr name=\"colorSelectedReactionCounterBackground\" format=\"color\" />\n\n        <attr name=\"colorBottomNavigationSelected\" format=\"color\" />\n        <attr name=\"colorBottomNavigationNotSelect\" format=\"color\" />\n\n        <attr name=\"normalIconTint\" format=\"color\" />\n\n        <attr name=\"colorMessageSelf\" format=\"color\" />\n        <attr name=\"colorMessageRecipient\" format=\"color\" />\n\n        <attr name=\"colorSeparator\" format=\"color\" />\n\n        <attr name=\"colorDotTabNormal\" format=\"color\" />\n        <attr name=\"colorDotTabSelected\" format=\"color\" />\n\n        <attr name=\"emojiPickerRippleColor\" format=\"color\" />\n    </declare-styleable>\n\n    <style name=\"ReactionTabStyle\" parent=\"Widget.Material3.TabLayout\">\n        <item name=\"android:textColor\">?android:attr/textColor</item>\n    </style>\n    <style name=\"LicensePageTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\"/>\n\n    <style name=\"TabStyle\" parent=\"Widget.Material3.TabLayout\">\n        <item name=\"tabIndicatorColor\">?attr/colorPrimary</item>\n        <item name=\"background\">?attr/colorPrimary</item>\n    </style>\n\n    <style name=\"TextInputLayoutStyle\" parent=\"Widget.Material3.TextInputLayout.OutlinedBox\">\n        <item name=\"hintTextColor\">?attr/colorPrimary</item>\n        <item name=\"colorControlActivated\">?attr/colorPrimary</item>\n        <item name=\"materialThemeOverlay\">@style/ThemeOverlay.TextInputEditText</item>\n    </style>\n\n    <style name=\"ThemeOverlay.TextInputEditText\" parent=\"ThemeOverlay.Material3.TextInputEditText.OutlinedBox\">\n        <!-- カーソルの色を変更している -->\n        <item name=\"colorControlActivated\">?attr/colorPrimary</item>\n\n        <!-- boxStrokeColor が選択時に colorPrimary を参照するため -->\n        <item name=\"colorPrimary\">?attr/colorPrimary</item>\n    </style>\n\n    <style name=\"DialogStyle\" parent=\"ThemeOverlay.Material3.Dialog\">\n        <item name=\"buttonBarPositiveButtonStyle\">@style/PositiveButtonStyle</item>\n        <item name=\"buttonBarNegativeButtonStyle\">@style/NegativeButtonStyle</item>\n    </style>\n    <style name=\"NegativeButtonStyle\" parent=\"Widget.Material3.Button.TextButton\">\n        <item name=\"android:textColor\">@android:color/white</item>\n    </style>\n    <style name=\"PositiveButtonStyle\" parent=\"Widget.Material3.Button.TextButton\">\n        <item name=\"android:textColorPrimary\">?attr/colorPrimary</item>\n    </style>\n\n    <style name=\"NotificationSnackBarTextView\" parent=\"Widget.Material3.Snackbar\">\n        <item name=\"android:textColor\">@color/colorTextColorPrimary</item>\n    </style>\n\n    <style name=\"BottomNavigationViewCompact\" parent=\"Widget.Material3.BottomNavigationView\">\n        <item name=\"android:minHeight\">56dp</item>\n        <item name=\"itemPaddingTop\">8dp</item>\n        <item name=\"itemPaddingBottom\">8dp</item>\n    </style>\n\n    <style name=\"BottomNavigationView4Dark\" parent=\"BottomNavigationViewCompact\">\n        <item name=\"elevation\">0dp</item>\n    </style>\n    <style name=\"TabLayout4Light\" parent=\"Widget.Material3.TabLayout\">\n        <item name=\"elevation\">4dp</item>\n        <item name=\"android:elevation\">4dp</item>\n    </style>\n\n    <style name=\"EmojiPickerLayoutStyle\">\n        <item name=\"colorControlHighlight\">?attr/emojiPickerRippleColor</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <style name=\"AppTheme\" parent=\"Theme.Material3.Light.NoActionBar\">\n\n        <item name=\"colorPrimary\">#3F51B5</item>\n        <item name=\"colorSecondary\">#575DAE</item>\n\n        <item name=\"actionBarSize\">53dp</item>\n\n        <item name=\"colorNormalReactionCounterBackground\">@color/colorNormalReaction</item>\n        <item name=\"colorSelectedReactionCounterBackground\">#808EDD</item>\n        <item name=\"colorBottomNavigationSelected\">@color/colorItemSelected</item>\n        <item name=\"colorBottomNavigationNotSelect\">@color/colorItemNotSelected</item>\n\n        <item name=\"normalIconTint\">@color/colorItemNotSelected</item>\n        <item name=\"colorMessageSelf\">#808EDD</item>\n        <item name=\"colorMessageRecipient\">@color/colorMessageRecipient</item>\n\n        <item name=\"colorSeparator\">@color/colorSeparator</item>\n\n        <item name=\"textInputStyle\">@style/TextInputLayoutStyle</item>\n\n        <item name=\"colorDotTabSelected\">#575DAE</item>\n        <item name=\"colorDotTabNormal\">@color/colorItemNotSelected</item>\n\n        <item name=\"emojiPickerRippleColor\">#5C000000</item>\n        <item name=\"bottomNavigationStyle\">@style/BottomNavigationViewCompact</item>\n    </style>\n\n    <style name=\"AppTheme.NoActionBar\">\n        <item name=\"windowActionBar\">false</item>\n        <item name=\"windowNoTitle\">true</item>\n    </style>\n\n    <style name=\"AppTheme.AppBarOverlay\" parent=\"ThemeOverlay.AppCompat.Dark.ActionBar\" />\n\n    <style name=\"AppTheme.PopupOverlay\" parent=\"ThemeOverlay.AppCompat.Light\" />\n\n    <style name=\"AppThemeDark\" parent=\"Theme.Material3.DayNight.NoActionBar\">\n\n        <item name=\"colorPrimary\">#9FA8DA</item>\n        <item name=\"colorSecondary\">#6D7FE1</item>\n\n        <item name=\"android:windowBackground\">@color/colorDarkWindowBackground</item>\n\n        <item name=\"colorSurface\">#1E1E1E</item>\n        <item name=\"colorSurfaceContainer\">#1E1E1E</item>\n\n        <item name=\"bottomNavigationStyle\">@style/BottomNavigationView4Dark</item>\n\n        <item name=\"normalIconTint\">@color/colorDarkTextColor</item>\n        <item name=\"actionBarSize\">53dp</item>\n\n        <item name=\"colorNormalReactionCounterBackground\">#3A3A3A</item>\n        <item name=\"colorSelectedReactionCounterBackground\">#3F51B5</item>\n\n        <item name=\"colorMessageSelf\">@color/colorMessageSelfDark</item>\n        <item name=\"colorMessageRecipient\">@color/colorMessageRecipientDark</item>\n        <item name=\"colorSeparator\">@color/colorSeparatorDark</item>\n\n        <item name=\"textInputStyle\">@style/TextInputLayoutStyle</item>\n        <item name=\"colorDotTabSelected\">@color/colorDarkAccent</item>\n        <item name=\"colorDotTabNormal\">@color/colorDarkTextColor</item>\n\n        <item name=\"colorBottomNavigationSelected\">@color/colorDarkBottomNavSelected</item>\n        <item name=\"colorBottomNavigationNotSelect\">@color/colorDarkBottomNavNormal</item>\n\n        <item name=\"emojiPickerRippleColor\">#66FFFFFF</item>\n    </style>\n\n    <style name=\"AppThemeBlack\" parent=\"AppThemeDark\">\n        <item name=\"android:windowBackground\">@color/colorBlackPrimary</item>\n        <item name=\"colorSurface\">#000000</item>\n        <item name=\"colorSurfaceContainer\">#000000</item>\n\n        <item name=\"normalIconTint\">@color/colorItemNotSelected</item>\n        <item name=\"actionBarSize\">53dp</item>\n\n        <item name=\"colorSeparator\">@color/colorSeparator</item>\n    </style>\n\n    <style name=\"AppThemeBread\" parent=\"AppTheme\">\n        <item name=\"colorPrimary\">@color/colorBreadPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorBreadPrimaryDark</item>\n        <item name=\"colorSurface\">@color/colorBreadSurface</item>\n        <item name=\"colorSurfaceContainer\">@color/colorBreadSurface</item>\n        <item name=\"colorSecondary\">#8BC34A</item>\n        <item name=\"colorSelectedReactionCounterBackground\">#FFCA28</item>\n        <item name=\"colorNormalReactionCounterBackground\">#EAE691</item>\n        <item name=\"colorBottomNavigationSelected\">@color/colorBreadBottomNavSelected</item>\n    </style>\n\n    <style name=\"AppThemeMastodonDark\" parent=\"AppThemeDark\">\n        <item name=\"colorPrimary\">#FF8C8DFE</item>\n        <item name=\"colorPrimaryDark\">#FF282c37</item>\n        <item name=\"colorSurface\">#FF282C37</item>\n        <item name=\"colorSurfaceContainer\">#FF282C37</item>\n        <item name=\"colorSecondary\">#FF595aff</item>\n        <item name=\"colorSelectedReactionCounterBackground\">#FF8C8DFE</item>\n        <item name=\"colorNormalReactionCounterBackground\">#FF424859</item>\n        <item name=\"android:windowBackground\">#FF191B22</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/values/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <integer name=\"reaction_choices_columns\">4</integer>\n</resources>"
  },
  {
    "path": "modules/common_resource/src/main/res/values-ja/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Milktea</string>\n    <string name=\"navigation_drawer_open\">ナヴィゲーションドロワーを開く</string>\n    <string name=\"navigation_drawer_close\">ナヴィゲーションドロワーを閉じる</string>\n    <string name=\"nav_header_title\">Android Studio</string>\n    <string name=\"nav_header_subtitle\">android.studio@android.com</string>\n    <string name=\"nav_header_desc\">Navigation header</string>\n    <string name=\"action_settings\">設定</string>\n\n    <string name=\"menu_home\">ホーム</string>\n    <string name=\"menu_gallery\">ギャラリー</string>\n    <string name=\"menu_slideshow\">スライドショー</string>\n    <string name=\"menu_tools\">ツール</string>\n    <string name=\"share\">共有</string>\n    <string name=\"menu_send\">Send</string>\n    <string name=\"search\">検索</string>\n    <string name=\"notification\">通知</string>\n    <string name=\"message\">メッセージ</string>\n    <string name=\"start_auth\">認証する</string>\n    <string name=\"selecting_instance\">選択中のインスタンス</string>\n<!--    <string name=\"welcome\">ようこそ</string>-->\n<!--    <string name=\"san\">さん</string>-->\n    <string name=\"following\">フォロー中</string>\n    <string name=\"follower\">フォロワー</string>\n    <string name=\"renote\">リポスト</string>\n    <string name=\"renote_in_channel\">チャンネル内にリポスト</string>\n    <string name=\"quote_renote\">引用</string>\n    <string name=\"quote_renote_in_channel\">チャンネル内に引用</string>\n    <string name=\"discovery\">discovery</string>\n    <string name=\"renote_was\">リポストしました</string>\n    <string name=\"input_custom_emoji\">絵文字/カスタム絵文字を入力</string>\n    <string name=\"title_activity_settings\">Settings</string>\n\n    <string name=\"reply_title\">Default reply action</string>\n\n    <!-- Sync Preferences -->\n    <string name=\"sync_title\">Sync email periodically</string>\n    <string name=\"attachment_title\">Download incoming attachments</string>\n    <string name=\"attachment_summary_on\">Automatically download attachments for incoming emails\n    </string>\n    <string name=\"attachment_summary_off\">Only download attachments when manually requested</string>\n    <string name=\"setting\">設定</string>\n    <string name=\"nav_like\">お気に入り</string>\n    <string name=\"nav_list\">リスト</string>\n    <string name=\"nav_cloud\">ドライブ</string>\n    <string name=\"nav_setting_tab\">タブを設定</string>\n    <string name=\"add_search\">検索を追加する</string>\n    <string name=\"save_setting\">設定を保存する</string>\n    <string name=\"tab_selected\">追加済み</string>\n    <string name=\"tab_selectable\">以下から追加</string>\n    <string name=\"title_featured\">ハイライト</string>\n\n<!--    <string name=\"create_folder\">フォルダーを作成</string>-->\n    <string name=\"add_account\">アカウントを追加</string>\n    <string name=\"post\">投稿</string>\n    <string name=\"please_speak\">お気持ちを表明してください</string>\n    <string name=\"open\">開く</string>\n    <string name=\"multiple_answer\">複数回答可能</string>\n    <string name=\"add_choice\">解答を追加</string>\n    <string name=\"cw_hint\">内容への注釈(オプション)</string>\n    <string name=\"show_reply\">返信を表示する</string>\n    <string name=\"show_conversation\">会話を表示する</string>\n    <string name=\"copy_url\">URLをコピー</string>\n    <string name=\"copy_content\">内容をコピー</string>\n    <string name=\"show_detail\">詳細</string>\n    <string name=\"favorite\">お気に入り</string>\n    <string name=\"remove_favorite\">お気に入りを解除</string>\n    <string name=\"remove\">削除</string>\n\n    <string name=\"pin\">ピン</string>\n    <string name=\"media\">メディア</string>\n    <string name=\"follow\">フォロー</string>\n\n    <string name=\"include_local_renotes\">ローカルの投稿のリポストをタイムラインに表示する</string>\n    <string name=\"include_renoted_my_notes\">自分の投稿のリポストをタイムラインに表示する</string>\n    <string name=\"include_my_renotes\">自分の行ったリポストをタイムラインに表示する</string>\n    <string name=\"auto_load_timeline\">タイムラインを自動で読み込む</string>\n    <string name=\"timeline\">タイムライン</string>\n\n    <string name=\"capture_note_when_stopped\">停止時も投稿をキャプチャーする</string>\n    <string name=\"auto_load_when_stopped\">停止時もタイムラインを自動で読み込む</string>\n    <string name=\"sync\">同期</string>\n\n    <string name=\"movement\">動き</string>\n    <string name=\"remove_note\">投稿を削除する</string>\n\n    <string name=\"hide_removed_note\">削除された投稿を非表示にする</string>\n\n    <string name=\"appearance\">見た目</string>\n    <string name=\"theme\">テーマ</string>\n    <string name=\"theme_white\">ホワイト</string>\n    <string name=\"theme_black\">ブラック</string>\n    <string name=\"theme_dark\">ダーク</string>\n    <string name=\"theme_bread\">パンケーキ</string>\n    <string name=\"theme_mastodon_dark\">ダーク(🐘)</string>\n\n\n    <string name=\"title_activity_media\">MediaActivity</string>\n    <string name=\"dummy_button\">Dummy Button</string>\n    <string name=\"dummy_content\">DUMMY\\nCONTENT</string>\n\n    <string name=\"sensitive_content\">閲覧注意</string>\n\n    <string name=\"thumbnail\">サムネイル</string>\n    <string name=\"play_media\">メディアを再生する</string>\n    <string name=\"avataricon\">avatarIcon</string>\n    <string name=\"reaction\">リアクション</string>\n    <string name=\"followed_by\">%sさんにフォローされました</string>\n    <string name=\"replied_by\">%sさんに返信されました</string>\n    <string name=\"quoted_by\">%sさんに引用されました</string>\n    <string name=\"voted_by\">%sさんに投票されました</string>\n    <string name=\"request_follow\">%sさんがフォローリクエストしてます</string>\n    <string name=\"mention_by\">%sさんにメンションされました</string>\n    <string name=\"reacted_by\">%sさんにリアクションされました</string>\n    <string name=\"renoted_by\">%sさんにリポストされました</string>\n    <string name=\"follow_requested_by\">%sさんにフォローリクエストされました。</string>\n    <string name=\"total_vote_count\">計%s票</string>\n    <string name=\"poll_ended\">投票が終了</string>\n\n    <string name=\"input_message\">相手に思いを伝えてください</string>\n\n    <string name=\"manifest_user_name_pattern\">\"@\"\\w([\\w-]*\\w)?(?:@[\\w.\\-]+\\w)?</string>\n    <string name=\"followee_state\">フォローされています</string>\n    <string name=\"mute\">ミュート</string>\n    <string name=\"block\">ブロック</string>\n    <string name=\"unmute\">ミュートを解除</string>\n    <string name=\"unblock\">ブロックを解除</string>\n\n    <string name=\"add_to_tab\">タブに追加する</string>\n\n    <string name=\"detail\">詳細</string>\n\n    <string name=\"instance_domain\">サーバドメイン</string>\n    <string name=\"sign_in\">ログイン</string>\n    <string name=\"user_name\">ユーザー名</string>\n    <string name=\"password\">パスワード</string>\n    <string name=\"sign_out\">ログアウト</string>\n    <string name=\"token\">トークン</string>\n\n    <string name=\"add_app\">アプリを追加する</string>\n    <string name=\"selected_account\">選択中のアカウント</string>\n    <string name=\"selected_app\">選択中のアプリ</string>\n    <string name=\"custom_app\">カスタムアプリ</string>\n\n    <string name=\"custom_app_name\">アプリケーション名</string>\n    <string name=\"custom_app_description\">アプリケーションの概要</string>\n\n    <string name=\"your_app_name\">あなたのアプリの名前</string>\n    <string name=\"description_of_app_description\">認証時に表示されます</string>\n    <string name=\"create\">作成</string>\n\n    <string name=\"auth_failed\">認証に失敗しました</string>\n    <string name=\"expired\">有効期限切れです</string>\n\n    <string name=\"auth_required\">認証が必要です</string>\n    <string name=\"invalid_url\">無効なURLです</string>\n    <string name=\"invalid_pw_id\">無効なパスワード・ID</string>\n\n    <string name=\"auth\">認証</string>\n\n    <string name=\"often_use\">よく使う</string>\n    <string name=\"all\">全て</string>\n\n    <string name=\"visibility_public\">公開</string>\n    <string name=\"visibility_home\">ホーム</string>\n    <string name=\"visibility_follower\">フォロワー</string>\n    <string name=\"visibility_specified\">ダイレクト</string>\n    <string name=\"visibility_public_local_only\">公開(ローカルのみ)</string>\n    <string name=\"visibility_home_local_only\">ホーム(ローカルのみ)</string>\n    <string name=\"visibility_follower_local_only\">フォロワー(ローカルのみ)</string>\n\n    <string name=\"show\">表示</string>\n    <string name=\"user_list\">ユーザー一覧</string>\n    <string name=\"update_user_list\">リストを編集する</string>\n    <string name=\"add_user\">ユーザーを加える</string>\n    <string name=\"list_name\">リスト名</string>\n    <string name=\"create_user_list\">リストを作成する</string>\n    <string name=\"at_mark\">\\@</string>\n\n    <string name=\"host\">ホスト</string>\n    <string name=\"select_user\">ユーザー選択</string>\n    <string name=\"selecting_users\">選択中のユーザー</string>\n    <string name=\"https\">https://</string>\n    <string name=\"conversation\">会話</string>\n    <string name=\"add_address\">宛先を追加</string>\n\n    <string name=\"indefinite_period\">無期限</string>\n    <string name=\"date_and_time_specification\">日時指定</string>\n\n    <string name=\"future\">未来</string>\n    <string name=\"now\">今</string>\n\n\n\n    <string name=\"time_with_year_ago\">%s年前</string>\n    <string name=\"time_with_month_ago\">%sヶ月前</string>\n    <string name=\"time_with_date_ago\">%s日前</string>\n    <string name=\"time_with_hour_ago\">%s時間前</string>\n    <string name=\"time_with_minute_ago\">%s分前</string>\n    <string name=\"time_with_second_ago\">%s秒前</string>\n\n    <string name=\"select_file\">ファイル選択</string>\n\n    <string name=\"network_error\">接続できません</string>\n\n<!--    <string name=\"folder_name\">フォルダ名</string>-->\n    <string name=\"selected\">選択済み</string>\n    <string name=\"more\">さらに</string>\n\n    <string name=\"delete_and_edit\">削除して編集</string>\n    <string name=\"license\">ライセンス</string>\n    <string name=\"standard_reaction\">定型リアクション</string>\n    <string name=\"set_the_reaction_displayed_in_the_reaction_picker\">リアクションピッカーに表示されるリアクションを設定します。</string>\n    <string name=\"reaction_picker\">リアクションピッカー</string>\n    <string name=\"list_picker\">リストピッカー</string>\n    <string name=\"simple_picker\">シンプルピッカー</string>\n    <string name=\"enter_reaction\">リアクションを入力</string>\n    <string name=\"click_to_delete_the_reaction\">クリックでリアクションを削除します。</string>\n    <string name=\"confirm_delete_reaction\">リアクション削除の確認</string>\n    <string name=\"delete_reaction\">リアクションを削除します</string>\n    <string name=\"user\">ユーザー</string>\n    <string name=\"note_opacity\">投稿の不透明度</string>\n    <string name=\"transparent\">透明</string>\n    <string name=\"opaque\">不透明</string>\n    <string name=\"background_image\">背景画像</string>\n    <string name=\"hide_bottom_navigation\">下メニューを隠す</string>\n    <string name=\"user_name_as_default_display_name\">ユーザー名をデフォルト表示名にする</string>\n    <string name=\"successfully_created_the_app\">アプリの作成に成功した</string>\n    <string name=\"continue_auth\">Continue</string>\n\n    <string name=\"home_timeline\">ホーム</string>\n    <string name=\"global_timeline\">グローバル</string>\n    <string name=\"local_timeline\">ローカル</string>\n    <string name=\"hybrid_timeline\">ソーシャル</string>\n    <string name=\"mention\">メンション</string>\n    <string name=\"add_tab\">タブを追加する</string>\n    <string name=\"list\">リスト</string>\n    <string name=\"tag\">ハッシュタグ</string>\n    <string name=\"featured\">ハイライト</string>\n    <string name=\"antenna\">アンテナ</string>\n    <string name=\"rename\">名前の変更</string>\n    <string name=\"edit\">編集</string>\n    <string name=\"delete\">削除</string>\n\n    <string name=\"edit_tab\">タブを編集</string>\n    <string name=\"update_timeline_in_background\">タイムラインをバックグラウンドで更新する(消費電力大)</string>\n\n    <string name=\"follow_request_accepted_by\">%sさんにフォローリクエストが承認されました</string>\n    <string name=\"confirm_deletion\">削除の確認</string>\n    <string name=\"name\">名前</string>\n    <string name=\"receiving_source\">受信ソース</string>\n\n    <string name=\"all_notes\">全ての投稿</string>\n    <string name=\"notes_from_following_users\">フォローしているユーザーの投稿</string>\n    <string name=\"notes_from_specific_users\">指定した一人または複数のユーザーの投稿</string>\n    <string name=\"notes_from_specific_list\">指定したリストの投稿</string>\n    <string name=\"notes_from_users_in_the_specified_group\">指定したグループの投稿</string>\n    <string name=\"include_replies\">返信を含める</string>\n    <string name=\"keywords_to_receive\">受信キーワード</string>\n    <string name=\"keyword_input_method\">AND条件の場合はスペースで区切ります。 ORの場合は改行で区切ります。</string>\n    <string name=\"keywords_to_exclude\">除外キーワード</string>\n    <string name=\"case_sensitive\">大文字小文字を区別する</string>\n    <string name=\"notify_notes\">新しい投稿を通知する</string>\n    <string name=\"with_files\">ファイルが添付された投稿のみ</string>\n    <string name=\"group\">グループ</string>\n    <string name=\"save\">保存</string>\n    <string name=\"unrenote\">リポスト解除</string>\n\n    <string name=\"confirm_delete_and_edit_note_description\">この投稿へのリアクション、リポスト、返信も全て削除されます。削除してもう一度編集しますか？</string>\n    <string name=\"via\">via</string>\n    <string name=\"search_emojis\">絵文字を検索</string>\n\n    <string name=\"success\">成功しました</string>\n    <string name=\"failure\">失敗しました</string>\n    <string name=\"explore_fediverse\">Fediverse</string>\n    <string name=\"explore\">見つける</string>\n    <string name=\"trending_users\">人気ユーザー</string>\n    <string name=\"users_with_recent_activity\">最近投稿したユーザー</string>\n\n    <string name=\"newly_joined_users\">新規ユーザー</string>\n    <string name=\"newly_discovered_users\">新たに発見されたユーザー</string>\n    <string name=\"trending_tag\">人気のタグ</string>\n\n    <string name=\"save_draft\">下書き保存</string>\n    <string name=\"save_the_note_as_a_draft\">投稿を下書き保存しますか</string>\n    <string name=\"draft_notes\">下書き投稿</string>\n    <string name=\"toggle_content_visibility\">コンテンツを表示/非表示</string>\n    <string name=\"delete_draft_note\">下書き投稿を削除する</string>\n    <string name=\"show_remotely\">リモートで表示する</string>\n    <string name=\"incomplete_information_for_remote_user\">リモートユーザーのため情報が不完全です。</string>\n    <string name=\"local_only\">ローカルのみ</string>\n    <string name=\"post_button_at_the_bottom\">投稿ボタンを下に配置する。</string>\n    <string name=\"please_again_to_finish\">もう一度押して終了</string>\n\n    <string name=\"url_preview\">URLプレビュー</string>\n    <string name=\"summaly_server_url\">SummalyサーバーURL</string>\n    <string name=\"displayed_url_preview\">表示されるURLプレビュー</string>\n    <string name=\"preview_display_test\">プレビュー表示テスト</string>\n    <string name=\"test_url\">テスト用URL</string>\n    <string name=\"from_misskey_api\">Misskey APIから</string>\n    <string name=\"specify_summaly_server\">Summalyサーバーを指定する</string>\n    <string name=\"use_app_implementation_deprecated\">アプリ実装を使用する(非推奨)</string>\n\n    <string name=\"use_simple_editor\">簡易エディターを使う</string>\n    <string name=\"retry\">リトライ</string>\n    <string name=\"failed_to_get_the_note\">投稿の取得に失敗しました</string>\n\n\n    <string name=\"refresh\">リフレッシュ</string>\n\n    <string name=\"long_text\">長すぎるため自動的に折りたたまれました(%d文字)</string>\n    <string name=\"show_more\">もっと見る(%s)</string>\n    <string name=\"hide\">隠す</string>\n\n    <string name=\"auto_note_folding\">投稿の自動折り畳み</string>\n    <string name=\"text_length_limit\">テキスト数制限(自動的に投稿が折りたたまれます)</string>\n    <string name=\"returns_limit\">改行数制限（自動的に投稿が折りたたまれます）</string>\n    <string name=\"height_limit\">高さ制限</string>\n    <string name=\"disable_height_limit\">高さ制限無効</string>\n    <string name=\"add_to_list\">リストに追加する</string>\n    <string name=\"promotion\">プロモーション</string>\n    <string name=\"waiting_4_approval\">認可されるのを待っています。</string>\n<!--    <string name=\"i_have_approved\">私は認可をしました</string>-->\n<!--    <string name=\"waiting_4_u_to_approve\">あなたが認可するのを待っています</string>-->\n    <string name=\"learn_note_visibility\">投稿の公開範囲を記憶する</string>\n    <string name=\"accept\">承認</string>\n    <string name=\"reject\">拒否</string>\n    <string name=\"local\">ローカル</string>\n    <string name=\"add_user_list\">ユーザーリストを追加する</string>\n    <string name=\"edit_note\">投稿を編集</string>\n    <string name=\"gallery_favorite_button\">gallery favorite button</string>\n    <string name=\"popular_posts\">人気な投稿</string>\n    <string name=\"gallery\">ギャラリー</string>\n    <string name=\"my_posts\">私の投稿</string>\n    <string name=\"my_liking\">お気に入り</string>\n    <string name=\"websocket_error\">WebSocketエラー</string>\n    <string name=\"connecting\">接続中・・・</string>\n    <string name=\"connected\">接続完了</string>\n    <string name=\"closing\">切断中・・・</string>\n    <string name=\"closed\">切断済み</string>\n    <string name=\"create_gallery\">ギャラリーを作成する</string>\n    <string name=\"title\">タイトル</string>\n    <string name=\"description\">説明</string>\n    <string name=\"pick_image\">画像を選択</string>\n    <string name=\"pick_image_from_device\">ドライブから画像を選択</string>\n    <string name=\"pick_image_from_drive\">ドライブから画像を選択</string>\n    <string name=\"successfully_created_note\">投稿の作成に成功しました</string>\n    <string name=\"sensitive\">センシティブ</string>\n<!--    <string name=\"authentication_url\">認証URL</string>-->\n<!--    <string name=\"copy_the_url_of_the_authentication_destination_to_the_clipboard\">認証先のURLをクリップボードにコピーする-->\n<!--    </string>-->\n    <string name=\"copied_to_clipboard\">クリップボードにコピーしました</string>\n    <string name=\"follow_approval_pending\">フォロー承認待ち</string>\n    <string name=\"request_follow_from_u\">フォロー申請</string>\n    <string name=\"unfollow\">フォロー解除</string>\n\n    <string name=\"unknown_notification\">不明な通知</string>\n    <string name=\"unknown_notification_msg\" formatted=\"false\">不明な通知。未対応な通知を受信しました、開発者にスクリーンショットを報告してください。 notificationId:%s, type:%s, senderID: %s, </string>\n    <string name=\"translated_from_s\">%sから翻訳:\\n</string>\n    <string name=\"error_s\">エラー %s</string>\n    <string name=\"translate\">翻訳</string>\n    <string name=\"report\">報告</string>\n    <string name=\"send\">送信</string>\n\n    <string name=\"successful_report\">報告成功</string>\n    <string name=\"report_failed\">報告失敗</string>\n    <string name=\"mark_as_nsfw\">閲覧注意にする</string>\n    <string name=\"undo_nsfw\">閲覧注意解除</string>\n<!--    <string name=\"file_deletion_confirmation\">ファイル削除の確認</string>-->\n    <string name=\"cancel\">やめる</string>\n<!--    <string name=\"do_u_want_2_delete_s\">%sを削除しますか？</string>-->\n\n    <string name=\"remove_attachment\">添付取りやめ</string>\n    <string name=\"warning_s\">警告:%s</string>\n    <string name=\"reservation_at\">投稿日時</string>\n    <string name=\"warning_reservation_msg\">異なる時間に投稿される恐れがあります。</string>\n    <string name=\"create_mention\">メンション付き投稿を作成</string>\n    <string name=\"change_nickname\">ニックネームを変更</string>\n    <string name=\"nickname\">ニックネーム</string>\n    <string name=\"delete_nickname\">ニックネームを削除</string>\n    <string name=\"suggested_emojis\">絵文字の候補</string>\n    <string name=\"the_remote_emoji_does_not_exist_in_this_instance\">そのリモート絵文字はこのサーバには存在しません。</string>\n    <string name=\"view_in_browser\">ブラウザで表示</string>\n    <string name=\"note_creation_failure\">投稿の作成失敗</string>\n    <string name=\"channel\">チャンネル</string>\n<!--    <string name=\"edit_caption\">キャプションを編集</string>-->\n<!--    <string name=\"input_caption\">キャプションを入力</string>-->\n    <string name=\"animation\">アニメーション</string>\n    <string name=\"avatar_icon_animation\">アバターアイコンアニメーション</string>\n    <string name=\"security_setting\">セキュリティ</string>\n    <string name=\"send_a_crash_report\">クラッシュレポートを送信する</string>\n    <string name=\"crash_reports_are_useful_for_development\">送信されたクラッシュレポートは開発の役に立てられます。</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"enable_google_analytics\">Google Analyticsを有効にする</string>\n    <string name=\"consent_to_collect_behavior_history\">行動履歴の収集</string>\n    <string name=\"consent_to_collect_behavior_history_message\">行動履歴はGoogle Analyticsによって収集され、開発の役に立てられます。</string>\n    <string name=\"disagree\">同意しない</string>\n    <string name=\"search_custom_emojis\">絵文字を検索</string>\n    <string name=\"notification_group_invited_message\">グループ:%sから招待が来ました</string>\n    <!--    <string name=\"n_people\">%d人</string>-->\n<!--    <string name=\"n_posts\">%d投稿</string>-->\n<!--    <string name=\"owned\">私の</string>-->\n    <string name=\"groups\">グループ一覧</string>\n    <string name=\"is_enable_instance_ticker\">サーバ情報を表示</string>\n    <string name=\"successfully_created_schedule_note\">スケジュール投稿が正常に作成されました</string>\n    <string name=\"account\">アカウント</string>\n    <string name=\"switch_account\">アカウント切り替え</string>\n    <string name=\"mute_thread\">スレッドをミュート</string>\n    <string name=\"unmute_thread\">スレッドのミュートを解除</string>\n\n    <string name=\"edit_caption\">キャプションを編集</string>\n    <string name=\"input_caption\">キャプションを入力</string>\n    <string name=\"notes_and_replies\">投稿と返信</string>\n    <string name=\"other\">その他</string>\n    <string name=\"recently_used\">最近使った</string>\n    <string name=\"char_count\">%1$d文字</string>\n    <string name=\"file_count\">%1$dファイル</string>\n    <string name=\"poll\">投票</string>\n    <string name=\"add_to_bookmark\">ブックマークに追加</string>\n    <string name=\"remove_bookmark\">ブックマークを解除</string>\n    <string name=\"visibility_personal\">自分限定</string>\n    <string name=\"visibility_limited\">サークル</string>\n    <string name=\"visibility_mutual\">相互フォロー</string>\n    <string name=\"calckey_recomended_timeline\">一押し</string>\n    <string name=\"notification_favorited_by\">%sさんにお気に入りにされました</string>\n    <string name=\"notification_posted_by\">%sさんが投稿しました</string>\n    <string name=\"clip\">クリップ</string>\n\n    <string name=\"server_error\">サーバーエラー</string>\n    <string name=\"bot_error\">サーバに人間であることを疑われています</string>\n    <string name=\"auth_error\">認証エラー</string>\n    <string name=\"parameter_error\">パラメーターエラー</string>\n    <string name=\"unauthorized_error\">未認証エラー</string>\n    <string name=\"rate_limit_error\">時間をおいてから再度お試してください(レートリミットエラー)</string>\n    <string name=\"not_found_error\">404 見つからないエラー</string>\n    <string name=\"show_more_reactions\">もっとリアクションを見る</string>\n    <string name=\"pick_file_from_device\">端末からファイルを選択</string>\n    <string name=\"note_editor_file_max_size_validation_error_message\">%d個を超えるファイルを添付できません</string>\n    <string name=\"auth_sign_up\">登録する</string>\n    <string name=\"auth_join_milktea_title\">Milkteaで\\nMisskeyをはじめよう</string>\n    <string name=\"auth_sign_in\">連携する(ログイン)</string>\n    <string name=\"auth_sign_up_button\">アカウントを作成する</string>\n    <string name=\"auth_find_instance\">サーバを見つける</string>\n    <string name=\"auth_find_instance_next_button_text\">次へ</string>\n    <string name=\"auth_find_instance_show_in_web_browser_message\">ブラウザに登録画面が表示されます。</string>\n    <string name=\"settings_note\">投稿</string>\n    <string name=\"settings_note_divider\">投稿に横区切り線を表示する</string>\n    <string name=\"auth_qr_code_message\">別のデバイスで認証する</string>\n\n    <string name=\"settings_show_bottom_menu\">下部メニューを表示</string>\n    <string name=\"settings_app_restart_required\">アプリの再起動が必要です</string>\n\n    <string name=\"note_editor_poll_choice_n\">候補%d</string>\n    <string name=\"settings_visible_instance_domain_in_toolbar\">ツールバーにサーバのドメインを表示する</string>\n    <string name=\"settings_hide_media_when_mobile_network\">モバイル ネットワーク時にメディアを非表示にする</string>\n    <string name=\"settings_always_show_media\">常にメディアを表示する</string>\n    <string name=\"notes_media_click_to_load_image\">クリックして画像を読み込み</string>\n    <string name=\"notifications_follow_requests\">フォローリクエスト</string>\n    <string name=\"content_not_exists_message\">何もありません</string>\n\n    <string name=\"user_detail_mute_renotes\">リポストを表示しない</string>\n    <string name=\"user_detail_unmute_renotes\">リポストを表示する</string>\n    <string name=\"settings_renote_mute_title\">リポスト非表示ユーザ</string>\n    <string name=\"bookmark\">ブックマーク</string>\n\n    <string name=\"milktea_catchphrase\">FediverseライフにMilkteaはいかが?</string>\n    <string name=\"donation\">寄付</string>\n    <string name=\"privacy_policy\">プライバシーポリシー</string>\n    <string name=\"terms_of_service\">利用規約</string>\n    <string name=\"settings_display_icons_as_squares\">アイコンを四角形で表示</string>\n\n\n\n    <!-- Authorization機能 -->\n    <string name=\"auth_custom_app_name\">アプリケーション名</string>\n    <string name=\"auth_app_name\">Milktea</string>\n    <string name=\"auth_successfully_created_the_app\">アプリの作成に成功した</string>\n    <string name=\"auth_warning_s\">警告:%s</string>\n    <string name=\"auth_error_s\">エラー %s</string>\n    <string name=\"auth_continue_auth\">Continue</string>\n    <string name=\"auth_copied_to_clipboard\">クリップボードにコピーしました</string>\n    <string name=\"auth_instance_domain\">サーバドメイン</string>\n    <string name=\"auth_https\">https://</string>\n    <string name=\"auth_waiting_4_u_to_approve\">あなたが認可するのを待っています</string>\n    <string name=\"auth_i_have_approved\">私は認可をしました</string>\n    <string name=\"auth_waiting_4_approval\">認可されるのを待っています。</string>\n    <string name=\"auth_authentication_url\">認証URL</string>\n    <string name=\"auth_copy_the_url_of_the_authentication_destination_to_the_clipboard\">認証先のURLをクリップボードにコピーする\n    </string>\n    <string name=\"auth_welcome\">ようこそ</string>\n    <string name=\"san\">さん</string>\n    <string name=\"auth_open_in_webview\">アプリブラウザで開く</string>\n    <string name=\"auth_privacy_policy_agreeation\">プライバシーポリシーに同意する</string>\n    <string name=\"auth_terms_of_service_agreeation\">利用規約に同意する</string>\n    <string name=\"auth_accpet_mastodon_alpha_test\">Mastodonに関する機能はまだアルファ段階で、まだ実装できていない機能や動作しない機能があることを理解し、開発者に責任を問わないことを承諾します。</string>\n    <!-- Authorization機能ここまで -->\n\n    <!-- Channel -->\n    <string name=\"channel_n_people\">%d人</string>\n    <string name=\"channel_n_posts\">%d投稿</string>\n    <string name=\"channel_owned\">私の</string>\n    <!-- Channel -->\n\n    <!-- Drive -->\n    <string name=\"drive_undo_nsfw\">閲覧注意解除</string>\n    <string name=\"drive_file_deletion_confirmation\">ファイル削除の確認</string>\n    <string name=\"drive_do_u_want_2_delete_s\">%sを削除しますか？</string>\n    <string name=\"drive_mark_as_nsfw\">閲覧注意にする</string>\n    <string name=\"drive\">ドライブ</string>\n    <string name=\"drive_file\">ファイル</string>\n    <string name=\"drive_folder\">フォルダー</string>\n    <string name=\"drive_create_folder\">フォルダーを作成</string>\n    <string name=\"drive_folder_name\">フォルダ名</string>\n    <!-- Drive -->\n\n    <!-- Gallery -->\n    <string name=\"gallery_sensitive_content\">Sensitive content</string>\n    <string name=\"gallery_pick_image\">画像を選択</string>\n    <string name=\"gallery_pick_image_from_device\">端末から画像を選択</string>\n    <string name=\"gallery_pick_image_from_drive\">ドライブから画像を選択</string>\n    <!-- Gallery -->\n\n    <!-- Group -->\n    <string name=\"group_name\">グループ名</string>\n    <string name=\"create_group\">グループを作成</string>\n    <string name=\"edit_group\">グループを編集</string>\n    <!-- Group -->\n\n    <!-- Media -->\n    <string name=\"download\">ダウンロード</string>\n    <string name=\"start_downloading_placeholder\">%sのダウンロードを開始します。</string>\n    <string name=\"success_download_file_message\">ファイルのダウンロードに成功にしました</string>\n    <string name=\"failed_download_file_message\">ファイルのダウンロードに失敗しました</string>\n    <!-- Media -->\n\n    <!-- Messaging -->\n    <string name=\"messaging_input_message\">相手に思いを伝えてください</string>\n    <!-- Messaging -->\n\n    <!-- Note -->\n    <string name=\"time_machine\">タイムマシーン</string>\n    <string name=\"dialog_timemachine_message\">表示したいタイムラインの時間を指定してください</string>\n    <string name=\"show_error\">Show Error</string>\n\n    <string name=\"timeout_error\">タイムアウト</string>\n\n    <string name=\"reauthenticate\">再認証する</string>\n    <string name=\"expand\">展開</string>\n    <string name=\"file_size_warning_dialog_title\">ファイルサイズの警告</string>\n    <string name=\"file_size_warning_dialog_message\">%1$sは%2$sより大きなファイルを添付することはできません。続行しますか？</string>\n    <string name=\"file_size_warning_dialo_positive_button\">続行</string>\n    <string name=\"file_size_warning_dialog_negative_button\">取りやめる</string>\n    <string name=\"mark_media_as_sensitive\">メディアを閲覧注意にする</string>\n    <string name=\"successfully_added_to_favorites\">お気に入りに追加しました</string>\n    <string name=\"failed_to_add_to_favorites\">お気に入りに追加できませんでした</string>\n    <string name=\"removed_from_favorites\">お気に入りから削除しました</string>\n    <string name=\"failed_to_delete_favorites\">お気に入りの削除に失敗しました</string>\n    <string name=\"successfully_deleted\">正常に削除されました</string>\n    <string name=\"dialog_add_emoji_to_user_settings_title\">設定に絵文字を追加する</string>\n    <string name=\"dialog_add_emoji_to_user_settings_message\">%sをユーザ絵文字設定に追加する</string>\n    <!-- Note -->\n\n    <!-- Notification -->\n    <string name=\"no_notifications\">通知はありません</string>\n    <string name=\"notification_menu_mark_as_all_read_notifications_label\">Mark as all read notifications</string>\n    <!-- Notification -->\n\n    <!-- Settings -->\n    <string name=\"client_word_mute\">クライアントワードミュート</string>\n    <string name=\"client_word_mute_format_description\">スペースで区切るとAND指定になり、改行で区切るとOR指定になります。\\nキーワードをスラッシュで囲むと正規表現になります。</string>\n    <string name=\"import_reactions_from_the_web\">リアクションをWebから取り込み</string>\n    <string name=\"import_reactions\">取り込み</string>\n    <string name=\"overwrite_save\">上書き保存</string>\n    <string name=\"notification_sound\">通知音</string>\n    <string name=\"inapp_notification_sound\">アプリ内通知音を有効にする</string>\n    <string name=\"streaming\">自動更新</string>\n    <string name=\"is_stop_timeline_streaming_when_background\">バックグラウンドでタイムラインを更新しない</string>\n    <string name=\"is_stop_note_capture_when_background\">バックグラウンドで投稿をキャプチャしない</string>\n    <string name=\"enable_automic_updates\">自動更新を有効にする</string>\n    <string name=\"please_login\">ログインしてください</string>\n    <string name=\"settings_edit_tab_only_media\">ファイルが添付された投稿のみ表示する</string>\n    <string name=\"settings_about_milktea\">Milkteaについて</string>\n    <string name=\"settings_about_milktea_source_code\">ソースコード(GitHub)</string>\n    <string name=\"settings_emoji_picker\">絵文字ピッカー</string>\n    <string name=\"settings_emoji_display_size\">絵文字の表示サイズ</string>\n    <!-- Settings -->\n\n    <!-- User -->\n    <string name=\"user_birthday\">誕生日: %s</string>\n    <string name=\"user_registration_date\">%sに登録をしました</string>\n    <string name=\"confirm_user_block_title\">確認</string>\n    <string name=\"confirm_user_block_description\">本当に%sさんをブロックしますか？</string>\n\n    <string name=\"user_mute_specify_time_15_minutes_later\">15分後</string>\n    <string name=\"user_mute_specify_time_30_minutes_later\">30分後</string>\n    <string name=\"user_mute_specify_time_1_hours_later\">1時間後</string>\n    <string name=\"user_mute_specify_time_1_day_later\">1日後</string>\n    <string name=\"user_mute_specify_time_1_week_later\">1週間後</string>\n    <string name=\"user_mute_specify_time_1_month_later\">1ヶ月後</string>\n    <string name=\"user_mute_specify_time_indefinite_period\">無期限</string>\n    <string name=\"view_remotely\">リモートで表示</string>\n    <string name=\"follows_you\">フォローされています</string>\n    <string name=\"settings_note_content_font_size\">投稿コンテンツ文字サイズ(%fsp)</string>\n    <string name=\"settings_note_header_font_size\">投稿ヘッダー文字サイズ(%fsp)</string>\n    <string name=\"settings_note_reaction_counter_font_size\">投稿リアクション件数表示の絵文字および文字サイズ(%fsp, %fps)</string>\n    <string name=\"settings_note_custom_emoji_scale_size_in_text\">投稿の本文中のカスタム絵文字の倍率(%f倍)</string>\n    <string name=\"suggestion_users\">おすすめユーザ</string>\n    <string name=\"trend_posted_person_count_msg\">%d人が投稿</string>\n    <string name=\"notes_confirm_attach_quote_note_by_url\">引用として添付しますか?</string>\n    <string name=\"select_draft_post\">下書き投稿を選択</string>\n    <string name=\"remember_scroll_position\">スクロール位置を保持する</string>\n    <string name=\"post_only\">投稿のみ</string>\n    <string name=\"settings_display_timestamps_as_absolute_dates\">タイムスタンプを絶対表示にする</string>\n    <string name=\"settings_cache_config\">キャッシュ設定</string>\n    <string name=\"settings_note_cache\">投稿のキャッシュ</string>\n    <string name=\"settings_custom_emoji_cache\">カスタム絵文字のキャッシュ</string>\n    <string name=\"move_files_here\">ここにファイルを移動</string>\n    <string name=\"reaction_acceptance_all\">全て</string>\n    <string name=\"reaction_acceptance_like_only_for_remote\">全て (リモートはいいねのみ)</string>\n    <string name=\"reaction_acceptance_non_sensitive_only\">非センシティブのみ (リモートはいいねのみ)</string>\n    <string name=\"reaction_acceptance_non_sensitive_only_likes_from_remote\">いいねのみ (リモートはいいねのみ)</string>\n    <string name=\"reaction_acceptance_only_likes\">いいねのみ</string>\n    <string name=\"reaction_acceptance\">リアクションの受け入れ</string>\n    <string name=\"media_display_mode_default\">デフォルト</string>\n    <string name=\"media_display_mode_always\">常にメディアを非表示</string>\n    <string name=\"misskey_role_drive_no_free_space_error_message\">ドライブの空き容量がないため、ファイルをアップロードできません。</string>\n    <string name=\"qr_code\">QRコード</string>\n    <string name=\"copy\">コピー</string>\n    <string name=\"no_app_available_to_open_this_file\">このファイルを開くアプリがありません</string>\n    <string name=\"notification_sync_download_custom_emoji_title\">カスタム絵文字ダウンロード中</string>\n    <string name=\"alarm_permission_description_title\">アラームの権限を付与してください</string>\n    <string name=\"alarm_permission_description_message\">予約投稿はアラーム機能の仕組みを利用するため、設定からMilkteaにアラームの権限を付与する必要性があります。</string>\n    <string name=\"exclude_replies\">リプライを除外</string>\n    <string name=\"exclude_reposts\">リポストを除外</string>\n    <string name=\"notify_about_new_posts\">投稿の通知を受信する</string>\n    <string name=\"stop_notify_about_new_posts\">投稿の通知をやめる</string>\n    <!-- User -->\n\n    <string name=\"settings_user_cache\">ユーザキャッシュ</string>\n    <string name=\"jump_to_new_post\">新着投稿を表示</string>\n    <string name=\"exclude_if_exists_sensitive_media\">センシティブなメディアを含む投稿を除外</string>\n    <string name=\"enable_safe_search\">セーフサーチを有効にする</string>\n\n    <string name=\"safe_search_description_dialog_title\">セーフサーチが有効になっています</string>\n    <string name=\"safe_search_description_dialog_message\">Gogole Playのユーザコンテンツポリシーに準拠するためにセーフサーチが有効になっています。セーフサーチが有効になっていると、センシティブなメディアが含まれる投稿がタイムラインに表示されなくなります。セーフサーチを無効化するには、設定>動き>セーフサーチを有効にするをOFFにしてください。</string>\n    <string name=\"safe_search_description_dialog_positive_button\">設定へ移動する</string>\n    <string name=\"safe_search_description_dialog_negative_button\">セーフサーチを有効にしておく</string>\n\n    <string name=\"confirm_display_sensitive_media_dialog_title\">メディア表示の確認</string>\n    <string name=\"confirm_display_sensitive_media_dialog_message\">暴力的、性的なメディアが表示される恐れがあります。本当に表示しますか？</string>\n    <string name=\"confirm_display_sensitive_media_dialog_positive_button\">表示</string>\n    <string name=\"confirm_display_sensitive_media_dialog_neutral_button\">警告を非表示</string>\n\n    <string name=\"settings_enable_haptic_feedback_on_new_post\">新規投稿受信時の感覚フィードバックを有効にする</string>\n\n    <!-- poll -->\n    <string name=\"poll_votes_count\">%d 票</string>\n    <string name=\"poll_expires_in\">%s に終了</string>\n\n    <!-- developer options -->\n    <string name=\"settings_developer_options\">開発者向けオプション</string>\n    <string name=\"settings_dev_compose_timeline\">Compose タイムライン</string>\n    <string name=\"settings_dev_compose_timeline_description\">有効にすると次回タイムライン表示時から Compose 版を使用します</string>\n\n</resources>\n"
  },
  {
    "path": "modules/common_resource/src/main/res/values-zh/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Milktea</string>\n    <string name=\"navigation_drawer_open\">打开导航栏抽屉</string>\n    <string name=\"navigation_drawer_close\">关闭导航栏抽屉</string>\n    <string name=\"nav_header_title\">Android Studio</string>\n    <string name=\"nav_header_subtitle\">android.studio@android.com</string>\n    <string name=\"nav_header_desc\">导航栏页首</string>\n    <string name=\"action_settings\">设置</string>\n\n    <string name=\"menu_home\">主页</string>\n    <string name=\"menu_gallery\">图库</string>\n    <string name=\"menu_slideshow\">幻灯片放映</string>\n    <string name=\"menu_tools\">工具</string>\n    <string name=\"share\">分享</string>\n    <string name=\"menu_send\">发送</string>\n    <string name=\"search\">搜索</string>\n    <string name=\"notification\">通知</string>\n    <string name=\"message\">消息</string>\n    <string name=\"start_auth\">登陆</string>\n    <string name=\"selecting_instance\">选择的实例</string>\n<!--    <string name=\"welcome\">欢迎</string>-->\n<!--    <string name=\"san\">先生 / 女士</string>-->\n    <string name=\"following\">关注中</string>\n    <string name=\"follower\">关注者</string>\n    <string name=\"renote\">转发</string>\n    <string name=\"renote_in_channel\">频道内转发</string>\n    <string name=\"quote_renote\">引用转发</string>\n    <string name=\"quote_renote_in_channel\">频道内引用转发</string>\n    <string name=\"discovery\">发现</string>\n    <string name=\"renote_was\">转发</string>\n    <string name=\"input_custom_emoji\">自定义表情</string>\n    <string name=\"title_activity_settings\">设置</string>\n\n    <string name=\"reply_title\">默认回复行为</string>\n\n    <!-- Sync Preferences -->\n    <string name=\"sync_title\">定期同步</string>\n    <string name=\"attachment_title\">下载附件</string>\n    <string name=\"attachment_summary_on\">自动</string>\n    <string name=\"attachment_summary_off\">手动</string>\n    <string name=\"setting\">设置</string>\n    <string name=\"nav_like\">收藏</string>\n    <string name=\"nav_list\">列表</string>\n    <string name=\"nav_cloud\">网盘</string>\n    <string name=\"nav_setting_tab\">选项卡设置</string>\n    <string name=\"add_search\">添加搜索</string>\n    <string name=\"save_setting\">保存设置</string>\n    <string name=\"tab_selected\">已选中</string>\n    <string name=\"tab_selectable\">可选</string>\n    <string name=\"title_featured\">热门</string>\n\n<!--    <string name=\"create_folder\">创建文件夹</string>-->\n    <string name=\"add_account\">添加账号</string>\n    <string name=\"post\">发帖</string>\n    <string name=\"please_speak\">有什么想说的?</string>\n    <string name=\"open\">打开</string>\n    <string name=\"multiple_answer\">多条回复</string>\n    <string name=\"add_choice\">添加回复</string>\n    <string name=\"cw_hint\">注释（选填）</string>\n    <string name=\"show_reply\">显示回复</string>\n    <string name=\"show_conversation\">查看对话</string>\n    <string name=\"copy_url\">复制链接</string>\n    <string name=\"copy_content\">复制内容</string>\n    <string name=\"show_detail\">详细</string>\n    <string name=\"favorite\">收藏</string>\n    <string name=\"remove_favorite\">移出收藏</string>\n    <string name=\"remove\">移除</string>\n\n    <string name=\"pin\">置顶</string>\n    <string name=\"media\">媒体</string>\n    <string name=\"follow\">关注</string>\n\n    <string name=\"include_local_renotes\">显示本地转发</string>\n    <string name=\"include_renoted_my_notes\">显示被转发的帖子</string>\n    <string name=\"include_my_renotes\">显示你的转发</string>\n    <string name=\"auto_load_timeline\">自动加载时间线</string>\n    <string name=\"timeline\">时间线</string>\n\n    <string name=\"capture_note_when_stopped\">即使实例停止也自动加载帖子</string>\n    <string name=\"auto_load_when_stopped\">即使实例停止也自动加载时间轴</string>\n    <string name=\"sync\">同步</string>\n\n    <string name=\"movement\">同步</string>\n    <string name=\"remove_note\">删除帖子</string>\n\n    <string name=\"hide_removed_note\">隐藏已删除的帖子</string>\n\n    <string name=\"appearance\">外观</string>\n    <string name=\"theme\">主题</string>\n    <string name=\"theme_white\">亮色</string>\n    <string name=\"theme_black\">黑色</string>\n    <string name=\"theme_dark\">暗色</string>\n    <string name=\"theme_bread\">薄饼</string>\n    <string name=\"theme_mastodon_dark\">大象暗色</string>\n\n    <string name=\"title_activity_media\">媒体活动</string>\n    <string name=\"dummy_button\">虚拟按钮</string>\n    <string name=\"dummy_content\">虚拟\\n内容</string>\n\n    <string name=\"sensitive_content\">敏感内容</string>\n\n    <string name=\"thumbnail\">缩略图</string>\n    <string name=\"play_media\">播放</string>\n    <string name=\"avataricon\">头像</string>\n    <string name=\"reaction\">回应</string>\n    <string name=\"followed_by\">被 %s 关注</string>\n    <string name=\"replied_by\">由 %s 回复</string>\n    <string name=\"quoted_by\">由 %s 引用</string>\n    <string name=\"voted_by\">被 %s 投票</string>\n    <string name=\"mention_by\">被 %s 提及</string>\n    <string name=\"reacted_by\">被 %s 回应</string>\n    <string name=\"renoted_by\">被 %s 转帖</string>\n    <string name=\"follow_requested_by\">来自 %s 的关注请求</string>\n    <string name=\"poll_ended\">投票结束</string>\n    <string name=\"total_vote_count\">总票数 %s</string>\n\n    <string name=\"input_message\">有什么新鲜事?</string>\n\n    <string name=\"manifest_user_name_pattern\">&quot;@&quot;\\w([\\w-]*\\w)?(?:@[\\w.\\-]+\\w)?</string>\n    <string name=\"followee_state\">已关注</string>\n    <string name=\"mute\">静音</string>\n    <string name=\"block\">拉黑</string>\n    <string name=\"unmute\">取消静音</string>\n    <string name=\"unblock\">取消拉黑</string>\n\n    <string name=\"add_to_tab\">添加至标签栏</string>\n\n    <string name=\"detail\">详情</string>\n\n    <string name=\"instance_domain\">实例 URL</string>\n    <string name=\"sign_in\">登录</string>\n    <string name=\"user_name\">用户名</string>\n    <string name=\"password\">密码</string>\n    <string name=\"sign_out\">登出</string>\n    <string name=\"token\">令牌</string>\n\n    <string name=\"add_app\">添加应用</string>\n    <string name=\"selected_account\">选中的账号</string>\n    <string name=\"selected_app\">选中的应用</string>\n    <string name=\"custom_app\">自定义应用</string>\n\n    <string name=\"custom_app_name\">应用名称</string>\n    <string name=\"custom_app_description\">应用概述</string>\n\n    <string name=\"your_app_name\">自定义应用名称</string>\n    <string name=\"description_of_app_description\">在用户身份验证时显示</string>\n    <string name=\"create\">创建</string>\n\n    <string name=\"auth_failed\">失败</string>\n    <string name=\"expired\">过期</string>\n\n    <string name=\"auth_required\">需要用户进行身份验证</string>\n    <string name=\"invalid_url\">无效的 URL 链接</string>\n    <string name=\"invalid_pw_id\">无效的 密码/ID</string>\n\n    <string name=\"auth\">用户身份验证</string>\n\n    <string name=\"often_use\">常用</string>\n    <string name=\"all\">全部</string>\n\n    <string name=\"visibility_public\">公开</string>\n    <string name=\"visibility_home\">主页</string>\n    <string name=\"visibility_follower\">仅关注者</string>\n    <string name=\"visibility_specified\">私信</string>\n    <string name=\"visibility_public_local_only\">公开（本地）</string>\n    <string name=\"visibility_home_local_only\">主页（本地）</string>\n    <string name=\"visibility_follower_local_only\">仅关注者（本地）</string>\n\n    <string name=\"show\">展示</string>\n    <string name=\"user_list\">用户列表</string>\n    <string name=\"update_user_list\">编辑列表</string>\n    <string name=\"add_user\">添加用户</string>\n    <string name=\"list_name\">列表名称</string>\n    <string name=\"create_user_list\">创建列表</string>\n    <string name=\"at_mark\">\\@</string>\n\n    <string name=\"host\">主机</string>\n    <string name=\"select_user\">选择用户</string>\n    <string name=\"selecting_users\">选择用户</string>\n    <string name=\"https\">https://</string>\n    <string name=\"conversation\">会话</string>\n    <string name=\"add_address\">添加地址</string>\n\n    <string name=\"indefinite_period\">无限期</string>\n    <string name=\"date_and_time_specification\">指定日期和时间</string>\n\n    <string name=\"future\">未来</string>\n    <string name=\"now\">现在</string>\n    <string name=\"time_with_year_ago\">%s年</string>\n    <string name=\"time_with_month_ago\">%s月</string>\n    <string name=\"time_with_date_ago\">%s日</string>\n    <string name=\"time_with_hour_ago\">%s时</string>\n    <string name=\"time_with_minute_ago\">%s分</string>\n    <string name=\"time_with_second_ago\">%s秒</string>\n\n    <string name=\"select_file\">选择文件</string>\n\n    <string name=\"network_error\">网络错误</string>\n\n<!--    <string name=\"folder_name\">文件夹名称</string>-->\n    <string name=\"selected\">已选中</string>\n    <string name=\"more\">更多</string>\n\n    <string name=\"delete_and_edit\">删除并编辑</string>\n    <string name=\"license\">许可</string>\n    <string name=\"standard_reaction\">标准回应</string>\n    <string name=\"set_the_reaction_displayed_in_the_reaction_picker\">设置常用回应</string>\n    <string name=\"reaction_picker\">回应选择器</string>\n    <string name=\"list_picker\">列表选择器</string>\n    <string name=\"simple_picker\">简单选择器</string>\n    <string name=\"enter_reaction\">输入回应</string>\n    <string name=\"click_to_delete_the_reaction\">点击以移除回应</string>\n    <string name=\"confirm_delete_reaction\">确认移除回应</string>\n    <string name=\"delete_reaction\">移除回应</string>\n    <string name=\"user\">用户</string>\n    <string name=\"note_opacity\">帖文不透明度</string>\n    <string name=\"transparent\">透明</string>\n    <string name=\"opaque\">不透明</string>\n    <string name=\"background_image\">背景图片</string>\n    <string name=\"hide_bottom_navigation\">隐藏底部菜单</string>\n    <string name=\"user_name_as_default_display_name\">将用户名设置为默认显示名称</string>\n    <string name=\"successfully_created_the_app\">成功创建应用</string>\n    <string name=\"continue_auth\">继续</string>\n\n    <string name=\"home_timeline\">主页</string>\n    <string name=\"global_timeline\">全局</string>\n    <string name=\"local_timeline\">本地</string>\n    <string name=\"hybrid_timeline\">社交</string>\n    <string name=\"mention\">提及</string>\n    <string name=\"add_tab\">添加选项卡</string>\n    <string name=\"list\">列表</string>\n    <string name=\"tag\">话题标签</string>\n    <string name=\"featured\">特色</string>\n    <string name=\"antenna\">天线</string>\n    <string name=\"rename\">重命名</string>\n    <string name=\"edit\">编辑</string>\n    <string name=\"delete\">删除</string>\n\n    <string name=\"update_timeline_in_background\">在后台更新时间线</string>\n\n    <string name=\"edit_tab\">编辑选项卡名称</string>\n\n    <string name=\"follow_request_accepted_by\">关注请求已被 %s 接受</string>\n    <string name=\"confirm_deletion\">确认删除</string>\n    <string name=\"name\">名称</string>\n    <string name=\"receiving_source\">消息源</string>\n\n    <string name=\"all_notes\">所有帖文</string>\n    <string name=\"notes_from_following_users\">来自关注用户的帖文</string>\n    <string name=\"notes_from_specific_users\">来自特定用户的帖文</string>\n    <string name=\"notes_from_specific_list\">来自特定列表的帖文</string>\n    <string name=\"notes_from_users_in_the_specified_group\">来自特定群组的帖文</string>\n    <string name=\"include_replies\">包含回复</string>\n    <string name=\"keywords_to_receive\">想要收到的关键词</string>\n    <string name=\"keyword_input_method\">用空格分隔表示“与”, 用换行分隔表示“或”。</string>\n    <string name=\"keywords_to_exclude\">要排除的关键词</string>\n    <string name=\"case_sensitive\">大小写敏感</string>\n    <string name=\"notify_notes\">当有新帖文时提醒</string>\n    <string name=\"with_files\">仅筛选带有附件的帖文</string>\n    <string name=\"group\">群组</string>\n    <string name=\"save\">保存</string>\n    <string name=\"unrenote\">取消转帖</string>\n    <string name=\"confirm_delete_and_edit_note_description\">你确定想要删除这个帖文并编辑它吗？这将丢失所有关于它的回应，转帖和回复。</string>\n    <string name=\"via\">通过</string>\n    <string name=\"search_emojis\">搜索表情</string>\n\n    <string name=\"success\">成功</string>\n    <string name=\"failure\">失败</string>\n    <string name=\"explore_fediverse\">探索联邦宇宙</string>\n    <string name=\"explore\">探索</string>\n    <string name=\"trending_users\">热门用户</string>\n    <string name=\"users_with_recent_activity\">最近活跃的用户</string>\n    <string name=\"newly_joined_users\">新加入的用户</string>\n    <string name=\"newly_discovered_users\">新发现的用户</string>\n    <string name=\"trending_tag\">热门标签</string>\n    <string name=\"save_draft\">保存草稿</string>\n    <string name=\"save_the_note_as_a_draft\">将帖文保存为草稿</string>\n    <string name=\"draft_notes\">帖文草稿</string>\n    <string name=\"toggle_content_visibility\">切换内容可见性</string>\n    <string name=\"delete_draft_note\">删除帖文草稿</string>\n    <string name=\"show_remotely\">远程显示</string>\n    <string name=\"incomplete_information_for_remote_user\">远程用户信息不完整</string>\n    <string name=\"local_only\">仅限本地</string>\n    <string name=\"post_button_at_the_bottom\">将发帖按钮放到屏幕下方</string>\n    <string name=\"please_again_to_finish\">再按一次关闭</string>\n\n    <string name=\"url_preview\">链接内容预览</string>\n    <string name=\"summaly_server_url\">预览服务器 URL</string>\n    <string name=\"displayed_url_preview\">URL 预览</string>\n    <string name=\"preview_display_test\">测试预览样式</string>\n    <string name=\"test_url\">测试 URL</string>\n    <string name=\"from_misskey_api\">使用 Misskey API</string>\n    <string name=\"specify_summaly_server\">指定预览服务器</string>\n    <string name=\"use_app_implementation_deprecated\">使用自带实现（已被弃用）</string>\n\n    <string name=\"use_simple_editor\">使用简易编辑器</string>\n    <string name=\"retry\">重试</string>\n    <string name=\"failed_to_get_the_note\">获取帖文失败</string>\n\n\n    <string name=\"refresh\">刷新</string>\n\n    <string name=\"long_text\">由于太长已为你自动折叠（长度：%d）</string>\n    <string name=\"show_more\">显示更多（%s）</string>\n    <string name=\"hide\">隐藏</string>\n    <string name=\"text_length_limit\">文本长度限制</string>\n    <string name=\"returns_limit\">换行限制（自动折叠帖子）</string>\n    <string name=\"height_limit\">高度限制</string>\n    <string name=\"disable_height_limit\">禁用高度限制</string>\n    <string name=\"auto_note_folding\">自动折叠帖文</string>\n    <string name=\"add_to_list\">添加至列表</string>\n    <string name=\"promotion\">晋升</string>\n    <string name=\"waiting_4_approval\">正在等待批准</string>\n<!--    <string name=\"i_have_approved\">我已批准的</string>-->\n<!--    <string name=\"waiting_4_u_to_approve\">等待批准</string>-->\n    <string name=\"learn_note_visibility\">记住帖文可见性</string>\n    <string name=\"accept\">接受</string>\n    <string name=\"reject\">拒绝</string>\n    <string name=\"local\">本地</string>\n    <string name=\"add_user_list\">添加用户列表</string>\n    <string name=\"edit_note\">编辑帖文</string>\n    <string name=\"gallery_favorite_button\">图库收藏按钮</string>\n    <string name=\"popular_posts\">流行趋势</string>\n    <string name=\"gallery\">图库</string>\n    <string name=\"my_posts\">我的帖文</string>\n    <string name=\"my_liking\">我喜欢的</string>\n    <string name=\"websocket_error\">WebSocket 错误</string>\n    <string name=\"connecting\">连接中…</string>\n    <string name=\"connected\">已连接</string>\n    <string name=\"closing\">关闭中…</string>\n    <string name=\"closed\">已关闭</string>\n    <string name=\"create_gallery\">创建图库</string>\n    <string name=\"title\">标题</string>\n    <string name=\"description\">描述</string>\n    <string name=\"pick_image\">选择图片</string>\n    <string name=\"pick_image_from_device\">从设备中选取图片</string>\n    <string name=\"pick_image_from_drive\">从网盘中选取图片</string>\n    <string name=\"successfully_created_note\">成功创建帖文</string>\n    <string name=\"sensitive\">敏感内容</string>\n<!--    <string name=\"authentication_url\">用户身份验证 URL</string>-->\n<!--    <string name=\"copy_the_url_of_the_authentication_destination_to_the_clipboard\">将身份验证目标的 URL 复制到剪贴板。</string>-->\n    <string name=\"request_follow\">%s 请求关注你</string>\n\n    <string name=\"copied_to_clipboard\">已复制到剪贴板</string>\n    <string name=\"follow_approval_pending\">等待关注批准</string>\n    <string name=\"request_follow_from_u\">请求关注</string>\n    <string name=\"unfollow\">取消关注</string>\n    <string name=\"unknown_notification\">未知的提醒</string>\n    <string name=\"unknown_notification_msg\" formatted=\"false\">未知的提醒。请截图并报告给开发者。notificationId:%s, type:%s, senderID:%s,</string>\n\n    <string name=\"translated_from_s\">翻译自 %s： \\n</string>\n    <string name=\"error_s\">发生错误: %s</string>\n    <string name=\"translate\">翻译</string>\n    <string name=\"report\">举报</string>\n    <string name=\"send\">发送</string>\n    <string name=\"successful_report\">举报成功</string>\n    <string name=\"report_failed\">举报失败</string>\n    <string name=\"mark_as_nsfw\">标记为NSFW</string>\n    <string name=\"undo_nsfw\">取消NSFW标签</string>\n<!--    <string name=\"file_deletion_confirmation\">确认删除</string>-->\n    <string name=\"cancel\">取消</string>\n<!--    <string name=\"do_u_want_2_delete_s\">你确定要删除 %s 吗？</string>-->\n    <string name=\"remove_attachment\">删除附件</string>\n    <string name=\"warning_s\">警告：%s</string>\n    <string name=\"reservation_at\">自动发布日期和时间</string>\n    <string name=\"warning_reservation_msg\">可能不会按照预期的时间发布</string>\n    <string name=\"create_mention\">创建提及</string>\n    <string name=\"change_nickname\">更改昵称</string>\n    <string name=\"nickname\">昵称</string>\n    <string name=\"delete_nickname\">删除昵称</string>\n    <string name=\"suggested_emojis\">建议的表情</string>\n    <string name=\"the_remote_emoji_does_not_exist_in_this_instance\">此实例中不存在远程表情符号。</string>\n    <string name=\"view_in_browser\">在浏览器中查看</string>\n    <string name=\"note_creation_failure\">帖文创建失败</string>\n    <string name=\"channel\">频道</string>\n\n<!--    <string name=\"edit_caption\">编辑标题</string>-->\n<!--    <string name=\"input_caption\">输入标题</string>-->\n    <string name=\"animation\">动画</string>\n    <string name=\"avatar_icon_animation\">头像图标动画</string>\n    <string name=\"security_setting\">安全</string>\n\n    <string name=\"send_a_crash_report\">发送崩溃报告</string>\n    <string name=\"crash_reports_are_useful_for_development\">崩溃报告对开发很有用</string>\n    <string name=\"agree\">同意</string>\n    <string name=\"enable_google_analytics\">启用Google Analytics</string>\n    <string name=\"consent_to_collect_behavior_history_message\">同意 Google Analytics 收集行为历史，对开发很有用。</string>\n    <string name=\"disagree\">不同意</string>\n\n    <string name=\"consent_to_collect_behavior_history\">动作历史集合</string>\n    <string name=\"search_custom_emojis\">搜索表情符号</string>\n    <string name=\"notification_group_invited_message\">您已被邀请加入一个群组: %s</string>\n\n    <string name=\"groups\">群组</string>\n\n    <string name=\"is_enable_instance_ticker\">显示实例信息</string>\n    <string name=\"successfully_created_schedule_note\">已成功创建计划帖子</string>\n    <string name=\"account\">帐户</string>\n    <string name=\"switch_account\">切换帐号</string>\n    <string name=\"mute_thread\">屏蔽帖子列表</string>\n    <string name=\"unmute_thread\">取消屏蔽帖子列表</string>\n\n    <!--    <string name=\"n_people\">%d位用户</string>-->\n<!--    <string name=\"n_posts\">%d篇帖文</string>-->\n<!--    <string name=\"owned\">拥有</string>-->\n\n    <string name=\"edit_caption\">编辑标题</string>\n    <string name=\"input_caption\">输入标题</string>\n    <string name=\"notes_and_replies\">帖子与回复</string>\n    <string name=\"other\">其他</string>\n    <string name=\"recently_used\">最近使用</string>\n    <string name=\"char_count\">%1$d 个字符</string>\n    <string name=\"file_count\">%1$d 个文件</string>\n    <string name=\"poll\">投票</string>\n    <string name=\"remove_bookmark\">删除书签</string>\n    <string name=\"add_to_bookmark\">添加书签</string>\n    <string name=\"visibility_personal\">仅自己</string>\n    <string name=\"visibility_limited\">限制</string>\n    <string name=\"visibility_mutual\">相互关注</string>\n    <string name=\"calckey_recomended_timeline\">推荐的</string>\n    <string name=\"notification_favorited_by\">被 %s 收藏</string>\n    <string name=\"notification_posted_by\">由 %s 发布</string>\n    <string name=\"clip\">便签</string>\n\n    <string name=\"server_error\">服务器错误</string>\n    <string name=\"bot_error\">你是人类吗？</string>\n    <string name=\"auth_error\">用户身份验证错误</string>\n    <string name=\"parameter_error\">参数错误</string>\n    <string name=\"unauthorized_error\">未认证错误（Unauthorized）</string>\n    <string name=\"rate_limit_error\">速率限制错误</string>\n    <string name=\"not_found_error\">404 未找到错误</string>\n    <string name=\"show_more_reactions\">显示更多反应</string>\n    <string name=\"pick_file_from_device\">从设备中选择文件</string>\n    <string name=\"note_editor_file_max_size_validation_error_message\">不能附加超过 %d 个文件</string>\n    <string name=\"auth_sign_up\">注册</string>\n    <string name=\"auth_join_milktea_title\">让我们从Milktea开始Misskey</string>\n    <string name=\"auth_sign_up_button\">注册</string>\n    <string name=\"auth_sign_in\">登入</string>\n    <string name=\"auth_find_instance\">寻找服务器</string>\n    <string name=\"auth_find_instance_next_button_text\">下一个</string>\n    <string name=\"auth_find_instance_show_in_web_browser_message\">注册屏幕将出现在您的浏览器中</string>\n    <string name=\"settings_note_divider\">在笔记中显示水平分隔线</string>\n    <string name=\"settings_note\">笔记</string>\n    <string name=\"auth_qr_code_message\">在另一台设备上进行身份验证</string>\n\n    <string name=\"settings_show_bottom_menu\">显示底部菜单</string>\n    <string name=\"settings_app_restart_required\">需要重新启动应用程序。</string>\n\n    <string name=\"note_editor_poll_choice_n\">选择%d</string>\n    <string name=\"settings_visible_instance_domain_in_toolbar\">在工具栏中显示实例的域</string>\n    <string name=\"settings_hide_media_when_mobile_network\">移动网络时隐藏媒体</string>\n    <string name=\"settings_always_show_media\">始终显示媒体</string>\n    <string name=\"notes_media_click_to_load_image\">点击加载图片</string>\n    <string name=\"notifications_follow_requests\">按照要求</string>\n    <string name=\"content_not_exists_message\">无内容</string>\n    <string name=\"user_detail_mute_renotes\">屏蔽转发</string>\n    <string name=\"user_detail_unmute_renotes\">取消屏蔽转发</string>\n    <string name=\"settings_renote_mute_title\">转发屏蔽</string>\n    <string name=\"bookmark\">书签</string>\n\n    <string name=\"milktea_catchphrase\">你想要带有联邦宇宙的Milktea吗？</string>\n    <string name=\"donation\">捐款</string>\n    <string name=\"privacy_policy\">隐私政策</string>\n    <string name=\"terms_of_service\">服务条款</string>\n\n\n    <string name=\"auth_custom_app_name\">应用名称</string>\n    <string name=\"auth_app_name\">Milktea</string>\n    <string name=\"auth_successfully_created_the_app\">成功创建应用</string>\n    <string name=\"auth_warning_s\">警告：%s</string>\n    <string name=\"auth_error_s\">发生错误：%s</string>\n    <string name=\"auth_continue_auth\">继续</string>\n    <string name=\"auth_copied_to_clipboard\">已复制到剪贴板</string>\n    <string name=\"auth_instance_domain\">实例 URL</string>\n    <string name=\"auth_https\">https://</string>\n    <string name=\"auth_waiting_4_u_to_approve\">正在等待您的同意</string>\n    <string name=\"auth_i_have_approved\">已同意</string>\n    <string name=\"auth_waiting_4_approval\">正在等待同意</string>\n    <string name=\"auth_authentication_url\">验证 URL</string>\n    <string name=\"auth_copy_the_url_of_the_authentication_destination_to_the_clipboard\">将身份验证 URL 复制到剪贴板。</string>\n    <string name=\"auth_welcome\">欢迎</string>\n    <string name=\"san\">先生 / 女士</string>\n    <string name=\"auth_open_in_webview\">使用 WebView 打开</string>\n    <string name=\"auth_terms_of_service_agreeation\">我同意服务条款</string>\n    <string name=\"auth_privacy_policy_agreeation\">我同意隐私政策</string>\n    <string name=\"auth_accpet_mastodon_alpha_test\">我明白Mastodon相关的功能仍处于alpha阶段，可能存在尚未实现或无法工作的功能，我同意不让开发人员负责。</string>\n\n    <!-- Channel -->\n    <string name=\"channel_n_people\">%d 人</string>\n    <string name=\"channel_n_posts\">%d 帖子</string>\n    <string name=\"channel_owned\">我的</string>\n    <!-- Channel -->\n\n    <!-- Drive -->\n    <string name=\"drive_undo_nsfw\">取消NSFW标签</string>\n    <string name=\"drive_file_deletion_confirmation\">确认删除</string>\n    <string name=\"drive_do_u_want_2_delete_s\">你确定要删除 %s 吗？</string>\n    <string name=\"drive_mark_as_nsfw\">标记为NSFW</string>\n    <string name=\"drive\">网盘</string>\n    <string name=\"drive_file\">文件</string>\n    <string name=\"drive_folder\">文件夹</string>\n    <string name=\"drive_create_folder\">创建文件夹</string>\n    <string name=\"drive_folder_name\">文件夹名称</string>\n    <!-- Drive -->\n\n    <!-- Gallery -->\n    <string name=\"gallery_sensitive_content\">敏感内容</string>\n    <string name=\"gallery_pick_image\">选择图片</string>\n    <string name=\"gallery_pick_image_from_device\">从设备中选取</string>\n    <string name=\"gallery_pick_image_from_drive\">从网盘中选取</string>\n    <!-- Gallery -->\n\n    <!-- Group -->\n    <string name=\"group_name\">群组名字</string>\n    <string name=\"create_group\">创建群组</string>\n    <string name=\"edit_group\">编辑群组</string>\n    <!-- Group -->\n\n    <!-- Media -->\n    <string name=\"download\">下载</string>\n    <string name=\"start_downloading_placeholder\">开始下载 %s</string>\n    <string name=\"success_download_file_message\">下载成功</string>\n    <string name=\"failed_download_file_message\">下载失败</string>\n    <!-- Media -->\n\n    <!-- Messaging -->\n    <string name=\"messaging_input_message\">什么事?</string>\n    <!-- Messaging -->\n\n    <!-- Note -->\n    <string name=\"time_machine\">回到未来</string>\n    <string name=\"dialog_timemachine_message\">请指定您要显示的时间线的时间</string>\n    <string name=\"show_error\">显示错误</string>\n\n    <string name=\"timeout_error\">超时</string>\n    <string name=\"reauthenticate\">重新认证</string>\n    <string name=\"expand\">展开</string>\n    <string name=\"file_size_warning_dialog_message\">%1$s 不允许大于 %2$s 的附件。要继续吗？</string>\n    <string name=\"file_size_warning_dialog_negative_button\">取消附件</string>\n    <string name=\"file_size_warning_dialo_positive_button\">继续</string>\n    <string name=\"file_size_warning_dialog_title\">文件大小警告</string>\n    <string name=\"mark_media_as_sensitive\">将媒体标记为敏感</string>\n    <string name=\"successfully_added_to_favorites\">已成功添加到收藏夹</string>\n    <string name=\"failed_to_add_to_favorites\">添加到收藏夹失败</string>\n    <string name=\"removed_from_favorites\">从收藏夹中删除</string>\n    <string name=\"failed_to_delete_favorites\">删除收藏失败</string>\n    <string name=\"successfully_deleted\">成功删除</string>\n    <string name=\"dialog_add_emoji_to_user_settings_title\">将表情符号添加到设置</string>\n    <string name=\"dialog_add_emoji_to_user_settings_message\">将 %s 添加到用户表情符号设置</string>\n    <!-- Note -->\n\n    <!-- Notification -->\n    <string name=\"no_notifications\">没有通知</string>\n    <string name=\"notification_menu_mark_as_all_read_notifications_label\">标记所有通知为已读</string>\n    <!-- Notification -->\n\n    <!-- Settings -->\n    <string name=\"client_word_mute\">客户端关键字屏蔽</string>\n    <string name=\"client_word_mute_format_description\">用空格分隔会产生 AND 规范，用换行符分隔会产生 OR 规范。\\n关键字周围的斜线使其成为正则表达式。</string>\n    <string name=\"import_reactions_from_the_web\">从网络导入反应</string>\n    <string name=\"import_reactions\">导入反应</string>\n    <string name=\"overwrite_save\">覆盖保存</string>\n    <string name=\"notification_sound\">通知音</string>\n    <string name=\"inapp_notification_sound\">启用应用内通知音</string>\n    <string name=\"streaming\">自动更新</string>\n    <string name=\"is_stop_timeline_streaming_when_background\">不在后台更新时间线</string>\n    <string name=\"is_stop_note_capture_when_background\">不在后台获取帖子</string>\n    <string name=\"enable_automic_updates\">启用自动更新</string>\n    <string name=\"please_login\">请登录</string>\n    <string name=\"settings_edit_tab_only_media\">仅媒体</string>\n    <string name=\"settings_about_milktea\">关于Milktea</string>\n    <string name=\"settings_about_milktea_source_code\">源代码（GitHub）</string>\n    <string name=\"settings_emoji_picker\">表情选择器</string>\n    <string name=\"settings_emoji_display_size\">表情显示大小</string>\n\n    <!-- Settings -->\n\n    <!-- User -->\n    <string name=\"user_birthday\">生日: %s</string>\n    <string name=\"user_registration_date\">注册于 %s</string>\n    <string name=\"confirm_user_block_title\">确认</string>\n    <string name=\"confirm_user_block_description\">您确定要屏蔽 %s 吗？</string>\n\n    <string name=\"user_mute_specify_time_15_minutes_later\">15 分钟</string>\n    <string name=\"user_mute_specify_time_30_minutes_later\">30 分钟</string>\n    <string name=\"user_mute_specify_time_1_hours_later\">1 小时</string>\n    <string name=\"user_mute_specify_time_1_day_later\">1 天</string>\n    <string name=\"user_mute_specify_time_1_week_later\">1 周</string>\n    <string name=\"user_mute_specify_time_1_month_later\">1 个月</string>\n    <string name=\"user_mute_specify_time_indefinite_period\">永久</string>\n    <string name=\"view_remotely\">远程查看</string>\n    <string name=\"follows_you\">正在关注你</string>\n    <string name=\"settings_note_content_font_size\">帖子内容字体大小（%fsp）</string>\n    <string name=\"settings_note_header_font_size\">帖子标题字体大小（%fsp）</string>\n    <string name=\"settings_note_reaction_counter_font_size\">帖子反应计数字体大小（%fsp，%fps）</string>\n    <string name=\"settings_note_custom_emoji_scale_size_in_text\">自定义表情符号放大倍率（%fX）</string>\n    <string name=\"suggestion_users\">建议</string>\n    <string name=\"trend_posted_person_count_msg\">%d 人发帖</string>\n    <string name=\"notes_confirm_attach_quote_note_by_url\">作为引用帖子附加？</string>\n    <string name=\"select_draft_post\">选择草稿帖子</string>\n    <string name=\"remember_scroll_position\">记住滚动位置</string>\n    <string name=\"post_only\">仅发帖</string>\n    <string name=\"settings_display_timestamps_as_absolute_dates\">以绝对日期显示时间戳</string>\n    <string name=\"settings_cache_config\">缓存设置</string>\n    <string name=\"settings_note_cache\">帖子缓存</string>\n    <string name=\"settings_custom_emoji_cache\">自定义表情缓存</string>\n    <string name=\"move_files_here\">将文件移至此处</string>\n    <string name=\"reaction_acceptance_all\">All</string>\n    <string name=\"reaction_acceptance_like_only_for_remote\">All (Only likes for remote instances)</string>\n    <string name=\"reaction_acceptance_non_sensitive_only\">Non-sensitive only</string>\n    <string name=\"reaction_acceptance_non_sensitive_only_likes_from_remote\">Non-sensitive only (Only likes from remote)</string>\n    <string name=\"reaction_acceptance_only_likes\">Only likes</string>\n    <string name=\"reaction_acceptance\">Reaction acceptance</string>\n    <string name=\"settings_display_icons_as_squares\">Display icons as squares</string>\n    <string name=\"media_display_mode_default\">Default</string>\n    <string name=\"media_display_mode_always\">Always hide</string>\n    <string name=\"misskey_role_drive_no_free_space_error_message\">无法上传文件，因为硬盘没有可用空间</string>\n    <string name=\"qr_code\">QR Code</string>\n    <string name=\"copy\">Copy</string>\n    <string name=\"no_app_available_to_open_this_file\">没有应用可打开此文件</string>\n    <string name=\"notification_sync_download_custom_emoji_title\">下载自定义表情符号</string>\n    <string name=\"alarm_permission_description_title\">Requires alarm permission</string>\n    <string name=\"alarm_permission_description_message\">Scheduled posting uses the mechanism of the alarm function, so it is necessary to grant alarm permission to Milktea from the settings.</string>\n    <string name=\"exclude_replies\">Exclude replies</string>\n    <string name=\"exclude_reposts\">Exclude reposts</string>\n    <string name=\"notify_about_new_posts\">Notify about new posts</string>\n    <string name=\"stop_notify_about_new_posts\">Stop notify about new posts</string>\n    <!-- User -->\n    <string name=\"settings_user_cache\">User caches</string>\n    <string name=\"jump_to_new_post\">Jump to new post</string>\n    <string name=\"exclude_if_exists_sensitive_media\">Exclude if exists senstive media</string>\n    <string name=\"enable_safe_search\">启用安全搜索</string>\n    <string name=\"safe_search_description_dialog_title\">安全搜索已启用</string>\n    <string name=\"safe_search_description_dialog_message\">为遵守Google Play用户内容政策，已启用安全搜索。启用安全搜索时，包含敏感媒体的帖子将不会显示在时间线上。要禁用安全搜索，请转到设置>动作>启用安全搜索并关闭。</string>\n    <string name=\"safe_search_description_dialog_positive_button\">移动到设置</string>\n    <string name=\"safe_search_description_dialog_negative_button\">保持启用安全搜索</string>\n\n    <string name=\"confirm_display_sensitive_media_dialog_title\">确认媒体显示</string>\n    <string name=\"confirm_display_sensitive_media_dialog_message\">可能会显示暴力或性内容的媒体。您确定要查看吗？</string>\n    <string name=\"confirm_display_sensitive_media_dialog_positive_button\">显示</string>\n    <string name=\"confirm_display_sensitive_media_dialog_neutral_button\">不要警告</string>\n\n\n    <string name=\"settings_enable_haptic_feedback_on_new_post\">新帖子的触觉反馈</string>\n\n    <!-- poll -->\n    <string name=\"poll_votes_count\">%d 票</string>\n    <string name=\"poll_expires_in\">%s 结束</string>\n\n    <!-- developer options -->\n    <string name=\"settings_developer_options\">开发者选项</string>\n    <string name=\"settings_dev_compose_timeline\">Compose 时间线</string>\n    <string name=\"settings_dev_compose_timeline_description\">启用后，下次显示时间线时将使用 Compose 版本</string>\n\n</resources>"
  },
  {
    "path": "modules/common_viewmodel/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/common_viewmodel/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.common_viewmodel'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_android')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.lifecycle.livedata\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/common_viewmodel/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/common_viewmodel/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/common_viewmodel/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/common_viewmodel/src/main/java/net/pantasystem/milktea/common_viewmodel/CurrentPageableTimelineViewModel.kt",
    "content": "package net.pantasystem.milktea.common_viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport javax.inject.Inject\n\nsealed interface SuitableType {\n    data object Gallery : SuitableType\n    data class Channel(val channelId: String) : SuitableType\n    data object Other : SuitableType\n\n    companion object\n}\n\nfun Pageable.suitableType(): SuitableType {\n    return when(this) {\n        is Pageable.ChannelTimeline -> {\n            SuitableType.Channel(this.channelId)\n        }\n        is Pageable.Gallery -> {\n            SuitableType.Gallery\n        }\n        else -> SuitableType.Other\n    }\n}\n\n\n@HiltViewModel\nclass CurrentPageableTimelineViewModel @Inject constructor(\n\n) : ViewModel() {\n\n    private val _currentType = MutableStateFlow<CurrentPageType>(\n        CurrentPageType.Page(null, Pageable.HomeTimeline(), null))\n\n    val currentType: StateFlow<CurrentPageType> = _currentType\n\n\n    private val _currentAccountId = MutableStateFlow<Long?>(null)\n    val currentAccountId = _currentAccountId.asStateFlow()\n\n    fun setCurrentPageable(accountId: Long?, pageable: Pageable, pageId: Long? = null,) {\n        _currentType.value = CurrentPageType.Page(accountId, pageable, pageId)\n    }\n\n    fun setCurrentPageType(type: CurrentPageType) {\n        _currentType.value = type\n    }\n\n}\n\nsealed interface CurrentPageType {\n    data class Page(val accountId: Long?, val pageable: Pageable, val pageId: Long?) : CurrentPageType\n    data object Account : CurrentPageType\n}"
  },
  {
    "path": "modules/common_viewmodel/src/main/java/net/pantasystem/milktea/common_viewmodel/ScrollToTopViewModel.kt",
    "content": "package net.pantasystem.milktea.common_viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ScrollToTopViewModel @Inject constructor() : ViewModel() {\n\n    private val _scrollToTopEvent = MutableSharedFlow<Unit>(extraBufferCapacity = 10, replay = 0)\n    val scrollToTopEvent = _scrollToTopEvent.asSharedFlow()\n\n    fun scrollToTop() {\n        _scrollToTopEvent.tryEmit(Unit)\n    }\n}"
  },
  {
    "path": "modules/common_viewmodel/src/main/java/net/pantasystem/milktea/common_viewmodel/UserViewData.kt",
    "content": "package net.pantasystem.milktea.common_viewmodel\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\nclass UserViewData private constructor(\n    val userId: User.Id?,\n    val userName: String? = null,\n    val host: String? = null,\n    val accountId: Long,\n    val userDataSource: UserDataSource,\n    val userRepository: UserRepository,\n    val accountRepository: AccountRepository,\n    val logger: Logger,\n    coroutineScope: CoroutineScope,\n    dispatcher: CoroutineDispatcher = Dispatchers.IO\n) {\n\n    @Singleton\n    class Factory @Inject constructor(\n        val userRepository: UserRepository,\n        val userDataSource: UserDataSource,\n        val accountRepository: AccountRepository,\n        val logger: Logger.Factory,\n        @IODispatcher val defaultDispatcher: CoroutineDispatcher,\n    ) {\n\n\n        private val l = logger.create(\"UserViewData\")\n\n        fun create(\n            userId: User.Id,\n            coroutineScope: CoroutineScope,\n            dispatcher: CoroutineDispatcher = defaultDispatcher\n        ): UserViewData {\n            return UserViewData(\n                userId,\n                userDataSource,\n                userRepository,\n                accountRepository,\n                l,\n                coroutineScope,\n                dispatcher,\n            )\n\n        }\n\n        fun create(\n            userName: String,\n            host: String?,\n            accountId: Long,\n            coroutineScope: CoroutineScope,\n            dispatcher: CoroutineDispatcher = defaultDispatcher\n        ): UserViewData {\n            return UserViewData(\n                userName,\n                host,\n                accountId,\n                userDataSource,\n                userRepository,\n                accountRepository,\n                l,\n                coroutineScope,\n                dispatcher\n            )\n        }\n\n        fun create(\n            user: User,\n            coroutineScope: CoroutineScope,\n            dispatcher: CoroutineDispatcher = defaultDispatcher\n        ): UserViewData {\n            return UserViewData(\n                user,\n                userDataSource,\n                userRepository,\n                accountRepository,\n                l,\n                coroutineScope,\n                dispatcher,\n            )\n        }\n    }\n\n\n    val user: StateFlow<User.Detail?> = if (userId != null) {\n        userRepository.observe(userId)\n    } else {\n        require(userName != null)\n        userRepository.observe(userName = userName, host = host, accountId = accountId)\n    }.filterNotNull().map {\n        it as? User.Detail\n    }.stateIn(\n        coroutineScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null,\n    )\n\n    val account: StateFlow<Account?> = suspend {\n        accountRepository.get(accountId).getOrNull()\n    }.asFlow().stateIn(\n        coroutineScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null,\n    )\n\n    private constructor(\n        user: User,\n        userDataSource: UserDataSource,\n        userRepository: UserRepository,\n        accountRepository: AccountRepository,\n        logger: Logger,\n        coroutineScope: CoroutineScope,\n        dispatcher: CoroutineDispatcher = Dispatchers.IO,\n    ) : this(\n        user.id,\n        userDataSource,\n        userRepository,\n        accountRepository,\n        logger,\n        coroutineScope = coroutineScope,\n        dispatcher = dispatcher\n    )\n\n    private constructor(\n        userName: String,\n        host: String?,\n        accountId: Long,\n        userDataSource: UserDataSource,\n        userRepository: UserRepository,\n        accountRepository: AccountRepository,\n        logger: Logger,\n        coroutineScope: CoroutineScope,\n        dispatcher: CoroutineDispatcher = Dispatchers.IO\n    ) : this(\n        null,\n        userName,\n        host,\n        accountId,\n        userDataSource,\n        userRepository,\n        accountRepository = accountRepository,\n        logger,\n        coroutineScope,\n        dispatcher\n    )\n\n    private constructor(\n        userId: User.Id,\n        userDataSource: UserDataSource,\n        userRepository: UserRepository,\n        accountRepository: AccountRepository,\n        logger: Logger,\n        coroutineScope: CoroutineScope,\n        dispatcher: CoroutineDispatcher = Dispatchers.IO\n    ) : this(\n        userId,\n        null,\n        null,\n        userId.accountId,\n        userDataSource,\n        userRepository,\n        accountRepository = accountRepository,\n        logger,\n        coroutineScope,\n        dispatcher\n    )\n\n    init {\n\n\n        coroutineScope.launch(dispatcher) {\n            initLoad()\n        }\n\n    }\n\n    private suspend fun initLoad() {\n\n        if (user.value == null) {\n            runCancellableCatching {\n                if (userId == null) {\n                    require(userName != null)\n                    userRepository.findByUserName(accountId, userName, host)\n                } else {\n                    userRepository.find(userId, true)\n                }\n            }.onFailure {\n                logger.debug(e = it) { \"取得エラー\" }\n            }.getOrNull()\n\n        }\n    }\n\n}\n"
  },
  {
    "path": "modules/data/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/data/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias libs.plugins.kotlin.serialization.plugin\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n\n        javaCompileOptions {\n            annotationProcessorOptions {\n                arguments += [\"room.schemaLocation\": \"$projectDir/schemas\".toString()]\n            }\n        }\n\n        sourceSets {\n            debug.assets.srcDirs += files(\"$projectDir/schemas\".toString())\n        }\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n        unitTests.includeAndroidResources = true\n    }\n    namespace 'net.pantasystem.milktea.data'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:api_streaming')\n    implementation project(path: ':modules:common_android')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n\n    implementation libs.room.runtime\n    kapt libs.room.compiler\n\n    // optional - Kotlin Extensions and Coroutines support for Room\n    implementation libs.room.ktx\n\n    // optional - Test helpers\n    testImplementation libs.room.testing\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n\n    // For instrumentation tests\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n\n    // For local unit tests\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n    implementation libs.kotlin.datetime\n\n    implementation libs.retrofit\n    implementation libs.retrofit.serialization.converter\n\n    implementation libs.kotlin.serialization\n\n    //Kotlin coroutines用ライブラリ(async, await)\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n    androidTestImplementation libs.coroutines.test\n\n    implementation libs.okhttp3.logging.inspector\n\n\n    implementation \"androidx.datastore:datastore-preferences:1.0.0\"\n    testImplementation libs.kotlin.reflect\n\n    implementation platform(libs.firebase.bom)\n    implementation 'com.google.firebase:firebase-messaging'\n    implementation 'com.google.android.gms:play-services-base'\n    testImplementation \"org.mockito.kotlin:mockito-kotlin:4.1.0\"\n\n    androidTestImplementation libs.room.testing\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n    implementation \"androidx.exifinterface:exifinterface:1.3.6\"\n\n    testImplementation libs.robolectric\n\n    implementation 'com.caverock:androidsvg-aar:1.4'\n\n}\n\nkapt {\n    correctErrorTypes true\n}"
  },
  {
    "path": "modules/data/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/data/objectbox-models/default.json",
    "content": "{\n  \"_note1\": \"KEEP THIS FILE! Check it into a version control system (VCS) like git.\",\n  \"_note2\": \"ObjectBox manages crucial IDs for your object model. See docs for details.\",\n  \"_note3\": \"If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.\",\n  \"entities\": [\n    {\n      \"id\": \"5:192241672526547352\",\n      \"lastPropertyId\": \"6:1197102331106729580\",\n      \"name\": \"ImageCacheRecord\",\n      \"properties\": [\n        {\n          \"id\": \"1:6002315150189198372\",\n          \"name\": \"id\",\n          \"type\": 6,\n          \"flags\": 1\n        },\n        {\n          \"id\": \"2:7274049216628202631\",\n          \"name\": \"sourceUrl\",\n          \"indexId\": \"10:5291013203713667470\",\n          \"type\": 9,\n          \"flags\": 2080\n        },\n        {\n          \"id\": \"3:3858052356230995928\",\n          \"name\": \"cachePath\",\n          \"type\": 9\n        },\n        {\n          \"id\": \"4:2544401018528846153\",\n          \"name\": \"cachedAt\",\n          \"type\": 6\n        },\n        {\n          \"id\": \"5:1403113483980738635\",\n          \"name\": \"width\",\n          \"type\": 5\n        },\n        {\n          \"id\": \"6:1197102331106729580\",\n          \"name\": \"height\",\n          \"type\": 5\n        }\n      ],\n      \"relations\": []\n    }\n  ],\n  \"lastEntityId\": \"6:5418605338436881136\",\n  \"lastIndexId\": \"12:6383965324106330542\",\n  \"lastRelationId\": \"2:5971800600708341253\",\n  \"lastSequenceId\": \"0:0\",\n  \"modelVersion\": 5,\n  \"modelVersionParserMinimum\": 5,\n  \"retiredEntityUids\": [\n    5418605338436881136,\n    2221534449032746185,\n    4355718382021751829,\n    1672123969377209864,\n    5892387857597582401\n  ],\n  \"retiredIndexUids\": [\n    3813410665521821846,\n    6383965324106330542,\n    7310482946990627063,\n    1359784589476878204,\n    9028601148259908010,\n    7288350540838608646,\n    873220635513493863,\n    6489830746707304657,\n    7445768282858324655,\n    2235427975397612884,\n    4038966684149214552\n  ],\n  \"retiredPropertyUids\": [\n    271785103207869909,\n    6655539627519293459,\n    211101382978291231,\n    7927231724161011575,\n    2060901050158269776,\n    1468865394375722898,\n    3770123434781396120,\n    8187355251103755613,\n    4598656151033408118,\n    6898596592219565017,\n    2473069054411856439,\n    2251620119095233921,\n    3861751215772392457,\n    8272452730188899909,\n    9063671629732813236,\n    7535868506911901175,\n    6442096145905059295,\n    7710661194467523389,\n    7628905268626047068,\n    642718946565483033,\n    7875342824717901704,\n    2696126269908017727,\n    7671147018644324486,\n    5925666535923240248,\n    7278439925725375992,\n    847812078561538164,\n    8110512460338708921,\n    4694592880431104676,\n    1186483322771015101,\n    2024059859948210103,\n    7037620531362936612,\n    2236394410735542656,\n    3729529343763408216,\n    6036481626668798700,\n    7174160995211405661,\n    6211678249736176180,\n    6669217353719482404,\n    3948737789517340243,\n    793339216143089151,\n    6452623503349626204,\n    4083832487305389369,\n    9093239415547628997,\n    3324579080801649916,\n    3063499869455528735,\n    9105231982798534371,\n    4399131295653378622,\n    7536084876962986464,\n    4389185113146110546,\n    8245146144562689363,\n    4295513395759066524,\n    2078366836220201658,\n    4906798512586853797,\n    6815318346139013870,\n    5034900393433514094,\n    2432945643631783084,\n    8599957524389440622,\n    918472720106521826,\n    4691087268272065354,\n    6038607075476419692,\n    8695980387794841290,\n    8716505910147340998,\n    603475478183588601,\n    4252978610725343033,\n    1047146758580551890,\n    3207491205296200689,\n    5101199550893785799,\n    1696546822899785376,\n    68607803971520561,\n    676934433640553584,\n    8038701529227730420,\n    2163943456333549192,\n    2143810341282238420,\n    1292188942965914799,\n    7634221281760726222,\n    27795029384995044,\n    6142530143329153194,\n    5250934048025398662\n  ],\n  \"retiredRelationUids\": [\n    5368363319508289421,\n    5971800600708341253\n  ],\n  \"version\": 1\n}"
  },
  {
    "path": "modules/data/objectbox-models/default.json.bak",
    "content": "{\n  \"_note1\": \"KEEP THIS FILE! Check it into a version control system (VCS) like git.\",\n  \"_note2\": \"ObjectBox manages crucial IDs for your object model. See docs for details.\",\n  \"_note3\": \"If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.\",\n  \"entities\": [\n    {\n      \"id\": \"4:5892387857597582401\",\n      \"lastPropertyId\": \"3:5250934048025398662\",\n      \"name\": \"CustomEmojiAspectRatioRecord\",\n      \"properties\": [\n        {\n          \"id\": \"1:27795029384995044\",\n          \"name\": \"id\",\n          \"type\": 6,\n          \"flags\": 1\n        },\n        {\n          \"id\": \"2:6142530143329153194\",\n          \"name\": \"uri\",\n          \"indexId\": \"9:4038966684149214552\",\n          \"type\": 9,\n          \"flags\": 2080\n        },\n        {\n          \"id\": \"3:5250934048025398662\",\n          \"name\": \"aspectRatio\",\n          \"type\": 7\n        }\n      ],\n      \"relations\": []\n    },\n    {\n      \"id\": \"5:192241672526547352\",\n      \"lastPropertyId\": \"6:1197102331106729580\",\n      \"name\": \"ImageCacheRecord\",\n      \"properties\": [\n        {\n          \"id\": \"1:6002315150189198372\",\n          \"name\": \"id\",\n          \"type\": 6,\n          \"flags\": 1\n        },\n        {\n          \"id\": \"2:7274049216628202631\",\n          \"name\": \"sourceUrl\",\n          \"indexId\": \"10:5291013203713667470\",\n          \"type\": 9,\n          \"flags\": 2080\n        },\n        {\n          \"id\": \"3:3858052356230995928\",\n          \"name\": \"cachePath\",\n          \"type\": 9\n        },\n        {\n          \"id\": \"4:2544401018528846153\",\n          \"name\": \"cachedAt\",\n          \"type\": 6\n        },\n        {\n          \"id\": \"5:1403113483980738635\",\n          \"name\": \"width\",\n          \"type\": 5\n        },\n        {\n          \"id\": \"6:1197102331106729580\",\n          \"name\": \"height\",\n          \"type\": 5\n        }\n      ],\n      \"relations\": []\n    }\n  ],\n  \"lastEntityId\": \"6:5418605338436881136\",\n  \"lastIndexId\": \"12:6383965324106330542\",\n  \"lastRelationId\": \"2:5971800600708341253\",\n  \"lastSequenceId\": \"0:0\",\n  \"modelVersion\": 5,\n  \"modelVersionParserMinimum\": 5,\n  \"retiredEntityUids\": [\n    5418605338436881136,\n    2221534449032746185,\n    4355718382021751829,\n    1672123969377209864\n  ],\n  \"retiredIndexUids\": [\n    3813410665521821846,\n    6383965324106330542,\n    7310482946990627063,\n    1359784589476878204,\n    9028601148259908010,\n    7288350540838608646,\n    873220635513493863,\n    6489830746707304657,\n    7445768282858324655,\n    2235427975397612884\n  ],\n  \"retiredPropertyUids\": [\n    271785103207869909,\n    6655539627519293459,\n    211101382978291231,\n    7927231724161011575,\n    2060901050158269776,\n    1468865394375722898,\n    3770123434781396120,\n    8187355251103755613,\n    4598656151033408118,\n    6898596592219565017,\n    2473069054411856439,\n    2251620119095233921,\n    3861751215772392457,\n    8272452730188899909,\n    9063671629732813236,\n    7535868506911901175,\n    6442096145905059295,\n    7710661194467523389,\n    7628905268626047068,\n    642718946565483033,\n    7875342824717901704,\n    2696126269908017727,\n    7671147018644324486,\n    5925666535923240248,\n    7278439925725375992,\n    847812078561538164,\n    8110512460338708921,\n    4694592880431104676,\n    1186483322771015101,\n    2024059859948210103,\n    7037620531362936612,\n    2236394410735542656,\n    3729529343763408216,\n    6036481626668798700,\n    7174160995211405661,\n    6211678249736176180,\n    6669217353719482404,\n    3948737789517340243,\n    793339216143089151,\n    6452623503349626204,\n    4083832487305389369,\n    9093239415547628997,\n    3324579080801649916,\n    3063499869455528735,\n    9105231982798534371,\n    4399131295653378622,\n    7536084876962986464,\n    4389185113146110546,\n    8245146144562689363,\n    4295513395759066524,\n    2078366836220201658,\n    4906798512586853797,\n    6815318346139013870,\n    5034900393433514094,\n    2432945643631783084,\n    8599957524389440622,\n    918472720106521826,\n    4691087268272065354,\n    6038607075476419692,\n    8695980387794841290,\n    8716505910147340998,\n    603475478183588601,\n    4252978610725343033,\n    1047146758580551890,\n    3207491205296200689,\n    5101199550893785799,\n    1696546822899785376,\n    68607803971520561,\n    676934433640553584,\n    8038701529227730420,\n    2163943456333549192,\n    2143810341282238420,\n    1292188942965914799,\n    7634221281760726222\n  ],\n  \"retiredRelationUids\": [\n    5368363319508289421,\n    5971800600708341253\n  ],\n  \"version\": 1\n}"
  },
  {
    "path": "modules/data/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/10.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 10,\n    \"identityHash\": \"e57ecde54b614792af12c09f03436dc1\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e57ecde54b614792af12c09f03436dc1')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/11.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 11,\n    \"identityHash\": \"c50ce2972f355ed260b3b30b300c8a9f\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c50ce2972f355ed260b3b30b300c8a9f')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/12.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 12,\n    \"identityHash\": \"d16f596614a6ec0c5703e7719b14256b\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd16f596614a6ec0c5703e7719b14256b')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/13.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 13,\n    \"identityHash\": \"9ee584917bd43848e691b5008beefce1\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ee584917bd43848e691b5008beefce1')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/14.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 14,\n    \"identityHash\": \"76e3ccefc59d715d7ea42ab26def4317\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '76e3ccefc59d715d7ea42ab26def4317')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/15.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 15,\n    \"identityHash\": \"eba8a0a8f11a1b1077c56f885ea7a911\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'eba8a0a8f11a1b1077c56f885ea7a911')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/16.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 16,\n    \"identityHash\": \"339e5af4007d54dddc9c03e43bd72233\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '339e5af4007d54dddc9c03e43bd72233')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/17.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 17,\n    \"identityHash\": \"3325efacd694a3ff9bd29ed29a34e937\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3325efacd694a3ff9bd29ed29a34e937')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/18.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 18,\n    \"identityHash\": \"10247d0cbcb12ef1c88179cb9739cabe\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '10247d0cbcb12ef1c88179cb9739cabe')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/19.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 19,\n    \"identityHash\": \"7b9e9101227a6e2d24d277013269c6ff\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7b9e9101227a6e2d24d277013269c6ff')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/20.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 20,\n    \"identityHash\": \"c2cb7cf803d76456f90d9f986adab9a9\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and g.serverId = u.serverId\\n                and g.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c2cb7cf803d76456f90d9f986adab9a9')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/21.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 21,\n    \"identityHash\": \"5f6ad3374f6ad750f6930510ef25a24b\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5f6ad3374f6ad750f6930510ef25a24b')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/22.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 22,\n    \"identityHash\": \"277e44723430ad95bb5a669929519446\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '277e44723430ad95bb5a669929519446')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/23.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 23,\n    \"identityHash\": \"bdfa8adde6567720a1c53f6f0dfe4a43\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'bdfa8adde6567720a1c53f6f0dfe4a43')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/24.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 24,\n    \"identityHash\": \"0bdc3d0d1d4bb924d433f3c0ae7813c0\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0bdc3d0d1d4bb924d433f3c0ae7813c0')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/25.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 25,\n    \"identityHash\": \"d19f81d5ed2edb0da2e45848f87f5313\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd19f81d5ed2edb0da2e45848f87f5313')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/26.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 26,\n    \"identityHash\": \"1b949b165bb3e310a17fdb40cb1b0fa0\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1b949b165bb3e310a17fdb40cb1b0fa0')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/27.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 27,\n    \"identityHash\": \"29f3357f07a623da1430ae9226728e13\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '29f3357f07a623da1430ae9226728e13')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/28.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 28,\n    \"identityHash\": \"ce707c47e8ce8ec2b1ec3034427f9377\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ce707c47e8ce8ec2b1ec3034427f9377')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/29.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 29,\n    \"identityHash\": \"148981c4bdbaa928c77f2e8fb69867aa\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '148981c4bdbaa928c77f2e8fb69867aa')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/3.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"786087deeceb0d1e04244116153de219\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '786087deeceb0d1e04244116153de219')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/30.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 30,\n    \"identityHash\": \"503d63cfab88a415cb200cf8184a8f46\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '503d63cfab88a415cb200cf8184a8f46')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/31.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 31,\n    \"identityHash\": \"308baa7b787a2a999b7bc04a8a0afb0c\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT NOT NULL, `size` INTEGER NOT NULL, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '308baa7b787a2a999b7bc04a8a0afb0c')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/32.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 32,\n    \"identityHash\": \"5b4a2646720cb7d2251a1baf434e4fef\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5b4a2646720cb7d2251a1baf434e4fef')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/33.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 33,\n    \"identityHash\": \"0f17c5371f3a74b4ba22717fd22a1818\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0f17c5371f3a74b4ba22717fd22a1818')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/34.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 34,\n    \"identityHash\": \"7d3cd25c06bfe956bad9179136b8362a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"host\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7d3cd25c06bfe956bad9179136b8362a')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/35.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 35,\n    \"identityHash\": \"0c7771abbc26a3ea7e00737d0341e97f\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"host\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0c7771abbc26a3ea7e00737d0341e97f')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/36.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 36,\n    \"identityHash\": \"4edfa8c0d684b64cba8f7dc9b5115a6d\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"host\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4edfa8c0d684b64cba8f7dc9b5115a6d')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/37.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 37,\n    \"identityHash\": \"701da4a026db9e7478784c6b6ba06f65\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"host\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '701da4a026db9e7478784c6b6ba06f65')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/38.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 38,\n    \"identityHash\": \"1e56a0e0bba8c9e8decb904f1c9e5d6b\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"host\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1e56a0e0bba8c9e8decb904f1c9e5d6b')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/39.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 39,\n    \"identityHash\": \"ab39c8595bffbe637337336df688af68\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"codes\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"localFileId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"parentId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"host\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ab39c8595bffbe637337336df688af68')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/4.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 4,\n    \"identityHash\": \"522c0549c443474673b33153ce928a8c\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '522c0549c443474673b33153ce928a8c')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/40.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 40,\n    \"identityHash\": \"b3f47813d696aa7582918a84acb4a3be\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b3f47813d696aa7582918a84acb4a3be')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/41.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 41,\n    \"identityHash\": \"9fd59d9bf6d5d14266142a4494c611d3\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9fd59d9bf6d5d14266142a4494c611d3')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/42.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 42,\n    \"identityHash\": \"81d289dc1714f5ef5d109132333e0879\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '81d289dc1714f5ef5d109132333e0879')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/43.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 43,\n    \"identityHash\": \"21f0db5a7bb49faa8495d52024dc4daf\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '21f0db5a7bb49faa8495d52024dc4daf')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/44.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 44,\n    \"identityHash\": \"8a4611b8efe95f3974bd13cef6b9205c\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '8a4611b8efe95f3974bd13cef6b9205c')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/45.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 45,\n    \"identityHash\": \"6422cba92843d6010b114ced1b08f79c\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6422cba92843d6010b114ced1b08f79c')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/46.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 46,\n    \"identityHash\": \"f18c4b30fd0c11030b4bf1914d5a046f\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f18c4b30fd0c11030b4bf1914d5a046f')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/47.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 47,\n    \"identityHash\": \"74b428945f0dd11983704517d6b662a3\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '74b428945f0dd11983704517d6b662a3')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/48.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 48,\n    \"identityHash\": \"eeb4c81798aaf018955eae65753e8534\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'eeb4c81798aaf018955eae65753e8534')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/49.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 49,\n    \"identityHash\": \"7c3ef2be31e3b6dce800a3325846e63d\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7c3ef2be31e3b6dce800a3325846e63d')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/5.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 5,\n    \"identityHash\": \"4d4ea06174551643c866184ef5de6130\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4d4ea06174551643c866184ef5de6130')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/50.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 50,\n    \"identityHash\": \"a2591430f2ca52a5faaa5206a4b39248\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a2591430f2ca52a5faaa5206a4b39248')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/51.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 51,\n    \"identityHash\": \"38285c644724533e33d923ffca494b89\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_alias_table_name_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_alias_table_name_instanceDomain` ON `${TABLE_NAME}` (`name`, `instanceDomain`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"utf8_emojis_by_amio\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`codes` TEXT NOT NULL, `name` TEXT NOT NULL, `char` TEXT NOT NULL, PRIMARY KEY(`codes`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"codes\",\n            \"columnName\": \"codes\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"charCode\",\n            \"columnName\": \"char\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"codes\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT, `name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_category\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"category\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_category` ON `${TABLE_NAME}` (`category`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`emojiId` INTEGER NOT NULL, `value` TEXT NOT NULL, PRIMARY KEY(`emojiId`, `value`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"emojiId\",\n            \"value\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId_value\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\",\n              \"value\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId_value` ON `${TABLE_NAME}` (`emojiId`, `value`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '38285c644724533e33d923ffca494b89')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/52.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 52,\n    \"identityHash\": \"4067d1a6c3c8bb58436d0d38abd5b487\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4067d1a6c3c8bb58436d0d38abd5b487')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/53.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 53,\n    \"identityHash\": \"2c2d13d17a2b2cc04c9b8deff54f9857\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '2c2d13d17a2b2cc04c9b8deff54f9857')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/54.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 54,\n    \"identityHash\": \"38acced0ecc597053a7967cce77dbe32\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '38acced0ecc597053a7967cce77dbe32')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/55.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 55,\n    \"identityHash\": \"baa61fa997debbbe9bf5d913c887e543\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'baa61fa997debbbe9bf5d913c887e543')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/56.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 56,\n    \"identityHash\": \"f4cc2e9213b8df1e283b59fd55a767dc\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f4cc2e9213b8df1e283b59fd55a767dc')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/57.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 57,\n    \"identityHash\": \"6bc52f86926e31554516c59ecfec39a9\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6bc52f86926e31554516c59ecfec39a9')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/58.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 58,\n    \"identityHash\": \"abeea00a832ef048d99e46fb3c1751c6\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'abeea00a832ef048d99e46fb3c1751c6')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/59.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 59,\n    \"identityHash\": \"9257b02f1c5fb08f3a6b602d66676be8\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9257b02f1c5fb08f3a6b602d66676be8')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/6.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 6,\n    \"identityHash\": \"f0b44b577de14e836e23b7ff464647a6\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f0b44b577de14e836e23b7ff464647a6')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/60.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 60,\n    \"identityHash\": \"018762f336cb3e1696371fe22872ba42\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '018762f336cb3e1696371fe22872ba42')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/61.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 61,\n    \"identityHash\": \"2cf44093d19beb1dea2945ae48c1e9d8\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '2cf44093d19beb1dea2945ae48c1e9d8')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/62.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 62,\n    \"identityHash\": \"6d207269b64590aae2f380c7e0af6aa2\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '6d207269b64590aae2f380c7e0af6aa2')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/63.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 63,\n    \"identityHash\": \"f5380cc57a9b9f030c5432ff34ac7627\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f5380cc57a9b9f030c5432ff34ac7627')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/64.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 64,\n    \"identityHash\": \"5f90e8bbb683a28ad35fc18907b1ff33\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5f90e8bbb683a28ad35fc18907b1ff33')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/65.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 65,\n    \"identityHash\": \"b7f8ea6db030c8769167c7c7a212a583\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b7f8ea6db030c8769167c7c7a212a583')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/66.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 66,\n    \"identityHash\": \"52ae61f69ffa68ea06fe92b9b1712a45\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '52ae61f69ffa68ea06fe92b9b1712a45')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/67.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 67,\n    \"identityHash\": \"9761e36bce4989a699f15dffb8d2fec5\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9761e36bce4989a699f15dffb8d2fec5')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/68.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 68,\n    \"identityHash\": \"ef0e10f9ecc03533074acc3cafd79524\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timelines\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_excluded_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_included_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'ef0e10f9ecc03533074acc3cafd79524')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/69.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 69,\n    \"identityHash\": \"bc85fd9bdc79205b1dee631f33086065\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timelines\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_excluded_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_included_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_items\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `cachedAt` INTEGER NOT NULL, PRIMARY KEY(`timelineId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cachedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_timeline_items_timelineId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"timelineId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_timeline_items_timelineId` ON `${TABLE_NAME}` (`timelineId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'bc85fd9bdc79205b1dee631f33086065')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/7.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 7,\n    \"identityHash\": \"75b46cd180746b997e83291bf1013d1a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '75b46cd180746b997e83291bf1013d1a')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/70.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 70,\n    \"identityHash\": \"a6e0c40d84857619ffe8a1cdb44edf67\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timelines\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_excluded_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_included_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_items\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `cachedAt` INTEGER NOT NULL, PRIMARY KEY(`timelineId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cachedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_timeline_items_timelineId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"timelineId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_timeline_items_timelineId` ON `${TABLE_NAME}` (`timelineId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"follow_request_accepted_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a6e0c40d84857619ffe8a1cdb44edf67')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/71.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 71,\n    \"identityHash\": \"9d1d9542d4676a6971412a139c1e16b9\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timelines\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_excluded_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_included_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_items\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `cachedAt` INTEGER NOT NULL, PRIMARY KEY(`timelineId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cachedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_timeline_items_timelineId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"timelineId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_timeline_items_timelineId` ON `${TABLE_NAME}` (`timelineId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"follow_request_accepted_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_authors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `reaction` TEXT, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_authors_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction_author_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`reaction_author_id`, `user_id`), FOREIGN KEY(`reaction_author_id`) REFERENCES `reaction_authors`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reactionAuthorId\",\n            \"columnName\": \"reaction_author_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction_author_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id_user_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\",\n              \"user_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id_user_id` ON `${TABLE_NAME}` (`reaction_author_id`, `user_id`)\"\n          },\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id` ON `${TABLE_NAME}` (`reaction_author_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"reaction_authors\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reaction_author_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9d1d9542d4676a6971412a139c1e16b9')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/72.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 72,\n    \"identityHash\": \"7e250f54824e1407cb043c0d2e762b09\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timelines\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_excluded_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_included_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_items\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `cachedAt` INTEGER NOT NULL, PRIMARY KEY(`timelineId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cachedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_timeline_items_timelineId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"timelineId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_timeline_items_timelineId` ON `${TABLE_NAME}` (`timelineId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"follow_request_accepted_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_authors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `reaction` TEXT, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_authors_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction_author_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`reaction_author_id`, `user_id`), FOREIGN KEY(`reaction_author_id`) REFERENCES `reaction_authors`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reactionAuthorId\",\n            \"columnName\": \"reaction_author_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction_author_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id_user_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\",\n              \"user_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id_user_id` ON `${TABLE_NAME}` (`reaction_author_id`, `user_id`)\"\n          },\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id` ON `${TABLE_NAME}` (`reaction_author_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"reaction_authors\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reaction_author_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emoji_aspects\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `aspect_ratio` REAL NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7e250f54824e1407cb043c0d2e762b09')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/73.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 73,\n    \"identityHash\": \"88a9400e4ded90d995fe9d03585f39bc\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timelines\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_excluded_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_included_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_items\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `cachedAt` INTEGER NOT NULL, PRIMARY KEY(`timelineId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cachedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_timeline_items_timelineId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"timelineId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_timeline_items_timelineId` ON `${TABLE_NAME}` (`timelineId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"follow_request_accepted_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_authors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `reaction` TEXT, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_authors_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction_author_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`reaction_author_id`, `user_id`), FOREIGN KEY(`reaction_author_id`) REFERENCES `reaction_authors`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reactionAuthorId\",\n            \"columnName\": \"reaction_author_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction_author_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id_user_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\",\n              \"user_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id_user_id` ON `${TABLE_NAME}` (`reaction_author_id`, `user_id`)\"\n          },\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id` ON `${TABLE_NAME}` (`reaction_author_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"reaction_authors\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reaction_author_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emoji_aspects\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `aspect_ratio` REAL NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"image_caches\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`source_url` TEXT NOT NULL, `cache_path` TEXT NOT NULL, `cached_at` INTEGER NOT NULL, `width` INTEGER, `height` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"sourceUrl\",\n            \"columnName\": \"source_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cached_at\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"width\",\n            \"columnName\": \"width\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"height\",\n            \"columnName\": \"height\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_image_caches_source_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"source_url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_image_caches_source_url` ON `${TABLE_NAME}` (`source_url`)\"\n          },\n          {\n            \"name\": \"index_image_caches_cached_at\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"cached_at\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_image_caches_cached_at` ON `${TABLE_NAME}` (`cached_at`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '88a9400e4ded90d995fe9d03585f39bc')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/74.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 74,\n    \"identityHash\": \"4243a87bc3e95ac10be2d99cd6903f4c\",\n    \"entities\": [\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `accountId` INTEGER, `target_post_id` TEXT, `target_user_id` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetPostId\",\n            \"columnName\": \"target_post_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"targetUserId\",\n            \"columnName\": \"target_user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `scheduleWillPostAt` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `isSensitive` INTEGER, `reactionAcceptanceType` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"scheduleWillPostAt\",\n            \"columnName\": \"scheduleWillPostAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reactionAcceptanceType\",\n            \"columnName\": \"reactionAcceptanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"draft_note_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, `createdAt` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"url\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `isSavePagePosition` INTEGER, `attachedAccountId` INTEGER, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT, `clipId` TEXT, `excludeReplies` INTEGER, `excludeReposts` INTEGER, `excludeIfExistsSensitiveMedia` INTEGER)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSavePagePosition\",\n            \"columnName\": \"isSavePagePosition\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"attachedAccountId\",\n            \"columnName\": \"attachedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.clipId\",\n            \"columnName\": \"clipId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReplies\",\n            \"columnName\": \"excludeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeReposts\",\n            \"columnName\": \"excludeReposts\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeIfExistsSensitiveMedia\",\n            \"columnName\": \"excludeIfExistsSensitiveMedia\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"pageId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"drive_file_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `relatedAccountId` INTEGER NOT NULL, `createdAt` TEXT, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `md5` TEXT, `size` INTEGER, `url` TEXT NOT NULL, `isSensitive` INTEGER NOT NULL, `thumbnailUrl` TEXT, `folderId` TEXT, `userId` TEXT, `comment` TEXT, `blurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`relatedAccountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"relatedAccountId\",\n            \"columnName\": \"relatedAccountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"md5\",\n            \"columnName\": \"md5\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"size\",\n            \"columnName\": \"size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"isSensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folderId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"blurhash\",\n            \"columnName\": \"blurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_drive_file_v1_serverId_relatedAccountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_drive_file_v1_serverId_relatedAccountId` ON `${TABLE_NAME}` (`serverId`, `relatedAccountId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_drive_file_v1_relatedAccountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"relatedAccountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_drive_file_v1_relatedAccountId` ON `${TABLE_NAME}` (`relatedAccountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"relatedAccountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draftNoteId` INTEGER NOT NULL, `filePropertyId` INTEGER, `localFileId` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`filePropertyId`) REFERENCES `drive_file_v1`(`id`) ON UPDATE NO ACTION ON DELETE SET NULL , FOREIGN KEY(`localFileId`) REFERENCES `draft_local_file_v2_table`(`localFileId`) ON UPDATE NO ACTION ON DELETE SET NULL )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draftNoteId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePropertyId\",\n            \"columnName\": \"filePropertyId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"draftNoteId\",\n              \"filePropertyId\",\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId_filePropertyId_localFileId` ON `${TABLE_NAME}` (`draftNoteId`, `filePropertyId`, `localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_draftNoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draftNoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_draftNoteId` ON `${TABLE_NAME}` (`draftNoteId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_localFileId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"localFileId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_localFileId` ON `${TABLE_NAME}` (`localFileId`)\"\n          },\n          {\n            \"name\": \"index_draft_file_v2_table_filePropertyId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"filePropertyId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_v2_table_filePropertyId` ON `${TABLE_NAME}` (`filePropertyId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"drive_file_v1\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"filePropertyId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          },\n          {\n            \"table\": \"draft_local_file_v2_table\",\n            \"onDelete\": \"SET NULL\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"localFileId\"\n            ],\n            \"referencedColumns\": [\n              \"localFileId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_local_file_v2_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `file_path` TEXT NOT NULL, `is_sensitive` INTEGER, `type` TEXT NOT NULL, `thumbnailUrl` TEXT, `folder_id` TEXT, `file_size` INTEGER, `comment` TEXT, `localFileId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileSize\",\n            \"columnName\": \"file_size\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"comment\",\n            \"columnName\": \"comment\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localFileId\",\n            \"columnName\": \"localFileId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"localFileId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"group_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `ownerId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ownerId\",\n            \"columnName\": \"ownerId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_v1_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_v1_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_group_v1_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_v1_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_member_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`groupId`) REFERENCES `group_v1`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"groupId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_group_member_v1_groupId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"groupId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_group_member_v1_groupId` ON `${TABLE_NAME}` (`groupId`)\"\n          },\n          {\n            \"name\": \"index_group_member_v1_groupId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"groupId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_group_member_v1_groupId_userId` ON `${TABLE_NAME}` (`groupId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"group_v1\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"groupId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `userName` TEXT NOT NULL, `name` TEXT, `avatarUrl` TEXT, `isCat` INTEGER, `isBot` INTEGER, `host` TEXT NOT NULL, `isSameHost` INTEGER NOT NULL, `avatarBlurhash` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"avatarUrl\",\n            \"columnName\": \"avatarUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isCat\",\n            \"columnName\": \"isCat\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isBot\",\n            \"columnName\": \"isBot\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isSameHost\",\n            \"columnName\": \"isSameHost\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"avatarBlurhash\",\n            \"columnName\": \"avatarBlurhash\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_serverId_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"serverId\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_serverId_accountId` ON `${TABLE_NAME}` (`serverId`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_user_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_userName` ON `${TABLE_NAME}` (`userName`)\"\n          },\n          {\n            \"name\": \"index_user_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_host\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_detailed_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_detailed_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_detailed_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_emoji\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `userId` INTEGER NOT NULL, `aspectRatio` REAL, `cachePath` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspectRatio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cachePath\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_emoji_name_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"name\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_emoji_name_userId` ON `${TABLE_NAME}` (`name`, `userId`)\"\n          },\n          {\n            \"name\": \"index_user_emoji_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_emoji_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pinned_note_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`noteId` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pinned_note_id_noteId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"noteId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_pinned_note_id_noteId_userId` ON `${TABLE_NAME}` (`noteId`, `userId`)\"\n          },\n          {\n            \"name\": \"index_pinned_note_id_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pinned_note_id_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`faviconUrl` TEXT, `iconUrl` TEXT, `name` TEXT, `softwareName` TEXT, `softwareVersion` TEXT, `themeColor` TEXT, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"faviconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"softwareName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"softwareVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_instance_info_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_instance_info_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_profile_field\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `value` TEXT NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"value\",\n            \"columnName\": \"value\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_profile_field_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_profile_field_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"word_filter_regex_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`pattern` TEXT NOT NULL, `parentId` INTEGER NOT NULL, PRIMARY KEY(`parentId`), FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"pattern\",\n            \"columnName\": \"pattern\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"parentId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_regex_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_regex_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"word_filter_word_condition\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `parentId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`parentId`) REFERENCES `word_filter_condition`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"word\",\n            \"columnName\": \"word\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"parentId\",\n            \"columnName\": \"parentId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_word_filter_word_condition_parentId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"parentId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_word_filter_word_condition_parentId` ON `${TABLE_NAME}` (`parentId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"word_filter_condition\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"parentId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`serverId` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `createdAt` TEXT NOT NULL, `name` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          },\n          {\n            \"name\": \"index_user_list_serverId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_serverId` ON `${TABLE_NAME}` (`serverId`)\"\n          },\n          {\n            \"name\": \"index_user_list_accountId_serverId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"accountId\",\n              \"serverId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_accountId_serverId` ON `${TABLE_NAME}` (`accountId`, `serverId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_list_member\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userListId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userListId`) REFERENCES `user_list`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userListId\",\n            \"columnName\": \"userListId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_list_member_userListId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userListId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_list_member_userListId` ON `${TABLE_NAME}` (`userListId`)\"\n          },\n          {\n            \"name\": \"index_user_list_member_userListId_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userListId\",\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_list_member_userListId_userId` ON `${TABLE_NAME}` (`userListId`, `userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user_list\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userListId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_info_v1_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `host` TEXT NOT NULL, `name` TEXT, `description` TEXT, `clientMaxBodyByteSize` INTEGER, `iconUrl` TEXT, `themeColor` TEXT, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"clientMaxBodyByteSize\",\n            \"columnName\": \"clientMaxBodyByteSize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"themeColor\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_instance_info_v1_table_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_instance_info_v1_table_host` ON `${TABLE_NAME}` (`host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"user_badge_role\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `iconUrl` TEXT, `displayOrder` INTEGER NOT NULL, `userId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"displayOrder\",\n            \"columnName\": \"displayOrder\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_badge_role_userId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_badge_role_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"search_histories\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `keyword` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"keyword\",\n            \"columnName\": \"keyword\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_search_histories_keyword_accountId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"keyword\",\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_search_histories_keyword_accountId` ON `${TABLE_NAME}` (`keyword`, `accountId`)\"\n          },\n          {\n            \"name\": \"index_search_histories_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_search_histories_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_info_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`description` TEXT, `followersCount` INTEGER, `followingCount` INTEGER, `hostLower` TEXT, `notesCount` INTEGER, `bannerUrl` TEXT, `url` TEXT, `isLocked` INTEGER NOT NULL, `birthday` TEXT, `createdAt` TEXT, `updatedAt` TEXT, `publicReactions` INTEGER, `userId` INTEGER NOT NULL, `ffVisibility` TEXT, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followersCount\",\n            \"columnName\": \"followersCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"followingCount\",\n            \"columnName\": \"followingCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hostLower\",\n            \"columnName\": \"hostLower\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notesCount\",\n            \"columnName\": \"notesCount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isLocked\",\n            \"columnName\": \"isLocked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"birthday\",\n            \"columnName\": \"birthday\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"publicReactions\",\n            \"columnName\": \"publicReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"ffVisibility\",\n            \"columnName\": \"ffVisibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_info_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_info_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_related_state\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`isFollowing` INTEGER NOT NULL, `isFollower` INTEGER NOT NULL, `isBlocking` INTEGER NOT NULL, `isMuting` INTEGER NOT NULL, `hasPendingFollowRequestFromYou` INTEGER NOT NULL, `hasPendingFollowRequestToYou` INTEGER NOT NULL, `isNotify` INTEGER, `userId` INTEGER NOT NULL, PRIMARY KEY(`userId`), FOREIGN KEY(`userId`) REFERENCES `user`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"isFollowing\",\n            \"columnName\": \"isFollowing\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isFollower\",\n            \"columnName\": \"isFollower\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isBlocking\",\n            \"columnName\": \"isBlocking\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isMuting\",\n            \"columnName\": \"isMuting\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestFromYou\",\n            \"columnName\": \"hasPendingFollowRequestFromYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"hasPendingFollowRequestToYou\",\n            \"columnName\": \"hasPendingFollowRequestToYou\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isNotify\",\n            \"columnName\": \"isNotify\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_related_state_userId\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"userId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_user_related_state_userId` ON `${TABLE_NAME}` (`userId`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"user\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"userId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nodeinfo\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`host` TEXT NOT NULL, `nodeInfoVersion` TEXT NOT NULL, `name` TEXT NOT NULL, `version` TEXT NOT NULL, PRIMARY KEY(`host`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"nodeInfoVersion\",\n            \"columnName\": \"nodeInfoVersion\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"host\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_info\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `email` TEXT NOT NULL, `version` TEXT NOT NULL, `urls_streamingApi` TEXT, `configuration_statuses_maxCharacters` INTEGER, `configuration_statuses_maxMediaAttachments` INTEGER, `configuration_polls_maxOptions` INTEGER, `configuration_polls_maxCharactersPerOption` INTEGER, `configuration_polls_minExpiration` INTEGER, `configuration_polls_maxExpiration` INTEGER, `configuration_emoji_reactions_myReactions` INTEGER, `configuration_emoji_reactions_maxReactionsPerAccount` INTEGER, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"email\",\n            \"columnName\": \"email\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"urls.streamingApi\",\n            \"columnName\": \"urls_streamingApi\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxCharacters\",\n            \"columnName\": \"configuration_statuses_maxCharacters\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.statuses.maxMediaAttachments\",\n            \"columnName\": \"configuration_statuses_maxMediaAttachments\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxOptions\",\n            \"columnName\": \"configuration_polls_maxOptions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxCharactersPerOption\",\n            \"columnName\": \"configuration_polls_maxCharactersPerOption\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.minExpiration\",\n            \"columnName\": \"configuration_polls_minExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.polls.maxExpiration\",\n            \"columnName\": \"configuration_polls_maxExpiration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactions\",\n            \"columnName\": \"configuration_emoji_reactions_myReactions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"configuration.emojiReactions.maxReactionsPerAccount\",\n            \"columnName\": \"configuration_emoji_reactions_maxReactionsPerAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_json_cache_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `json` TEXT NOT NULL, `key` TEXT, `weight` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"json\",\n            \"columnName\": \"json\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"key\",\n            \"columnName\": \"key\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_json_cache_v1_key\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"key\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_json_cache_v1_key` ON `${TABLE_NAME}` (`key`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_word_filters_v1\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `filterId` TEXT NOT NULL, `phrase` TEXT NOT NULL, `wholeWord` INTEGER NOT NULL, `expiresAt` TEXT, `irreversible` INTEGER NOT NULL, `isContextHome` INTEGER NOT NULL, `isContextNotifications` INTEGER NOT NULL, `isContextPublic` INTEGER NOT NULL, `isContextThread` INTEGER NOT NULL, `isContextAccount` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `filterId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"filterId\",\n            \"columnName\": \"filterId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"phrase\",\n            \"columnName\": \"phrase\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"wholeWord\",\n            \"columnName\": \"wholeWord\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"irreversible\",\n            \"columnName\": \"irreversible\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextHome\",\n            \"columnName\": \"isContextHome\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextNotifications\",\n            \"columnName\": \"isContextNotifications\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextPublic\",\n            \"columnName\": \"isContextPublic\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextThread\",\n            \"columnName\": \"isContextThread\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isContextAccount\",\n            \"columnName\": \"isContextAccount\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"accountId\",\n            \"filterId\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"renote_mute_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `userId` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `postedAt` TEXT, PRIMARY KEY(`userId`, `accountId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"postedAt\",\n            \"columnName\": \"postedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"userId\",\n            \"accountId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_renote_mute_users_postedAt\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"postedAt\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_postedAt` ON `${TABLE_NAME}` (`postedAt`)\"\n          },\n          {\n            \"name\": \"index_renote_mute_users_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_renote_mute_users_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"mastodon_instance_fedibird_capabilities\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_instance_fedibird_capabilities_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_instance_fedibird_capabilities_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"pleroma_metadata_features\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` TEXT NOT NULL, `uri` TEXT NOT NULL, PRIMARY KEY(`uri`, `type`), FOREIGN KEY(`uri`) REFERENCES `mastodon_instance_info`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\",\n            \"type\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_pleroma_metadata_features_uri\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"uri\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_pleroma_metadata_features_uri` ON `${TABLE_NAME}` (`uri`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"mastodon_instance_info\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"uri\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiHost` TEXT NOT NULL, `url` TEXT, `uri` TEXT, `type` TEXT, `serverId` TEXT, `category` TEXT, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiHost\",\n            \"columnName\": \"emojiHost\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"serverId\",\n            \"columnName\": \"serverId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emojis_emojiHost_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\",\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost_name` ON `${TABLE_NAME}` (`emojiHost`, `name`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_emojiHost\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiHost\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_emojiHost` ON `${TABLE_NAME}` (`emojiHost`)\"\n          },\n          {\n            \"name\": \"index_custom_emojis_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emojis_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"custom_emoji_aliases\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `emojiId` INTEGER NOT NULL, PRIMARY KEY(`name`, `emojiId`), FOREIGN KEY(`emojiId`) REFERENCES `custom_emojis`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"emojiId\",\n            \"columnName\": \"emojiId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"name\",\n            \"emojiId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_custom_emoji_aliases_emojiId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"emojiId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_emojiId` ON `${TABLE_NAME}` (`emojiId`)\"\n          },\n          {\n            \"name\": \"index_custom_emoji_aliases_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_custom_emoji_aliases_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"custom_emojis\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"emojiId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"instance_tickers\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `favicon_url` TEXT, `icon_url` TEXT, `name` TEXT, `software_name` TEXT, `software_version` TEXT, `theme_color` TEXT, `created_at` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"faviconUrl\",\n            \"columnName\": \"favicon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"icon_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareName\",\n            \"columnName\": \"software_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"softwareVersion\",\n            \"columnName\": \"software_version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"themeColor\",\n            \"columnName\": \"theme_color\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notes\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `created_at` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `user_id` TEXT NOT NULL, `reply_id` TEXT, `repost_id` TEXT, `via_mobile` INTEGER, `visibility` TEXT NOT NULL, `local_only` INTEGER, `url` TEXT, `uri` TEXT, `repost_count` INTEGER NOT NULL, `reply_count` INTEGER NOT NULL, `channel_id` TEXT, `max_reaction_per_account` INTEGER NOT NULL, `polls_expires_at` TEXT, `polls_multiple` INTEGER, `circle_id` TEXT, `type` TEXT NOT NULL, `mastodon_reblogged` INTEGER, `mastodon_favourited` INTEGER, `mastodon_bookmarked` INTEGER, `mastodon_muted` INTEGER, `mastodon_favourites_count` INTEGER, `mastodon_is_fedibird_quote` INTEGER, `mastodon_poll_id` TEXT, `mastodon_is_sensitive` INTEGER, `mastodon_pure_text` TEXT, `mastodon_is_reaction_available` INTEGER, `misskey_channel_id` TEXT, `misskey_channel_name` TEXT, `misskey_is_accepting_only_like_reaction` INTEGER, `misskey_is_not_accepting_sensitive_reaction` INTEGER, `misskey_is_require_nyaize` INTEGER, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"reply_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostId\",\n            \"columnName\": \"repost_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"via_mobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"local_only\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"repostCount\",\n            \"columnName\": \"repost_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"replyCount\",\n            \"columnName\": \"reply_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxReactionPerAccount\",\n            \"columnName\": \"max_reaction_per_account\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pollExpiresAt\",\n            \"columnName\": \"polls_expires_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pollMultiple\",\n            \"columnName\": \"polls_multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fedibirdCircleId\",\n            \"columnName\": \"circle_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"mastodonReblogged\",\n            \"columnName\": \"mastodon_reblogged\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavourited\",\n            \"columnName\": \"mastodon_favourited\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonBookmarked\",\n            \"columnName\": \"mastodon_bookmarked\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonMuted\",\n            \"columnName\": \"mastodon_muted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonFavouritesCount\",\n            \"columnName\": \"mastodon_favourites_count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsFedibirdQuote\",\n            \"columnName\": \"mastodon_is_fedibird_quote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPollId\",\n            \"columnName\": \"mastodon_poll_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsSensitive\",\n            \"columnName\": \"mastodon_is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonPureText\",\n            \"columnName\": \"mastodon_pure_text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mastodonIsReactionAvailable\",\n            \"columnName\": \"mastodon_is_reaction_available\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelId\",\n            \"columnName\": \"misskey_channel_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyChannelName\",\n            \"columnName\": \"misskey_channel_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsAcceptingOnlyLikeReaction\",\n            \"columnName\": \"misskey_is_accepting_only_like_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsNotAcceptingSensitiveReaction\",\n            \"columnName\": \"misskey_is_not_accepting_sensitive_reaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"misskeyIsRequireNyaize\",\n            \"columnName\": \"misskey_is_require_nyaize\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_counts\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `reaction` TEXT NOT NULL, `count` INTEGER NOT NULL, `me` INTEGER NOT NULL, `weight` INTEGER, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"count\",\n            \"columnName\": \"count\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"me\",\n            \"columnName\": \"me\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_counts_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_counts_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_visible_user_ids\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_visible_user_ids_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_visible_user_ids_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_poll_choices\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `index` INTEGER NOT NULL, `text` TEXT NOT NULL, `votes` INTEGER NOT NULL, `is_voted` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"index\",\n            \"columnName\": \"index\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"votes\",\n            \"columnName\": \"votes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isVoted\",\n            \"columnName\": \"is_voted\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_poll_choices_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_poll_choices_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_tags\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `tag` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `tag`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"tag\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_tags_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_tags_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"mastodon_mentions\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, `username` TEXT NOT NULL, `acct` TEXT NOT NULL, `url` TEXT NOT NULL, PRIMARY KEY(`note_id`, `user_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"username\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"acct\",\n            \"columnName\": \"acct\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_mastodon_mentions_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_mastodon_mentions_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_custom_emojis\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `name` TEXT NOT NULL, `url` TEXT, `aspect_ratio` REAL, `cache_path` TEXT, PRIMARY KEY(`id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_custom_emojis_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_custom_emojis_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_files\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`note_id` TEXT NOT NULL, `file_id` TEXT NOT NULL, PRIMARY KEY(`note_id`, `file_id`), FOREIGN KEY(`note_id`) REFERENCES `notes`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"note_id\",\n            \"file_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_note_files_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_note_files_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"note_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_threads\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `accountId` INTEGER NOT NULL, `targetNoteId` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"targetNoteId\",\n            \"columnName\": \"targetNoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_ancestors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"note_thread_descendants\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`thread_id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`thread_id`, `note_id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"threadId\",\n            \"columnName\": \"thread_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"thread_id\",\n            \"note_id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"timeline_item\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`account_id` INTEGER NOT NULL, `page_id` INTEGER NOT NULL, `note_id` TEXT NOT NULL, `note_local_id` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(`note_local_id`) REFERENCES `notes`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"page_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteLocalId\",\n            \"columnName\": \"note_local_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_timeline_item_account_id_page_id_note_id\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"account_id\",\n              \"page_id\",\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_timeline_item_account_id_page_id_note_id` ON `${TABLE_NAME}` (`account_id`, `page_id`, `note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_id` ON `${TABLE_NAME}` (`note_id`)\"\n          },\n          {\n            \"name\": \"index_timeline_item_note_local_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"note_local_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_timeline_item_note_local_id` ON `${TABLE_NAME}` (`note_local_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notes\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"note_local_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `notification_id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `created_at` TEXT NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`account_id`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notification_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notifications_account_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"account_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notifications_account_id` ON `${TABLE_NAME}` (`account_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"account_id\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"follow_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"note_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `reaction` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_vote_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `choice` INTEGER NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"group_invited_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `group_id` TEXT NOT NULL, `group_name` TEXT NOT NULL, `group_owner_id` TEXT NOT NULL, `group_created_at` TEXT NOT NULL, `invitation_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupId\",\n            \"columnName\": \"group_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupName\",\n            \"columnName\": \"group_name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupOwnerId\",\n            \"columnName\": \"group_owner_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"groupCreatedAt\",\n            \"columnName\": \"group_created_at\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"invitationId\",\n            \"columnName\": \"invitation_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unknown_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `raw_type` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"rawType\",\n            \"columnName\": \"raw_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_ended_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timelines\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_excluded_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_included_types\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `type` TEXT NOT NULL, PRIMARY KEY(`timelineId`, `type`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"type\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"notification_timeline_items\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`timelineId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, `cachedAt` INTEGER NOT NULL, PRIMARY KEY(`timelineId`, `notificationId`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"timelineId\",\n            \"columnName\": \"timelineId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cachedAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"timelineId\",\n            \"notificationId\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_notification_timeline_items_timelineId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"timelineId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_notification_timeline_items_timelineId` ON `${TABLE_NAME}` (`timelineId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"follow_request_accepted_notifications\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`id`), FOREIGN KEY(`id`) REFERENCES `notifications`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"notifications\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_authors\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `account_id` INTEGER NOT NULL, `reaction` TEXT, `note_id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"account_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noteId\",\n            \"columnName\": \"note_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_authors_users\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction_author_id` TEXT NOT NULL, `user_id` TEXT NOT NULL, PRIMARY KEY(`reaction_author_id`, `user_id`), FOREIGN KEY(`reaction_author_id`) REFERENCES `reaction_authors`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reactionAuthorId\",\n            \"columnName\": \"reaction_author_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"user_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"reaction_author_id\",\n            \"user_id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id_user_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\",\n              \"user_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id_user_id` ON `${TABLE_NAME}` (`reaction_author_id`, `user_id`)\"\n          },\n          {\n            \"name\": \"index_reaction_authors_users_reaction_author_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"reaction_author_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_reaction_authors_users_reaction_author_id` ON `${TABLE_NAME}` (`reaction_author_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"reaction_authors\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"reaction_author_id\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"custom_emoji_aspects\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `aspect_ratio` REAL NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"aspectRatio\",\n            \"columnName\": \"aspect_ratio\",\n            \"affinity\": \"REAL\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": false,\n          \"columnNames\": [\n            \"uri\"\n          ]\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"image_caches\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`source_url` TEXT NOT NULL, `cache_path` TEXT NOT NULL, `cached_at` INTEGER NOT NULL, `width` INTEGER, `height` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"sourceUrl\",\n            \"columnName\": \"source_url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachePath\",\n            \"columnName\": \"cache_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"cachedAt\",\n            \"columnName\": \"cached_at\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"width\",\n            \"columnName\": \"width\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"height\",\n            \"columnName\": \"height\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"autoGenerate\": true,\n          \"columnNames\": [\n            \"id\"\n          ]\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_image_caches_source_url\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"source_url\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_image_caches_source_url` ON `${TABLE_NAME}` (`source_url`)\"\n          },\n          {\n            \"name\": \"index_image_caches_cached_at\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"cached_at\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_image_caches_cached_at` ON `${TABLE_NAME}` (`cached_at`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [\n      {\n        \"viewName\": \"user_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\"\n      },\n      {\n        \"viewName\": \"group_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \\n            inner join group_v1 as g\\n            inner join user as u\\n            on m.groupId = g.id\\n                and m.userId = u.serverId\\n                and g.accountId = u.accountId\"\n      },\n      {\n        \"viewName\": \"user_list_member_view\",\n        \"createSql\": \"CREATE VIEW `${VIEW_NAME}` AS select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \\n            inner join user_list as ul\\n            inner join user as u\\n            on m.userListId = ul.id\\n                and m.userId = u.serverId\\n                and ul.accountId = u.accountId\"\n      }\n    ],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4243a87bc3e95ac10be2d99cd6903f4c')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/8.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 8,\n    \"identityHash\": \"7a5223ff0728af36a89dccaed48f97ec\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7a5223ff0728af36a89dccaed48f97ec')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.infrastructure.DataBase/9.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 9,\n    \"identityHash\": \"9ca4eba1d0228c9795b0c3a2995db32a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ca4eba1d0228c9795b0c3a2995db32a')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/10.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 10,\n    \"identityHash\": \"e57ecde54b614792af12c09f03436dc1\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e57ecde54b614792af12c09f03436dc1')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/11.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 11,\n    \"identityHash\": \"c50ce2972f355ed260b3b30b300c8a9f\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c50ce2972f355ed260b3b30b300c8a9f')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/12.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 12,\n    \"identityHash\": \"d16f596614a6ec0c5703e7719b14256b\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd16f596614a6ec0c5703e7719b14256b')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/3.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"786087deeceb0d1e04244116153de219\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '786087deeceb0d1e04244116153de219')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/4.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 4,\n    \"identityHash\": \"522c0549c443474673b33153ce928a8c\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '522c0549c443474673b33153ce928a8c')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/5.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 5,\n    \"identityHash\": \"4d4ea06174551643c866184ef5de6130\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4d4ea06174551643c866184ef5de6130')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/6.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 6,\n    \"identityHash\": \"f0b44b577de14e836e23b7ff464647a6\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f0b44b577de14e836e23b7ff464647a6')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/7.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 7,\n    \"identityHash\": \"75b46cd180746b997e83291bf1013d1a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '75b46cd180746b997e83291bf1013d1a')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/8.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 8,\n    \"identityHash\": \"7a5223ff0728af36a89dccaed48f97ec\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7a5223ff0728af36a89dccaed48f97ec')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/net.pantasystem.milktea.data.model.DataBase/9.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 9,\n    \"identityHash\": \"9ca4eba1d0228c9795b0c3a2995db32a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ca4eba1d0228c9795b0c3a2995db32a')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/10.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 10,\n    \"identityHash\": \"e57ecde54b614792af12c09f03436dc1\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e57ecde54b614792af12c09f03436dc1')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/11.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 11,\n    \"identityHash\": \"c50ce2972f355ed260b3b30b300c8a9f\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'c50ce2972f355ed260b3b30b300c8a9f')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/12.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 12,\n    \"identityHash\": \"d16f596614a6ec0c5703e7719b14256b\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `channelId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `instanceType` TEXT NOT NULL DEFAULT 'misskey', `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceType\",\n            \"columnName\": \"instanceType\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'misskey'\"\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT, `channelId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.channelId\",\n            \"columnName\": \"channelId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd16f596614a6ec0c5703e7719b14256b')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/3.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 3,\n    \"identityHash\": \"786087deeceb0d1e04244116153de219\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '786087deeceb0d1e04244116153de219')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/4.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 4,\n    \"identityHash\": \"522c0549c443474673b33153ce928a8c\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '522c0549c443474673b33153ce928a8c')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/5.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 5,\n    \"identityHash\": \"4d4ea06174551643c866184ef5de6130\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '4d4ea06174551643c866184ef5de6130')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/6.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 6,\n    \"identityHash\": \"f0b44b577de14e836e23b7ff464647a6\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'f0b44b577de14e836e23b7ff464647a6')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/7.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 7,\n    \"identityHash\": \"75b46cd180746b997e83291bf1013d1a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '75b46cd180746b997e83291bf1013d1a')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/8.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 8,\n    \"identityHash\": \"7a5223ff0728af36a89dccaed48f97ec\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`updatedAt` TEXT NOT NULL, `accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`file_id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '7a5223ff0728af36a89dccaed48f97ec')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/schemas/schemas/jp.panta.misskeyandroidclient.model.DataBase/9.json",
    "content": "{\n  \"formatVersion\": 1,\n  \"database\": {\n    \"version\": 9,\n    \"identityHash\": \"9ca4eba1d0228c9795b0c3a2995db32a\",\n    \"entities\": [\n      {\n        \"tableName\": \"connection_information\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT NOT NULL, `instanceBaseUrl` TEXT NOT NULL, `encryptedI` TEXT NOT NULL, `viaName` TEXT, `createdAt` TEXT NOT NULL, `isDirect` INTEGER NOT NULL, `updatedAt` TEXT NOT NULL, PRIMARY KEY(`accountId`, `encryptedI`, `instanceBaseUrl`), FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceBaseUrl\",\n            \"columnName\": \"instanceBaseUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedI\",\n            \"columnName\": \"encryptedI\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"viaName\",\n            \"columnName\": \"viaName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"createdAt\",\n            \"columnName\": \"createdAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"isDirect\",\n            \"columnName\": \"isDirect\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"updatedAt\",\n            \"columnName\": \"updatedAt\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"encryptedI\",\n            \"instanceBaseUrl\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"reaction_history\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `id` INTEGER PRIMARY KEY AUTOINCREMENT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"Account\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"reaction_user_setting\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`reaction` TEXT NOT NULL, `instance_domain` TEXT NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`reaction`, `instance_domain`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"reaction\",\n            \"columnName\": \"reaction\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instance_domain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"reaction\",\n            \"instance_domain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` TEXT, `title` TEXT NOT NULL, `pageNumber` INTEGER, `id` INTEGER PRIMARY KEY AUTOINCREMENT, `global_timeline_with_files` INTEGER, `global_timeline_type` TEXT, `local_timeline_with_files` INTEGER, `local_timeline_exclude_nsfw` INTEGER, `local_timeline_type` TEXT, `hybrid_timeline_withFiles` INTEGER, `hybrid_timeline_includeLocalRenotes` INTEGER, `hybrid_timeline_includeMyRenotes` INTEGER, `hybrid_timeline_includeRenotedMyRenotes` INTEGER, `hybrid_timeline_type` TEXT, `home_timeline_withFiles` INTEGER, `home_timeline_includeLocalRenotes` INTEGER, `home_timeline_includeMyRenotes` INTEGER, `home_timeline_includeRenotedMyRenotes` INTEGER, `home_timeline_type` TEXT, `user_list_timeline_listId` TEXT, `user_list_timeline_withFiles` INTEGER, `user_list_timeline_includeLocalRenotes` INTEGER, `user_list_timeline_includeMyRenotes` INTEGER, `user_list_timeline_includeRenotedMyRenotes` INTEGER, `user_list_timeline_type` TEXT, `mention_following` INTEGER, `mention_visibility` TEXT, `mention_type` TEXT, `show_noteId` TEXT, `show_type` TEXT, `tag_tag` TEXT, `tag_reply` INTEGER, `tag_renote` INTEGER, `tag_withFiles` INTEGER, `tag_poll` INTEGER, `tag_type` TEXT, `featured_offset` INTEGER, `featured_type` TEXT, `notification_following` INTEGER, `notification_markAsRead` INTEGER, `notification_type` TEXT, `user_userId` TEXT, `user_includeReplies` INTEGER, `user_includeMyRenotes` INTEGER, `user_withFiles` INTEGER, `user_type` TEXT, `search_query` TEXT, `search_host` TEXT, `search_userId` TEXT, `search_type` TEXT, `favorite_type` TEXT, `antenna_antennaId` TEXT, `antenna_type` TEXT, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageNumber\",\n            \"columnName\": \"pageNumber\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.withFiles\",\n            \"columnName\": \"global_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"globalTimeline.type\",\n            \"columnName\": \"global_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.withFiles\",\n            \"columnName\": \"local_timeline_with_files\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.excludeNsfw\",\n            \"columnName\": \"local_timeline_exclude_nsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localTimeline.type\",\n            \"columnName\": \"local_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.withFiles\",\n            \"columnName\": \"hybrid_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeLocalRenotes\",\n            \"columnName\": \"hybrid_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"hybrid_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"hybridTimeline.type\",\n            \"columnName\": \"hybrid_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.withFiles\",\n            \"columnName\": \"home_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeLocalRenotes\",\n            \"columnName\": \"home_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeMyRenotes\",\n            \"columnName\": \"home_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"home_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"homeTimeline.type\",\n            \"columnName\": \"home_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.listId\",\n            \"columnName\": \"user_list_timeline_listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.withFiles\",\n            \"columnName\": \"user_list_timeline_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeLocalRenotes\",\n            \"columnName\": \"user_list_timeline_includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.includeRenotedMyRenotes\",\n            \"columnName\": \"user_list_timeline_includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userListTimeline.type\",\n            \"columnName\": \"user_list_timeline_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.following\",\n            \"columnName\": \"mention_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.visibility\",\n            \"columnName\": \"mention_visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mention.type\",\n            \"columnName\": \"mention_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.noteId\",\n            \"columnName\": \"show_noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"show.type\",\n            \"columnName\": \"show_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.tag\",\n            \"columnName\": \"tag_tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.reply\",\n            \"columnName\": \"tag_reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.renote\",\n            \"columnName\": \"tag_renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.withFiles\",\n            \"columnName\": \"tag_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.poll\",\n            \"columnName\": \"tag_poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"searchByTag.type\",\n            \"columnName\": \"tag_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.offset\",\n            \"columnName\": \"featured_offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"featured.type\",\n            \"columnName\": \"featured_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.following\",\n            \"columnName\": \"notification_following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.markAsRead\",\n            \"columnName\": \"notification_markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"notification.type\",\n            \"columnName\": \"notification_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.userId\",\n            \"columnName\": \"user_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeReplies\",\n            \"columnName\": \"user_includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.includeMyRenotes\",\n            \"columnName\": \"user_includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.withFiles\",\n            \"columnName\": \"user_withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"userTimeline.type\",\n            \"columnName\": \"user_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.query\",\n            \"columnName\": \"search_query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.host\",\n            \"columnName\": \"search_host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.userId\",\n            \"columnName\": \"search_userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"search.type\",\n            \"columnName\": \"search_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"favorite.type\",\n            \"columnName\": \"favorite_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.antennaId\",\n            \"columnName\": \"antenna_antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"antenna.type\",\n            \"columnName\": \"antenna_type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"Account\",\n            \"onDelete\": \"NO ACTION\",\n            \"onUpdate\": \"NO ACTION\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"poll_choice_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`choice` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, `weight` INTEGER NOT NULL, PRIMARY KEY(`choice`, `weight`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"choice\",\n            \"columnName\": \"choice\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"choice\",\n            \"weight\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_poll_choice_table_draft_note_id_choice\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\",\n              \"choice\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_poll_choice_table_draft_note_id_choice` ON `${TABLE_NAME}` (`draft_note_id`, `choice`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"user_id\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`userId` TEXT NOT NULL, `draft_note_id` INTEGER NOT NULL, PRIMARY KEY(`userId`, `draft_note_id`), FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"userId\",\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_user_id_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_user_id_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_file_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL DEFAULT 'name none', `remote_file_id` TEXT, `file_path` TEXT, `is_sensitive` INTEGER, `type` TEXT, `thumbnailUrl` TEXT, `draft_note_id` INTEGER NOT NULL, `folder_id` TEXT, `file_id` INTEGER PRIMARY KEY AUTOINCREMENT, FOREIGN KEY(`draft_note_id`) REFERENCES `draft_note_table`(`draft_note_id`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true,\n            \"defaultValue\": \"'name none'\"\n          },\n          {\n            \"fieldPath\": \"remoteFileId\",\n            \"columnName\": \"remote_file_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"filePath\",\n            \"columnName\": \"file_path\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"isSensitive\",\n            \"columnName\": \"is_sensitive\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnailUrl\",\n            \"columnName\": \"thumbnailUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"folderId\",\n            \"columnName\": \"folder_id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"fileId\",\n            \"columnName\": \"file_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"file_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_file_table_draft_note_id\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"draft_note_id\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_file_table_draft_note_id` ON `${TABLE_NAME}` (`draft_note_id`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"draft_note_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"draft_note_id\"\n            ],\n            \"referencedColumns\": [\n              \"draft_note_id\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"draft_note_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `visibility` TEXT NOT NULL, `text` TEXT, `cw` TEXT, `viaMobile` INTEGER, `localOnly` INTEGER, `noExtractMentions` INTEGER, `noExtractHashtags` INTEGER, `noExtractEmojis` INTEGER, `replyId` TEXT, `renoteId` TEXT, `draft_note_id` INTEGER PRIMARY KEY AUTOINCREMENT, `multiple` INTEGER, `expiresAt` INTEGER, FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"text\",\n            \"columnName\": \"text\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cw\",\n            \"columnName\": \"cw\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"viaMobile\",\n            \"columnName\": \"viaMobile\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"localOnly\",\n            \"columnName\": \"localOnly\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractMentions\",\n            \"columnName\": \"noExtractMentions\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractHashtags\",\n            \"columnName\": \"noExtractHashtags\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"noExtractEmojis\",\n            \"columnName\": \"noExtractEmojis\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"replyId\",\n            \"columnName\": \"replyId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"renoteId\",\n            \"columnName\": \"renoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"draftNoteId\",\n            \"columnName\": \"draft_note_id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.multiple\",\n            \"columnName\": \"multiple\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"poll.expiresAt\",\n            \"columnName\": \"expiresAt\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"draft_note_id\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_draft_note_table_accountId_text\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\",\n              \"text\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_draft_note_table_accountId_text` ON `${TABLE_NAME}` (`accountId`, `text`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"url_preview\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `icon` TEXT, `description` TEXT, `thumbnail` TEXT, `siteName` TEXT, PRIMARY KEY(`url`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"icon\",\n            \"columnName\": \"icon\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"thumbnail\",\n            \"columnName\": \"thumbnail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"siteName\",\n            \"columnName\": \"siteName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"url\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"account_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`remoteId` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `userName` TEXT NOT NULL, `encryptedToken` TEXT NOT NULL, `accountId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"remoteId\",\n            \"columnName\": \"remoteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"userName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"encryptedToken\",\n            \"columnName\": \"encryptedToken\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_account_table_remoteId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"remoteId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_remoteId` ON `${TABLE_NAME}` (`remoteId`)\"\n          },\n          {\n            \"name\": \"index_account_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_account_table_userName\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"userName\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_account_table_userName` ON `${TABLE_NAME}` (`userName`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"page_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `title` TEXT NOT NULL, `weight` INTEGER NOT NULL, `pageId` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `type` TEXT NOT NULL, `withFiles` INTEGER, `excludeNsfw` INTEGER, `includeLocalRenotes` INTEGER, `includeMyRenotes` INTEGER, `includeRenotedMyRenotes` INTEGER, `listId` TEXT, `following` INTEGER, `visibility` TEXT, `noteId` TEXT, `tag` TEXT, `reply` INTEGER, `renote` INTEGER, `poll` INTEGER, `offset` INTEGER, `markAsRead` INTEGER, `userId` TEXT, `includeReplies` INTEGER, `query` TEXT, `host` TEXT, `antennaId` TEXT)\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"title\",\n            \"columnName\": \"title\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"weight\",\n            \"columnName\": \"weight\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageId\",\n            \"columnName\": \"pageId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"pageParams.withFiles\",\n            \"columnName\": \"withFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.excludeNsfw\",\n            \"columnName\": \"excludeNsfw\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeLocalRenotes\",\n            \"columnName\": \"includeLocalRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeMyRenotes\",\n            \"columnName\": \"includeMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeRenotedMyRenotes\",\n            \"columnName\": \"includeRenotedMyRenotes\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.listId\",\n            \"columnName\": \"listId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.following\",\n            \"columnName\": \"following\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.visibility\",\n            \"columnName\": \"visibility\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.noteId\",\n            \"columnName\": \"noteId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.tag\",\n            \"columnName\": \"tag\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.reply\",\n            \"columnName\": \"reply\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.renote\",\n            \"columnName\": \"renote\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.poll\",\n            \"columnName\": \"poll\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.offset\",\n            \"columnName\": \"offset\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.markAsRead\",\n            \"columnName\": \"markAsRead\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.userId\",\n            \"columnName\": \"userId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.includeReplies\",\n            \"columnName\": \"includeReplies\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.query\",\n            \"columnName\": \"query\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"pageParams.antennaId\",\n            \"columnName\": \"antennaId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"pageId\"\n          ],\n          \"autoGenerate\": true\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_page_table_weight\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"weight\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_weight` ON `${TABLE_NAME}` (`weight`)\"\n          },\n          {\n            \"name\": \"index_page_table_accountId\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"accountId\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_page_table_accountId` ON `${TABLE_NAME}` (`accountId`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"meta_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uri` TEXT NOT NULL, `bannerUrl` TEXT, `cacheRemoteFiles` INTEGER, `description` TEXT, `disableGlobalTimeline` INTEGER, `disableLocalTimeline` INTEGER, `disableRegistration` INTEGER, `driveCapacityPerLocalUserMb` INTEGER, `driveCapacityPerRemoteUserMb` INTEGER, `enableDiscordIntegration` INTEGER, `enableEmail` INTEGER, `enableEmojiReaction` INTEGER, `enableGithubIntegration` INTEGER, `enableRecaptcha` INTEGER, `enableServiceWorker` INTEGER, `enableTwitterIntegration` INTEGER, `errorImageUrl` TEXT, `feedbackUrl` TEXT, `iconUrl` TEXT, `maintainerEmail` TEXT, `maintainerName` TEXT, `mascotImageUrl` TEXT, `maxNoteTextLength` INTEGER, `name` TEXT, `recaptchaSiteKey` TEXT, `secure` INTEGER, `swPublicKey` TEXT, `toSUrl` TEXT, `version` TEXT NOT NULL, PRIMARY KEY(`uri`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"bannerUrl\",\n            \"columnName\": \"bannerUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"cacheRemoteFiles\",\n            \"columnName\": \"cacheRemoteFiles\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"description\",\n            \"columnName\": \"description\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableGlobalTimeline\",\n            \"columnName\": \"disableGlobalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableLocalTimeline\",\n            \"columnName\": \"disableLocalTimeline\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"disableRegistration\",\n            \"columnName\": \"disableRegistration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerLocalUserMb\",\n            \"columnName\": \"driveCapacityPerLocalUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"driveCapacityPerRemoteUserMb\",\n            \"columnName\": \"driveCapacityPerRemoteUserMb\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableDiscordIntegration\",\n            \"columnName\": \"enableDiscordIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmail\",\n            \"columnName\": \"enableEmail\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableEmojiReaction\",\n            \"columnName\": \"enableEmojiReaction\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableGithubIntegration\",\n            \"columnName\": \"enableGithubIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableRecaptcha\",\n            \"columnName\": \"enableRecaptcha\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableServiceWorker\",\n            \"columnName\": \"enableServiceWorker\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"enableTwitterIntegration\",\n            \"columnName\": \"enableTwitterIntegration\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"errorImageUrl\",\n            \"columnName\": \"errorImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"feedbackUrl\",\n            \"columnName\": \"feedbackUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"iconUrl\",\n            \"columnName\": \"iconUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerEmail\",\n            \"columnName\": \"maintainerEmail\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maintainerName\",\n            \"columnName\": \"maintainerName\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"mascotImageUrl\",\n            \"columnName\": \"mascotImageUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"maxNoteTextLength\",\n            \"columnName\": \"maxNoteTextLength\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"recaptchaSiteKey\",\n            \"columnName\": \"recaptchaSiteKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"secure\",\n            \"columnName\": \"secure\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"swPublicKey\",\n            \"columnName\": \"swPublicKey\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"toSUrl\",\n            \"columnName\": \"toSUrl\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"version\",\n            \"columnName\": \"version\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"uri\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": []\n      },\n      {\n        \"tableName\": \"emoji_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, `host` TEXT, `url` TEXT, `uri` TEXT, `type` TEXT, `category` TEXT, `id` TEXT, PRIMARY KEY(`name`, `instanceDomain`), FOREIGN KEY(`instanceDomain`) REFERENCES `meta_table`(`uri`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"url\",\n            \"columnName\": \"url\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"uri\",\n            \"columnName\": \"uri\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"type\",\n            \"columnName\": \"type\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"category\",\n            \"columnName\": \"category\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": false\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_emoji_table_instanceDomain\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"instanceDomain\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_instanceDomain` ON `${TABLE_NAME}` (`instanceDomain`)\"\n          },\n          {\n            \"name\": \"index_emoji_table_name\",\n            \"unique\": false,\n            \"columnNames\": [\n              \"name\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE INDEX IF NOT EXISTS `index_emoji_table_name` ON `${TABLE_NAME}` (`name`)\"\n          }\n        ],\n        \"foreignKeys\": [\n          {\n            \"table\": \"meta_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"uri\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"emoji_alias_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`alias` TEXT NOT NULL, `name` TEXT NOT NULL, `instanceDomain` TEXT NOT NULL, PRIMARY KEY(`alias`, `name`, `instanceDomain`), FOREIGN KEY(`name`, `instanceDomain`) REFERENCES `emoji_table`(`name`, `instanceDomain`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"alias\",\n            \"columnName\": \"alias\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"name\",\n            \"columnName\": \"name\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"instanceDomain\",\n            \"columnName\": \"instanceDomain\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"alias\",\n            \"name\",\n            \"instanceDomain\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"emoji_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"name\",\n              \"instanceDomain\"\n            ],\n            \"referencedColumns\": [\n              \"name\",\n              \"instanceDomain\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"unread_notifications_table\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`accountId` INTEGER NOT NULL, `notificationId` TEXT NOT NULL, PRIMARY KEY(`accountId`, `notificationId`), FOREIGN KEY(`accountId`) REFERENCES `account_table`(`accountId`) ON UPDATE CASCADE ON DELETE CASCADE )\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"accountId\",\n            \"columnName\": \"accountId\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"notificationId\",\n            \"columnName\": \"notificationId\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"accountId\",\n            \"notificationId\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [],\n        \"foreignKeys\": [\n          {\n            \"table\": \"account_table\",\n            \"onDelete\": \"CASCADE\",\n            \"onUpdate\": \"CASCADE\",\n            \"columns\": [\n              \"accountId\"\n            ],\n            \"referencedColumns\": [\n              \"accountId\"\n            ]\n          }\n        ]\n      },\n      {\n        \"tableName\": \"nicknames\",\n        \"createSql\": \"CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`nickname` TEXT NOT NULL, `username` TEXT NOT NULL, `host` TEXT NOT NULL, `id` INTEGER NOT NULL, PRIMARY KEY(`id`))\",\n        \"fields\": [\n          {\n            \"fieldPath\": \"nickname\",\n            \"columnName\": \"nickname\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"userName\",\n            \"columnName\": \"username\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"host\",\n            \"columnName\": \"host\",\n            \"affinity\": \"TEXT\",\n            \"notNull\": true\n          },\n          {\n            \"fieldPath\": \"id\",\n            \"columnName\": \"id\",\n            \"affinity\": \"INTEGER\",\n            \"notNull\": true\n          }\n        ],\n        \"primaryKey\": {\n          \"columnNames\": [\n            \"id\"\n          ],\n          \"autoGenerate\": false\n        },\n        \"indices\": [\n          {\n            \"name\": \"index_nicknames_username_host\",\n            \"unique\": true,\n            \"columnNames\": [\n              \"username\",\n              \"host\"\n            ],\n            \"orders\": [],\n            \"createSql\": \"CREATE UNIQUE INDEX IF NOT EXISTS `index_nicknames_username_host` ON `${TABLE_NAME}` (`username`, `host`)\"\n          }\n        ],\n        \"foreignKeys\": []\n      }\n    ],\n    \"views\": [],\n    \"setupQueries\": [\n      \"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)\",\n      \"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9ca4eba1d0228c9795b0c3a2995db32a')\"\n    ]\n  }\n}"
  },
  {
    "path": "modules/data/src/androidTest/java/net/pantasystem/milktea/data/infrastructure/DatabaseMigrationTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure\n\nimport androidx.room.testing.MigrationTestHelper\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport androidx.test.platform.app.InstrumentationRegistry\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\nimport java.io.IOException\n\n@RunWith(AndroidJUnit4::class)\nclass DatabaseMigrationTest {\n\n    private val testDb = \"test-db\"\n\n    @get:Rule\n    val helper: MigrationTestHelper = MigrationTestHelper(\n        InstrumentationRegistry.getInstrumentation(),\n        DataBase::class.java,\n    )\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate24To25() {\n        helper.createDatabase(testDb, 24)\n        helper.runMigrationsAndValidate(testDb, 25, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate23To25() {\n        helper.createDatabase(testDb, 23)\n        helper.runMigrationsAndValidate(testDb, 25, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate22To25() {\n        helper.createDatabase(testDb, 22)\n        helper.runMigrationsAndValidate(testDb, 25, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate21To25() {\n        helper.createDatabase(testDb, 21)\n        helper.runMigrationsAndValidate(testDb, 25, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To25() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 25, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate25To26() {\n        helper.createDatabase(testDb, 25)\n        helper.runMigrationsAndValidate(testDb, 26, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To26() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 26, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate26To27() {\n        helper.createDatabase(testDb, 26)\n        helper.runMigrationsAndValidate(testDb, 27, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate25To27() {\n        helper.createDatabase(testDb, 25)\n        helper.runMigrationsAndValidate(testDb, 27, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate24To27() {\n        helper.createDatabase(testDb, 24)\n        helper.runMigrationsAndValidate(testDb, 27, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To27() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 27, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To28() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 28, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To29() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 29, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To30() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 30, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To31() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 31, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To32() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 32, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To33() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 33, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To34() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 34, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To35() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 35, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To36() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 36, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To37() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 37, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To38() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 38, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To39() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 39, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To40() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 40, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate11To41() {\n        helper.createDatabase(testDb, 11)\n        helper.runMigrationsAndValidate(testDb, 41, true)\n    }\n\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate40To41() {\n        helper.createDatabase(testDb, 40)\n        helper.runMigrationsAndValidate(testDb, 41, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate41To42() {\n        helper.createDatabase(testDb, 41)\n        helper.runMigrationsAndValidate(testDb, 42, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate42To43() {\n        helper.createDatabase(testDb, 42)\n        helper.runMigrationsAndValidate(testDb, 43, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate43To44() {\n        helper.createDatabase(testDb, 43)\n        helper.runMigrationsAndValidate(testDb, 44, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate44To45() {\n        helper.createDatabase(testDb, 44)\n        helper.runMigrationsAndValidate(testDb, 45, true)\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate45To46() {\n        helper.createDatabase(testDb, 45)\n        helper.runMigrationsAndValidate(testDb, 46, true)\n\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate46To47() {\n        helper.createDatabase(testDb, 46)\n        helper.runMigrationsAndValidate(testDb, 47, true)\n\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate47To48() {\n        helper.createDatabase(testDb, 47)\n        helper.runMigrationsAndValidate(testDb, 48, true)\n\n    }\n\n    @Test\n    @Throws(IOException::class)\n    fun migrate48To49() {\n        helper.createDatabase(testDb, 48)\n        helper.runMigrationsAndValidate(testDb, 49, true)\n\n    }\n\n    @Test\n    fun migrate49To50() {\n        helper.createDatabase(testDb, 49)\n        helper.runMigrationsAndValidate(testDb, 50, true)\n    }\n\n    @Test\n    fun migrate50To51() {\n        helper.createDatabase(testDb, 50)\n        helper.runMigrationsAndValidate(testDb, 51, true)\n    }\n\n    @Test\n    fun migrate51To52() {\n        helper.createDatabase(testDb, 51)\n        helper.runMigrationsAndValidate(testDb, 52, true, MIGRATION_51_52)\n    }\n\n    @Test\n    fun migrate51To54() {\n        helper.createDatabase(testDb, 51)\n        helper.runMigrationsAndValidate(testDb, 54, true, MIGRATION_51_52)\n    }\n\n}"
  },
  {
    "path": "modules/data/src/androidTest/java/net/pantasystem/milktea/data/infrastructure/image/ImageCacheRepositoryImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.image\n\nimport android.content.Context\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.DefaultOkHttpClientProvider\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.model.image.ImageCache\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport kotlin.time.Duration.Companion.days\n\nclass ImageCacheRepositoryImplTest {\n\n\n    lateinit var repository: ImageCacheRepositoryImpl\n    lateinit var dao: ImageCacheDAO\n    @Before\n    fun setup() {\n        val context = ApplicationProvider.getApplicationContext<Context>()\n        val database = Room.inMemoryDatabaseBuilder(context, DataBase::class.java).build()\n        repository = ImageCacheRepositoryImpl(\n            okHttpClientProvider = DefaultOkHttpClientProvider(),\n            context = context,\n            coroutineDispatcher = kotlinx.coroutines.Dispatchers.Default,\n            database.imageCacheDAO(),\n        )\n        dao = database.imageCacheDAO()\n    }\n\n    @Test\n    fun deleteExpiredCaches() = runBlocking {\n\n        val data = listOf(\n            ImageCache(\n                sourceUrl = \"https://example.com/image2.png\",\n                cachedAt = Clock.System.now() - 8.days,\n                cachePath = \"path/to/cache2.png\",\n                width = 100,\n                height = 100,\n            ),\n            ImageCache(\n                sourceUrl = \"https://example.com/image3.png\",\n                cachedAt = Clock.System.now() - 7.days,\n                cachePath = \"path/to/cache3.png\",\n                width = 100,\n                height = 100,\n            ),\n            ImageCache(\n                sourceUrl = \"https://example.com/image4.png\",\n                cachedAt = Clock.System.now() - 6.days,\n                cachePath = \"path/to/cache4.png\",\n                width = 100,\n                height = 100,\n            ),\n            ImageCache(\n                sourceUrl = \"https://example.com/image5.png\",\n                cachedAt = Clock.System.now() - 6.days,\n                cachePath = \"path/to/cache5.png\",\n                width = 100,\n                height = 100,\n            ),\n            ImageCache(\n                sourceUrl = \"https://example.com/image1.png\",\n                cachedAt = Clock.System.now() - 6.days,\n                cachePath = \"path/to/cache1.png\",\n                width = 100,\n                height = 100,\n            )\n        )\n        data.forEach {\n            dao.upsert(\n                ImageCacheEntity.from(it)\n            )\n        }\n\n        Assert.assertEquals(5, dao.count())\n\n        repository.deleteExpiredCaches()\n\n        Assert.assertEquals(3, dao.count())\n\n        Assert.assertEquals(\n            setOf(\n                data[2],\n                data[3],\n                data[4]\n            ).map {\n                  it.sourceUrl\n            },\n            dao.findAll().map { it.toModel() }.toSet().map {\n                it.sourceUrl\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/androidTest/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineCacheDAOTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport android.content.Context\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteDAO\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteEntity\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.make\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.After\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass TimelineCacheDAOTest {\n\n    private lateinit var timelineCacheDAO: TimelineCacheDAO\n    private lateinit var noteDAO: NoteDAO\n    private lateinit var db: DataBase\n\n    @Before\n    fun setUp() {\n        val context = ApplicationProvider.getApplicationContext<Context>()\n        db = Room.inMemoryDatabaseBuilder(context, DataBase::class.java).build()\n        timelineCacheDAO = db.timelineCacheDAO()\n\n        noteDAO = db.noteDAO()\n    }\n\n    @Test\n    fun getTimelineItemsSinceId() = runTest {\n        val accountId = 1L\n        val pageId = 1L\n        timelineCacheDAO.clear(accountId, pageId)\n        val testData = (1 until 1000).map {\n            val noteId = it.toString().padStart(4, '0')\n            Assert.assertEquals(4, noteId.length)\n            TimelineItemEntity(\n                accountId = accountId,\n                pageId = pageId,\n                noteId = noteId,\n                noteLocalId = NoteEntity.makeEntityId(\n                    Note.Id(accountId, noteId)\n                ),\n                id = 0\n            )\n        }\n        noteDAO.insertAll(\n            testData.map {\n                NoteEntity.fromModel(Note.make(\n                    Note.Id(it.accountId, it.noteId),\n                    User.Id(it.accountId, \"user\")\n                ))\n            }\n        )\n        timelineCacheDAO.insertAll(testData)\n        Assert.assertEquals(\n            testData.size.toLong(), noteDAO.count()\n        )\n        Assert.assertEquals(\n            testData.size.toLong(),\n            timelineCacheDAO.count()\n        )\n        val items = timelineCacheDAO.getTimelineItemsSinceId(\n            accountId = accountId,\n            pageId = pageId,\n            sinceId = \"0400\",\n            limit = 10,\n        )\n        Assert.assertTrue(items.isNotEmpty())\n        Assert.assertEquals(\n            \"0401\",\n            items[0].noteId,\n        )\n        Assert.assertEquals(\n            \"0402\",\n            items[1].noteId,\n        )\n        println(items)\n        Assert.assertEquals(\n            \"0410\",\n            items[9].noteId,\n        )\n    }\n\n    @Test\n    fun getTimelineItemsUntilId() = runTest {\n        val accountId = 1L\n        val pageId = 1L\n        timelineCacheDAO.clear(accountId, pageId)\n        val testData = (1 until 1000).map {\n            val noteId = it.toString().padStart(4, '0')\n            Assert.assertEquals(4, noteId.length)\n            TimelineItemEntity(\n                accountId = accountId,\n                pageId = pageId,\n                noteId = noteId,\n                noteLocalId = NoteEntity.makeEntityId(\n                    Note.Id(accountId, noteId)\n                ),\n                id = 0\n            )\n        }\n        noteDAO.insertAll(\n            testData.map {\n                NoteEntity.fromModel(Note.make(\n                    Note.Id(it.accountId, it.noteId),\n                    User.Id(it.accountId, \"user\")\n                ))\n            }\n        )\n        timelineCacheDAO.insertAll(testData)\n        Assert.assertEquals(\n            testData.size.toLong(), noteDAO.count()\n        )\n        Assert.assertEquals(\n            testData.size.toLong(),\n            timelineCacheDAO.count()\n        )\n        val items = timelineCacheDAO.getTimelineItemsUntilId(\n            accountId = accountId,\n            pageId = pageId,\n            untilId = \"0400\",\n            limit = 10,\n        )\n        Assert.assertTrue(items.isNotEmpty())\n        Assert.assertEquals(\n            \"0399\",\n            items[0].noteId,\n        )\n        Assert.assertEquals(\n            \"0398\",\n            items[1].noteId,\n        )\n        println(items)\n        Assert.assertEquals(\n            \"0390\",\n            items[9].noteId,\n        )\n    }\n\n    @Test\n    fun getTimelineItems() = runTest {\n        val accountId = 1L\n        val pageId = 1L\n        timelineCacheDAO.clear(accountId, pageId)\n        val testData = (1 until 1000).map {\n            val noteId = it.toString().padStart(4, '0')\n            Assert.assertEquals(4, noteId.length)\n            TimelineItemEntity(\n                accountId = accountId,\n                pageId = pageId,\n                noteId = noteId,\n                noteLocalId = NoteEntity.makeEntityId(\n                    Note.Id(accountId, noteId)\n                ),\n                id = 0\n            )\n        }\n        noteDAO.insertAll(\n            testData.map {\n                NoteEntity.fromModel(Note.make(\n                    Note.Id(it.accountId, it.noteId),\n                    User.Id(it.accountId, \"user\")\n                ))\n            }\n        )\n        timelineCacheDAO.insertAll(testData)\n        Assert.assertEquals(\n            testData.size.toLong(), noteDAO.count()\n        )\n        Assert.assertEquals(\n            testData.size.toLong(),\n            timelineCacheDAO.count()\n        )\n        val items = timelineCacheDAO.getTimelineItems(\n            accountId = accountId,\n            pageId = pageId,\n            limit = 10,\n        )\n        Assert.assertTrue(items.isNotEmpty())\n        Assert.assertEquals(\n            \"0999\",\n            items[0].noteId,\n        )\n        Assert.assertEquals(\n            \"0998\",\n            items[1].noteId,\n        )\n        println(items)\n        Assert.assertEquals(\n            \"0990\",\n            items[9].noteId,\n        )\n    }\n\n    @Test\n    fun findLastPreviousId() = runTest {\n        val accountId = 1L\n        val pageId = 1L\n        timelineCacheDAO.clear(accountId, pageId)\n        val testData = (1 until 1000).map {\n            val noteId = it.toString().padStart(4, '0')\n            Assert.assertEquals(4, noteId.length)\n            TimelineItemEntity(\n                accountId = accountId,\n                pageId = pageId,\n                noteId = noteId,\n                noteLocalId = NoteEntity.makeEntityId(\n                    Note.Id(accountId, noteId)\n                ),\n                id = 0\n            )\n        }\n        noteDAO.insertAll(\n            testData.map {\n                NoteEntity.fromModel(Note.make(\n                    Note.Id(it.accountId, it.noteId),\n                    User.Id(it.accountId, \"user\")\n                ))\n            }\n        )\n        timelineCacheDAO.insertAll(testData)\n        Assert.assertEquals(\n            testData.size.toLong(), noteDAO.count()\n        )\n        Assert.assertEquals(\n            testData.size.toLong(),\n            timelineCacheDAO.count()\n        )\n        val lastPreviousId = timelineCacheDAO.findLastPreviousId(accountId, pageId)\n        Assert.assertNotNull(lastPreviousId)\n        Assert.assertEquals(\"0001\", lastPreviousId)\n    }\n\n    @Test\n    fun findFirstLaterId() = runTest {\n        val accountId = 1L\n        val pageId = 1L\n        timelineCacheDAO.clear(accountId, pageId)\n        val testData = (1 until 1000).map {\n            val noteId = it.toString().padStart(4, '0')\n            Assert.assertEquals(4, noteId.length)\n            TimelineItemEntity(\n                accountId = accountId,\n                pageId = pageId,\n                noteId = noteId,\n                noteLocalId = NoteEntity.makeEntityId(\n                    Note.Id(accountId, noteId)\n                ),\n                id = 0\n            )\n        }\n        noteDAO.insertAll(\n            testData.map {\n                NoteEntity.fromModel(Note.make(\n                    Note.Id(it.accountId, it.noteId),\n                    User.Id(it.accountId, \"user\")\n                ))\n            }\n        )\n        timelineCacheDAO.insertAll(testData)\n        Assert.assertEquals(\n            testData.size.toLong(), noteDAO.count()\n        )\n        Assert.assertEquals(\n            testData.size.toLong(),\n            timelineCacheDAO.count()\n        )\n        val firstLaterId = timelineCacheDAO.findFirstLaterId(accountId, pageId)\n        Assert.assertEquals(\"0999\", firstLaterId)\n    }\n\n    @After\n    fun after() {\n        db.close()\n    }\n}"
  },
  {
    "path": "modules/data/src/androidTest/java/net/pantasystem/milktea/data/infrastructure/note/wordmute/WordFilterConfigRepositoryImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.wordmute\n\nimport android.content.Context\nimport androidx.room.Room\nimport androidx.test.core.app.ApplicationProvider\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.model.note.muteword.FilterConditionType\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfig\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfigRepository\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\n\nclass WordFilterConfigRepositoryImplTest {\n\n    lateinit var repository: WordFilterConfigRepository\n    lateinit var scope: CoroutineScope\n    @Before\n    fun setup() {\n        val context = ApplicationProvider.getApplicationContext<Context>()\n        scope = CoroutineScope(SupervisorJob())\n        val database = Room.inMemoryDatabaseBuilder(context, DataBase::class.java).build()\n        repository = WordFilterConfigRepositoryImpl(scope, database.wordFilterConfigDao(), object : Logger.Factory {\n            override fun create(tag: String): Logger {\n                return object : Logger {\n                    override val defaultTag: String\n                        get() = \"\"\n\n                    override fun debug(msg: String, tag: String, e: Throwable?) {\n                    }\n\n                    override fun error(msg: String, e: Throwable?, tag: String) {\n                    }\n\n                    override fun info(msg: String, tag: String, e: Throwable?) {\n                    }\n\n                    override fun warning(msg: String, tag: String, e: Throwable?) {\n                    }\n\n                    override fun debug(tag: String, e: Throwable?, message: () -> String) {\n\n                    }\n\n                }\n            }\n\n        }, WordFilterConfigCache(), Dispatchers.Default)\n    }\n\n    @Test\n    fun saveAndGet() {\n        val config = WordFilterConfig(\n            listOf(\n                FilterConditionType.Normal(listOf(\"hoge\", \"fizz\", \"panta\")),\n                FilterConditionType.Normal(listOf(\"piyo\", \"buzz\")),\n                FilterConditionType.Normal(listOf(\"fuga\", \"moga\")),\n                FilterConditionType.Regex(\"\\\\hogepiyo\\\\\")\n            )\n        )\n        runBlocking {\n            repository.save(config).getOrThrow()\n            Assert.assertEquals(config, repository.get().getOrThrow())\n\n        }\n\n    }\n}"
  },
  {
    "path": "modules/data/src/androidTest/java/net/pantasystem/milktea/data/infrastructure/settings/LocalConfigRepositoryImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.settings\n\nimport android.content.Context\nimport androidx.test.core.app.ApplicationProvider\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.common.getPreferences\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.Theme\nimport org.junit.Assert\nimport org.junit.Before\nimport org.junit.Test\n\nclass LocalConfigRepositoryImplTest {\n\n    lateinit var localConfigRepository: LocalConfigRepository\n\n    @Before\n    fun setup() {\n        val context = ApplicationProvider.getApplicationContext<Context>()\n        localConfigRepository = LocalConfigRepositoryImpl(\n            sharedPreference = context.getPreferences()\n        )\n\n    }\n\n    @Test\n    fun get() {\n        val config = localConfigRepository.get().getOrThrow()\n        Assert.assertEquals(DefaultConfig.config, config)\n        val expect = config.copy(isPostButtonAtTheBottom = false, isClassicUI = true)\n        runBlocking {\n            localConfigRepository.save(expect).getOrThrow()\n        }\n        Assert.assertEquals(expect, localConfigRepository.get().getOrThrow())\n    }\n\n    @Test\n    fun save() {\n        val expect = DefaultConfig.config.copy(\n            isPostButtonAtTheBottom = false,\n            isClassicUI = true,\n            noteExpandedHeightSize = 100,\n            theme = Theme.Black\n        )\n        runBlocking {\n            localConfigRepository.save(expect).getOrThrow()\n        }\n        Assert.assertEquals(expect, localConfigRepository.get().getOrThrow())\n    }\n}"
  },
  {
    "path": "modules/data/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n</manifest>"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/api/NodeInfoAPIBuilder.kt",
    "content": "package net.pantasystem.milktea.data.api\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.activitypub.NodeInfoAPI\nimport net.pantasystem.milktea.api.activitypub.WellKnownNodeInfoAPI\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport okhttp3.MediaType.Companion.toMediaType\nimport retrofit2.Retrofit\nimport javax.inject.Inject\n\nclass NodeInfoAPIBuilderImpl @Inject constructor(\n    val okHttpClientProvider: OkHttpClientProvider,\n) : NodeInfoAPIBuilder {\n\n    val json = Json {\n        ignoreUnknownKeys = true\n    }\n\n    @OptIn(ExperimentalSerializationApi::class)\n    override fun build(): NodeInfoAPI {\n        val okHttp = okHttpClientProvider.get()\n        return Retrofit.Builder()\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttp)\n            .baseUrl(\"https://example.com/\") // NOTE: 任意のURLを指定しないと怒られる\n            .build()\n            .create(NodeInfoAPI::class.java)\n    }\n\n    @OptIn(ExperimentalSerializationApi::class)\n    override fun buildWellKnown(baseUrl: String): WellKnownNodeInfoAPI {\n        val okHttp = okHttpClientProvider.get()\n        return Retrofit.Builder()\n            .baseUrl(baseUrl)\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttp)\n            .build()\n            .create(WellKnownNodeInfoAPI::class.java)\n    }\n}\n\ninterface NodeInfoAPIBuilder {\n    fun buildWellKnown(baseUrl: String): WellKnownNodeInfoAPI\n\n    fun build(): NodeInfoAPI\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/api/mastodon/MastodonAPIFactory.kt",
    "content": "package net.pantasystem.milktea.data.api.mastodon\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.mastodon.MastodonAPI\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport okhttp3.MediaType.Companion.toMediaType\nimport okhttp3.OkHttpClient\nimport retrofit2.Retrofit\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MastodonAPIFactory @Inject constructor(\n    val okHttpProvider: OkHttpClientProvider,\n){\n\n    val json = Json { ignoreUnknownKeys = true }\n\n    private val sharedOkHttp = okHttpProvider.get()\n\n    private var okHttpClientMap = mapOf<MastodonAPIProvider.Key, OkHttpClient>()\n\n    @OptIn(ExperimentalSerializationApi::class)\n    fun build(baseURL: String, token: String?): MastodonAPI {\n        val okHttp = getOkHttp(baseURL, token)\n        return Retrofit.Builder()\n            .baseUrl(baseURL)\n            .addConverterFactory(json.asConverterFactory(\"application/json\".toMediaType()))\n            .client(okHttp)\n            .build()\n            .create(MastodonAPI::class.java)\n\n    }\n\n    fun getOkHttp(baseURL: String, token: String?): OkHttpClient {\n        return if (token == null) {\n            sharedOkHttp\n        } else {\n            synchronized(this) {\n                val key = MastodonAPIProvider.Key(instanceBaseURL = baseURL, token = token)\n                var client = okHttpClientMap[key]\n                if (client == null) {\n                    client = okHttpProvider.get().newBuilder()\n                        .addInterceptor {\n                            val request = it.request()\n                            val newReq = request.newBuilder()\n                                .header(\"Authorization\", \"Bearer $token\")\n                                .build()\n                            it.proceed(newReq)\n                        }.build()\n                    okHttpClientMap = okHttpClientMap + (key to client)\n                }\n                client\n\n            }\n\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/api/mastodon/MastodonAPIProvider.kt",
    "content": "package net.pantasystem.milktea.data.api.mastodon\n\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.mastodon.MastodonAPI\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MastodonAPIProvider @Inject constructor(\n    private val mastodonAPIFactory: MastodonAPIFactory,\n){\n\n    data class Key(\n        val instanceBaseURL: String,\n        val token: String?,\n    )\n\n    private val lock = Mutex()\n    private val apiMap = mutableMapOf<Key, MastodonAPI>()\n    suspend fun get(baseURL: String): MastodonAPI {\n        return lock.withLock {\n            var api = apiMap[Key(baseURL, null)]\n            if (api != null) {\n                return api\n            }\n            api = mastodonAPIFactory.build(baseURL, null)\n            apiMap[Key(baseURL, null)] = api\n            return@withLock api\n        }\n    }\n\n    suspend fun get(account: Account): MastodonAPI {\n        if (account.instanceType == Account.InstanceType.MISSKEY) {\n            throw IllegalArgumentException(\"アカウント種別Misskeyは受け入れていません\")\n        }\n        return get(account.normalizedInstanceUri, account.token)\n\n    }\n\n    suspend fun get(baseURL: String, token: String): MastodonAPI {\n\n        val key = Key(baseURL, token)\n        lock.withLock {\n            var api = apiMap[key]\n            if (api != null) {\n                return api\n            }\n            api = mastodonAPIFactory.build(baseURL, token)\n            apiMap[key] = api\n            return api\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/api/misskey/MisskeyAPIProvider.kt",
    "content": "package net.pantasystem.milktea.data.api.misskey\n\n\nimport net.pantasystem.milktea.api.misskey.MisskeyAPI\nimport net.pantasystem.milktea.api.misskey.MisskeyAPIServiceBuilder\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * MisskeyAPIとBaseURLとVersionをいい感じに管理する\n */\n@Singleton\nclass MisskeyAPIProvider @Inject constructor(\n    val misskeyAPIServiceBuilder: MisskeyAPIServiceBuilder\n){\n\n\n    private val baseURLAndMisskeyAPI = mutableMapOf<String, MisskeyAPI>()\n\n    fun get(baseURL: String): MisskeyAPI {\n        synchronized(baseURLAndMisskeyAPI) {\n            var api = baseURLAndMisskeyAPI[baseURL]\n\n            // NOTE BaseURLに対応するインスタンスが生成されていない＆＆鯖のバージョンに対応するインスタンスが生成されていなければ生成する\n            if(api == null) {\n                api = misskeyAPIServiceBuilder.build(baseURL)\n            }\n            baseURLAndMisskeyAPI[baseURL] = api\n            return api\n        }\n    }\n\n    fun get(account: Account): MisskeyAPI {\n        return get(account.normalizedInstanceUri)\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/ClipDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport net.pantasystem.milktea.api.misskey.clip.ClipDTO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.clip.Clip\nimport net.pantasystem.milktea.model.clip.ClipId\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass ClipDTOEntityConverter @Inject constructor(\n    val userDTOEntityConverter: UserDTOEntityConverter,\n    val userDataSource: UserDataSource,\n) {\n    suspend fun convert(account: Account, clipDTO: ClipDTO): Clip {\n        userDataSource.add(userDTOEntityConverter.convert(account, clipDTO.user))\n        return Clip(\n            id = ClipId(account.accountId, clipDTO.id),\n            name = clipDTO.name,\n            description = clipDTO.description,\n            createdAt = clipDTO.createdAt,\n            isPublic = clipDTO.isPublic,\n            userId = User.Id(account.accountId, clipDTO.userId)\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/FilePropertyDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport net.pantasystem.milktea.api.misskey.drive.FilePropertyDTO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass FilePropertyDTOEntityConverter @Inject constructor() {\n\n    suspend fun convert(filePropertyDTO: FilePropertyDTO, account: Account): FileProperty {\n        return FileProperty(\n            id = FileProperty.Id(account.accountId, filePropertyDTO.id),\n            name = filePropertyDTO.name,\n            createdAt = filePropertyDTO.createdAt,\n            type = filePropertyDTO.type,\n            md5 = filePropertyDTO.md5,\n            size = filePropertyDTO.size ?: 0,\n            userId = filePropertyDTO.userId?.let { User.Id(account.accountId, filePropertyDTO.userId!!) },\n            folderId = filePropertyDTO.folderId,\n            comment = filePropertyDTO.comment,\n            isSensitive = filePropertyDTO.isSensitive ?: false,\n            url = filePropertyDTO.getUrl(account.normalizedInstanceUri),\n            thumbnailUrl = filePropertyDTO.getThumbnailUrl(account.normalizedInstanceUri),\n            blurhash = filePropertyDTO.blurhash,\n            properties = filePropertyDTO.properties?.let {\n                FileProperty.Properties(it.width, it.height)\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/GalleryPostDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass GalleryPostDTOEntityConverter @Inject constructor(\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val userDataSource: net.pantasystem.milktea.model.user.UserDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n) {\n\n    suspend fun convert(\n        galleryPostDTO: net.pantasystem.milktea.api.misskey.v12_75_0.GalleryPost,\n        account: Account\n    ): GalleryPost {\n        filePropertyDataSource.addAll(galleryPostDTO.files.map {\n            filePropertyDTOEntityConverter.convert(it, account)\n        })\n        // NOTE: API上ではdetailだったが実際に受信されたデータはSimpleだったのでfalse\n        userDataSource.add(userDTOEntityConverter.convert(account, galleryPostDTO.user, false))\n        if (galleryPostDTO.likedCount == null || galleryPostDTO.isLiked == null) {\n            return GalleryPost.Normal(\n                GalleryPost.Id(account.accountId, galleryPostDTO.id),\n                galleryPostDTO.createdAt,\n                galleryPostDTO.updatedAt,\n                galleryPostDTO.title,\n                galleryPostDTO.description,\n                User.Id(account.accountId, galleryPostDTO.userId),\n                galleryPostDTO.files.map {\n                    FileProperty.Id(account.accountId, it.id)\n                },\n                galleryPostDTO.tags ?: emptyList(),\n                galleryPostDTO.isSensitive\n            )\n        } else {\n            return GalleryPost.Authenticated(\n                GalleryPost.Id(account.accountId, galleryPostDTO.id),\n                galleryPostDTO.createdAt,\n                galleryPostDTO.updatedAt,\n                galleryPostDTO.title,\n                galleryPostDTO.description,\n                User.Id(account.accountId, galleryPostDTO.userId),\n                galleryPostDTO.files.map {\n                    FileProperty.Id(account.accountId, it.id)\n                },\n                galleryPostDTO.tags ?: emptyList(),\n                galleryPostDTO.isSensitive,\n                galleryPostDTO.likedCount ?: 0,\n                galleryPostDTO.isLiked ?: false\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/MastodonAccountDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.instance.ticker.InstanceTickerRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MastodonAccountDTOEntityConverter @Inject constructor(\n    private val instanceTickerRepository: InstanceTickerRepository,\n    private val coroutineScope: CoroutineScope,\n    loggerFactory: Logger.Factory\n) {\n\n    private val logger = loggerFactory.create(\"AccountDTOEntityConverter\")\n\n    suspend fun convert(account: Account, dto: MastodonAccountDTO, related: User.Related? = null): User {\n        val host = dto.acct.split(\"@\").getOrNull(1) ?: account.getHost()\n        val isSameHost = dto.acct.split(\"@\").getOrNull(1) == null\n                || dto.acct.split(\"@\").getOrNull(1) == account.getHost()\n\n        coroutineScope.launch {\n            if (!isSameHost) {\n                instanceTickerRepository.find(host).onFailure {\n                    logger.error(\"Failed to find instance ticker\", it)\n                }\n            }\n        }\n\n        return User.Detail(\n            User.Id(account.accountId, dto.id),\n            userName = dto.username,\n            name = dto.displayName,\n            avatarUrl = dto.avatar,\n            emojis = dto.emojis.map {\n                CustomEmoji(\n                    name = it.shortcode,\n                    uri = it.url,\n                    url = it.url,\n                    category = it.category,\n                )\n            },\n            host = host,\n            isBot = dto.bot,\n            isCat = false,\n            nickname = null,\n            isSameHost = isSameHost,\n            instance = if (isSameHost) null else instanceTickerRepository.get(host).mapCatching { instanceTicker ->\n                instanceTicker?.takeIf {\n                    it.isValid()\n                }?.let {\n                    User.InstanceInfo(\n                        name = it.name,\n                        faviconUrl = it.faviconUrl,\n                        iconUrl = it.iconUrl,\n                        softwareName = it.softwareName,\n                        softwareVersion = it.softwareVersion,\n                        themeColor = it.themeColor,\n                    )\n                }\n            }.getOrNull(),\n            avatarBlurhash = null,\n            info = User.Info(\n                followersCount = dto.followersCount.toInt(),\n                followingCount = dto.followingCount.toInt(),\n                notesCount = dto.statusesCount.toInt(),\n                hostLower = null,\n                pinnedNoteIds = null,\n                bannerUrl = dto.header,\n                url = dto.url,\n                isLocked = dto.locked,\n                birthday = null,\n                fields = emptyList(),\n                createdAt = dto.createdAt,\n                updatedAt = null,\n                isPublicReactions = false,\n                description = dto.note,\n                ffVisibility = null,\n            ),\n            related = related,\n            badgeRoles = emptyList(),\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/NoteDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteVisibilityType\nimport net.pantasystem.milktea.api.misskey.notes.PollDTO\nimport net.pantasystem.milktea.api.misskey.notes.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioDataSource\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParser\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.EmojiResolvedType\nimport net.pantasystem.milktea.model.image.ImageCache\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass NoteDTOEntityConverter @Inject constructor(\n    private val customEmojiAspectRatioDataSource: CustomEmojiAspectRatioDataSource,\n    private val imageCacheRepository: ImageCacheRepository,\n    private val instanceInfoService: InstanceInfoService,\n    private val customEmojiRepository: CustomEmojiRepository,\n) {\n\n    suspend fun convertAll(\n        account: Account,\n        noteDTOs: List<NoteDTO>,\n        instanceInfoType: InstanceInfoType? = null,\n        instanceEmojis: Map<String, CustomEmoji>? = null,\n    ): List<Note> {\n        val emojis = noteDTOs.flatMap {\n            it.emojiList + (it.reactionEmojiList)\n        }\n        val instanceInfo = instanceInfoType?.takeIf {\n            it.uri == account.normalizedInstanceUri\n        } ?: instanceInfoService.find(account.normalizedInstanceUri).getOrNull()\n\n        val aspects = customEmojiAspectRatioDataSource.findIn(emojis.mapNotNull {\n            it.url ?: it.uri\n        }).getOrElse {\n            emptyList()\n        }.associate {\n            it.uri to it.aspectRatio\n        }\n        val fileCaches = imageCacheRepository.findBySourceUrls(emojis.mapNotNull {\n            it.url ?: it.uri\n        }).getOrElse { emptyList() }.associateBy {\n            it.sourceUrl\n        }\n\n        val allEmojis =\n            instanceEmojis ?: customEmojiRepository.findAndConvertToMap(account.getHost())\n                .getOrElse { emptyMap() }\n\n        return noteDTOs.map {\n            convert(\n                account = account,\n                noteDTO = it,\n                instanceInfoType = instanceInfo,\n                aspects = aspects,\n                fileCaches = fileCaches,\n                instanceEmojis = allEmojis,\n            )\n        }\n    }\n\n    suspend fun convert(\n        account: Account,\n        noteDTO: NoteDTO,\n        instanceInfoType: InstanceInfoType? = null,\n        instanceEmojis: Map<String, CustomEmoji>? = null,\n    ): Note {\n        val emojis = noteDTO.emojiList\n\n        val aspects = customEmojiAspectRatioDataSource.findIn(emojis.mapNotNull {\n            it.url ?: it.uri\n        }).getOrElse {\n            emptyList()\n        }.associate {\n            it.uri to it.aspectRatio\n        }\n        val fileCaches = imageCacheRepository.findBySourceUrls(emojis.mapNotNull {\n            it.url ?: it.uri\n        }).getOrElse { emptyList() }.associateBy {\n            it.sourceUrl\n        }\n        val info =\n            instanceInfoType ?: instanceInfoService.find(account.normalizedInstanceUri).getOrNull()\n\n        return convert(\n            account = account,\n            noteDTO = noteDTO,\n            instanceInfoType = info,\n            aspects = aspects,\n            fileCaches = fileCaches,\n            instanceEmojis = instanceEmojis\n        )\n    }\n\n    private suspend fun convert(\n        account: Account,\n        noteDTO: NoteDTO,\n        instanceInfoType: InstanceInfoType? = null,\n        aspects: Map<String, Float>,\n        fileCaches: Map<String, ImageCache>,\n        instanceEmojis: Map<String, CustomEmoji>? = null,\n    ): Note {\n        val isRequireNyaize = (instanceInfoType?.isRequirePerformNyaizeFrontend ?: false)\n                && (noteDTO.user.isCat ?: false)\n        val visibility = Visibility(\n            noteDTO.visibility ?: NoteVisibilityType.Public,\n            isLocalOnly = noteDTO.localOnly ?: false,\n            visibleUserIds = noteDTO.visibleUserIds?.map { id ->\n                User.Id(account.accountId, id)\n            } ?: emptyList()\n        )\n\n        val reactionCounts = noteDTO.reactionCounts?.map {\n            ReactionCount(\n                reaction = it.key,\n                count = it.value,\n                me = noteDTO.myReaction == it.key\n            )\n        } ?: emptyList()\n\n        val noteEmojis = getEmojis(\n            account = account,\n            noteDTO = noteDTO,\n            aspects = aspects,\n            fileCaches = fileCaches,\n            instanceEmojis = instanceEmojis\n        )\n\n        val emojiNameMap = noteEmojis.associateBy {\n            it.name\n        }\n\n        return Note(\n            id = Note.Id(account.accountId, noteDTO.id),\n            createdAt = noteDTO.createdAt,\n            text = noteDTO.text,\n            cw = noteDTO.cw,\n            userId = User.Id(account.accountId, noteDTO.userId),\n            replyId = noteDTO.replyId?.let { Note.Id(account.accountId, noteDTO.replyId!!) },\n            renoteId = noteDTO.renoteId?.let { Note.Id(account.accountId, noteDTO.renoteId!!) },\n            viaMobile = noteDTO.viaMobile,\n            visibility = visibility,\n            localOnly = noteDTO.localOnly,\n            emojis = noteEmojis,\n            fileIds = noteDTO.fileIds?.map { FileProperty.Id(account.accountId, it) },\n            poll = noteDTO.poll?.toPoll(),\n            reactionCounts = reactionCounts,\n            renoteCount = noteDTO.renoteCount,\n            repliesCount = noteDTO.replyCount,\n            uri = noteDTO.uri,\n            url = noteDTO.url,\n            visibleUserIds = noteDTO.visibleUserIds?.map {\n                User.Id(account.accountId, it)\n            } ?: emptyList(),\n            myReaction = noteDTO.myReaction,\n            channelId = noteDTO.channelId?.let {\n                Channel.Id(account.accountId, it)\n            },\n            type = Note.Type.Misskey(\n                channel = noteDTO.channel?.let {\n                    Note.Type.Misskey.SimpleChannelInfo(\n                        id = Channel.Id(account.accountId, it.id),\n                        name = it.name\n                    )\n                },\n                isAcceptingOnlyLikeReaction = when (noteDTO.reactionAcceptance) {\n                    ReactionAcceptanceType.LikeOnly4Remote -> noteDTO.uri != null\n                    ReactionAcceptanceType.LikeOnly -> true\n                    ReactionAcceptanceType.NonSensitiveOnly -> false\n                    ReactionAcceptanceType.NonSensitiveOnly4LocalOnly4Remote -> false\n                    null -> false\n                },\n                isNotAcceptingSensitiveReaction = when (noteDTO.reactionAcceptance) {\n                    ReactionAcceptanceType.NonSensitiveOnly -> true\n                    ReactionAcceptanceType.NonSensitiveOnly4LocalOnly4Remote -> true\n                    else -> false\n                },\n                isRequireNyaize = isRequireNyaize,\n            ),\n            maxReactionsPerAccount = 1,\n            emojiNameMap = emojiNameMap,\n        )\n    }\n\n    /**\n     * 表示するときにカスタム絵文字の取捨選択する処理は面倒なので、\n     * この段階で紐づくカスタム絵文字を選出して紐づけておく\n     */\n    private suspend fun getEmojis(\n        account: Account,\n        noteDTO: NoteDTO,\n        aspects: Map<String, Float>,\n        fileCaches: Map<String, ImageCache>,\n        instanceEmojis: Map<String, CustomEmoji>?,\n    ): List<CustomEmoji> {\n        val emojis = noteDTO.emojiList\n        val emojiModels = emojis.map {\n            it.toModel(aspects[it.url ?: it.uri], fileCaches[it.url ?: it.uri]?.cachePath)\n        }\n\n        val emojiModelsMap = emojiModels.associateBy {\n            it.name\n        }\n\n        val emojisResultInText = CustomEmojiParser.parse(\n            sourceHost = noteDTO.user.host ?: account.getHost(),\n            emojiMap = emojiModelsMap,\n            text = noteDTO.text ?: \"\",\n            instanceEmojis = instanceEmojis,\n        )\n\n        val emojisResultInCw = CustomEmojiParser.parse(\n            sourceHost = noteDTO.user.host ?: account.getHost(),\n            emojiMap = emojiModelsMap,\n            text = noteDTO.cw ?: \"\",\n            instanceEmojis = instanceEmojis,\n        )\n        val emojisInText = emojisResultInText.emojis.mapNotNull {\n            (it.result as? EmojiResolvedType.Resolved?)?.emoji\n        }\n\n        val emojisInCw = emojisResultInCw.emojis.mapNotNull {\n            (it.result as? EmojiResolvedType.Resolved?)?.emoji\n        }\n\n        val reactions = noteDTO.reactionCounts?.map {\n            Reaction(it.key)\n        }?.filter {\n            it.isCustomEmojiFormat()\n        }\n        val remoteReactionEmojis = reactions?.mapNotNull {\n            emojiModelsMap[it.reaction.replace(\":\", \"\")]\n                ?: instanceEmojis?.get(it.getName())\n        } ?: emptyList()\n\n        val localReactionEmojis = customEmojiRepository.findByNames(\n            account.getHost(),\n            reactions?.mapNotNull {\n                it.getName()\n            } ?: emptyList()\n        ).getOrElse { emptyList() }\n\n        val noteEmojis = if (instanceEmojis == null) {\n            val unresolvedEmojiTags = emojisResultInText.emojis.mapNotNull {\n                (it.result as? EmojiResolvedType.UnResolved)?.tag\n            } + emojisResultInCw.emojis.mapNotNull {\n                (it.result as? EmojiResolvedType.UnResolved)?.tag\n            }\n            val reactionTags = noteDTO.reactionEmojiList.mapNotNull {\n                Reaction(it.name).getName()\n            }\n            customEmojiRepository.findByNames(\n                noteDTO.user.host ?: account.getHost(),\n                unresolvedEmojiTags + reactionTags\n            ).getOrElse {\n                emptyList()\n            }\n        } else {\n            emptyList()\n        } + emojisInCw + emojisInText + emojiModels + remoteReactionEmojis + localReactionEmojis\n\n        return noteEmojis\n    }\n}\n\nfun PollDTO?.toPoll(): Poll? {\n    return this?.let { dto ->\n        Poll(\n            multiple = dto.multiple,\n            expiresAt = dto.expiresAt,\n            choices = choices.mapIndexed { index, value ->\n                Poll.Choice(\n                    index = index,\n                    text = value.text,\n                    isVoted = value.isVoted,\n                    votes = value.votes\n                )\n            }\n        )\n    }\n}\n\n\n@Throws(IllegalArgumentException::class)\nfun Visibility(\n    type: NoteVisibilityType,\n    isLocalOnly: Boolean,\n    visibleUserIds: List<User.Id>? = null,\n): Visibility {\n    return when (type) {\n        NoteVisibilityType.Public -> Visibility.Public(isLocalOnly)\n        NoteVisibilityType.Followers -> Visibility.Followers(isLocalOnly)\n        NoteVisibilityType.Home -> Visibility.Home(isLocalOnly)\n        NoteVisibilityType.Specified -> Visibility.Specified(visibleUserIds ?: emptyList())\n        else -> Visibility.Public(isLocalOnly)\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/NotificationDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport net.pantasystem.milktea.api.misskey.notification.NotificationDTO\nimport net.pantasystem.milktea.data.infrastructure.toGroup\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.group.InvitationId\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.notification.FollowNotification\nimport net.pantasystem.milktea.model.notification.FollowRequestAcceptedNotification\nimport net.pantasystem.milktea.model.notification.GroupInvitedNotification\nimport net.pantasystem.milktea.model.notification.MentionNotification\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.PollEndedNotification\nimport net.pantasystem.milktea.model.notification.PollVoteNotification\nimport net.pantasystem.milktea.model.notification.PostNotification\nimport net.pantasystem.milktea.model.notification.QuoteNotification\nimport net.pantasystem.milktea.model.notification.ReactionNotification\nimport net.pantasystem.milktea.model.notification.ReceiveFollowRequestNotification\nimport net.pantasystem.milktea.model.notification.RenoteNotification\nimport net.pantasystem.milktea.model.notification.ReplyNotification\nimport net.pantasystem.milktea.model.notification.UnknownNotification\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass NotificationDTOEntityConverter @Inject constructor(\n    private val noteDTOEntityConverter: NoteDTOEntityConverter\n) {\n    suspend fun convert(\n        notificationDTO: NotificationDTO,\n        account: Account,\n    ): Notification {\n        val id = Notification.Id(account.accountId, notificationDTO.id)\n        return when (notificationDTO.type) {\n            \"follow\" -> {\n                FollowNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"followRequestAccepted\" -> {\n                FollowRequestAcceptedNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"receiveFollowRequest\" -> {\n                ReceiveFollowRequestNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"mention\" -> {\n                MentionNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    Note.Id(\n                        account.accountId,\n                        notificationDTO.note?.id ?: throw IllegalStateException(\"noteId参照不能\")\n                    ),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"reply\" -> {\n                ReplyNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    Note.Id(\n                        account.accountId,\n                        notificationDTO.note?.id ?: throw IllegalStateException(\"noteId参照不能\")\n                    ),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"renote\" -> {\n                RenoteNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    Note.Id(\n                        account.accountId,\n                        notificationDTO.note?.id ?: throw IllegalStateException(\"noteId参照不能\")\n                    ),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"quote\" -> {\n                QuoteNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    Note.Id(\n                        account.accountId,\n                        notificationDTO.note?.id ?: throw IllegalStateException(\"noteId参照不能\")\n                    ),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"reaction\" -> {\n\n                require(notificationDTO.reaction != null) {\n                    \"想定しないデータ=$notificationDTO\"\n                }\n                require(notificationDTO.note != null)\n                val n = noteDTOEntityConverter.convert(account, notificationDTO.note!!)\n                ReactionNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    n.id,\n                    notificationDTO.reaction!!,\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"pollVote\" -> {\n                require(notificationDTO.noteId != null || notificationDTO.note != null)\n                require(notificationDTO.choice != null)\n                PollVoteNotification(\n                    id,\n                    Note.Id(\n                        account.accountId,\n                        notificationDTO.noteId ?: notificationDTO.note?.id!!\n                    ),\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    notificationDTO.choice!!,\n                    notificationDTO.isRead ?: true\n                )\n            }\n            \"pollEnded\", \"poll_finished\" -> {\n                require(notificationDTO.note != null)\n                PollEndedNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    isRead = notificationDTO.isRead ?: true,\n                    Note.Id(account.accountId, notificationDTO.note!!.id)\n                )\n            }\n            \"groupInvited\" -> {\n                require(notificationDTO.invitation != null)\n                require(notificationDTO.userId != null)\n                GroupInvitedNotification(\n                    id,\n                    isRead = notificationDTO.isRead ?: true,\n                    notificationDTO.createdAt,\n                    group = notificationDTO.invitation!!.group.toGroup(account.accountId),\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    InvitationId(account.accountId, notificationDTO.invitation!!.id),\n                )\n            }\n            \"note\" -> {\n                PostNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    User.Id(account.accountId, notificationDTO.userId!!),\n                    Note.Id(\n                        account.accountId,\n                        notificationDTO.note?.id ?: throw IllegalStateException(\"noteId参照不能\")\n                    ),\n                    notificationDTO.isRead ?: true\n                )\n            }\n            else -> {\n                return UnknownNotification(\n                    id,\n                    notificationDTO.createdAt,\n                    notificationDTO.isRead ?: false,\n                    notificationDTO.userId?.let { User.Id(account.accountId, notificationDTO.userId!!) },\n                    notificationDTO.type\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/TootDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.infrastructure.toPoll\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.image.ImageCache\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfo\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfoRepository\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass TootDTOEntityConverter @Inject constructor(\n    private val instanceInfoRepository: MastodonInstanceInfoRepository,\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val imageCacheRepository: ImageCacheRepository,\n    private val loggerFactory: Logger.Factory,\n) {\n\n    private val logger by lazy {\n        loggerFactory.create(\"TootDTOEntityConverter\")\n    }\n\n    suspend fun convertAll(account: Account, statusDTOs: List<TootStatusDTO>): List<Note> {\n        val nodeInfo = nodeInfoRepository.find(account.getHost()).getOrNull()\n        val instanceInfo = instanceInfoRepository.find(account.normalizedInstanceUri)\n        val isReactionAvailable = (instanceInfo.onFailure {\n            logger.error(\"Failed to find instance info\", it)\n        }.getOrNull()?.isReactionAvailable ?: false) || nodeInfo?.type is NodeInfo.SoftwareType.Mastodon.Fedibird || nodeInfo?.type is NodeInfo.SoftwareType.Mastodon.Kmyblue\n\n        val urls = statusDTOs.flatMap { statusDTO ->\n            (statusDTO.emojiReactions?.mapNotNull {\n                it.url\n            }?: emptyList()) + (statusDTO.emojiReactions?.mapNotNull {\n                it.url\n            }?: emptyList())\n        }\n        val imageCaches = imageCacheRepository.findBySourceUrls(urls).getOrElse { emptyList() }.associateBy {\n            it.sourceUrl\n        }\n        return statusDTOs.map {\n            convert(account, it, instanceInfo, isReactionAvailable, imageCaches)\n        }\n    }\n\n    suspend fun convert(statusDTO: TootStatusDTO, account: Account): Note {\n        val nodeInfo = nodeInfoRepository.find(account.getHost()).getOrNull()\n        val instanceInfoResult = instanceInfoRepository.find(account.normalizedInstanceUri)\n        val isReactionAvailable = (instanceInfoResult\n            .onFailure {\n                logger.error(\"Failed to find instance info\", it)\n            }\n            .getOrNull()?.isReactionAvailable\n            ?: false) || nodeInfo?.type is NodeInfo.SoftwareType.Mastodon.Fedibird\n                || nodeInfo?.type is NodeInfo.SoftwareType.Mastodon.Kmyblue\n\n        val urls = (statusDTO.emojiReactions?.mapNotNull {\n            it.url\n        }?: emptyList()) + (statusDTO.emojiReactions?.mapNotNull {\n            it.url\n        }?: emptyList())\n        val imageCaches = imageCacheRepository.findBySourceUrls(urls).getOrElse { emptyList() }.associateBy {\n            it.sourceUrl\n        }\n        return convert(\n            account = account,\n            statusDTO = statusDTO,\n            instanceInfoResult = instanceInfoResult,\n            isReactionAvailable = isReactionAvailable,\n            imageCaches = imageCaches,\n        )\n    }\n\n    private fun convert(\n        account: Account,\n        statusDTO: TootStatusDTO,\n        instanceInfoResult: Result<MastodonInstanceInfo>,\n        isReactionAvailable: Boolean,\n        imageCaches: Map<String, ImageCache>,\n    ): Note {\n        return with(statusDTO) {\n            val emojis = emojis.map {\n                it.toEmoji(imageCaches[it.url]?.cachePath)\n            } + (emojiReactions?.mapNotNull {\n                it.getEmoji(imageCaches[it.url]?.cachePath)\n            } ?: emptyList())\n            Note(\n                id = Note.Id(account.accountId, id),\n                text = this.content,\n                cw = this.spoilerText.takeIf {\n                    it.isNotBlank()\n                },\n                userId = User.Id(account.accountId, this.account.id),\n                replyId = this.inReplyToId?.let { Note.Id(account.accountId, this.inReplyToId!!) },\n                renoteId = this.quote?.id?.let { Note.Id(account.accountId, it) }\n                    ?: this.reblog?.id?.let { Note.Id(account.accountId, this.reblog?.id!!) },\n                viaMobile = null,\n                visibility = net.pantasystem.milktea.data.infrastructure.Visibility(\n                    visibility,\n                    circleId,\n                    visibilityEx\n                ),\n                localOnly = null,\n                emojis = emojis,\n                reactionCounts = emojiReactions?.map {\n                    ReactionCount(\n                        reaction = it.reaction,\n                        count = it.count,\n                        me = it.me ?: false,\n                    )\n                } ?: emptyList(),\n                repliesCount = repliesCount,\n                renoteCount = reblogsCount,\n                uri = this.uri,\n                url = this.url,\n                visibleUserIds = emptyList(),\n                myReaction = emojiReactions?.firstOrNull {\n                    it.myReaction() != null\n                }?.myReaction(),\n                channelId = null,\n                createdAt = createdAt,\n                fileIds = mediaAttachments.map {\n                    FileProperty.Id(account.accountId, it.id)\n                },\n                poll = poll.toPoll(),\n                maxReactionsPerAccount = instanceInfoResult.getOrNull()?.maxReactionsPerAccount ?: 0,\n                type = Note.Type.Mastodon(\n                    favorited = favourited,\n                    reblogged = reblogged,\n                    bookmarked = bookmarked,\n                    muted = muted,\n                    favoriteCount = favouritesCount,\n                    tags = tags?.map {\n                        it.toModel()\n                    } ?: emptyList(),\n                    mentions = mentions?.map {\n                        it.toModel()\n                    } ?: emptyList(),\n                    isFedibirdQuote = quote != null,\n                    pollId = poll?.id,\n                    isSensitive = sensitive,\n                    pureText = text,\n                    isReactionAvailable = isReactionAvailable\n                ),\n                emojiNameMap = emojis.associateBy { it.name }\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/converters/UserDTOEntityConverter.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioDataSource\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParser\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.EmojiResolvedType\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UserDTOEntityConverter @Inject constructor(\n    private val customEmojiRepository: CustomEmojiRepository,\n    private val customEmojiAspectRatioDataSource: CustomEmojiAspectRatioDataSource,\n    private val imageCacheRepository: ImageCacheRepository,\n) {\n\n    suspend fun convert(account: Account, userDTO: UserDTO, isDetail: Boolean = false, instanceEmojis: Map<String, CustomEmoji>? = null): User {\n        val instanceInfo = userDTO.instance?.let {\n            User.InstanceInfo(\n                name = it.name,\n                faviconUrl = it.faviconUrl,\n                iconUrl = it.iconUrl,\n                softwareName = it.softwareName,\n                softwareVersion = it.softwareVersion,\n                themeColor = it.themeColor\n            )\n        }\n\n        val urls = userDTO.emojiList?.mapNotNull {\n            it.url ?: it.uri\n        } ?: emptyList()\n        val aspects = customEmojiAspectRatioDataSource.findIn(urls).getOrElse {\n            emptyList()\n        }.associateBy {\n            it.uri\n        }\n        val fileCaches = imageCacheRepository.findBySourceUrls(urls).getOrElse { emptyList() }.associateBy {\n            it.sourceUrl\n        }\n\n        var emojis = userDTO.emojiList?.map {\n            it.toModel(\n                aspects[it.url ?: it.uri]?.aspectRatio,\n                cachePath = fileCaches[it.url ?: it.uri]?.cachePath\n            )\n        } ?: emptyList()\n\n        val parsedResult = CustomEmojiParser.parse(\n            userDTO.host ?: account.getHost(),\n            emojis,\n            userDTO.name ?: userDTO.userName,\n            instanceEmojis ?: customEmojiRepository.getAndConvertToMap(account.getHost()),\n        )\n\n        val resolvedEmojis = parsedResult.emojis.mapNotNull {\n            (it.result as? EmojiResolvedType.Resolved)?.emoji\n        }\n        val finallyResolvedEmojis = if (instanceEmojis == null) {\n            val tags = parsedResult.emojis.mapNotNull {\n                it.result as? EmojiResolvedType.UnResolved\n            }.map {\n                it.tag\n            }\n            customEmojiRepository.findByNames(userDTO.host ?: account.getHost(), tags).getOrElse {\n                emptyList()\n            } + resolvedEmojis\n        } else {\n            resolvedEmojis\n        }\n\n        emojis = (emojis + finallyResolvedEmojis).distinctBy {\n            it.name to it.host to it.url to it.uri\n        }\n\n        val badgeRoles = userDTO.badgeRoles?.mapIndexed { index, role ->\n            User.BadgeRole(\n                name = role.name,\n                iconUri = role.iconUrl,\n                displayOrder = role.displayOrder ?: ((userDTO.badgeRoles?.size ?: 0) - index)\n            )\n        }?.sortedByDescending {\n            it.displayOrder\n        } ?: emptyList()\n\n        if (isDetail) {\n            return User.Detail(\n                id = User.Id(account.accountId, userDTO.id),\n                avatarUrl = userDTO.avatarUrl,\n                emojis = emojis,\n                isBot = userDTO.isBot,\n                isCat = userDTO.isCat,\n                name = userDTO.name,\n                userName = userDTO.userName,\n                host = userDTO.host ?: account.getHost(),\n                nickname = null,\n                isSameHost = userDTO.host == null,\n                instance = instanceInfo,\n                avatarBlurhash = userDTO.avatarBlurhash,\n                info = User.Info(\n                    bannerUrl = userDTO.bannerUrl,\n                    description = userDTO.description,\n                    followersCount = userDTO.followersCount,\n                    followingCount = userDTO.followingCount,\n                    url = userDTO.url,\n                    hostLower = userDTO.hostLower,\n                    notesCount = userDTO.notesCount,\n                    pinnedNoteIds = userDTO.pinnedNoteIds?.map {\n                        Note.Id(account.accountId, it)\n                    },\n                    isLocked = userDTO.isLocked ?: false,\n                    birthday = userDTO.birthday,\n                    createdAt = userDTO.createdAt,\n                    updatedAt = userDTO.updatedAt,\n                    fields = userDTO.fields?.map {\n                        User.Field(it.name, it.value)\n                    } ?: emptyList(),\n                    isPublicReactions = userDTO.publicReactions ?: false,\n                    ffVisibility = when (userDTO.followFollowerVisibility) {\n                        UserDTO.FollowFollowerVisibility.Public -> User.FollowerFollowerVisibility.Public\n                        UserDTO.FollowFollowerVisibility.Followers -> User.FollowerFollowerVisibility.Followers\n                        UserDTO.FollowFollowerVisibility.Private -> User.FollowerFollowerVisibility.Private\n                        null -> null\n                    },\n                ),\n                related = User.Related(\n                    isFollowing = userDTO.isFollowing ?: false,\n                    isFollower = userDTO.isFollowed ?: false,\n                    isBlocking = userDTO.isBlocking ?: false,\n                    isMuting = userDTO.isMuted ?: false,\n                    hasPendingFollowRequestFromYou = userDTO.hasPendingFollowRequestFromYou\n                        ?: false,\n                    hasPendingFollowRequestToYou = userDTO.hasPendingFollowRequestToYou ?: false,\n                    isNotify = userDTO.notifyState?.let {\n                        userDTO.notifyState == \"normal\"\n                    }\n                ),\n                badgeRoles = badgeRoles\n            )\n        } else {\n            return User.Simple(\n                id = User.Id(account.accountId, userDTO.id),\n                avatarUrl = userDTO.avatarUrl,\n                emojis = emojis,\n                isBot = userDTO.isBot,\n                isCat = userDTO.isCat,\n                name = userDTO.name,\n                userName = userDTO.userName,\n                host = userDTO.host ?: account.getHost(),\n                nickname = null,\n                isSameHost = userDTO.host == null,\n                instance = instanceInfo,\n                avatarBlurhash = userDTO.avatarBlurhash,\n                badgeRoles = badgeRoles\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/AccountModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport android.content.Context\nimport dagger.Binds\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineDispatcher\nimport net.pantasystem.milktea.common.Encryption\nimport net.pantasystem.milktea.common.getPreferences\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.account.AuthImpl\nimport net.pantasystem.milktea.data.infrastructure.account.ClientIdRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.account.SignOutUseCaseImpl\nimport net.pantasystem.milktea.data.infrastructure.account.db.MediatorAccountRepository\nimport net.pantasystem.milktea.data.infrastructure.account.db.RoomAccountRepository\nimport net.pantasystem.milktea.model.account.*\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject AccountModule {\n\n    @Provides\n    @Singleton\n    fun accountRepository(\n        @ApplicationContext context: Context,\n        @IODispatcher ioDispatcher: CoroutineDispatcher,\n        database: DataBase,\n        encryption: Encryption,\n    ): AccountRepository {\n        val preferences = context.getPreferences()\n        val roomAccountRepository = RoomAccountRepository(database, preferences, database.accountDAO(), database.pageDAO(), encryption)\n        return MediatorAccountRepository(roomAccountRepository, ioDispatcher)\n    }\n\n\n    @Singleton\n    @Provides\n    fun provideClientIdRepository(\n        @ApplicationContext context: Context,\n    ) : ClientIdRepository {\n        return ClientIdRepositoryImpl(context.getPreferences())\n    }\n}\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class AuthModule {\n\n    @Binds\n    @Singleton\n    abstract fun provideAuth(impl: AuthImpl): Auth\n\n    @Binds\n    @Singleton\n    abstract fun provideAuthById(impl: AuthImpl): AuthById\n\n    @Binds\n    @Singleton\n    abstract fun provideGetAccount(impl: AuthImpl): GetAccount\n\n    @Binds\n    @Singleton\n    abstract fun bindSignOutUseCase(impl: SignOutUseCaseImpl): SignOutUseCase\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/AntennaModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.antenna.AntennaRepositoryImpl\nimport net.pantasystem.milktea.model.antenna.AntennaRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class AntennaBindModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindAntennaRepository(impl: AntennaRepositoryImpl): AntennaRepository\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/ApResolverModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.ap.ApResolverRepositoryImpl\nimport net.pantasystem.milktea.model.ap.ApResolverRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class ApResolverModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindApResolverRepository(impl: ApResolverRepositoryImpl): ApResolverRepository\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/BookmarkModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.note.bookmark.BookmarkRepositoryImpl\nimport net.pantasystem.milktea.model.note.bookmark.BookmarkRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class BookmarkModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindBookmarkRepository(impl: BookmarkRepositoryImpl): BookmarkRepository\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/ChannelModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.channel.ChannelAPIAdapter\nimport net.pantasystem.milktea.data.infrastructure.channel.ChannelAPIAdapterWebImpl\nimport net.pantasystem.milktea.data.infrastructure.channel.ChannelRepositoryImpl\nimport net.pantasystem.milktea.model.channel.ChannelRepository\nimport net.pantasystem.milktea.model.channel.ChannelStateModel\nimport net.pantasystem.milktea.model.channel.ChannelStateModelOnMemory\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class ChannelModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindChannelStateModel(channelStateModel: ChannelStateModelOnMemory): ChannelStateModel\n\n    @Binds\n    @Singleton\n    abstract fun bindChannelRepository(channelRepositoryImpl: ChannelRepositoryImpl): ChannelRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindChannelAPIAdapter(channelAPIAdapter: ChannelAPIAdapterWebImpl): ChannelAPIAdapter\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/ClipModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.clip.ClipRepositoryImpl\nimport net.pantasystem.milktea.model.clip.ClipRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class ClipBindModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindClipRepository(impl: ClipRepositoryImpl): ClipRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/CustomEmojiModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiApiAdapterImpl\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiAspectRatioDataSourceImpl\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiRepositoryImpl\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioDataSource\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class CustomEmojiModule {\n\n    @Binds\n    internal abstract fun customEmojiApiAdapter(impl: CustomEmojiApiAdapterImpl): CustomEmojiApiAdapter\n\n    @Singleton\n    @Binds\n    internal abstract fun bindCustomEmojiRepository(impl: CustomEmojiRepositoryImpl): CustomEmojiRepository\n\n    @Singleton\n    @Binds\n    internal abstract fun bindAspectRatioDataSource(impl: CustomEmojiAspectRatioDataSourceImpl): CustomEmojiAspectRatioDataSource\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/DbModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport android.content.Context\nimport androidx.room.Room\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_10_11\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_1_2\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_2_3\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_3_4\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_4_5\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_51_52\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_57_58\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_5_6\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_6_7\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_7_8\nimport net.pantasystem.milktea.data.infrastructure.MIGRATION_8_10\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountDAO\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveFileRecordDao\nimport net.pantasystem.milktea.data.infrastructure.group.GroupDao\nimport net.pantasystem.milktea.data.infrastructure.instance.db.InstanceInfoDao\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MastodonInstanceInfoDAO\nimport net.pantasystem.milktea.data.infrastructure.list.UserListDao\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.db.NodeInfoDao\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftNoteDao\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history.ReactionHistoryDao\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSettingDao\nimport net.pantasystem.milktea.data.infrastructure.note.wordmute.WordFilterConfigDao\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotificationDAO\nimport net.pantasystem.milktea.data.infrastructure.search.SearchHistoryDao\nimport net.pantasystem.milktea.data.infrastructure.url.db.UrlPreviewDAO\nimport net.pantasystem.milktea.data.infrastructure.user.UserNicknameDAO\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserDao\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject DbModule {\n\n    @Singleton\n    @Provides\n    fun database(@ApplicationContext context: Context): DataBase {\n        return Room.databaseBuilder(context, DataBase::class.java, \"milk_database\")\n            .fallbackToDestructiveMigration()\n            .addMigrations(MIGRATION_1_2)\n            .addMigrations(MIGRATION_2_3)\n            .addMigrations(MIGRATION_3_4)\n            .addMigrations(MIGRATION_4_5)\n            .addMigrations(MIGRATION_5_6)\n            .addMigrations(MIGRATION_6_7)\n            .addMigrations(MIGRATION_7_8)\n            .addMigrations(MIGRATION_8_10)\n            .addMigrations(MIGRATION_10_11)\n            .addMigrations(MIGRATION_51_52)\n            .addMigrations(MIGRATION_57_58)\n            .build()\n    }\n\n    @Provides\n    @Singleton\n    fun accountDAO(db: DataBase): AccountDAO {\n        return db.accountDAO()\n    }\n\n    @Provides\n    @Singleton\n    fun reactionUserSettingDAO(db: DataBase): ReactionUserSettingDao {\n        return db.reactionUserSettingDao()\n    }\n\n    @Provides\n    @Singleton\n    fun reactionHistoryDao(db: DataBase): ReactionHistoryDao {\n        return db.reactionHistoryDao()\n    }\n\n    @Provides\n    @Singleton\n    fun unreadNotificationDAO(db: DataBase): UnreadNotificationDAO = db.unreadNotificationDAO()\n\n    @Provides\n    @Singleton\n    fun draftNoteDAO(db: DataBase): DraftNoteDao = db.draftNoteDao()\n\n    @Provides\n    @Singleton\n    fun urlPreviewDAO(db: DataBase): UrlPreviewDAO = db.urlPreviewDAO()\n\n    @Provides\n    @Singleton\n    fun userNicknameDAO(db: DataBase): UserNicknameDAO = db.userNicknameDAO()\n\n    @Provides\n    @Singleton\n    fun driveFileDAO(db: DataBase): DriveFileRecordDao = db.driveFileRecordDAO()\n\n    @Provides\n    @Singleton\n    fun groupDAO(db: DataBase): GroupDao = db.groupDao()\n\n    @Provides\n    @Singleton\n    fun provideUserDao(db: DataBase): UserDao = db.userDao()\n\n    @Provides\n    @Singleton\n    fun provideWordFilterDao(db: DataBase): WordFilterConfigDao = db.wordFilterConfigDao()\n\n    @Provides\n    @Singleton\n    fun provideUserListDao(db: DataBase): UserListDao = db.userListDao()\n\n    @Provides\n    @Singleton\n    fun provideInstanceInfoDao(db: DataBase): InstanceInfoDao = db.instanceInfoDao()\n\n    @Provides\n    @Singleton\n    fun provideSearchHistoryDao(db: DataBase): SearchHistoryDao = db.searchHistoryDao()\n\n    @Provides\n    @Singleton\n    fun provideNodeInfoDao(db: DataBase): NodeInfoDao = db.nodeInfoDao()\n\n    @Provides\n    @Singleton\n    fun provideMastodonInfoDao(db: DataBase): MastodonInstanceInfoDAO = db.mastodonInstanceInfoDao()\n\n    @Provides\n    @Singleton\n    fun provideNotificationJsonCacheDao(db: DataBase) = db.notificationJsonCacheRecordDAO()\n\n    @Provides\n    @Singleton\n    fun provideMastodonWordFilterDao(db: DataBase) = db.mastodonFilterDao()\n\n    @Provides\n    @Singleton\n    fun provideRenoteMuteDao(db: DataBase) = db.renoteMuteDao()\n\n    @Provides\n    @Singleton\n    fun provideCustomEmojiDao(db: DataBase) = db.customEmojiDao()\n\n    @Provides\n    @Singleton\n    fun provideInstanceTickerDao(db: DataBase) = db.instanceTickerDAO()\n\n    @Provides\n    @Singleton\n    fun provideNoteDao(db: DataBase) = db.noteDAO()\n\n    @Provides\n    @Singleton\n    fun provideNoteThreadDao(db: DataBase) = db.noteThreadDAO()\n\n    @Provides\n    @Singleton\n    fun provideTimelineCacheDao(db: DataBase) = db.timelineCacheDAO()\n\n    @Provides\n    @Singleton\n    fun provideNotificationCacheDao(db: DataBase) = db.notificationCacheDAO()\n\n    @Provides\n    @Singleton\n    fun provideReactionAuthorDAO(db: DataBase) = db.reactionAuthorDAO()\n\n    @Provides\n    @Singleton\n    fun provideCustomEmojiAspectDAO(db: DataBase) = db.customEmojiAspectDAO()\n\n    @Provides\n    @Singleton\n    fun provideImageCacheDAO(db: DataBase) = db.imageCacheDAO()\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/DriveDirectoryModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.app_store.drive.DriveDirectoryPagingStore\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveDirectoryPagingStoreImpl\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveDirectoryRepositoryImpl\nimport net.pantasystem.milktea.model.drive.DriveDirectoryRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class DriveDirectoryModule {\n\n    @Singleton\n    @Binds\n    abstract fun provideDriveDirectoryRepository(impl: DriveDirectoryRepositoryImpl): DriveDirectoryRepository\n\n    @Singleton\n    @Binds\n    abstract fun provideDriveDirectoryPagingStore(impl: DriveDirectoryPagingStoreImpl): DriveDirectoryPagingStore\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/DriveFileModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport android.content.Context\nimport dagger.Binds\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.app_store.drive.FilePropertyPagingStore\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIFactory\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.converters.FilePropertyDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.drive.*\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class DriveFileBindModule {\n    @Binds\n    @Singleton\n    abstract fun filePropertyDataSource(inMem: MediatorFilePropertyDataSource): FilePropertyDataSource\n\n    @Binds\n    @Singleton\n    abstract fun driveFileRepository(repo: DriveFileRepositoryImpl): DriveFileRepository\n\n    @Binds\n    @Singleton\n    abstract fun provideFilePropertyPagingStore(impl: FilePropertyPagingStoreImpl): FilePropertyPagingStore\n}\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject DriveFileModule {\n    @Provides\n    @Singleton\n    fun uploader(\n        @ApplicationContext context: Context,\n        okHttpClientProvider: OkHttpClientProvider,\n        filePropertyDataSource: FilePropertyDataSource,\n        mastodonAPIFactory: MastodonAPIFactory,\n        mastodonAPIProvider: MastodonAPIProvider,\n        filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n    ): FileUploaderProvider {\n        return OkHttpFileUploaderProvider(\n            okHttpClientProvider,\n            context,\n            json = Json {\n                ignoreUnknownKeys = true\n            },\n            filePropertyDataSource = filePropertyDataSource,\n            mastodonAPIFactory = mastodonAPIFactory,\n            mastodonAPIProvider = mastodonAPIProvider,\n            filePropertyDTOEntityConverter = filePropertyDTOEntityConverter\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/FavoriteModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.note.favorite.FavoriteRepositoryImpl\nimport net.pantasystem.milktea.model.note.favorite.FavoriteRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class FavoriteModule {\n\n    @Binds\n    @Singleton\n    abstract fun provideFavoriteRepository(\n        impl: FavoriteRepositoryImpl\n    ): FavoriteRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/FileModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.file.CopyFileToAppDirRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.file.UriToAppFileUseCaseImpl\nimport net.pantasystem.milktea.model.file.CopyFileToAppDirRepository\nimport net.pantasystem.milktea.model.file.UriToAppFileUseCase\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class FileModule {\n\n    @Singleton\n    @Binds\n    abstract fun bindCopyFileToAppDirRepository(\n        impl: CopyFileToAppDirRepositoryImpl\n    ): CopyFileToAppDirRepository\n\n    @Binds\n    abstract fun bindUriToAppFileUseCase(\n        impl: UriToAppFileUseCaseImpl,\n    ): UriToAppFileUseCase\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/GalleryModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.gallery.GalleryPostsStoreImpl\nimport net.pantasystem.milktea.data.infrastructure.gallery.GalleryRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.gallery.InMemoryGalleryDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryDataSource\nimport net.pantasystem.milktea.app_store.gallery.GalleryPostsStore\nimport net.pantasystem.milktea.model.gallery.GalleryRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class GalleryModule {\n\n    @Binds\n    @Singleton\n    abstract fun galleryDataSource(galleryDataSource: InMemoryGalleryDataSource): GalleryDataSource\n\n    @Binds\n    @Singleton\n    abstract fun galleryRepository(impl: GalleryRepositoryImpl): GalleryRepository\n\n    @Binds\n    @Singleton\n    abstract fun provideGalleryPostsStoreFactory(impl: GalleryPostsStoreImpl.Factory): GalleryPostsStore.Factory\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/GetterModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.messaging.MessageAdder\nimport net.pantasystem.milktea.data.infrastructure.messaging.MessageRelationGetterImpl\nimport net.pantasystem.milktea.model.messaging.MessageRelationGetter\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class GetterModule {\n\n    @Binds\n    @Singleton\n    abstract fun provideMessageGetter(impl: MessageRelationGetterImpl): MessageRelationGetter\n\n    @Binds\n    @Singleton\n    abstract fun provideMessageAdder(impl: MessageRelationGetterImpl): MessageAdder\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/GroupModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.group.GroupDataSourceImpl\nimport net.pantasystem.milktea.data.infrastructure.group.GroupRepositoryImpl\nimport net.pantasystem.milktea.model.group.GroupDataSource\nimport net.pantasystem.milktea.model.group.GroupRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class GroupModule {\n    @Binds\n    @Singleton\n    abstract fun groupDataSource(ds: GroupDataSourceImpl) : GroupDataSource\n\n    @Binds\n    @Singleton\n    abstract fun groupRepository(ds: GroupRepositoryImpl) : GroupRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/HashtagModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.hashtag.HashtagRepositoryImpl\nimport net.pantasystem.milktea.model.hashtag.HashtagRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class HashtagBindModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindHashtagRepository(impl: HashtagRepositoryImpl): HashtagRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/ImageCacheBindModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.image.ImageCacheRepositoryImpl\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class ImageCacheBindModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindImageCacheRepository(impl: ImageCacheRepositoryImpl): ImageCacheRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/InstanceInfoModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.instance.FeatureEnablesImpl\nimport net.pantasystem.milktea.data.infrastructure.instance.online.user.count.OnlineUserCountRepositoryImpl\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.instance.online.user.count.OnlineUserCountRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class InstanceInfoBindModule {\n\n//    @Binds\n//    @Singleton\n//    abstract fun bindInstanceInfoRepository(impl: InstanceInfoRepositoryImpl): InstanceInfoRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindFeatureEnables(impl: FeatureEnablesImpl): FeatureEnables\n\n    @Binds\n    @Singleton\n    abstract fun bindOnlineUserCountRepository(impl: OnlineUserCountRepositoryImpl): OnlineUserCountRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/InstanceTickerModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.instance.ticker.InstanceTickerRepositoryImpl\nimport net.pantasystem.milktea.model.instance.ticker.InstanceTickerRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class InstanceTickerModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindInstanceTickerRepository(\n        repository: InstanceTickerRepositoryImpl\n    ): InstanceTickerRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/MarkerModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.markers.MarkerRepositoryImpl\nimport net.pantasystem.milktea.model.markers.MarkerRepository\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class MarkerModule {\n\n    @Binds\n    abstract fun bindMarkerRepository(impl: MarkerRepositoryImpl): MarkerRepository\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/MastodonInstanceInfoModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.instance.MastodonInstanceInfoRepositoryImpl\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfoRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class MastodonInstanceInfoModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindMastodonInfoRepository(impl: MastodonInstanceInfoRepositoryImpl): MastodonInstanceInfoRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/MessagingModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ViewModelComponent\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.app_store.messaging.MessagePagingStore\nimport net.pantasystem.milktea.data.infrastructure.messaging.*\nimport net.pantasystem.milktea.model.messaging.MessageObserver\nimport net.pantasystem.milktea.model.messaging.MessageRepository\nimport net.pantasystem.milktea.model.messaging.MessagingRepository\nimport net.pantasystem.milktea.model.messaging.UnReadMessages\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class MessagingBindsModule {\n\n    @Binds\n    @Singleton\n    abstract fun messageRepository(\n        messageRepositoryImpl: MessageRepositoryImpl\n    ) : MessageRepository\n\n    @Binds\n    @Singleton\n    abstract fun provideMessageObserve(\n        messageObserverImpl: MessageObserverImpl\n    ): MessageObserver\n\n    @Binds\n    @Singleton\n    abstract fun messagingRepository(\n        impl: MessagingRepositoryImpl\n    ) : MessagingRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindMessageDataSource(\n        impl: InMemoryMessageDataSource\n    ) : MessageDataSource\n\n    @Binds\n    @Singleton\n    abstract fun bindUnreadMessages(\n        impl: InMemoryMessageDataSource\n    ) : UnReadMessages\n\n\n}\n\n@Module\n@InstallIn(ViewModelComponent::class)\nabstract class MessagingBindsViewModelModule {\n    @Binds\n    abstract fun provideMessagePagingStore(impl: MessagePagingStoreImpl): MessagePagingStore\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/MetaModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.instance.MetaRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.instance.db.InMemoryMetaDataSource\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MediatorMetaDataSource\nimport net.pantasystem.milktea.data.infrastructure.instance.db.RoomMetaDataSource\nimport net.pantasystem.milktea.model.instance.MetaDataSource\nimport net.pantasystem.milktea.model.instance.MetaRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject MetaModule {\n\n    @Provides\n    @Singleton\n    fun provideMetaDataSource(db: DataBase): MetaDataSource {\n        return MediatorMetaDataSource(\n            RoomMetaDataSource(\n                db.metaDAO(),\n                db,\n            ),\n            InMemoryMetaDataSource()\n        )\n    }\n\n}\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class MetaBindModule {\n    @Binds\n    @Singleton\n    abstract fun bindMetaRepository(impl: MetaRepositoryImpl): MetaRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/NodeInfoModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.api.NodeInfoAPIBuilder\nimport net.pantasystem.milktea.data.api.NodeInfoAPIBuilderImpl\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.NodeInfoFetcher\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.NodeInfoFetcherImpl\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.NodeInfoRepositoryImpl\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class NodeInfoModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindNodeInfoRepository(impl: NodeInfoRepositoryImpl): NodeInfoRepository\n\n    @Binds\n    @Singleton\n    abstract fun nodeInfoAPIBuilder(impl: NodeInfoAPIBuilderImpl): NodeInfoAPIBuilder\n\n    @Binds\n    @Singleton\n    abstract fun bindNodeInfoFetcher(impl: NodeInfoFetcherImpl): NodeInfoFetcher\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/NoteModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport android.content.Context\nimport dagger.Binds\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.app_store.notes.TimelineStore\nimport net.pantasystem.milktea.common.getPreferences\nimport net.pantasystem.milktea.data.infrastructure.note.NoteStreamingImpl\nimport net.pantasystem.milktea.data.infrastructure.note.NoteTranslationStoreImpl\nimport net.pantasystem.milktea.data.infrastructure.note.ReplyStreamingImpl\nimport net.pantasystem.milktea.data.infrastructure.note.TimelineScrollPositionRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.TimelineStoreImpl\nimport net.pantasystem.milktea.data.infrastructure.note.draft.DraftNoteRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.impl.DraftNoteServiceImpl\nimport net.pantasystem.milktea.data.infrastructure.note.impl.NoteApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.note.impl.NoteApiAdapterFactoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.impl.NoteRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.impl.ThreadContextApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.note.impl.ThreadContextApiAdapterFactoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.SQLiteNoteDataSource\nimport net.pantasystem.milktea.data.infrastructure.note.renote.RenotesPagingServiceImpl\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.TimelineFetcher\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.TimelineFetcherImpl\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.TimelineLocalDataSource\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.TimelineLocalDataSourceImpl\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.TimelineRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.favorite.FavoriteTimelineRepositoryImpl\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.NoteStreaming\nimport net.pantasystem.milktea.model.note.ReplyStreaming\nimport net.pantasystem.milktea.model.note.TimelineScrollPositionRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNoteService\nimport net.pantasystem.milktea.model.note.repost.RenotesPagingService\nimport net.pantasystem.milktea.model.note.timeline.TimelineRepository\nimport net.pantasystem.milktea.model.note.timeline.favorite.FavoriteTimelineRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class NoteBindModule{\n\n    @Binds\n    @Singleton\n    abstract fun noteDataSource(inMem: SQLiteNoteDataSource): NoteDataSource\n\n    @Binds\n    @Singleton\n    abstract fun noteRepository(impl: NoteRepositoryImpl): NoteRepository\n\n    @Binds\n    @Singleton\n    abstract fun provideTimelineStoreFactory(impl: TimelineStoreImpl.Factory): TimelineStore.Factory\n\n    @Binds\n    @Singleton\n    abstract fun provideNoteStreaming(impl: NoteStreamingImpl): NoteStreaming\n\n    @Binds\n    @Singleton\n    abstract fun provideDraftNoteService(impl: DraftNoteServiceImpl): DraftNoteService\n\n    @Binds\n    @Singleton\n    abstract fun bindRenotePagingService(impl: RenotesPagingServiceImpl.Factory): RenotesPagingService.Factory\n\n    @Binds\n    @Singleton\n    abstract fun provideDraftNoteRepository(impl: DraftNoteRepositoryImpl): DraftNoteRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindReplyStreaming(impl: ReplyStreamingImpl): ReplyStreaming\n\n    @Binds\n    internal abstract fun bindNoteApiAdapterFactory(impl: NoteApiAdapterFactoryImpl): NoteApiAdapter.Factory\n\n    @Binds\n    internal abstract fun bindThreadContextApiAdapterFactory(impl: ThreadContextApiAdapterFactoryImpl): ThreadContextApiAdapter.Factory\n\n    @Binds\n    @Singleton\n    internal abstract fun bindTimelineRepository(impl: TimelineRepositoryImpl): TimelineRepository\n\n    @Binds\n    @Singleton\n    internal abstract fun bindFavoriteTimelineRepository(impl: FavoriteTimelineRepositoryImpl): FavoriteTimelineRepository\n\n    @Binds\n    internal abstract fun bindTimelineFetcher(impl: TimelineFetcherImpl): TimelineFetcher\n\n    @Binds\n    internal abstract fun bindTimelineLocalSourceLoader(impl: TimelineLocalDataSourceImpl): TimelineLocalDataSource\n}\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject NoteProvideModule {\n    @Provides\n    @Singleton\n    fun provideTimelineScrollPositionRepository(\n        @ApplicationContext context: Context\n    ): TimelineScrollPositionRepository {\n        return TimelineScrollPositionRepositoryImpl(\n            context.getPreferences()\n        )\n    }\n}\n\n\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class AbsNoteModule {\n    @Binds\n    @Singleton\n    abstract fun provideNoteTranslationStore(\n        impl: NoteTranslationStoreImpl\n    ) : NoteTranslationStore\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/NotificationModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.notification.impl.MediatorNotificationDataSource\nimport net.pantasystem.milktea.data.infrastructure.notification.impl.NotificationPagingStoreImpl\nimport net.pantasystem.milktea.data.infrastructure.notification.impl.NotificationRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.notification.impl.NotificationTimelineRepositoryImpl\nimport net.pantasystem.milktea.model.notification.NotificationDataSource\nimport net.pantasystem.milktea.model.notification.NotificationPagingStore\nimport net.pantasystem.milktea.model.notification.NotificationRepository\nimport net.pantasystem.milktea.model.notification.NotificationTimelineRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class NotificationModule {\n\n    @Binds\n    @Singleton\n    abstract fun notificationDataSource(\n        ds: MediatorNotificationDataSource,\n    ): NotificationDataSource\n\n\n    @Binds\n    @Singleton\n    abstract fun notificationRepository(\n        impl: NotificationRepositoryImpl\n    ): NotificationRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindNotificationPagingStoreFactory(\n        impl: NotificationPagingStoreImpl.Factory\n    ) : NotificationPagingStore.Factory\n\n    @Binds\n    @Singleton\n    abstract fun bindNotificationTimelineRepository(\n        impl: NotificationTimelineRepositoryImpl\n    ) : NotificationTimelineRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/ReactionModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.emoji.UserEmojiConfigRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.ReactionUserRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history.ReactionHistoryRepositoryImpl\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfigRepository\nimport net.pantasystem.milktea.model.note.reaction.ReactionUserRepository\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class ReactionModule {\n    \n    @Binds\n    @Singleton\n    abstract fun bindReactionHistoryRepository(impl: ReactionHistoryRepositoryImpl): ReactionHistoryRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindUserEmojiConfigRepository(impl: UserEmojiConfigRepositoryImpl): UserEmojiConfigRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindReactionUserRepository(impl: ReactionUserRepositoryImpl): ReactionUserRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/RenoteMuteModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.*\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate.*\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMuteRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class RenoteMuteModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindRenoteMuteApiAdapter(impl: RenoteMuteApiAdapterImpl): RenoteMuteApiAdapter\n\n    @Binds\n    @Singleton\n    internal abstract fun bindRenoteMuteRepository(impl: RenoteMuteRepositoryImpl): RenoteMuteRepository\n\n    @Binds\n    @Singleton\n    abstract fun bindIsSupportRenoteMuteInstance(impl: IsSupportRenoteMuteInstanceImpl): IsSupportRenoteMuteInstance\n\n    @Binds\n    @Singleton\n    internal abstract fun bindFindRenoteMuteAndUpdateMemCacheDelegate(impl: FindRenoteMuteAndUpdateMemCacheDelegateImpl): FindRenoteMuteAndUpdateMemCacheDelegate\n\n    @Binds\n    @Singleton\n    internal abstract fun bindCreateRenoteMuteAndPushToRemoteDelegate(impl: CreateRenoteMuteAndPushToRemoteDelegateImpl): CreateRenoteMuteAndPushToRemoteDelegate\n\n    @Binds\n    @Singleton\n    internal abstract fun bindSyncRenoteMuteDelegate(impl: SyncRenoteMuteDelegateImpl): SyncRenoteMuteDelegate\n\n    @Binds\n    @Singleton\n    internal abstract fun bindFindALlRemoteRenoteMutesDelegate(impl: FindAllRemoteRenoteMutesDelegateImpl): FindAllRemoteRenoteMutesDelegate\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/SearchModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.search.SearchHistoryRepositoryImpl\nimport net.pantasystem.milktea.model.search.SearchHistoryRepository\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class SearchBindsModule {\n    @Binds\n    @Singleton\n    abstract fun bindSearchHistoryRepository(impl: SearchHistoryRepositoryImpl): SearchHistoryRepository\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/SettingModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport android.content.Context\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineScope\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.getPreferences\nimport net.pantasystem.milktea.model.setting.ColorSettingStore\nimport net.pantasystem.milktea.data.infrastructure.settings.LocalConfigRepositoryImpl\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.NoteExpandedHeightSize\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nobject SettingModule {\n\n    @Singleton\n    @Provides\n    fun settingStore(@ApplicationContext context: Context, repository: LocalConfigRepository, coroutineScope: CoroutineScope): SettingStore {\n        return SettingStore(context.getPreferences(), repository, coroutineScope)\n    }\n\n    @Singleton\n    @Provides\n    fun provideLocalConfigRepository(@ApplicationContext context: Context): LocalConfigRepository {\n        return LocalConfigRepositoryImpl(context.getPreferences())\n    }\n\n    @Singleton\n    @Provides\n    fun  provideNoteExpandedHeightSize(settingStore: SettingStore): NoteExpandedHeightSize {\n        return settingStore\n    }\n\n    @Singleton\n    @Provides\n    fun provideColorSettingStore(@ApplicationContext context: Context): ColorSettingStore {\n        return ColorSettingStore(context.getPreferences())\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/SocketModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.Provides\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.infrastructure.emoji.EmojiEventHandlerImpl\nimport net.pantasystem.milktea.data.infrastructure.note.NoteCaptureAPIAdapterImpl\nimport net.pantasystem.milktea.data.infrastructure.note.NoteCaptureAPIWithAccountProvider\nimport net.pantasystem.milktea.data.infrastructure.note.NoteCaptureAPIWithAccountProviderImpl\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.data.infrastructure.notification.impl.NotificationStreamingImpl\nimport net.pantasystem.milktea.data.streaming.ChannelAPIWithAccountProvider\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider\nimport net.pantasystem.milktea.data.streaming.StreamingAPIProvider\nimport net.pantasystem.milktea.data.streaming.impl.SocketWithAccountProviderImpl\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioDataSource\nimport net.pantasystem.milktea.model.emoji.EmojiEventHandler\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.model.note.NoteCaptureAPIAdapter\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.notification.NotificationStreaming\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class SocketBindsModule {\n\n    @Binds\n    @Singleton\n    abstract fun provideSocketWithAccountProvider(\n        socketWithAccountProviderImpl: SocketWithAccountProviderImpl\n    ): SocketWithAccountProvider\n\n    @Binds\n    @Singleton\n    abstract fun provideNoteCaptureAPIWithAccountProvider(\n        provider: NoteCaptureAPIWithAccountProviderImpl\n    ) : NoteCaptureAPIWithAccountProvider\n\n    @Binds\n    @Singleton\n    abstract fun bindEmojiEventHandler(impl: EmojiEventHandlerImpl): EmojiEventHandler\n\n    @Binds\n    @Singleton\n    abstract fun bindNotificationStreaming(impl: NotificationStreamingImpl): NotificationStreaming\n}\n\n\n@InstallIn(SingletonComponent::class)\n@Module\nobject SocketModule {\n    @Singleton\n    @Provides\n    fun provideChannelAPIProvider(\n        loggerFactory: Logger.Factory,\n        socketWithAccountProvider: SocketWithAccountProvider\n    ): ChannelAPIWithAccountProvider {\n        return ChannelAPIWithAccountProvider(\n            socketWithAccountProvider,\n            loggerFactory\n        )\n    }\n\n    @Singleton\n    @Provides\n    fun provideNoteCaptureAPIAdapter(\n        accountRepository: AccountRepository,\n        coroutineScope: CoroutineScope,\n        loggerFactory: Logger.Factory,\n        noteCaptureAPIWithAccountProvider: NoteCaptureAPIWithAccountProvider,\n        noteDataSource: NoteDataSource,\n        noteDataSourceAdder: NoteDataSourceAdder,\n        streamingAPIProvider: StreamingAPIProvider,\n        customEmojiAspectRatioDataSource: CustomEmojiAspectRatioDataSource,\n        imageCacheRepository: ImageCacheRepository,\n    ): NoteCaptureAPIAdapter {\n        return NoteCaptureAPIAdapterImpl(\n            accountRepository = accountRepository,\n            cs = coroutineScope,\n            loggerFactory = loggerFactory,\n            noteCaptureAPIWithAccountProvider = noteCaptureAPIWithAccountProvider,\n            noteDataSource = noteDataSource,\n            dispatcher = Dispatchers.IO,\n            noteDataSourceAdder = noteDataSourceAdder,\n            streamingAPIProvider = streamingAPIProvider,\n            customEmojiAspectRatioDataSource = customEmojiAspectRatioDataSource,\n            imageCacheRepository = imageCacheRepository,\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/UrlPreviewModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.url.UrlPreviewStoreProviderImpl\nimport net.pantasystem.milktea.model.url.UrlPreviewStoreProvider\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class UrlPreviewModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindUrlPreviewStoreProvider(impl: UrlPreviewStoreProviderImpl): UrlPreviewStoreProvider\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/UserListModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.model.list.UserListRepository\nimport net.pantasystem.milktea.data.infrastructure.list.UserListRepositoryWebAPIImpl\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class UserListBindsModule {\n\n    @Binds\n    @Singleton\n    abstract fun provideUserListRepository(\n        impl: UserListRepositoryWebAPIImpl\n    ) : UserListRepository\n}\n\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/UserModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.app_store.user.FollowFollowerPagingStore\nimport net.pantasystem.milktea.app_store.user.UserReactionPagingStore\nimport net.pantasystem.milktea.data.infrastructure.report.ReportRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.user.*\nimport net.pantasystem.milktea.data.infrastructure.user.block.BlockApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.user.block.BlockApiAdapterImpl\nimport net.pantasystem.milktea.data.infrastructure.user.block.BlockRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.user.follow.FollowApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.user.follow.FollowApiAdapterImpl\nimport net.pantasystem.milktea.data.infrastructure.user.follow.FollowRepositoryImpl\nimport net.pantasystem.milktea.data.infrastructure.user.mute.MuteApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.user.mute.MuteApiAdapterImpl\nimport net.pantasystem.milktea.data.infrastructure.user.mute.MuteRepositoryImpl\nimport net.pantasystem.milktea.model.user.FollowRequestRepository\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.model.user.block.BlockRepository\nimport net.pantasystem.milktea.model.user.follow.FollowRepository\nimport net.pantasystem.milktea.model.user.mute.MuteRepository\nimport net.pantasystem.milktea.model.user.report.ReportRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class UserModule {\n\n    @Binds\n    @Singleton\n    abstract fun userDataSource(dataSource: MediatorUserDataSource): UserDataSource\n\n    @Binds\n    @Singleton\n    internal abstract fun userRepository(\n        impl: UserRepositoryImpl\n    ): UserRepository\n\n    @Binds\n    @Singleton\n    abstract fun provideFollowFollowerPagingStoreFactory(\n        impl: FollowFollowerPagingStoreImpl.Factory\n    ) : FollowFollowerPagingStore.Factory\n\n    @Binds\n    @Singleton\n    abstract fun provideUserReactionPagingStoreFactory(\n        impl: UserReactionPagingStoreImpl.Factory\n    ) : UserReactionPagingStore.Factory\n\n    @Binds\n    @Singleton\n    abstract fun bindFollowRequestRepository(\n        impl: FollowRequestRepositoryImpl\n    ): FollowRequestRepository\n\n    @Binds\n    @Singleton\n    internal abstract fun bindMuteRepository(impl: MuteRepositoryImpl): MuteRepository\n\n    @Binds\n    @Singleton\n    internal abstract fun bindMuteApiAdapter(impl: MuteApiAdapterImpl): MuteApiAdapter\n\n    @Binds\n    @Singleton\n    internal abstract fun bindBlockRepository(impl: BlockRepositoryImpl): BlockRepository\n\n    @Binds\n    @Singleton\n    internal abstract fun bindBlockApiAdapter(impl: BlockApiAdapterImpl): BlockApiAdapter\n\n    @Binds\n    @Singleton\n    internal abstract fun bindUserApiAdapter(impl: UserApiAdapterImpl): UserApiAdapter\n\n    @Binds\n    @Singleton\n    internal abstract fun bindUserCacheUpdater(impl: UserCacheUpdaterFromUserActionResultImpl): UserCacheUpdaterFromUserActionResult\n\n    @Binds\n    @Singleton\n    internal abstract fun bindReportRepository(impl: ReportRepositoryImpl): ReportRepository\n\n    @Binds\n    @Singleton\n    internal abstract fun bindFollowRepository(impl: FollowRepositoryImpl): FollowRepository\n\n    @Binds\n    @Singleton\n    internal abstract fun bindFollowApiAdapter(impl: FollowApiAdapterImpl): FollowApiAdapter\n\n    @Binds\n    @Singleton\n    internal abstract fun bindUserSuggestionApiAdapter(impl: UserSuggestionsApiAdapterImpl): UserSuggestionsApiAdapter\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/UserNicknameModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.user.UserNicknameRepositorySQLiteImpl\nimport net.pantasystem.milktea.model.user.nickname.UserNicknameRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class UserNicknameModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindUserNicknameRepository(userNicknameRepositorySQLiteImpl: UserNicknameRepositorySQLiteImpl): UserNicknameRepository\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/WordFilterConfigModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.note.wordmute.WordFilterConfigRepositoryImpl\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfigRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class WordFilterConfigModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindWordFilterConfigRepository(impl: WordFilterConfigRepositoryImpl): WordFilterConfigRepository\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/di/module/WordFilterModule.kt",
    "content": "package net.pantasystem.milktea.data.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.data.infrastructure.filter.MastodonWordFilterRepositoryImpl\nimport net.pantasystem.milktea.model.filter.MastodonWordFilterRepository\nimport javax.inject.Singleton\n\n@Module\n@InstallIn(SingletonComponent::class)\nabstract class WordFilterModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindMastodonWordFilterRepository(impl: MastodonWordFilterRepositoryImpl): MastodonWordFilterRepository\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/DataBase.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure\n\nimport androidx.room.AutoMigration\nimport androidx.room.Database\nimport androidx.room.RoomDatabase\nimport androidx.room.TypeConverters\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountDAO\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountInstanceTypeConverter\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.data.infrastructure.account.page.db.PageDAO\nimport net.pantasystem.milktea.data.infrastructure.account.page.db.PageRecord\nimport net.pantasystem.milktea.data.infrastructure.account.page.db.TimelinePageTypeConverter\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveFileRecord\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveFileRecordDao\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiAliasRecord\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiAspectRatioDAO\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiAspectRatioEntity\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiDAO\nimport net.pantasystem.milktea.data.infrastructure.emoji.CustomEmojiRecord\nimport net.pantasystem.milktea.data.infrastructure.filter.db.MastodonFilterDao\nimport net.pantasystem.milktea.data.infrastructure.filter.db.MastodonWordFilterRecord\nimport net.pantasystem.milktea.data.infrastructure.group.GroupDao\nimport net.pantasystem.milktea.data.infrastructure.group.GroupMemberIdRecord\nimport net.pantasystem.milktea.data.infrastructure.group.GroupMemberView\nimport net.pantasystem.milktea.data.infrastructure.group.GroupRecord\nimport net.pantasystem.milktea.data.infrastructure.image.ImageCacheDAO\nimport net.pantasystem.milktea.data.infrastructure.image.ImageCacheEntity\nimport net.pantasystem.milktea.data.infrastructure.instance.db.FedibirdCapabilitiesRecord\nimport net.pantasystem.milktea.data.infrastructure.instance.db.InstanceInfoDao\nimport net.pantasystem.milktea.data.infrastructure.instance.db.InstanceInfoRecord\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MastodonInstanceInfoDAO\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MastodonInstanceInfoRecord\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MetaDAO\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MetaDTO\nimport net.pantasystem.milktea.data.infrastructure.instance.db.PleromaMetadataFeatures\nimport net.pantasystem.milktea.data.infrastructure.instance.ticker.db.InstanceTickerDAO\nimport net.pantasystem.milktea.data.infrastructure.instance.ticker.db.InstanceTickerRecord\nimport net.pantasystem.milktea.data.infrastructure.list.UserListDao\nimport net.pantasystem.milktea.data.infrastructure.list.UserListMemberIdRecord\nimport net.pantasystem.milktea.data.infrastructure.list.UserListMemberView\nimport net.pantasystem.milktea.data.infrastructure.list.UserListRecord\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.db.NodeInfoDao\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.db.NodeInfoRecord\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftFileJunctionRef\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftLocalFile\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftNoteDTO\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftNoteDao\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.PollChoiceDTO\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.UserIdDTO\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.MastodonMentionEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.MastodonTagEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteAncestorEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteCustomEmojiEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteDAO\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteDescendantEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteFileEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NotePollChoiceEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteThreadDAO\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteThreadEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteVisibleUserIdEntity\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.ReactionCountEntity\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.ReactionAuthorDAO\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.ReactionAuthorEntity\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.ReactionUserEntity\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history.ReactionHistoryDao\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history.ReactionHistoryRecord\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSetting\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSettingDao\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.TimelineCacheDAO\nimport net.pantasystem.milktea.data.infrastructure.note.timeline.TimelineItemEntity\nimport net.pantasystem.milktea.data.infrastructure.note.wordmute.WordFilterConditionRecord\nimport net.pantasystem.milktea.data.infrastructure.note.wordmute.WordFilterConditionRegexRecord\nimport net.pantasystem.milktea.data.infrastructure.note.wordmute.WordFilterConditionWordRecord\nimport net.pantasystem.milktea.data.infrastructure.note.wordmute.WordFilterConfigDao\nimport net.pantasystem.milktea.data.infrastructure.notification.db.FollowNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.FollowRequestAcceptedNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.GroupInvitedNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NoteNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationCacheDAO\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationJsonCacheRecord\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationJsonCacheRecordDAO\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineDAO\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineExcludedTypeEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineIncludedTypeEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineItemEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.PollEndedNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.PollVoteNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.ReactionNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnknownNotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotification\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotificationDAO\nimport net.pantasystem.milktea.data.infrastructure.search.SearchHistoryDao\nimport net.pantasystem.milktea.data.infrastructure.search.SearchHistoryRecord\nimport net.pantasystem.milktea.data.infrastructure.url.db.UrlPreviewDAO\nimport net.pantasystem.milktea.data.infrastructure.url.db.UrlPreviewRecord\nimport net.pantasystem.milktea.data.infrastructure.user.UserNicknameDAO\nimport net.pantasystem.milktea.data.infrastructure.user.UserNicknameDTO\nimport net.pantasystem.milktea.data.infrastructure.user.db.BadgeRoleRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.PinnedNoteIdRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserDao\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserDetailedStateRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserEmojiRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserInfoStateRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserInstanceInfoRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserProfileFieldRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserRelatedStateRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserView\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteRecord\n\n@Database(\n    entities = [\n        ReactionHistoryRecord::class,\n        ReactionUserSetting::class,\n        PollChoiceDTO::class,\n        UserIdDTO::class,\n        DraftNoteDTO::class,\n\n        UrlPreviewRecord::class,\n        AccountRecord::class,\n        PageRecord::class,\n        MetaDTO::class,\n//        EmojiDTO::class,\n//        EmojiAlias::class,\n        UnreadNotification::class,\n        UserNicknameDTO::class,\n        DriveFileRecord::class,\n        DraftFileJunctionRef::class,\n        DraftLocalFile::class,\n        GroupRecord::class,\n        GroupMemberIdRecord::class,\n        UserRecord::class,\n        UserDetailedStateRecord::class,\n        UserEmojiRecord::class,\n        PinnedNoteIdRecord::class,\n        UserInstanceInfoRecord::class,\n        UserProfileFieldRecord::class,\n\n        WordFilterConditionRecord::class,\n        WordFilterConditionRegexRecord::class,\n        WordFilterConditionWordRecord::class,\n\n        UserListRecord::class,\n        UserListMemberIdRecord::class,\n        InstanceInfoRecord::class,\n        BadgeRoleRecord::class,\n\n        SearchHistoryRecord::class,\n        UserInfoStateRecord::class,\n        UserRelatedStateRecord::class,\n        NodeInfoRecord::class,\n\n        MastodonInstanceInfoRecord::class,\n\n//        CustomEmojiRecord::class,\n//        CustomEmojiAliasRecord::class,\n\n        NotificationJsonCacheRecord::class,\n\n        MastodonWordFilterRecord::class,\n\n        RenoteMuteRecord::class,\n\n        FedibirdCapabilitiesRecord::class,\n\n        PleromaMetadataFeatures::class,\n\n        CustomEmojiRecord::class,\n        CustomEmojiAliasRecord::class,\n\n        InstanceTickerRecord::class,\n\n        NoteEntity::class,\n        ReactionCountEntity::class,\n        NoteVisibleUserIdEntity::class,\n        NotePollChoiceEntity::class,\n        MastodonTagEntity::class,\n        MastodonMentionEntity::class,\n        NoteCustomEmojiEntity::class,\n        NoteFileEntity::class,\n\n        NoteThreadEntity::class,\n        NoteAncestorEntity::class,\n        NoteDescendantEntity::class,\n\n        TimelineItemEntity::class,\n\n        // notification\n        NotificationEntity::class,\n        FollowNotificationEntity::class,\n        NoteNotificationEntity::class,\n        ReactionNotificationEntity::class,\n        PollVoteNotificationEntity::class,\n        GroupInvitedNotificationEntity::class,\n        UnknownNotificationEntity::class,\n        PollEndedNotificationEntity::class,\n\n        // notification timeline holder\n        NotificationTimelineEntity::class,\n        NotificationTimelineExcludedTypeEntity::class,\n        NotificationTimelineIncludedTypeEntity::class,\n\n        NotificationTimelineItemEntity::class,\n\n        FollowRequestAcceptedNotificationEntity::class,\n\n        ReactionAuthorEntity::class,\n        ReactionUserEntity::class,\n\n        CustomEmojiAspectRatioEntity::class,\n\n        ImageCacheEntity::class,\n    ],\n    version = 74,\n    exportSchema = true,\n    autoMigrations = [\n        AutoMigration(from = 11, to = 12),\n        AutoMigration(from = 12, to = 13),\n        AutoMigration(from = 13, to = 14),\n        AutoMigration(from = 14, to = 15),\n        AutoMigration(from = 15, to = 16),\n        AutoMigration(from = 16, to = 17),\n        AutoMigration(from = 17, to = 18),\n        AutoMigration(from = 18, to = 19),\n        AutoMigration(from = 19, to = 20),\n        AutoMigration(from = 20, to = 21),\n        AutoMigration(from = 21, to = 22),\n        AutoMigration(from = 22, to = 23),\n        AutoMigration(from = 23, to = 24),\n        AutoMigration(from = 24, to = 25),\n        AutoMigration(from = 25, to = 26),\n        AutoMigration(from = 26, to = 27),\n        AutoMigration(from = 27, to = 28),\n        AutoMigration(from = 28, to = 29),\n        AutoMigration(from = 29, to = 30),\n        AutoMigration(from = 30, to = 31),\n        AutoMigration(from = 31, to = 32),\n        AutoMigration(from = 32, to = 33),\n        AutoMigration(from = 33, to = 34),\n        AutoMigration(from = 34, to = 35),\n        AutoMigration(from = 35, to = 36),\n        AutoMigration(from = 36, to = 37),\n        AutoMigration(from = 37, to = 38),\n        AutoMigration(from = 38, to = 39),\n        AutoMigration(from = 39, to = 40),\n        AutoMigration(from = 40, to = 41),\n        AutoMigration(from = 41, to = 42),\n        AutoMigration(from = 42, to = 43),\n        AutoMigration(from = 43, to = 44),\n        AutoMigration(from = 44, to = 45),\n        AutoMigration(from = 45, to = 46),\n        AutoMigration(from = 46, to = 47),\n        AutoMigration(from = 47, to = 48),\n        AutoMigration(from = 48, to = 49),\n        AutoMigration(from = 49, to = 50),\n        AutoMigration(from = 50, to = 51),\n        AutoMigration(from = 52, to = 53),\n        AutoMigration(from = 53, to = 54),\n        AutoMigration(from = 54, to = 55),\n        AutoMigration(from = 55, to = 56),\n        AutoMigration(from = 56, to = 57),\n        AutoMigration(from = 58, to = 59),\n        AutoMigration(from = 59, to = 60),\n        AutoMigration(from = 60, to = 61),\n        AutoMigration(from = 61, to = 62),\n        AutoMigration(from = 62, to = 63),\n        AutoMigration(from = 63, to = 64),\n        AutoMigration(from = 64, to = 65),\n        AutoMigration(from = 65, to = 66),\n        AutoMigration(from = 66, to = 67),\n        AutoMigration(from = 67, to = 68),\n        AutoMigration(from = 68, to = 69),\n        AutoMigration(from = 69, to = 70),\n        AutoMigration(from = 70, to = 71),\n        AutoMigration(from = 71, to = 72),\n        AutoMigration(from = 72, to = 73),\n        AutoMigration(from = 73, to = 74),\n    ],\n    views = [UserView::class, GroupMemberView::class, UserListMemberView::class]\n)\n@TypeConverters(\n    DateConverter::class,\n    TimelinePageTypeConverter::class,\n    AccountInstanceTypeConverter::class,\n    InstantConverter::class,\n    LocalDateConverter::class,\n)\nabstract class DataBase : RoomDatabase() {\n    //abstract fun connectionInstanceDao(): ConnectionInstanceDao\n\n    abstract fun reactionHistoryDao(): ReactionHistoryDao\n    abstract fun reactionUserSettingDao(): ReactionUserSettingDao\n\n    abstract fun draftNoteDao(): DraftNoteDao\n\n    abstract fun urlPreviewDAO(): UrlPreviewDAO\n\n    abstract fun accountDAO(): AccountDAO\n    abstract fun pageDAO(): PageDAO\n\n    abstract fun metaDAO(): MetaDAO\n//    abstract fun emojiAliasDAO(): EmojiAliasDAO\n\n    abstract fun unreadNotificationDAO(): UnreadNotificationDAO\n\n    abstract fun userNicknameDAO(): UserNicknameDAO\n\n\n    abstract fun driveFileRecordDAO(): DriveFileRecordDao\n\n    abstract fun groupDao(): GroupDao\n\n    abstract fun userDao(): UserDao\n\n    abstract fun wordFilterConfigDao(): WordFilterConfigDao\n\n    abstract fun userListDao(): UserListDao\n\n    abstract fun instanceInfoDao(): InstanceInfoDao\n\n    abstract fun searchHistoryDao(): SearchHistoryDao\n\n    abstract fun nodeInfoDao(): NodeInfoDao\n\n    abstract fun mastodonInstanceInfoDao(): MastodonInstanceInfoDAO\n\n//    abstract fun customEmojiDao(): CustomEmojiDAO\n\n    abstract fun notificationJsonCacheRecordDAO(): NotificationJsonCacheRecordDAO\n\n    abstract fun mastodonFilterDao(): MastodonFilterDao\n\n    abstract fun renoteMuteDao(): RenoteMuteDao\n\n    abstract fun customEmojiDao(): CustomEmojiDAO\n\n    abstract fun instanceTickerDAO(): InstanceTickerDAO\n\n    abstract fun noteDAO(): NoteDAO\n\n    abstract fun noteThreadDAO(): NoteThreadDAO\n\n    abstract fun timelineCacheDAO(): TimelineCacheDAO\n\n    abstract fun notificationCacheDAO(): NotificationCacheDAO\n\n    abstract fun notificationTimelineDAO(): NotificationTimelineDAO\n\n    abstract fun reactionAuthorDAO(): ReactionAuthorDAO\n\n    abstract fun customEmojiAspectDAO(): CustomEmojiAspectRatioDAO\n\n    abstract fun imageCacheDAO(): ImageCacheDAO\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/DateConverter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure\n\nimport androidx.room.TypeConverter\nimport androidx.room.TypeConverters\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.LocalDate\nimport java.text.SimpleDateFormat\nimport java.util.*\n\n@TypeConverters\nclass DateConverter{\n\n    companion object{\n        private val smf = SimpleDateFormat.getInstance()\n    }\n\n    @TypeConverter\n    fun toDate(formattedDate: String?): Date? {\n        formattedDate ?: return null\n        return smf.parse(formattedDate)\n    }\n\n    @TypeConverter\n    fun fromDate(date: Date?): String? {\n        date?: return null\n        return smf.format(date)\n    }\n}\n\n@TypeConverters\nobject InstantConverter {\n\n    @TypeConverter\n    fun toInstant(iso8601DateTime: String?): Instant? {\n        return iso8601DateTime?.let {\n            Instant.parse(iso8601DateTime)\n        }\n    }\n\n    @TypeConverter\n    fun fromInstant(instant: Instant?): String? {\n        return instant?.toString()\n    }\n}\n\n@TypeConverters\nobject LocalDateConverter {\n    @TypeConverter\n    fun toLocalDate(str: String?): LocalDate? {\n        return str?.let {\n            LocalDate.parse(it)\n        }\n    }\n\n    @TypeConverter\n    fun fromLocalDate(localDate: LocalDate?): String? {\n        return localDate?.toString()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/MemoryCacheCleaner.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure\n\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MemoryCacheCleaner @Inject constructor(){\n    interface Cleanable {\n        suspend fun clean()\n    }\n\n    private var cleanableCacheList = mutableListOf<Cleanable>()\n\n    fun register(cleanable: Cleanable) {\n        synchronized(this) {\n            cleanableCacheList.add(cleanable)\n        }\n    }\n\n    suspend fun clean() {\n        cleanableCacheList.forEach {\n            it.clean()\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/Migrations.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure\n\nimport androidx.room.migration.Migration\nimport androidx.sqlite.db.SupportSQLiteDatabase\n\n\nval MIGRATION_1_2 = object : Migration(1, 2){\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"create table 'draft_note'('draft_note_id' INTEGER primary key autoincrement,'accountId' TEXT not null, 'visibility' TEXT not null, 'text' TEXT, 'cw' TEXT, 'viaMobile' INTEGER, 'localOnly' INTEGER, 'noExtractMentions' INTEGER, 'noExtractHashtags' INTEGER, 'noExtractEmojis' INTEGER, 'replyId' TEXT, 'renoteId' TEXT, 'expiresAt' INTEGER, 'multiple' INTEGER, foreign key('accountId') references 'Account'('id') on update cascade on delete cascade)\")\n        database.execSQL(\"create table 'user_id'('userId' TEXT not null, 'draft_note_id' INTEGER not null, foreign key('draft_note_id') references'draft_note'('draft_note_id') on delete cascade on update cascade, primary key('userId', 'draft_note_id'))\")\n        database.execSQL(\"create table 'poll_choice'('choice' TEXT not null, 'weight' INTEGER not null, 'draft_note_id' INTEGER not null, foreign key('draft_note_id') references 'draft_note'('draft_note_id') on delete cascade on update cascade, primary key('choice', 'weight', 'draft_note_id'))\")\n        database.execSQL(\"create table 'draft_file'('remote_file_id' TEXT, 'file_path' TEXT, 'draft_note_id' INTEGER not null, 'file_id' INTEGER primary key autoincrement, foreign key('draft_note_id') references 'draft_note'('draft_note_id') on delete cascade on update cascade)\")\n\n        database.execSQL(\"create index 'index_draft_note_accountId_text' on 'draft_note'('accountId', 'text')\")\n        database.execSQL(\"create index 'index_user_id' on 'user_id'('draft_note_id')\")\n        database.execSQL(\"create index 'index_poll_choice_draft_note_id_choice' on 'poll_choice'('draft_note_id', 'choice')\")\n        database.execSQL(\"create index 'index_draft_file' on 'draft_file'('draft_note_id')\")\n    }\n}\n\nval MIGRATION_2_3 = object : Migration(2, 3){\n    override fun migrate(database: SupportSQLiteDatabase) {\n        // change draftFileDTO\n\n\n        database.execSQL(\"alter table 'draft_file' add column 'is_sensitive' INTEGER\")\n        database.execSQL(\"alter table 'draft_file' add column 'type' TEXT\")\n        database.execSQL(\"alter table 'draft_file' add column 'thumbnailUrl' TEXT\")\n        database.execSQL(\"alter table 'draft_file' add column 'name' TEXT not null default 'name none'\")\n        database.execSQL(\"alter table 'draft_file' add column 'folder_id' TEXT \")\n    }\n}\n\nval MIGRATION_3_4 = object : Migration(3, 4){\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"DROP TABLE IF EXISTS 'url_preview'\")\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'url_preview'('url' TEXT NOT NULL, 'title' TEXT NOT NULL, 'icon' TEXT, 'description' TEXT, 'thumbnail' TEXT, 'siteName' TEXT, PRIMARY KEY('url'))\")\n    }\n}\n\nval MIGRATION_4_5 = object : Migration(4, 5){\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"DROP TABLE IF EXISTS 'draft_file_table'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'poll_choice_table'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'user_id'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'draft_note'\")\n\n\n\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'account_table' ('remoteId' TEXT NOT NULL, 'instanceDomain' TEXT NOT NULL, 'userName' TEXT NOT NULL, 'encryptedToken' TEXT NOT NULL, 'accountId' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_account_table_remoteId' ON 'account_table'('remoteId')\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_account_table_instanceDomain' ON 'account_table' ('instanceDomain')\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_account_table_userName' ON 'account_table' ('userName')\")\n        \n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'page_table' ('accountId' INTEGER NOT NULL, 'title' TEXT NOT NULL, 'weight' INTEGER NOT NULL, 'pageId' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 'type' TEXT NOT NULL, 'withFiles' INTEGER, 'excludeNsfw' INTEGER, 'includeLocalRenotes' INTEGER, 'includeMyRenotes' INTEGER, 'includeRenotedMyRenotes' INTEGER, 'listId' TEXT, 'following' INTEGER, 'visibility' TEXT, 'noteId' TEXT, 'tag' TEXT, 'reply' INTEGER, 'renote' INTEGER, 'poll' INTEGER, 'offset' INTEGER, 'markAsRead' INTEGER, 'userId' TEXT, 'includeReplies' INTEGER, 'query' TEXT, 'host' TEXT, 'antennaId' TEXT)\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_page_table_weight' ON 'page_table' ('weight')\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_page_table_accountId' ON 'page_table' ('accountId')\")\n        \n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'draft_note_table' ('draft_note_id' INTEGER PRIMARY KEY AUTOINCREMENT, 'accountId' INTEGER NOT NULL, 'visibility' TEXT NOT NULL, 'text' TEXT, 'cw' TEXT, 'viaMobile' INTEGER, 'localOnly' INTEGER, 'noExtractMentions' INTEGER, 'noExtractHashtags' INTEGER, 'noExtractEmojis' INTEGER, 'replyId' TEXT, 'renoteId' TEXT, 'multiple' INTEGER, 'expiresAt' INTEGER, FOREIGN KEY('accountId') REFERENCES 'account_table'('accountId') ON UPDATE CASCADE ON DELETE CASCADE )\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_draft_note_table_accountId_text' ON 'draft_note_table' ('accountId', 'text')\")\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'draft_file_table' ('file_id' INTEGER PRIMARY KEY AUTOINCREMENT, 'name' TEXT NOT NULL DEFAULT 'name none', 'remote_file_id' TEXT, 'file_path' TEXT, 'is_sensitive' INTEGER, 'type' TEXT, 'thumbnailUrl' TEXT, 'draft_note_id' INTEGER NOT NULL, 'folder_id' TEXT, FOREIGN KEY('draft_note_id') REFERENCES 'draft_note_table'('draft_note_id') ON UPDATE CASCADE ON DELETE CASCADE )\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_draft_file_table_draft_note_id' ON 'draft_file_table' ('draft_note_id')\")\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'poll_choice_table' ('choice' TEXT NOT NULL, 'draft_note_id' INTEGER NOT NULL, 'weight' INTEGER NOT NULL, PRIMARY KEY('choice', 'weight', 'draft_note_id'), FOREIGN KEY('draft_note_id') REFERENCES 'draft_note_table'('draft_note_id') ON UPDATE CASCADE ON DELETE CASCADE )\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_poll_choice_table_draft_note_id_choice' ON 'poll_choice_table'('draft_note_id', 'choice')\")\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'user_id' ('userId' TEXT NOT NULL, 'draft_note_id' INTEGER NOT NULL, PRIMARY KEY('userId', 'draft_note_id'), FOREIGN KEY('draft_note_id') REFERENCES 'draft_note_table'('draft_note_id') ON UPDATE CASCADE ON DELETE CASCADE )\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_user_id_draft_note_id' ON 'user_id' ('draft_note_id')\")\n        \n    }\n}\n\n\nval MIGRATION_5_6 = object : Migration(5, 6){\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'meta_table' ('uri' TEXT NOT NULL, 'bannerUrl' TEXT, 'cacheRemoteFiles' INTEGER, 'description' TEXT, 'disableGlobalTimeline' INTEGER, 'disableLocalTimeline' INTEGER, 'disableRegistration' INTEGER, 'driveCapacityPerLocalUserMb' INTEGER, 'driveCapacityPerRemoteUserMb' INTEGER, 'enableDiscordIntegration' INTEGER, 'enableEmail' INTEGER, 'enableEmojiReaction' INTEGER, 'enableGithubIntegration' INTEGER, 'enableRecaptcha' INTEGER, 'enableServiceWorker' INTEGER, 'enableTwitterIntegration' INTEGER, 'errorImageUrl' TEXT, 'feedbackUrl' TEXT, 'iconUrl' TEXT, 'maintainerEmail' TEXT, 'maintainerName' TEXT, 'mascotImageUrl' TEXT, 'maxNoteTextLength' INTEGER, 'name' TEXT, 'recaptchaSiteKey' TEXT, 'secure' INTEGER, 'swPublicKey' TEXT, 'toSUrl' TEXT, 'version' TEXT NOT NULL, PRIMARY KEY('uri'))\")\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'emoji_table' ('name' TEXT NOT NULL, 'instanceDomain' TEXT NOT NULL, 'host' TEXT, 'url' TEXT, 'uri' TEXT, 'type' TEXT, 'category' TEXT, 'id' TEXT, PRIMARY KEY('name', 'instanceDomain'), FOREIGN KEY('instanceDomain') REFERENCES 'meta_table'('uri') ON UPDATE CASCADE ON DELETE CASCADE )\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_emoji_table_instanceDomain' ON 'emoji_table' ('instanceDomain')\")\n        database.execSQL(\"CREATE INDEX IF NOT EXISTS 'index_emoji_table_name' ON 'emoji_table' ('name')\")\n    }\n}\n\nval MIGRATION_6_7 = object : Migration(6, 7) {\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'emoji_alias_table' ('alias' TEXT NOT NULL, 'name' TEXT NOT NULL, 'instanceDomain' TEXT NOT NULL, PRIMARY KEY('alias', 'name', 'instanceDomain'), FOREIGN KEY('name', 'instanceDomain') REFERENCES 'emoji_table'('name', 'instanceDomain') ON UPDATE CASCADE ON DELETE CASCADE )\")\n    }\n}\n\nval MIGRATION_7_8 = object : Migration(7, 8) {\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'unread_notifications_table' ('accountId' INTEGER NOT NULL, 'notificationId' TEXT NOT NULL, PRIMARY KEY('accountId', 'notificationId'), FOREIGN KEY('accountId') REFERENCES 'account_table'('accountId') ON UPDATE CASCADE ON DELETE CASCADE )\")\n    }\n}\n\nval MIGRATION_8_10 = object : Migration(8, 10) {\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"CREATE TABLE IF NOT EXISTS 'nicknames' ('nickname' TEXT NOT NULL, 'username' TEXT NOT NULL, 'host' TEXT NOT NULL, 'id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)\")\n        database.execSQL(\"CREATE UNIQUE INDEX IF NOT EXISTS 'index_nicknames_username_host' ON 'nicknames' ('username', 'host')\")\n    }\n}\n\nval MIGRATION_10_11 = object : Migration(10, 11) {\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"alter table 'account_table' add column 'instanceType' TEXT NOT NULL default 'misskey'\")\n    }\n}\n\nval MIGRATION_51_52 = object : Migration(51, 52) {\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"DROP TABLE IF EXISTS  'draft_file_table'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'utf8_emojis_by_amio'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'custom_emoji_aliases'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'custom_emojis'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'emoji_alias_table'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'emoji_table'\")\n    }\n}\n\nval MIGRATION_57_58 = object : Migration(57, 58) {\n    override fun migrate(database: SupportSQLiteDatabase) {\n        database.execSQL(\"DROP TABLE IF EXISTS 'connection_information'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'page'\")\n        database.execSQL(\"DROP TABLE IF EXISTS 'account'\")\n    }\n}\n// account_tableにtokenカラムを追加し、encryptedTokenを複合化してtokenに複合化した値を追加する実装例\n//class Migration58To59(\n//    val encryption: Encryption,\n//) : Migration(58, 59) {\n//    override fun migrate(database: SupportSQLiteDatabase) {\n//        database.execSQL(\"alter table 'account_table' add column 'token' TEXT\")\n//        val cursor = database.query(\"select * from 'account_table'\")\n//        while(cursor.moveToNext()) {\n//            val id = cursor.getLong(cursor.getColumnIndexOrThrow(\"accountId\"))\n//            val encryptedToken = cursor.getString(cursor.getColumnIndexOrThrow(\"encryptedToken\"))\n//            val remoteId = cursor.getString(cursor.getColumnIndexOrThrow(\"remoteId\"))\n//            val token = encryption.decrypt(remoteId, encryptedToken)\n//            val contentValues = ContentValues()\n//\n//            contentValues.put(\"token\", token)\n//            database.update(\"account_table\", SQLiteDatabase.CONFLICT_IGNORE, contentValues, \"accountId = ?\", arrayOf(id))\n//        }\n//    }\n//}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/MisskeyEntityConverters.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure\n\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.misskey.groups.GroupDTO\nimport net.pantasystem.milktea.api.misskey.list.UserListDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.user.User\n\n\nfun UserListDTO.toEntity(account: Account): UserList {\n    return UserList(\n        UserList.Id(account.accountId, id),\n        createdAt,\n        name,\n        userIds.map {\n            User.Id(account.accountId, it)\n        }\n    )\n}\n\n\n\nfun GroupDTO.toGroup(accountId: Long): Group {\n    return Group(\n        Group.Id(accountId, id),\n        createdAt,\n        name,\n        User.Id(accountId, ownerId),\n        userIds.map {\n            User.Id(accountId, it)\n        }\n    )\n}\n\n\ndata class NoteDTOUnpacked(\n    val note: NoteDTO,\n    val notes: List<NoteDTO>,\n    val users: List<User>,\n    val files: List<FileProperty>\n)\n\ndata class TootDTOUnpacked(\n    val toot: TootStatusDTO,\n    val toots: List<TootStatusDTO>,\n    val users: List<User>,\n    val files: List<FileProperty>\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/TootEntityConverters.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure\n\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountRelationshipDTO\nimport net.pantasystem.milktea.api.mastodon.instance.Instance\nimport net.pantasystem.milktea.api.mastodon.media.TootMediaAttachment\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api.mastodon.poll.TootPollDTO\nimport net.pantasystem.milktea.api.mastodon.status.StatusVisibilityType\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfo\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.notification.FavoriteNotification\nimport net.pantasystem.milktea.model.notification.FollowNotification\nimport net.pantasystem.milktea.model.notification.FollowRequestAcceptedNotification\nimport net.pantasystem.milktea.model.notification.MentionNotification\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.PollEndedNotification\nimport net.pantasystem.milktea.model.notification.PostNotification\nimport net.pantasystem.milktea.model.notification.ReactionNotification\nimport net.pantasystem.milktea.model.notification.RenoteNotification\nimport net.pantasystem.milktea.model.notification.UnknownNotification\nimport net.pantasystem.milktea.model.user.User\n\nfun TootPollDTO?.toPoll(): Poll? {\n    return this?.let { dto ->\n        Poll(\n            multiple = dto.multiple ?: false,\n            expiresAt = dto.expiresAt,\n            choices = dto.options.mapIndexed { index, value ->\n                Poll.Choice(\n                    index = index,\n                    text = value.title,\n                    isVoted = (!(dto.multiple\n                        ?: false) && dto.voted == true) || dto.ownVotes?.firstOrNull {\n                        it == index\n                    } != null,\n                    votes = dto.votesCount ?: 0\n                )\n            }\n        )\n    }\n}\n\nfun TootMediaAttachment.toFileProperty(account: Account, isSensitive: Boolean): FileProperty {\n    return FileProperty(\n        id = FileProperty.Id(account.accountId, id),\n        name = \"\",\n        createdAt = null,\n        type = type,\n        md5 = null,\n        size = null,\n        url = url ?: \"\",\n        isSensitive = isSensitive,\n        thumbnailUrl = previewUrl,\n        blurhash = blurhash,\n        comment = description,\n    )\n}\n\n\nsuspend fun TootStatusDTO.toEntities(\n    account: Account,\n    dtoEntityConverter: MastodonAccountDTOEntityConverter,\n): TootDTOUnpacked {\n    val users = mutableListOf<User>()\n    val notes = mutableListOf<TootStatusDTO>()\n    val files = mutableListOf<FileProperty>()\n    pickEntities(account, notes, users, files, dtoEntityConverter)\n    return TootDTOUnpacked(\n        this,\n        files = files,\n        users = users,\n        toots = notes,\n    )\n}\n\nsuspend fun TootStatusDTO.pickEntities(\n    account: Account,\n    notes: MutableList<TootStatusDTO>,\n    users: MutableList<User>,\n    files: MutableList<FileProperty>,\n    dtoEntityConverter: MastodonAccountDTOEntityConverter,\n) {\n    val user = dtoEntityConverter.convert(account, this.account)\n    notes.add(this)\n    users.add(user)\n    files.addAll(\n        mediaAttachments.map {\n            it.toFileProperty(account, sensitive)\n        }\n    )\n    this.reblog?.pickEntities(account, notes, users, files, dtoEntityConverter)\n    this.quote?.pickEntities(account, notes, users, files, dtoEntityConverter)\n}\n\nfun MastodonAccountRelationshipDTO.toUserRelated(): User.Related {\n    return User.Related(\n        isFollower = followedBy,\n        isFollowing = following,\n        isBlocking = blocking,\n        hasPendingFollowRequestFromYou = requested,\n        isMuting = muting,\n        hasPendingFollowRequestToYou = false,\n        isNotify = notifying ?: false,\n    )\n}\n\nfun MstNotificationDTO.toModel(a: Account, isRead: Boolean): Notification {\n    val id = Notification.Id(a.accountId, id)\n    val userId = User.Id(a.accountId, account.id)\n    return when(type) {\n        MstNotificationDTO.NotificationType.Mention -> {\n            MentionNotification(\n                createdAt = createdAt,\n                id = id,\n                userId = userId,\n                isRead = isRead,\n                noteId = Note.Id(a.accountId, requireNotNull(status).id)\n            )\n        }\n        MstNotificationDTO.NotificationType.Status -> {\n            PostNotification(\n                createdAt = createdAt,\n                id = id,\n                userId = userId,\n                isRead = isRead,\n                noteId = Note.Id(a.accountId, requireNotNull(status).id)\n            )\n        }\n        MstNotificationDTO.NotificationType.Reblog -> {\n            RenoteNotification(\n                id = id,\n                createdAt = createdAt,\n                userId = userId,\n                noteId = Note.Id(a.accountId, requireNotNull(status).id),\n                isRead = isRead,\n            )\n        }\n        MstNotificationDTO.NotificationType.Follow -> {\n            FollowNotification(\n                id = id,\n                createdAt = createdAt,\n                userId = userId,\n                isRead = isRead,\n            )\n        }\n        MstNotificationDTO.NotificationType.FollowRequest -> {\n            FollowRequestAcceptedNotification(\n                id = id,\n                createdAt = createdAt,\n                userId = userId,\n                isRead = isRead,\n            )\n        }\n        MstNotificationDTO.NotificationType.Favourite -> {\n            FavoriteNotification(\n                createdAt = createdAt,\n                id = id,\n                userId = userId,\n                isRead = isRead,\n                noteId = Note.Id(a.accountId, requireNotNull(status).id)\n            )\n        }\n        MstNotificationDTO.NotificationType.Poll -> {\n            PollEndedNotification(\n                id = id,\n                createdAt = createdAt,\n                isRead = isRead,\n                noteId = Note.Id(a.accountId, requireNotNull(status).id),\n            )\n        }\n        MstNotificationDTO.NotificationType.Update -> {\n            UnknownNotification(\n                id = id,\n                createdAt = createdAt,\n                isRead = isRead,\n                rawType = type.name,\n                userId = userId,\n            )\n        }\n        MstNotificationDTO.NotificationType.AdminSingUp -> {\n            UnknownNotification(\n                id = id,\n                createdAt = createdAt,\n                isRead = isRead,\n                rawType = type.name,\n                userId = userId,\n            )\n        }\n        MstNotificationDTO.NotificationType.AdminReport -> {\n            UnknownNotification(\n                id = id,\n                createdAt = createdAt,\n                isRead = isRead,\n                rawType = type.name,\n                userId = userId,\n            )\n        }\n        MstNotificationDTO.NotificationType.EmojiReaction -> {\n            ReactionNotification(\n                id = id,\n                createdAt = createdAt,\n                isRead = isRead,\n                noteId = Note.Id(a.accountId, requireNotNull(status).id),\n                reaction = requireNotNull(emojiReaction).reaction,\n                userId = userId,\n            )\n        }\n    }\n}\nfun Visibility(type: StatusVisibilityType, circleId: String? = null, visibilityEx: String? = null,): Visibility {\n    return when(type) {\n        StatusVisibilityType.Private -> {\n            when(visibilityEx) {\n                \"limited\" -> Visibility.Limited(circleId)\n                else -> Visibility.Followers(false)\n            }\n        }\n        StatusVisibilityType.Unlisted -> Visibility.Home(false)\n        StatusVisibilityType.Public -> Visibility.Public(false)\n        StatusVisibilityType.Direct -> when(visibilityEx) {\n            \"personal\" -> Visibility.Personal\n            else -> Visibility.Specified(emptyList())\n        }\n    }\n}\n\nfun Instance.toModel(): MastodonInstanceInfo {\n    return MastodonInstanceInfo(\n        uri = uri,\n        title = title,\n        description = description,\n        email = email,\n        urls = urls.let {\n            MastodonInstanceInfo.Urls(\n                streamingApi = it.streamingApi\n            )\n        },\n        version = version,\n        configuration = configuration?.let { config ->\n            MastodonInstanceInfo.Configuration(\n                statuses = config.statuses?.let {\n                    MastodonInstanceInfo.Configuration.Statuses(\n                        maxCharacters = it.maxCharacters,\n                        maxMediaAttachments = it.maxMediaAttachments,\n                    )\n                },\n                polls = config.polls?.let {\n                    MastodonInstanceInfo.Configuration.Polls(\n                        maxOptions = it.maxOptions,\n                        maxCharactersPerOption = it.maxCharactersPerOption,\n                        maxExpiration = it.maxExpiration,\n                        minExpiration = it.minExpiration,\n                    )\n                },\n                emojiReactions = config.emojiReactions?.let {\n                    MastodonInstanceInfo.Configuration.EmojiReactions(\n                        maxReactions = it.maxReactions,\n                        maxReactionsPerAccount = it.maxReactionsPerAccount,\n                    )\n                }\n            )\n        },\n        fedibirdCapabilities = fedibirdCapabilities?.let {\n            it + listOfNotNull(\n                if (featureQuote == true) \"feature_quote\" else null,\n            )\n        },\n        pleroma = pleroma?.let { pleroma ->\n            MastodonInstanceInfo.Pleroma(\n                metadata = pleroma.metadata.let { m ->\n                    MastodonInstanceInfo.Pleroma.Metadata(\n                        features = m.features\n                    )\n                }\n            )\n        }\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/AuthImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account\n\nimport net.pantasystem.milktea.model.account.*\nimport javax.inject.Inject\nimport net.pantasystem.milktea.common.runCancellableCatching\n\nclass AuthImpl @Inject constructor(\n    val accountRepository: AccountRepository,\n) : Auth, AuthById, GetAccount {\n\n\n    override suspend fun check(): Boolean {\n        return try {\n            accountRepository.getCurrentAccount().getOrThrow()\n            true\n        } catch (e: UnauthorizedException) {\n            false\n        }\n    }\n\n    override suspend fun getCurrentAccount(): Account? {\n        return runCancellableCatching {\n            accountRepository.getCurrentAccount().getOrThrow()\n        }.getOrNull()\n    }\n\n\n    override suspend fun getToken(): String? {\n        return getCurrentAccount()?.token\n    }\n\n    override suspend fun check(id: Long): Boolean {\n        return runCancellableCatching {\n            accountRepository.get(id)\n        }.getOrNull() != null\n    }\n\n    override suspend fun getToken(id: Long): String {\n        return accountRepository.get(id).getOrThrow().token\n    }\n\n    override suspend fun get(id: Long): Account {\n        return accountRepository.get(id).getOrThrow()\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/ClientIdRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account\n\nimport android.content.SharedPreferences\nimport androidx.core.content.edit\nimport net.pantasystem.milktea.model.account.ClientId\nimport net.pantasystem.milktea.model.account.ClientIdRepository\nimport javax.inject.Inject\n\nprivate const val CLIENT_ID = \"milktea.CLIENT_ID\"\nclass ClientIdRepositoryImpl @Inject constructor(\n    private val sharedPreferences: SharedPreferences\n): ClientIdRepository {\n    override fun getOrCreate(): ClientId {\n        val clientId = sharedPreferences.getString(CLIENT_ID, null)?.let {\n            ClientId(it)\n        }\n        val newClientId = ClientId.createOrNothing(clientId)\n        if(clientId == null) {\n            sharedPreferences.edit {\n                putString(CLIENT_ID, newClientId.clientId)\n            }\n        }\n        return newClientId\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/SignOutUseCaseImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account\n\nimport net.pantasystem.milktea.api_streaming.network.SocketImpl\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.SignOutUseCase\nimport net.pantasystem.milktea.model.sw.register.SubscriptionUnRegistration\nimport javax.inject.Inject\n\n\nclass SignOutUseCaseImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val subscriptionUnRegistration: SubscriptionUnRegistration,\n    private val socketWithAccountProvider: SocketWithAccountProvider,\n    private val accountStore: AccountStore,\n): SignOutUseCase {\n\n    override suspend fun invoke(account: Account): Result<Unit> {\n        return runCancellableCatching {\n            subscriptionUnRegistration\n                .unregister(account.accountId)\n        }.mapCancellableCatching {\n            accountRepository.delete(account)\n        }.mapCancellableCatching {\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val socket = socketWithAccountProvider.get(account.accountId)\n                    if (socket is SocketImpl) {\n                        socket.destroy()\n                    } else {\n                        socketWithAccountProvider.get(account.accountId)?.disconnect()\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {}\n            }\n        }.mapCancellableCatching {\n            accountStore.initialize()\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/converter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account\n\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.common.Hash\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.AccessToken\nimport net.pantasystem.milktea.model.account.Account\n\n\nfun AccessToken.Misskey.newAccount(instanceDomain: String): Account {\n    return this.user.newAccount(\n        instanceDomain,\n        Hash.sha256(accessToken + appSecret)\n    )\n}\n\nfun AccessToken.Firefish.newAccount(instanceDomain: String): Account {\n    return this.user.newAccount4Firefish(\n        instanceDomain,\n        Hash.sha256(accessToken + appSecret)\n    )\n}\n\nfun AccessToken.Mastodon.newAccount(\n    instanceDomain: String,\n): Account {\n    return Account(\n        remoteId = this.account.id,\n        userName = this.account.username,\n        instanceDomain = instanceDomain,\n        token = accessToken,\n        instanceType = Account.InstanceType.MASTODON,\n        pages = emptyList()\n    )\n}\n\nfun AccessToken.Pleroma.newAccount(\n    instanceDomain: String\n): Account {\n    return Account(\n        remoteId = this.account.id,\n        userName = this.account.username,\n        instanceDomain = instanceDomain,\n        token = accessToken,\n        instanceType = Account.InstanceType.PLEROMA,\n        pages = emptyList()\n    )\n}\n\nfun AccessToken.MisskeyIdAndPassword.newAccount(instanceDomain: String): Account {\n    return this.user.newAccount(\n        instanceDomain,\n        accessToken,\n    )\n}\n\nfun AccessToken.newAccount(instanceDomain: String): Account {\n    return when(this) {\n        is AccessToken.Misskey -> {\n            this.newAccount(instanceDomain)\n        }\n        is AccessToken.Mastodon -> {\n            this.newAccount(instanceDomain)\n        }\n        is AccessToken.MisskeyIdAndPassword -> {\n            this.newAccount(instanceDomain)\n        }\n        is AccessToken.Pleroma -> {\n            this.newAccount(instanceDomain)\n        }\n        is AccessToken.Firefish -> {\n            this.newAccount(instanceDomain)\n        }\n    }\n}\n\n\n\nfun UserDTO.newAccount(instanceDomain: String, token: String): Account {\n    return Account(\n        remoteId = this.id,\n        instanceDomain = instanceDomain,\n        userName = this.userName,\n        /*name = this.name,\n        description = this.description,\n        followersCount = this.followersCount?: 0,\n        followingCount = this.followingCount?: 0,\n        notesCount = this.notesCount?: 0,\n        isBot = this.isBot,\n        isCat = this.isCat,\n        avatarUrl = this.avatarUrl,\n        bannerUrl = this.bannerUrl,*/\n        token = token,\n        //emojis = this.emojis?: emptyList(),\n        pages = emptyList(),\n        instanceType = Account.InstanceType.MISSKEY\n    )\n}\n\nfun UserDTO.newAccount4Firefish(instanceDomain: String, token: String): Account {\n    return Account(\n        remoteId = this.id,\n        instanceDomain = instanceDomain,\n        userName = this.userName,\n        /*name = this.name,\n        description = this.description,\n        followersCount = this.followersCount?: 0,\n        followingCount = this.followingCount?: 0,\n        notesCount = this.notesCount?: 0,\n        isBot = this.isBot,\n        isCat = this.isCat,\n        avatarUrl = this.avatarUrl,\n        bannerUrl = this.bannerUrl,*/\n        token = token,\n        //emojis = this.emojis?: emptyList(),\n        pages = emptyList(),\n        instanceType = Account.InstanceType.FIREFISH\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/db/AccountDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.db\n\nimport androidx.room.*\n\n@Dao\nabstract class AccountDAO{\n\n    @Query(\"select * from account_table where accountId = :accountId\")\n    abstract fun get(accountId: Long): AccountRecord?\n\n    @Transaction\n    @Query(\"select * from account_table where accountId = :accountId\")\n    abstract fun getAccountRelation(accountId: Long): AccountRelation?\n\n    @Transaction\n    @Query(\"select * from account_table where remoteId = :remoteId and instanceDomain = :instanceDomain\")\n    abstract fun findByRemoteIdAndInstanceDomain(remoteId: String, instanceDomain: String): AccountRelation?\n\n    @Transaction\n    @Query(\"select * from account_table where userName = :userName and instanceDomain = :instanceDomain\")\n    abstract fun findByUserNameAndInstanceDomain(userName: String, instanceDomain: String): AccountRelation?\n\n    @Transaction\n    @Query(\"select * from account_table where userName = :userName\")\n    abstract fun findAllByUserName(userName: String): List<AccountRelation>\n\n    @Transaction\n    @Query(\"select * from account_table\")\n    abstract fun findAll(): List<AccountRelation>\n\n\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun insert(account: AccountRecord): Long\n\n    @Delete\n    abstract fun delete(account: AccountRecord)\n\n    @Update\n    abstract fun update(account: AccountRecord)\n\n\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/db/AccountRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport androidx.room.TypeConverter\nimport net.pantasystem.milktea.common.Encryption\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Page\nimport java.io.Serializable\n\n\n@Entity(\n    tableName = \"account_table\",\n    indices = [\n        Index(\"remoteId\"),\n        Index(\"instanceDomain\"),\n        Index(\"userName\")\n    ]\n)\ndata class AccountRecord(\n    @ColumnInfo(name = \"remoteId\")\n    val remoteId: String,\n\n    @ColumnInfo(name = \"instanceDomain\")\n    val instanceDomain: String,\n\n    @ColumnInfo(name = \"userName\")\n    val userName: String,\n\n    @ColumnInfo(name = \"encryptedToken\")\n    val encryptedToken: String,\n\n    @Ignore val pages: List<Page>,\n    @ColumnInfo(name = \"instanceType\", defaultValue = \"misskey\")\n    val instanceType: Account.InstanceType,\n\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = \"accountId\")\n    var accountId: Long = 0\n) : Serializable {\n\n\n\n    companion object {\n        @Ignore\n        fun from(account: Account, encryption: Encryption): AccountRecord {\n            val encryptedToken = encryption.encrypt(account.remoteId, account.token)\n            return AccountRecord(\n                remoteId = account.remoteId,\n                instanceDomain = account.instanceDomain,\n                userName = account.userName,\n                encryptedToken = encryptedToken,\n                pages = account.pages,\n                instanceType = account.instanceType,\n                accountId = account.accountId\n            )\n        }\n    }\n\n    @Ignore\n    fun toAccount(encryption: Encryption): Account {\n        val decryptedToken = runCancellableCatching {\n            requireNotNull(encryption.decrypt(remoteId, encryptedToken))\n        }.getOrElse {\n            \"\"\n        }\n\n        return Account(\n            remoteId = remoteId,\n            instanceDomain = instanceDomain,\n            userName = userName,\n            token = decryptedToken,\n            pages = pages,\n            instanceType = instanceType,\n            accountId = accountId,\n        )\n    }\n\n    constructor(\n        remoteId: String,\n        instanceDomain: String,\n        userName: String,\n        instanceType: Account.InstanceType,\n        encryptedToken: String\n    ) :\n            this(\n                remoteId,\n                instanceDomain,\n                userName,\n                encryptedToken,\n                emptyList(),\n                instanceType\n            )\n\n\n    fun getHost(): String {\n        if (instanceDomain.startsWith(\"https://\")) {\n            return instanceDomain.substring(\"https://\".length, instanceDomain.length)\n        } else if (instanceDomain.startsWith(\"http://\")) {\n            return instanceDomain.substring(\"http://\".length, instanceDomain.length)\n        }\n        return instanceDomain\n    }\n\n}\n\nclass AccountInstanceTypeConverter {\n\n    @TypeConverter\n    fun convert(type: Account.InstanceType): String {\n        // NOTE: enum.nameで取得するとリファクタリング時にデータが壊れる可能性があるのであえて愚直に変換している\n        return when (type) {\n            Account.InstanceType.MISSKEY -> \"misskey\"\n            Account.InstanceType.MASTODON -> \"mastodon\"\n            Account.InstanceType.PLEROMA -> \"pleroma\"\n            Account.InstanceType.FIREFISH -> \"firefish\"\n        }\n    }\n\n    @TypeConverter\n    fun convert(type: String): Account.InstanceType {\n        // NOTE: enum.nameで取得するとリファクタリング時にデータが壊れる可能性があるのであえて愚直に変換している\n        return when (type) {\n            \"misskey\" -> Account.InstanceType.MISSKEY\n            \"mastodon\" -> Account.InstanceType.MASTODON\n            \"pleroma\" -> Account.InstanceType.PLEROMA\n            \"firefish\" -> Account.InstanceType.FIREFISH\n            else -> throw IllegalArgumentException(\"未知のアカウント種別です\")\n        }\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/db/AccountRelation.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.db\n\nimport androidx.room.DatabaseView\nimport androidx.room.Embedded\nimport androidx.room.Ignore\nimport androidx.room.Relation\nimport net.pantasystem.milktea.data.infrastructure.account.page.db.PageRecord\n\n@DatabaseView\nclass AccountRelation{\n    @Embedded lateinit var account: AccountRecord\n\n    @Relation(parentColumn = \"accountId\", entityColumn = \"accountId\", entity = PageRecord::class)\n    lateinit var pages: List<PageRecord>\n\n    @Ignore\n    fun toAccount(): AccountRecord {\n        return account.copy(pages = pages.sortedBy {\n            it.weight\n        }.map {\n            it.toPage()\n        })\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/db/MediatorAccountRepository.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.db\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountNotFoundException\nimport net.pantasystem.milktea.model.account.AccountRepository\n\n/**\n * データベースの内容をメモリにキャッシュしデータベースを制御する。\n * Writeは遅くなるがReadは高速化することが期待できる。\n */\nclass MediatorAccountRepository(\n    private val roomAccountRepository: RoomAccountRepository,\n    private val ioDispatcher: CoroutineDispatcher,\n) : AccountRepository {\n\n    private var mAccountMap: Map<Long, Account> = mapOf()\n    private var mAccounts: List<Account> = listOf()\n        set(value) {\n            field = value\n            mAccountMap = value.associateBy {\n                it.accountId\n            }\n        }\n\n\n    override suspend fun add(account: Account, isUpdatePages: Boolean): Result<Account> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                roomAccountRepository.add(account, isUpdatePages).also {\n                    mAccounts = roomAccountRepository.findAll().getOrThrow()\n                }.getOrThrow()\n            }\n        }\n    }\n\n    override suspend fun delete(account: Account) {\n        withContext(ioDispatcher) {\n            roomAccountRepository.delete(account).also {\n                mAccounts = roomAccountRepository.findAll().getOrThrow()\n            }\n        }\n    }\n\n    override suspend fun findAll(): Result<List<Account>> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                if(mAccounts.isEmpty()) {\n                    mAccounts = roomAccountRepository.findAll().getOrThrow()\n                }\n                mAccounts\n            }\n        }\n    }\n\n\n    override suspend fun get(accountId: Long): Result<Account> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val inMem = mAccountMap[accountId]\n                if (inMem != null) {\n                    return@withContext inMem\n                }\n                findAll().getOrThrow().firstOrNull {\n                    it.accountId == accountId\n                }?: throw AccountNotFoundException(accountId)\n            }\n        }\n\n    }\n\n    override suspend fun getCurrentAccount(): Result<Account> {\n        return withContext(ioDispatcher) {\n            roomAccountRepository.getCurrentAccount()\n        }\n    }\n\n    override suspend fun setCurrentAccount(account: Account): Result<Account> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                roomAccountRepository.setCurrentAccount(account).getOrThrow().also {\n                    mAccounts = findAll().getOrThrow()\n                }\n            }\n        }\n    }\n\n    override fun addEventListener(listener: AccountRepository.Listener) {\n        roomAccountRepository.addEventListener(listener)\n    }\n\n    override fun removeEventListener(listener: AccountRepository.Listener) {\n        roomAccountRepository.removeEventListener(listener)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/db/RoomAccountRepository.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.db\n\nimport android.content.SharedPreferences\nimport android.util.Log\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.common.Encryption\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.account.page.db.PageDAO\nimport net.pantasystem.milktea.data.infrastructure.account.page.db.PageRecord\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountNotFoundException\nimport net.pantasystem.milktea.model.account.AccountRegistrationFailedException\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Page\nimport java.util.concurrent.Callable\n\nconst val CURRENT_ACCOUNT_ID_KEY = \"CURRENT_ACCOUNT_ID\"\n\nclass RoomAccountRepository(\n    private val roomDataBase: DataBase,\n    private val sharedPreferences: SharedPreferences,\n    private val accountDao: AccountDAO,\n    private val pageDAO: PageDAO,\n    private val encryption: Encryption,\n) : AccountRepository {\n\n    private val listeners = mutableSetOf<AccountRepository.Listener>()\n\n    override fun addEventListener(listener: AccountRepository.Listener) {\n        synchronized(listeners) {\n            listeners.add(listener)\n        }\n    }\n\n    override fun removeEventListener(listener: AccountRepository.Listener) {\n        synchronized(listeners) {\n            listeners.remove(listener)\n        }\n    }\n\n    override suspend fun add(account: Account, isUpdatePages: Boolean): Result<Account> = runCancellableCatching{\n        return@runCancellableCatching roomDataBase.runInTransaction(Callable<Account> {\n            var exAccount: Account? = null\n            var isNeedDeepUpdate = isUpdatePages\n\n            if (account.accountId > 0) {\n                exAccount = accountDao.getAccountRelation(account.accountId)?.toAccount()?.toAccount(encryption)\n            }\n            if (exAccount == null) {\n                exAccount = accountDao.findByUserNameAndInstanceDomain(\n                    account.userName,\n                    account.instanceDomain\n                )?.toAccount()?.toAccount(encryption)\n            }\n\n            if (exAccount == null) {\n                exAccount = accountDao.findByRemoteIdAndInstanceDomain(\n                    account.remoteId,\n                    account.instanceDomain\n                )?.toAccount()?.toAccount(encryption)\n            }\n\n            if (exAccount == null) {\n                val id = accountDao.insert(AccountRecord.from(account, encryption))\n                exAccount = accountDao.get(id)?.toAccount(encryption) ?: throw AccountRegistrationFailedException()\n                Log.d(\"RoomAccountRepository\", \"insertしました: $exAccount\")\n                isNeedDeepUpdate = true\n            } else {\n                exAccount = exAccount.copy(\n                    remoteId = account.remoteId,\n                    instanceDomain = account.instanceDomain,\n                    token = account.token,\n                    userName = account.userName,\n                    instanceType = account.instanceType,\n                ).also {\n                    accountDao.update(AccountRecord.from(it, encryption))\n                }\n            }\n\n\n            if (isNeedDeepUpdate) {\n                val exPages = exAccount.pages\n                val pages = account.pages.mapIndexed { i, page ->\n                    page.also {\n                        it.accountId = exAccount!!.accountId\n                        it.weight = i\n                    }\n                }\n\n                val pageMap = account.pages.associateBy {\n                    it.pageId\n                }\n\n                val exPageMap = exAccount.pages.associateBy {\n                    it.pageId\n                }\n\n                val addedPages = ArrayList<Page>()\n                val updatedPages = ArrayList<Page>()\n\n                for (page in pages) {\n                    when {\n                        page.pageId == 0L -> {\n                            addedPages.add(page)\n                        }\n                        page != exPageMap[page.pageId] -> {\n                            updatedPages.add(page)\n                        }\n\n                    }\n                }\n\n                val removedPages = exPages.filter {\n                    pageMap[it.pageId] == null\n                }\n                Log.d(\"Repo\", \"削除されたページ:$removedPages ${exPages.size}, ${pages.size}\")\n\n                runBlocking {\n                    pageDAO.deleteAll(removedPages.map {\n                        PageRecord.from(it)\n                    })\n                    pageDAO.updateAll(updatedPages.map {\n                        PageRecord.from(it)\n                    })\n                    pageDAO.insertAll(addedPages.map {\n                        PageRecord.from(it)\n                    })\n                }\n\n                exAccount = runBlocking {\n                    get(exAccount!!.accountId).getOrThrow()\n                }\n                Log.d(\"Repo\", \"ex: $exAccount\")\n                publish(AccountRepository.Event.Created(account))\n            } else {\n                publish(AccountRepository.Event.Updated(account))\n            }\n\n            exAccount\n        })\n\n    }\n\n    override suspend fun delete(account: Account) {\n        accountDao.delete(AccountRecord.from(account, encryption))\n        publish(AccountRepository.Event.Deleted(account.accountId))\n    }\n\n\n    @Throws(AccountNotFoundException::class)\n    override suspend fun get(accountId: Long): Result<Account> {\n        return runCancellableCatching {\n            accountDao.getAccountRelation(accountId)?.toAccount()?.toAccount(encryption)\n                ?: throw AccountNotFoundException(\n                    accountId\n                )\n        }\n    }\n\n    override suspend fun findAll(): Result<List<Account>> {\n        return runCancellableCatching {\n            accountDao.findAll().map {\n                it.toAccount().toAccount(encryption)\n            }\n        }\n    }\n\n    @Throws(AccountNotFoundException::class)\n    override suspend fun getCurrentAccount(): Result<Account> {\n        val currentAccountId = sharedPreferences.getLong(CURRENT_ACCOUNT_ID_KEY, -1)\n        val current = accountDao.getAccountRelation(currentAccountId)\n        return runCancellableCatching {\n            if (current == null) {\n                val first = accountDao.findAll().firstOrNull()?.toAccount()?.toAccount(encryption)\n                    ?: throw AccountNotFoundException(currentAccountId)\n                setCurrentAccount(first).getOrThrow()\n            } else {\n                current.toAccount().toAccount(encryption)\n            }\n        }\n\n    }\n\n\n    override suspend fun setCurrentAccount(account: Account): Result<Account> {\n        return runCancellableCatching {\n            val current = accountDao.get(account.accountId)\n            val ac = if (current == null) {\n                add(account).getOrThrow()\n            } else {\n                account\n            }\n            sharedPreferences.edit().also {\n                it.putLong(CURRENT_ACCOUNT_ID_KEY, ac.accountId)\n            }.apply()\n            publish(AccountRepository.Event.Updated(ac))\n\n            return@runCancellableCatching ac\n        }\n\n    }\n\n\n    private fun publish(e: AccountRepository.Event) {\n        synchronized(listeners) {\n            listeners.forEach {\n                it.on(e)\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/page/db/PageDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.page.db\n\nimport androidx.room.*\n\n@Dao\ninterface PageDAO{\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertAll(pages: List<PageRecord>)\n\n    @Update\n    suspend fun update(page: PageRecord)\n\n    @Update\n    suspend fun updateAll(pages: List<PageRecord>)\n\n    @Delete\n    suspend fun deleteAll(pages: List<PageRecord>)\n\n    @Query(\"delete from page_table where accountId = :accountId\")\n    suspend fun clearByAccountId(accountId: Long)\n\n    @Query(\"select * from page_table where accountId = :accountId\")\n    suspend fun findAllByAccount(accountId: Long): List<PageRecord>\n\n    @Query(\"select * from page_table where pageId = :pageId\")\n    suspend fun get(pageId: Long): PageRecord?\n\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/page/db/PageRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.page.db\n\nimport androidx.room.*\nimport net.pantasystem.milktea.model.account.page.Page\n\n@Entity(\n    tableName = \"page_table\",\n    indices = [Index(\"weight\"), Index(\"accountId\")]\n)\ndata class PageRecord(\n    @ColumnInfo(name = \"accountId\")\n    var accountId: Long,\n\n    @ColumnInfo(name = \"title\")\n    val title: String,\n\n    @ColumnInfo(name = \"weight\")\n    var weight: Int,\n\n    @Embedded val pageParams: PageRecordParams,\n\n    @ColumnInfo(name = \"isSavePagePosition\")\n    val isSavePagePosition: Boolean? = false,\n\n    @ColumnInfo(name = \"attachedAccountId\")\n    val attachedAccountId: Long? = null,\n\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = \"pageId\")\n    var pageId: Long\n) {\n\n    companion object {\n        fun from(page: Page): PageRecord {\n            return PageRecord(\n                accountId = page.accountId,\n                title = page.title,\n                weight = page.weight,\n                pageParams = PageRecordParams.from(page.pageParams),\n                isSavePagePosition = page.isSavePagePosition,\n                attachedAccountId = page.attachedAccountId,\n                pageId = page.pageId\n            )\n        }\n    }\n\n    fun toPage(): Page {\n        return Page(\n            accountId = accountId,\n            title = title,\n            weight = weight,\n            pageParams = pageParams.toParams(),\n            pageId = pageId,\n            attachedAccountId = attachedAccountId,\n            isSavePagePosition = isSavePagePosition ?: false\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/page/db/PageRecordParams.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.page.db\n\nimport androidx.room.ColumnInfo\nimport net.pantasystem.milktea.model.account.page.PageParams\nimport net.pantasystem.milktea.model.account.page.PageType\n\ndata class PageRecordParams(\n    @ColumnInfo(name = \"type\")\n    val type: PageType = PageType.HOME,\n\n    @ColumnInfo(name = \"withFiles\")\n    val withFiles: Boolean? = null,\n\n    @ColumnInfo(name = \"excludeNsfw\")\n    var excludeNsfw: Boolean? = null,\n\n    @ColumnInfo(name = \"includeLocalRenotes\")\n    var includeLocalRenotes: Boolean? = null,\n\n    @ColumnInfo(name = \"includeMyRenotes\")\n    var includeMyRenotes: Boolean? = null,\n\n    @ColumnInfo(name = \"includeRenotedMyRenotes\")\n    var includeRenotedMyRenotes: Boolean? = null,\n\n    @ColumnInfo(name = \"listId\")\n    val listId: String? = null,\n\n    @ColumnInfo(name = \"following\")\n    val following: Boolean? = null,\n\n    @ColumnInfo(name = \"visibility\")\n    val visibility: String? = null,\n\n    @ColumnInfo(name = \"noteId\")\n    val noteId: String? = null,\n\n    @ColumnInfo(name = \"tag\")\n    val tag: String? = null,\n\n    @ColumnInfo(name = \"reply\")\n    var reply: Boolean? = null,\n\n    @ColumnInfo(name = \"renote\")\n    var renote: Boolean? = null,\n\n    @ColumnInfo(name = \"poll\")\n    var poll: Boolean? = null,\n\n    @ColumnInfo(name = \"offset\")\n    val offset: Int? = null,\n\n    @ColumnInfo(name = \"markAsRead\")\n    var markAsRead: Boolean? = null,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: String? = null,\n\n    @ColumnInfo(name = \"includeReplies\")\n    var includeReplies: Boolean? = null,\n\n    @ColumnInfo(name = \"query\")\n    var query: String? = null,\n\n    @ColumnInfo(name = \"host\")\n    var host: String? = null,\n\n    @ColumnInfo(name = \"antennaId\")\n    val antennaId: String? = null,\n\n    @ColumnInfo(name = \"channelId\")\n    val channelId: String? = null,\n\n    @ColumnInfo(name = \"clipId\")\n    val clipId: String? = null,\n\n    @ColumnInfo(name = \"excludeReplies\")\n    val excludeReplies: Boolean? = null,\n\n    @ColumnInfo(name = \"excludeReposts\")\n    val excludeReposts: Boolean? = null,\n\n    @ColumnInfo(name = \"excludeIfExistsSensitiveMedia\")\n    val excludeIfExistsSensitiveMedia: Boolean? = null,\n) {\n    fun toParams(): PageParams {\n        return PageParams(\n            type = type,\n            withFiles = withFiles,\n            excludeNsfw = excludeNsfw,\n            includeLocalRenotes = includeLocalRenotes,\n            includeMyRenotes = includeMyRenotes,\n            includeRenotedMyRenotes = includeRenotedMyRenotes,\n            listId = listId,\n            following = following,\n            visibility = visibility,\n            noteId = noteId,\n            tag = tag,\n            reply = reply,\n            renote = renote,\n            poll = poll,\n            offset = offset,\n            markAsRead = markAsRead,\n            userId = userId,\n            includeReplies = includeReplies,\n            query = query,\n            host = host,\n            antennaId = antennaId,\n            channelId = channelId,\n            clipId = clipId,\n            excludeReplies = excludeReplies,\n            excludeReposts = excludeReposts,\n            excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n        )\n    }\n\n    companion object {\n        fun from(model: PageParams): PageRecordParams {\n            return with(model) {\n                PageRecordParams(\n                    type = type,\n                    withFiles = withFiles,\n                    excludeNsfw = excludeNsfw,\n                    includeLocalRenotes = includeLocalRenotes,\n                    includeMyRenotes = includeMyRenotes,\n                    includeRenotedMyRenotes = includeRenotedMyRenotes,\n                    listId = listId,\n                    following = following,\n                    visibility = visibility,\n                    noteId = noteId,\n                    tag = tag,\n                    reply = reply,\n                    renote = renote,\n                    poll = poll,\n                    offset = offset,\n                    markAsRead = markAsRead,\n                    userId = userId,\n                    includeReplies = includeReplies,\n                    query = query,\n                    host = host,\n                    antennaId = antennaId,\n                    channelId = channelId,\n                    clipId = clipId,\n                    excludeReplies = excludeReplies,\n                    excludeReposts = excludeReposts,\n                    excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/account/page/db/TimelinePageTypeConverter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.page.db\n\nimport androidx.room.TypeConverter\nimport net.pantasystem.milktea.model.account.page.PageType\n\nclass TimelinePageTypeConverter{\n\n    @TypeConverter\n    fun convert(type: PageType): String{\n        return type.label\n    }\n\n    @TypeConverter\n    fun convert(type: String): PageType {\n        return PageType.values().first {\n            it.label == type\n        }\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/antenna/AntennaRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.antenna\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaQuery\nimport net.pantasystem.milktea.api.misskey.v12.antenna.AntennaToAdd\nimport net.pantasystem.milktea.api.misskey.v12.antenna.from\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport net.pantasystem.milktea.model.antenna.AntennaRepository\nimport net.pantasystem.milktea.model.antenna.SaveAntennaParam\nimport javax.inject.Inject\n\nclass AntennaRepositoryImpl @Inject constructor(\n    val getAccount: GetAccount,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : AntennaRepository {\n\n    override suspend fun findByAccountId(accountId: Long): Result<List<Antenna>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(accountId)\n            val body = (misskeyAPIProvider.get(account)).getAntennas(\n                AntennaQuery(\n                    i = account.token,\n                    limit = null,\n                    antennaId = null,\n                )\n            ).throwIfHasError().body()\n            body?.map {\n                it.toEntity(account)\n            } ?: emptyList()\n        }\n\n    }\n\n    override suspend fun delete(antennaId: Antenna.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(antennaId.accountId)\n            (misskeyAPIProvider.get(account)).deleteAntenna(\n                AntennaQuery(\n                    antennaId = antennaId.antennaId,\n                    i = account.token,\n                    limit = null\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun create(accountId: Long, params: SaveAntennaParam): Result<Antenna> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(accountId)\n            val request = AntennaToAdd.from(account.token, params,)\n            (misskeyAPIProvider.get(account)).createAntenna(request)\n                .throwIfHasError()\n                .body()\n                ?.toEntity(account)!!\n        }\n    }\n\n    override suspend fun update(antennaId: Antenna.Id, params: SaveAntennaParam): Result<Antenna>  = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(antennaId.accountId)\n            val request = AntennaToAdd.from(account.token, params, antennaId.antennaId)\n            (misskeyAPIProvider.get(account)).updateAntenna(request)\n                .throwIfHasError()\n                .body()\n                ?.toEntity(account)!!\n        }\n    }\n\n    override suspend fun find(antennaId: Antenna.Id): Result<Antenna> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(antennaId.accountId)\n            val api = misskeyAPIProvider.get(account)\n\n            val res = api.showAntenna(\n                AntennaQuery(\n                    i = account.token, antennaId = antennaId.antennaId, limit = null\n                )\n            )\n            res.throwIfHasError()\n            res.body()?.toEntity(account)!!\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/ap/ApResolverRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.ap\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.ap.ApResolveRequest\nimport net.pantasystem.milktea.api.misskey.ap.ApResolveResult\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.ap.ApResolver\nimport net.pantasystem.milktea.model.ap.ApResolverRepository\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\n\nclass ApResolverRepositoryImpl @Inject constructor(\n    private val apiProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val getAccount: GetAccount,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val userDataSource: UserDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n): ApResolverRepository {\n\n    override suspend fun resolve(accountId: Long, uri: String): Result<ApResolver> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(accountId)\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val result = apiProvider.get(account).resolve(ApResolveRequest(i = account.token, uri = uri))\n                        .throwIfHasError()\n                        .body()!!\n                    when(result) {\n                        is ApResolveResult.TypeNote -> {\n                            val note = noteDataSourceAdder.addNoteDtoToDataSource(account, result.note)\n                            ApResolver.TypeNote(\n                                note\n                            )\n                        }\n\n                        is ApResolveResult.TypeUser -> {\n                            val user = userDTOEntityConverter.convert(account, result.user, true)\n                            userDataSource.add(user)\n                            ApResolver.TypeUser(\n                                user\n                            )\n                        }\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val body = mastodonAPIProvider.get(account).search(\n                        q = uri,\n                        resolve = true\n                    ).throwIfHasError().body()\n                    requireNotNull(body).let { res ->\n                        val accounts = res.accounts.map {\n                            mastodonAccountDTOEntityConverter.convert(account, it)\n                        }\n                        userDataSource.addAll(accounts)\n                        val statuses = res.statuses.map {\n                            noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, it)\n                        }\n                        when(val aAccount = accounts.firstOrNull()) {\n                            null -> {\n                                ApResolver.TypeNote(statuses.first())\n                            }\n                            else -> {\n                                ApResolver.TypeUser(aAccount)\n                            }\n                        }\n                    }\n                }\n            }\n\n        }\n\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/auth/Authorization.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.auth\n\n\nimport net.pantasystem.milktea.api.misskey.auth.Session\nimport net.pantasystem.milktea.api.misskey.auth.generateAuthUrl\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.AccessToken\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.TemporarilyAuthState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.app.AppType\nimport net.pantasystem.milktea.model.user.User\n\n\n/**\n * 認証の状態\n */\nsealed interface Authorization {\n    data object BeforeAuthentication : Authorization\n\n    sealed interface Waiting4UserAuthorization : Authorization{\n        val instanceBaseURL: String\n        fun generateAuthUrl(): String\n\n        companion object;\n\n        data class Misskey(\n            override val instanceBaseURL: String,\n            val viaName: String?,\n            val appSecret: String,\n            val session: Session\n        ) : Waiting4UserAuthorization {\n            override fun generateAuthUrl(): String {\n                return session.url\n            }\n        }\n\n        data class Mastodon(\n            override val instanceBaseURL: String,\n            val client: AppType.Mastodon,\n            val scope: String,\n        ) : Waiting4UserAuthorization {\n            override fun generateAuthUrl(): String {\n                return client.generateAuthUrl(instanceBaseURL, scope)\n            }\n        }\n\n        data class Pleroma(\n            override val instanceBaseURL: String,\n            val client: AppType.Pleroma,\n            val scope: String\n        ) : Waiting4UserAuthorization {\n            override fun generateAuthUrl(): String {\n                return client.generateAuthUrl(instanceBaseURL, scope)\n            }\n        }\n\n        data class Firefish(\n            override val instanceBaseURL: String,\n            val viaName: String?,\n            val appSecret: String,\n            val session: Session\n        ) : Waiting4UserAuthorization {\n            override fun generateAuthUrl(): String {\n                return session.url\n            }\n        }\n\n    }\n\n\n    data class Approved(\n        val instanceBaseURL: String,\n        val accessToken: AccessToken\n    ) : Authorization\n\n    data class Finish(\n        val account: Account, val user: User\n    ) : Authorization\n\n}\n\nfun Authorization.Waiting4UserAuthorization.Companion.from(state: TemporarilyAuthState): Authorization.Waiting4UserAuthorization {\n    return when(state) {\n        is TemporarilyAuthState.Mastodon -> {\n            Authorization.Waiting4UserAuthorization.Mastodon(\n                client = state.app,\n                instanceBaseURL = state.instanceDomain,\n                scope = state.scope\n            )\n        }\n        is TemporarilyAuthState.Misskey -> {\n            Authorization.Waiting4UserAuthorization.Misskey(\n                appSecret = state.secret,\n                session = state.session,\n                instanceBaseURL = state.instanceDomain,\n                viaName = state.viaName\n            )\n        }\n        is TemporarilyAuthState.Pleroma -> {\n            Authorization.Waiting4UserAuthorization.Pleroma(\n                client = state.app,\n                instanceBaseURL = state.instanceDomain,\n                scope = state.scope\n            )\n        }\n        is TemporarilyAuthState.Firefish-> {\n            Authorization.Waiting4UserAuthorization.Firefish(\n                appSecret = state.secret,\n                session = state.session,\n                instanceBaseURL = state.instanceDomain,\n                viaName = state.viaName\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/auth/KeyStoreSystemEncryption.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage net.pantasystem.milktea.data.infrastructure.auth\n\nimport android.content.Context\nimport android.security.KeyPairGeneratorSpec\nimport android.util.Base64\nimport net.pantasystem.milktea.common.Encryption\nimport java.math.BigInteger\nimport java.security.KeyPairGenerator\nimport java.security.KeyStore\nimport java.util.*\nimport javax.crypto.Cipher\nimport javax.security.auth.x500.X500Principal\n\nclass KeyStoreSystemEncryption(private val context: Context) : Encryption {\n    companion object{\n        const val PROVIDER = \"AndroidKeyStore\"\n        const val ALGORITHM = \"RSA\"\n        val CIPHER_TRANSFORMATION = \"RSA/ECB/PKCS1Padding\"\n    }\n    override fun encrypt(alias: String, plainText: String): String {\n        val keyStore = KeyStore.getInstance(PROVIDER)\n        keyStore.load(null)\n\n        // キーペアがない場合生成\n        if (!keyStore.containsAlias(alias)) {\n            val keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM, PROVIDER)\n            keyPairGenerator.initialize(createKeyPairGeneratorSpec(context, alias))\n            keyPairGenerator.generateKeyPair()\n        }\n        val publicKey = keyStore.getCertificate(alias).publicKey\n        keyStore.getKey(alias, null)\n\n        // 公開鍵で暗号化\n        val cipher = Cipher.getInstance(CIPHER_TRANSFORMATION)\n        cipher.init(Cipher.ENCRYPT_MODE, publicKey)\n        val bytes = cipher.doFinal(plainText.toByteArray(Charsets.UTF_8))\n\n        // SharedPreferencesに保存しやすいようにBase64でString化\n        return Base64.encodeToString(bytes, Base64.DEFAULT)\n    }\n\n    override fun decrypt(alias: String, encryptedText: String): String? {\n        val keyStore = KeyStore.getInstance(PROVIDER)\n        keyStore.load(null)\n        if (!keyStore.containsAlias(alias)) {\n            return null\n        }\n\n        val privateKey = keyStore.getKey(alias, null)\n        val cipher = Cipher.getInstance(CIPHER_TRANSFORMATION)\n        cipher.init(Cipher.DECRYPT_MODE, privateKey)\n        val bytes = Base64.decode(encryptedText, Base64.DEFAULT)\n\n        val b = cipher.doFinal(bytes)\n        return String(b)\n    }\n\n    private fun createKeyPairGeneratorSpec(context: Context, alias: String): KeyPairGeneratorSpec {\n        val start = Calendar.getInstance()\n        val end = Calendar.getInstance()\n        end.add(Calendar.YEAR, 100)\n\n        return KeyPairGeneratorSpec.Builder(context)\n            .setAlias(alias)\n            .setSubject(X500Principal(String.format(\"CN=%s\", alias)))\n            .setSerialNumber(BigInteger.valueOf(114514))\n            .setStartDate(start.time)\n            .setEndDate(end.time)\n            .build()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/auth/custom/AccessToken.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.auth.custom\n\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.mastodon.apps.AccessToken as MastodonAccessToken\nimport net.pantasystem.milktea.api.misskey.auth.AccessToken as MisskeyAccessToken\n\n\nsealed interface AccessToken {\n    val accessToken: String\n    data class Misskey(\n        var appSecret: String,\n        override val accessToken: String,\n        val user: UserDTO\n    ) : AccessToken\n\n    data class MisskeyIdAndPassword(\n        val baseUrl: String,\n        override val accessToken: String,\n        val user: UserDTO,\n    ) : AccessToken\n\n    data class Mastodon(\n        override val accessToken: String,\n        val tokenType: String,\n        val scope: String,\n        val createdAt: Long,\n        val account: MastodonAccountDTO\n    ) : AccessToken\n\n    data class Pleroma(\n        override val accessToken: String,\n        val tokenType: String,\n        val scope: String,\n        val createdAt: Long,\n        val account: MastodonAccountDTO\n    ) : AccessToken\n\n    data class Firefish(\n        var appSecret: String,\n        override val accessToken: String,\n        val user: UserDTO\n    ) : AccessToken\n}\n\n\nfun MisskeyAccessToken.toModel(appSecret: String) : AccessToken.Misskey {\n    return AccessToken.Misskey(\n        accessToken = accessToken,\n        user = user,\n        appSecret = appSecret\n    )\n}\n\nfun MastodonAccessToken.toModel(account: MastodonAccountDTO) : AccessToken.Mastodon {\n    return AccessToken.Mastodon(\n        accessToken = accessToken,\n        tokenType = tokenType,\n        createdAt = createdAt,\n        scope = scope,\n        account = account\n    )\n}\n\nfun MastodonAccessToken.toPleromaModel(account: MastodonAccountDTO): AccessToken.Pleroma {\n    return AccessToken.Pleroma(\n        accessToken = accessToken,\n        tokenType = tokenType,\n        createdAt = createdAt,\n        scope = scope,\n        account = account\n    )\n}\n\nfun MisskeyAccessToken.toFirefishModel(appSecret: String): AccessToken.Firefish {\n    return AccessToken.Firefish(\n        accessToken = accessToken,\n        user = user,\n        appSecret = appSecret\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/auth/custom/CustomAuthBridge.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.auth.custom\n\nimport net.pantasystem.milktea.api.misskey.auth.Session\nimport net.pantasystem.milktea.model.app.AppType\nimport java.util.Date\n\n\nsealed interface TemporarilyAuthState {\n    val enabledDateEnd: Date\n    val instanceDomain: String\n    data class Misskey(\n        val secret: String,\n        override val instanceDomain: String,\n        val session: Session,\n        override val enabledDateEnd: Date,\n        val viaName: String?\n    ) : TemporarilyAuthState\n\n    data class Mastodon(\n        override val instanceDomain: String,\n        override val enabledDateEnd: Date,\n        val app: AppType.Mastodon,\n        val scope: String,\n\n    ) : TemporarilyAuthState\n\n    data class Pleroma(\n        override val instanceDomain: String,\n        override val enabledDateEnd: Date,\n        val app: AppType.Pleroma,\n        val scope: String,\n    ) : TemporarilyAuthState\n\n    data class Firefish(\n        val secret: String,\n        override val instanceDomain: String,\n        val session: Session,\n        override val enabledDateEnd: Date,\n        val viaName: String?\n    ) : TemporarilyAuthState\n\n}\n\nfun AppType.Misskey.createAuth(instanceDomain: String, session: Session, timeLimit: Date = Date(System.currentTimeMillis() + 3600 * 1000)): TemporarilyAuthState.Misskey {\n    requireNotNull(secret)\n    return TemporarilyAuthState.Misskey(\n        secret = secret!!,\n        instanceDomain = instanceDomain,\n        session = session,\n        enabledDateEnd = timeLimit,\n        viaName = name\n    )\n}\n\n\nfun AppType.Firefish.createAuth(instanceDomain: String, session: Session, timeLimit: Date = Date(System.currentTimeMillis() + 3600 * 1000)): TemporarilyAuthState.Firefish {\n    requireNotNull(secret)\n    return TemporarilyAuthState.Firefish(\n        secret = secret!!,\n        instanceDomain = instanceDomain,\n        session = session,\n        enabledDateEnd = timeLimit,\n        viaName = name\n    )\n}\n\nfun AppType.Mastodon.createAuth(instanceDomain: String, scope: String, timeLimit: Date = Date(System.currentTimeMillis() + 3600 * 1000)): TemporarilyAuthState.Mastodon {\n    return TemporarilyAuthState.Mastodon(\n        scope = scope,\n        instanceDomain = instanceDomain,\n        enabledDateEnd = timeLimit,\n        app = this\n    )\n}\n\nfun AppType.Pleroma.createAuth(instanceDomain: String, scope: String, timeLimit: Date = Date(System.currentTimeMillis() + 3600 * 1000)): TemporarilyAuthState.Pleroma {\n    return TemporarilyAuthState.Pleroma(\n        scope = scope,\n        instanceDomain = instanceDomain,\n        enabledDateEnd = timeLimit,\n        app = this\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/auth/custom/CustomAuthStore.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.auth.custom\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport net.pantasystem.milktea.api.misskey.auth.Session\nimport net.pantasystem.milktea.common.getPreferenceName\nimport net.pantasystem.milktea.model.app.AppType\nimport java.util.Date\n\nclass CustomAuthStore(private val sharedPreferences: SharedPreferences){\n\n    companion object{\n        private const val MISSKEY_SECRET = \"jp.panta.misskeyandroidclient.model.auth.custom.CustomAuthStore.SECRET\"\n        private const val MISSKEY_SESSION_TOKEN = \"jp.panta.misskeyandroidclient.model.auth.custom.CustomAuthStore.SESSION_TOKEN\"\n        private const val MISSKEY_SESSION_URL = \"jp.panta.misskeyandroidclient.model.auth.custom.CustomAuthStore.SESSION_URL\"\n        private const val INSTANCE_DOMAIN = \"jp.panta.misskeyandroidclient.model.auth.custom.CustomAuthStore.INSTANCE_DOMAIN\"\n        private const val ENABLED_DATE_END = \"jp.panta.misskeyandroidclient.model.auth.custom.CustomAuthStore.ENABLED_DATE_END\"\n        private const val MISSKEY_VIA_NAME = \"jp.panta.misskeyandroidclient.model.auth.custom.CustomAuthStore.VIA_NAME\"\n\n\n        private const val MASTODON_APP_CLIENT_SECRET = \"MASTODON_CLIENT_SECRET\"\n        private const val MASTODON_SCOPE = \"MASTODON_SCOPE\"\n        private const val REDIRECT_URI = \"REDIRECT_URI\"\n        private const val MASTODON_APP_CLIENT_ID = \"CLIENT_ID\"\n        private const val MASTODON_APP_ID = \"MASTODON_APP_ID\"\n        private const val MASTODON_APP_VAPID_KEY = \"MASTODON_VAPID_KEY\"\n        private const val MASTODON_APP_WEBSITE = \"MASTODON_APP_WEBSITE\"\n        private const val MASTODON_APP_NAME = \"MASTODON_APP_NAME\"\n\n\n        private const val TYPE = \"TEMPORARILY_AUTH_STATE_TYPE\"\n\n        fun newInstance(context: Context): CustomAuthStore{\n            return CustomAuthStore(context.getSharedPreferences(context.getPreferenceName(), Context.MODE_PRIVATE))\n        }\n    }\n\n    fun setCustomAuthBridge(customAuthBridge: TemporarilyAuthState){\n        when(customAuthBridge) {\n            is TemporarilyAuthState.Mastodon -> {\n                sharedPreferences.edit().apply {\n                    putString(MASTODON_SCOPE, customAuthBridge.scope)\n                    putString(INSTANCE_DOMAIN, customAuthBridge.instanceDomain)\n                    putString(REDIRECT_URI, customAuthBridge.app.redirectUri)\n\n                    putLong(ENABLED_DATE_END, customAuthBridge.enabledDateEnd.time)\n                    putString(MASTODON_APP_CLIENT_ID, customAuthBridge.app.clientId)\n                    putString(MASTODON_APP_CLIENT_SECRET, customAuthBridge.app.clientSecret)\n                    putString(MASTODON_APP_ID, customAuthBridge.app.id)\n                    putString(MASTODON_APP_NAME, customAuthBridge.app.name)\n                    putString(TYPE, \"mastodon\")\n                }.apply()\n            }\n            is TemporarilyAuthState.Misskey -> {\n                sharedPreferences.edit().apply {\n                    putString(MISSKEY_SECRET, customAuthBridge.secret)\n                    putString(MISSKEY_SESSION_TOKEN, customAuthBridge.session.token)\n                    putString(MISSKEY_SESSION_URL, customAuthBridge.session.url)\n                    putString(INSTANCE_DOMAIN, customAuthBridge.instanceDomain)\n                    putLong(ENABLED_DATE_END, customAuthBridge.enabledDateEnd.time)\n                    putString(MISSKEY_VIA_NAME, customAuthBridge.viaName)\n                    putString(TYPE, \"misskey\")\n                    apply()\n                }\n            }\n            is TemporarilyAuthState.Pleroma -> {\n                sharedPreferences.edit().apply {\n                    putString(MASTODON_SCOPE, customAuthBridge.scope)\n                    putString(INSTANCE_DOMAIN, customAuthBridge.instanceDomain)\n                    putString(REDIRECT_URI, customAuthBridge.app.redirectUri)\n\n                    putLong(ENABLED_DATE_END, customAuthBridge.enabledDateEnd.time)\n                    putString(MASTODON_APP_CLIENT_ID, customAuthBridge.app.clientId)\n                    putString(MASTODON_APP_CLIENT_SECRET, customAuthBridge.app.clientSecret)\n                    putString(MASTODON_APP_ID, customAuthBridge.app.id)\n                    putString(MASTODON_APP_NAME, customAuthBridge.app.name)\n                    putString(TYPE, \"pleroma\")\n                }.apply()\n            }\n            is TemporarilyAuthState.Firefish -> {\n                sharedPreferences.edit().apply {\n                    putString(MISSKEY_SECRET, customAuthBridge.secret)\n                    putString(MISSKEY_SESSION_TOKEN, customAuthBridge.session.token)\n                    putString(MISSKEY_SESSION_URL, customAuthBridge.session.url)\n                    putString(INSTANCE_DOMAIN, customAuthBridge.instanceDomain)\n                    putLong(ENABLED_DATE_END, customAuthBridge.enabledDateEnd.time)\n                    putString(MISSKEY_VIA_NAME, customAuthBridge.viaName)\n                    putString(TYPE, \"firefish\")\n                    apply()\n                }\n            }\n        }\n\n\n    }\n\n    fun getCustomAuthBridge() : TemporarilyAuthState?{\n        sharedPreferences.let {\n            val type = it.getString(TYPE, \"misskey\")\n            val instanceDomain = it.getString(INSTANCE_DOMAIN, null)?: return null\n            val enabledDate = Date(it.getLong(ENABLED_DATE_END, 0))\n            val viaName: String? = it.getString(MISSKEY_VIA_NAME, null)\n            if(enabledDate < Date()) {\n                return null\n            }\n            return when (type) {\n                \"misskey\" -> {\n                    val secret = it.getString(MISSKEY_SECRET, null)?: return null\n                    val sessionToken = it.getString(MISSKEY_SESSION_TOKEN, null)?: return null\n                    val sessionUrl = it.getString(MISSKEY_SESSION_URL, null)?: return null\n                    TemporarilyAuthState.Misskey(\n                        secret = secret,\n                        session = Session(\n                            url = sessionUrl,\n                            token = sessionToken\n                        ),\n                        instanceDomain = instanceDomain,\n                        enabledDateEnd = enabledDate,\n                        viaName = viaName\n                    )\n                }\n                \"mastodon\" -> {\n                    TemporarilyAuthState.Mastodon(\n                        app = AppType.Mastodon(\n                            clientId = it.getString(MASTODON_APP_CLIENT_ID, null)?: return null,\n                            clientSecret = it.getString(MASTODON_APP_CLIENT_SECRET, null)?: return null,\n                            redirectUri = it.getString(REDIRECT_URI, null)?: return null,\n                            id = it.getString(MASTODON_APP_ID, null)?: return null,\n                            name = it.getString(MASTODON_APP_NAME, null)?: return null,\n                        ),\n                        instanceDomain = instanceDomain,\n                        enabledDateEnd = enabledDate,\n                        scope = it.getString(MASTODON_SCOPE, null)?: return null\n                    )\n                }\n                \"pleroma\" -> {\n                    TemporarilyAuthState.Pleroma(\n                        app = AppType.Pleroma(\n                            clientId = it.getString(MASTODON_APP_CLIENT_ID, null)?: return null,\n                            clientSecret = it.getString(MASTODON_APP_CLIENT_SECRET, null)?: return null,\n                            redirectUri = it.getString(REDIRECT_URI, null)?: return null,\n                            id = it.getString(MASTODON_APP_ID, null)?: return null,\n                            name = it.getString(MASTODON_APP_NAME, null)?: return null,\n                        ),\n                        instanceDomain = instanceDomain,\n                        enabledDateEnd = enabledDate,\n                        scope = it.getString(MASTODON_SCOPE, null)?: return null\n                    )\n                }\n                \"firefish\" -> {\n                    val secret = it.getString(MISSKEY_SECRET, null)?: return null\n                    val sessionToken = it.getString(MISSKEY_SESSION_TOKEN, null)?: return null\n                    val sessionUrl = it.getString(MISSKEY_SESSION_URL, null)?: return null\n                    TemporarilyAuthState.Firefish(\n                        secret = secret,\n                        session = Session(\n                            url = sessionUrl,\n                            token = sessionToken\n                        ),\n                        instanceDomain = instanceDomain,\n                        enabledDateEnd = enabledDate,\n                        viaName = viaName\n                    )\n                }\n                else -> null\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/channel/ChannelAPIAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.channel\n\nimport net.pantasystem.milktea.api.misskey.v12.channel.ChannelDTO\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.CreateChannel\nimport net.pantasystem.milktea.model.channel.UpdateChannel\n\ninterface ChannelAPIAdapter {\n\n    suspend fun findOne(id: Channel.Id): Result<ChannelDTO>\n\n    suspend fun create(model: CreateChannel): Result<ChannelDTO>\n\n    suspend fun follow(id: Channel.Id): Result<Unit>\n\n    suspend fun unFollow(id: Channel.Id): Result<Unit>\n\n    suspend fun update(model: UpdateChannel): Result<ChannelDTO>\n\n    suspend fun findFollowedChannels(\n        accountId: Long,\n        sinceId: Channel.Id? = null,\n        untilId: Channel.Id? = null,\n        limit: Int = 20,\n    ): Result<List<ChannelDTO>>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/channel/ChannelAPIAdapterWebImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.channel\n\nimport net.pantasystem.milktea.api.misskey.MisskeyAPI\nimport net.pantasystem.milktea.api.misskey.v12.channel.ChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.CreateChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.FindPageable\nimport net.pantasystem.milktea.api.misskey.v12.channel.FollowChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.ShowChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.UnFollowChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.UpdateChannelDTO\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.CreateChannel\nimport net.pantasystem.milktea.model.channel.UpdateChannel\nimport javax.inject.Inject\n\nclass ChannelAPIAdapterWebImpl @Inject constructor(\n    val accountRepository: AccountRepository,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n) : ChannelAPIAdapter {\n    override suspend fun findOne(id: Channel.Id): Result<ChannelDTO> {\n        return runCancellableCatching {\n            val account = id.getAccount()\n            id.getAPI().showChannel(\n                ShowChannelDTO(\n                i = account.token,\n                channelId = id.channelId\n            )\n            ).throwIfHasError().body()!!\n        }\n\n    }\n\n    override suspend fun create(model: CreateChannel): Result<ChannelDTO> {\n        return runCancellableCatching {\n            val account = accountRepository.get(model.accountId).getOrThrow()\n            (misskeyAPIProvider.get(account)).createChannel(\n                CreateChannelDTO(\n                    i = account.token,\n                    name = model.name,\n                    description = model.description,\n                    bannerId = model.bannerId\n                )\n            ).throwIfHasError().body()!!\n        }\n    }\n\n    override suspend fun follow(id: Channel.Id): Result<Unit> {\n        return runCancellableCatching {\n            val account = id.getAccount()\n            id.getAPI().followChannel(\n                FollowChannelDTO(\n                    i = account.token,\n                    channelId = id.channelId\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun unFollow(id: Channel.Id): Result<Unit> {\n        return runCancellableCatching {\n            val account = id.getAccount()\n            id.getAPI().unFollowChannel(\n                UnFollowChannelDTO(\n                    i = account.token,\n                    channelId = id.channelId\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun update(model: UpdateChannel): Result<ChannelDTO> {\n        return runCancellableCatching {\n            val account = model.id.getAccount()\n            model.id.getAPI()\n                .updateChannel(\n                    UpdateChannelDTO(\n                        i = account.token,\n                        name = model.name,\n                        description = model.description,\n                        bannerId = model.bannerId\n                    )\n                ).throwIfHasError()\n                .body()!!\n        }\n    }\n\n    override suspend fun findFollowedChannels(\n        accountId: Long,\n        sinceId: Channel.Id?,\n        untilId: Channel.Id?,\n        limit: Int\n    ): Result<List<ChannelDTO>> {\n        return runCancellableCatching {\n            val account = accountRepository.get(accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            api.followedChannels(FindPageable(\n                i = account.token,\n                sinceId = sinceId?.channelId,\n                untilId = untilId?.channelId,\n                limit = limit,\n            )).throwIfHasError().body()!!\n        }\n    }\n    private suspend fun Channel.Id.getAPI(): MisskeyAPI {\n        val account = accountRepository.get(accountId).getOrThrow()\n        return misskeyAPIProvider.get(account)\n    }\n\n    private suspend fun Channel.Id.getAccount(): Account {\n        return accountRepository.get(accountId).getOrThrow()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/channel/ChannelPagingModel.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.channel\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.v12.channel.ChannelDTO\nimport net.pantasystem.milktea.api.misskey.v12.channel.FindPageable\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.common.paginator.*\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.ChannelStateModel\nimport javax.inject.Inject\n\nenum class ChannelListType {\n    OWNED, FOLLOWED, FEATURED\n}\n\nclass ChannelPagingModel(\n    private val channelStateModel: ChannelStateModel,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val accountRepository: AccountRepository,\n    val loggerFactory: Logger.Factory,\n    val type: ChannelListType,\n    val getAccount: suspend () -> Account,\n) : EntityConverter<ChannelDTO, Channel.Id>, PreviousLoader<ChannelDTO>,\n    IdGetter<Channel.Id>, StateLocker, PaginationState<Channel.Id> {\n\n    class Factory @Inject constructor(\n        private val channelStateModel: ChannelStateModel,\n        val misskeyAPIProvider: MisskeyAPIProvider,\n        val accountRepository: AccountRepository,\n        val loggerFactory: Logger.Factory,\n    ) {\n        fun create(type: ChannelListType, getAccount: suspend () -> Account): ChannelPagingModel {\n            return ChannelPagingModel(\n                channelStateModel,\n                misskeyAPIProvider,\n                accountRepository,\n                loggerFactory,\n                type,\n                getAccount\n            )\n        }\n    }\n\n    val logger: Logger by lazy {\n        loggerFactory.create(\"ChannelPagingModel\")\n    }\n\n    override val mutex: Mutex = Mutex()\n\n\n    private val _state = MutableStateFlow<PageableState<List<Channel.Id>>>(\n        PageableState.Loading.Init()\n    )\n    override val state: Flow<PageableState<List<Channel.Id>>>\n        get() = _state\n\n\n    override fun getState(): PageableState<List<Channel.Id>> {\n        return _state.value\n    }\n\n    override suspend fun getSinceId(): Channel.Id? {\n        return (getState().content as? StateContent.Exist)?.rawContent?.firstOrNull()\n    }\n\n    override suspend fun getUntilId(): Channel.Id? {\n        return (getState().content as? StateContent.Exist)?.rawContent?.lastOrNull()\n    }\n\n    override fun setState(state: PageableState<List<Channel.Id>>) {\n        logger.debug(\"setState:$state\")\n        _state.value = state\n    }\n\n    override suspend fun convertAll(list: List<ChannelDTO>): List<Channel.Id> {\n        val account = accountRepository.get(getAccount().accountId).getOrThrow()\n        return channelStateModel.addAll(list.map { it.toModel(account) }).map { it.id }\n    }\n//    NOTE: MisskeyのAPIがバグってるのか正常に動かない（Postmanからもチェック済み）\n//    override suspend fun loadFuture(): Response<List<ChannelDTO>> {\n//        val sinceId = getSinceId()?.channelId\n//        logger.debug(\"loadFuture type:$type, sinceId:$sinceId\")\n//        val account = accountRepository.get(accountId).getOrThrow()\n//        val api = (misskeyAPIProvider.get(account) as MisskeyAPIV12)\n//        val i = account.token\n//        val res = when (type) {\n//            ChannelListType.FOLLOWED -> api.followedChannels(\n//                FindPageable(\n//                    i = i,\n//                    sinceId = sinceId,\n//                    untilId = null,\n//                )\n//            )\n//            ChannelListType.OWNED -> api.ownedChannels(\n//                FindPageable(\n//                    i = i,\n//                    sinceId = sinceId,\n//                    untilId = null\n//                )\n//            )\n//            ChannelListType.FEATURED -> {\n//                throw IllegalStateException(\"featuredはサポートしていません。\")\n//            }\n//        }\n//        return res.throwIfHasError()\n//    }\n\n    override suspend fun loadPrevious(): Result<List<ChannelDTO>> {\n        val account = accountRepository.get(getAccount().accountId).getOrThrow()\n        val api = (misskeyAPIProvider.get(account))\n        val i = account.token\n        val res = when (type) {\n            ChannelListType.FOLLOWED -> {\n                api.followedChannels(\n                    FindPageable(\n                        i = i,\n                        sinceId = null,\n//                        untilId = null,\n                        untilId = getUntilId()?.channelId,\n                        limit = 99,\n                    )\n                )\n            }\n\n            ChannelListType.OWNED -> {\n                api.ownedChannels(\n                    FindPageable(\n                        i = i,\n                        sinceId = null,\n//                        untilId = null,\n                        untilId = getUntilId()?.channelId,\n                        limit = 99,\n                    )\n                )\n            }\n\n            ChannelListType.FEATURED -> {\n                if (getUntilId() != null) {\n                    // NOTE: featuredはページネーションできないので\n                    throw IllegalStateException()\n                }\n                api.featuredChannels(I(i))\n            }\n        }\n        logger.debug { \"loadPrevious res:${res.code()}\" }\n        return runCancellableCatching {\n            res.throwIfHasError().body()!!\n        }\n    }\n\n\n    suspend fun clear() {\n        mutex.withLock {\n            _state.value = PageableState.Loading.Init()\n        }\n    }\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    fun observeChannels(): Flow<PageableState<List<Channel>>> {\n        return channelStateModel.state.flatMapLatest { globalState ->\n            state.map { state ->\n                state.convert { list ->\n                    list.mapNotNull { id ->\n                        globalState.get(id)\n                    }\n                }\n            }\n        }.distinctUntilChanged()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/channel/ChannelRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.channel\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.ChannelRepository\nimport net.pantasystem.milktea.model.channel.ChannelStateModel\nimport net.pantasystem.milktea.model.channel.CreateChannel\nimport net.pantasystem.milktea.model.channel.UpdateChannel\nimport javax.inject.Inject\n\nclass ChannelRepositoryImpl @Inject constructor(\n    private val channelAPIAdapter: ChannelAPIAdapter,\n    private val channelStateModel: ChannelStateModel,\n    private val accountRepository: AccountRepository,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : ChannelRepository {\n    override suspend fun findOne(id: Channel.Id): Result<Channel> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                var channel = channelStateModel.get(id)\n                if (channel == null) {\n                    val account = accountRepository.get(id.accountId).getOrThrow()\n                    channel = channelAPIAdapter.findOne(id).getOrThrow()\n                        .toModel(account)\n                    channelStateModel.add(channel)\n                }\n                channel\n            }\n        }\n    }\n\n    override suspend fun create(model: CreateChannel): Result<Channel> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = accountRepository.get(model.accountId).getOrThrow()\n                val channel = channelAPIAdapter.create(model).getOrThrow()\n                    .toModel(account)\n                channelStateModel.add(channel)\n            }\n        }\n    }\n\n    override suspend fun follow(id: Channel.Id): Result<Channel> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                var channel = findOne(id).getOrThrow()\n                channelAPIAdapter.follow(id).getOrThrow()\n                channel = channel.copy(isFollowing = true)\n                channelStateModel.add(channel)\n            }\n        }\n    }\n\n    override suspend fun unFollow(id: Channel.Id): Result<Channel> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                var channel = findOne(id).getOrThrow()\n                channelAPIAdapter.unFollow(id).getOrThrow()\n                channel = channel.copy(isFollowing = false)\n                channelStateModel.add(channel)\n            }\n        }\n    }\n\n    override suspend fun update(model: UpdateChannel): Result<Channel> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val channel = channelAPIAdapter.update(model).getOrThrow()\n                val account = accountRepository.get(model.id.accountId).getOrThrow()\n                channelStateModel.add(channel.toModel(account))\n            }\n        }\n    }\n\n    override suspend fun findFollowedChannels(\n        accountId: Long,\n        sinceId: Channel.Id?,\n        untilId: Channel.Id?,\n        limit: Int\n    ): Result<List<Channel>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            channelAPIAdapter.findFollowedChannels(accountId, sinceId, untilId, 99).mapCancellableCatching { list ->\n                val account = accountRepository.get(accountId).getOrThrow()\n                list.map {\n                    it.toModel(account)\n                }\n            }.mapCancellableCatching {\n                channelStateModel.addAll(it)\n                it\n            }.getOrThrow()\n\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/clip/ClipRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.clip\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.clip.*\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.ClipDTOEntityConverter\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.clip.*\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\nclass ClipRepositoryImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val clipDTOEntityConverter: ClipDTOEntityConverter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : ClipRepository {\n\n    override suspend fun getMyClips(accountId: Long): Result<List<Clip>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            val body = api.findMyClips(I(account.token)).throwIfHasError().body()\n            requireNotNull(body).map {\n                clipDTOEntityConverter.convert(account, it)\n            }\n        }\n    }\n\n    override suspend fun findOne(clipId: ClipId): Result<Clip> = runCancellableCatching  {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(clipId.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            val body = api.showClip(ShowClipRequest(i = account.token, clipId = clipId.clipId))\n                .throwIfHasError()\n                .body()\n            clipDTOEntityConverter.convert(account, requireNotNull(body))\n        }\n    }\n\n    override suspend fun findBy(\n        userId: User.Id,\n        sinceId: String?,\n        untilId: String?,\n        limit: Int\n    ): Result<List<Clip>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(userId.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            val body = api.findByUsersClip(\n                FindUsersClipRequest(\n                    i = account.token,\n                    userId = userId.id,\n                    limit = limit,\n                    sinceId = sinceId,\n                    untilId = untilId\n                )\n            ).throwIfHasError().body()\n            requireNotNull(body).map {\n                clipDTOEntityConverter.convert(account, it)\n            }\n        }\n    }\n\n    override suspend fun findBy(\n        noteId: Note.Id\n    ): Result<List<Clip>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(noteId.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            val body = api.findByNotesClip(FindNotesClip(\n                i = account.token,\n                noteId = noteId.noteId,\n            )).throwIfHasError().body()\n            requireNotNull(body).map {\n                clipDTOEntityConverter.convert(account, it)\n            }\n        }\n    }\n\n    override suspend fun create(\n        createClip: CreateClip\n    ): Result<Clip> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(createClip.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            val body = api.createClip(CreateClipRequest(\n                i = account.token,\n                name = createClip.name,\n                description = createClip.description,\n                isPublic = createClip.isPublic\n            )).throwIfHasError().body()\n            clipDTOEntityConverter.convert(account, requireNotNull(body))\n        }\n    }\n\n    override suspend fun update(\n        clipId: ClipId,\n        updateClip: UpdateClip\n    ): Result<Clip> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(clipId.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            val body = api.updateClip(UpdateClipRequest(\n                i = account.token,\n                name = updateClip.name,\n                description = updateClip.description,\n                isPublic = updateClip.isPublic,\n                clipId = clipId.clipId\n            )).throwIfHasError().body()\n            clipDTOEntityConverter.convert(account, requireNotNull(body))\n        }\n    }\n\n    override suspend fun delete(\n        clipId: ClipId\n    ): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(clipId.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            api.deleteClip(DeleteClipRequest(i = account.token, clipId = clipId.clipId))\n                .throwIfHasError()\n        }\n    }\n\n    override suspend fun appendNote(\n        clipId: ClipId,\n        noteId: Note.Id\n    ): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(clipId.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            api.addNoteToClip(AddNoteToClipRequest(\n                i = account.token,\n                noteId = noteId.noteId,\n                clipId = clipId.clipId\n            )).throwIfHasError()\n        }\n    }\n\n    override suspend fun removeNote(\n        clipId: ClipId,\n        noteId: Note.Id\n    ): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(clipId.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            api.removeNoteToClip(RemoveNoteToClipRequest(\n                i = account.token,\n                noteId = noteId.noteId,\n                clipId = clipId.clipId\n            )).throwIfHasError()\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/DriveDirectoryPagingStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport net.pantasystem.milktea.api.misskey.drive.RequestFolder\nimport net.pantasystem.milktea.app_store.drive.DriveDirectoryPagingStore\nimport net.pantasystem.milktea.common.Encryption\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.model.drive.Directory\nimport javax.inject.Inject\n\nclass DriveDirectoryPagingStoreImpl @Inject constructor(\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val accountRepository: AccountRepository,\n    val encryption: Encryption,\n) : DriveDirectoryPagingStore {\n    private val pagingImpl by lazy {\n        DriveDirectoryPagingImpl(\n            misskeyAPIProvider,\n            accountRepository,\n            encryption,\n        )\n    }\n\n    private val controller = PreviousPagingController.create(\n        pagingImpl,\n    )\n\n    override val state: Flow<PageableState<List<Directory>>>\n        get() = pagingImpl.state\n\n    override suspend fun clear() {\n        pagingImpl.setState(PageableState.Fixed(StateContent.NotExist()))\n    }\n\n    override suspend fun loadPrevious(): Result<Int> {\n        return controller.loadPrevious()\n    }\n\n    override suspend fun setAccount(account: Account?) {\n        pagingImpl.setCurrentAccount(account)\n        this.clear()\n    }\n\n    override suspend fun setCurrentDirectory(directory: Directory?) {\n        pagingImpl.setCurrentDirectory(directory)\n        this.clear()\n    }\n\n    override fun onCreated(directory: Directory) {\n        if (pagingImpl.directory?.id == directory.parentId) {\n            pagingImpl.setState(\n                pagingImpl.getState().convert {\n                    it.toMutableList().also { list ->\n                        list.add(0, directory)\n                    }\n                }\n            )\n        }\n    }\n\n    override fun onDeleted(directory: Directory) {\n        pagingImpl.setState(\n            pagingImpl.getState().convert { list ->\n                list.filterNot { it.id == directory.id }\n            }\n        )\n    }\n}\n\n\nclass DriveDirectoryPagingImpl(\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val accountRepository: AccountRepository,\n    val encryption: Encryption,\n) : PaginationState<Directory>, IdGetter<String>,\n    PreviousLoader<Directory>, EntityConverter<Directory, Directory>,\n    StateLocker {\n\n    private var account: Account? = null\n    var directory: Directory? = null\n\n    override val mutex: Mutex = Mutex()\n\n    private val _state =\n        MutableStateFlow<PageableState<List<Directory>>>(PageableState.Loading.Init())\n    override val state: Flow<PageableState<List<Directory>>>\n        get() = _state\n\n    override suspend fun convertAll(list: List<Directory>): List<Directory> {\n        return list\n    }\n\n    override suspend fun getSinceId(): String? {\n        return (_state.value.content as? StateContent.Exist)?.rawContent?.firstOrNull()?.id?.directoryId\n    }\n\n    override suspend fun getUntilId(): String? {\n        return (_state.value.content as? StateContent.Exist)?.rawContent?.lastOrNull()?.id?.directoryId\n    }\n\n    override suspend fun loadPrevious(): Result<List<Directory>> {\n        return runCancellableCatching {\n            val account = account ?: throw UnauthorizedException()\n            misskeyAPIProvider.get(account)\n                .getFolders(\n                    RequestFolder(\n                        i = account.token,\n                        untilId = getUntilId(),\n                        folderId = directory?.id?.directoryId\n                    )\n                )\n                .throwIfHasError()\n                .body()!!\n                .map {\n                    it.toModel(account)\n                }\n        }\n    }\n\n    override fun getState(): PageableState<List<Directory>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<Directory>>) {\n        _state.value = state\n    }\n\n    fun setCurrentAccount(account: Account?) {\n        this.account = account\n    }\n\n    fun setCurrentDirectory(directory: Directory?) {\n        this.directory = directory\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/DriveDirectoryRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.drive.CreateFolder\nimport net.pantasystem.milktea.api.misskey.drive.ShowFolderRequest\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.drive.CreateDirectory\nimport net.pantasystem.milktea.model.drive.Directory\nimport net.pantasystem.milktea.model.drive.DirectoryId\nimport net.pantasystem.milktea.model.drive.DriveDirectoryRepository\nimport javax.inject.Inject\n\nclass DriveDirectoryRepositoryImpl @Inject constructor(\n    val accountRepository: AccountRepository,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : DriveDirectoryRepository {\n\n    override suspend fun create(createDirectory: CreateDirectory): Result<Directory> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = accountRepository.get(createDirectory.accountId).getOrThrow()\n                val api = misskeyAPIProvider.get(account)\n                api.createFolder(CreateFolder(\n                    i = account.token,\n                    name = createDirectory.directoryName,\n                    parentId = createDirectory.parentId\n                )).throwIfHasError().body()!!.toModel(account)\n            }\n        }\n    }\n\n    override suspend fun findOne(id: DirectoryId): Result<Directory> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(id.accountId).getOrThrow()\n            val api = misskeyAPIProvider.get(account)\n            api.showFolder(\n                ShowFolderRequest(\n                    i = account.token,\n                    folderId = id.directoryId\n                )\n            ).throwIfHasError().body()!!.toModel(account)\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/DriveFileRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport androidx.room.*\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.user.User\n\n@Entity(\n    tableName = \"drive_file_v1\",\n    indices = [\n        Index(\"serverId\", \"relatedAccountId\", unique = true),\n        Index(\"serverId\"),\n        Index(\"relatedAccountId\"),\n    ],\n    foreignKeys = [\n        ForeignKey(\n            entity = AccountRecord::class,\n            parentColumns = [\"accountId\"],\n            childColumns = [\"relatedAccountId\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ]\n)\ndata class DriveFileRecord(\n    @ColumnInfo(name = \"serverId\")\n    val serverId: String,\n\n    @ColumnInfo(name = \"relatedAccountId\")\n    val relatedAccountId: Long,\n\n    @ColumnInfo(name = \"createdAt\")\n    val createdAt: Instant?,\n\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    @ColumnInfo(name = \"type\")\n    val type: String,\n\n    @ColumnInfo(name = \"md5\")\n    val md5: String?,\n\n    @ColumnInfo(name = \"size\")\n    val size: Int?,\n\n    @ColumnInfo(name = \"url\")\n    val url: String,\n\n    @ColumnInfo(name = \"isSensitive\")\n    val isSensitive: Boolean,\n\n    @ColumnInfo(name = \"thumbnailUrl\")\n    val thumbnailUrl: String?,\n\n    @ColumnInfo(name = \"folderId\")\n    val folderId: String?,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: String?,\n\n    @ColumnInfo(name = \"comment\")\n    val comment: String?,\n\n    @ColumnInfo(name = \"blurhash\")\n    val blurhash: String?,\n\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = \"id\")\n    val id: Long,\n) {\n\n    @Ignore\n    fun toFileProperty(): FileProperty {\n        return FileProperty(\n            id = FileProperty.Id(relatedAccountId, serverId),\n            createdAt = createdAt,\n            md5 = md5,\n            name = name,\n            type = type,\n            size = size,\n            url = url,\n            thumbnailUrl = thumbnailUrl,\n            folderId = folderId,\n            userId = userId?.let {\n                User.Id(relatedAccountId, it)\n            },\n            comment = comment,\n            blurhash = blurhash,\n            isSensitive = isSensitive,\n        )\n    }\n\n    @Ignore\n    fun toFilePropertyId(): FileProperty.Id {\n        return FileProperty.Id(relatedAccountId, serverId)\n    }\n\n    @Ignore\n    fun update(file: FileProperty): DriveFileRecord {\n        require(toFilePropertyId() == file.id) {\n            \"同一Id外の更新を行うことはできません id:${toFilePropertyId()}, args id:${file.id}\"\n        }\n        return copy(\n            serverId = file.id.fileId,\n            relatedAccountId = file.id.accountId,\n            createdAt = file.createdAt,\n            name = file.name,\n            type = file.type,\n            md5 = file.md5,\n            size = file.size,\n            url = file.url,\n            isSensitive = file.isSensitive,\n            thumbnailUrl = file.thumbnailUrl,\n            folderId = file.folderId,\n            userId = file.userId?.id,\n            blurhash = file.blurhash,\n            comment = file.comment\n        )\n    }\n\n    @Ignore\n    fun equalFileProperty(property: FileProperty): Boolean {\n        return property.id != toFilePropertyId()\n                || property.isSensitive != isSensitive\n                || property.comment != comment\n                || property.size != size\n                || property.md5 != md5\n                || property.name != name\n                || property.thumbnailUrl != thumbnailUrl\n                || property.url != url\n                || property.userId?.id != userId\n                || property.folderId != folderId\n                || property.type != type\n    }\n\n    companion object\n}\n\nfun DriveFileRecord.Companion.from(fileProperty: FileProperty): DriveFileRecord {\n\n    return DriveFileRecord(\n        serverId = fileProperty.id.fileId,\n        createdAt = fileProperty.createdAt,\n        md5 = fileProperty.md5,\n        name = fileProperty.name,\n        type = fileProperty.type,\n        size = fileProperty.size,\n        url = fileProperty.url,\n        thumbnailUrl = fileProperty.thumbnailUrl,\n        folderId = fileProperty.folderId,\n        userId = fileProperty.userId?.id,\n        comment = fileProperty.comment,\n        isSensitive = fileProperty.isSensitive,\n        relatedAccountId = fileProperty.id.accountId,\n        blurhash = fileProperty.blurhash,\n        id = 0L\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/DriveFileRecordDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\nabstract class DriveFileRecordDao {\n\n    @Insert(onConflict = OnConflictStrategy.ABORT)\n    abstract suspend fun insert(record: DriveFileRecord)\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract suspend fun insertAll(records: List<DriveFileRecord>): List<Long>\n\n    @Update\n    abstract suspend fun update(record: DriveFileRecord)\n\n    @Query(\"select * from drive_file_v1 where relatedAccountId=:accountId and serverId=:id\")\n    abstract suspend fun findOne(accountId: Long, id: String): DriveFileRecord?\n\n    @Query(\"delete from drive_file_v1 where relatedAccountId=:accountId and serverId=:id\")\n    abstract suspend fun delete(accountId: Long, id: String)\n\n    @Query(\"select * from drive_file_v1 where relatedAccountId=:accountId and serverId in (:serverIds)\")\n    abstract fun observeIn(accountId: Long, serverIds: List<String>): Flow<List<DriveFileRecord>>\n\n    @Query(\"select * from drive_file_v1 where relatedAccountId=:accountId and serverId=:id\")\n    abstract fun observe(accountId: Long, id: String): Flow<DriveFileRecord?>\n\n    @Query(\"select * from drive_file_v1 where relatedAccountId=:accountId and serverId in (:serverIds)\")\n    abstract suspend fun findIn(accountId: Long, serverIds: List<String>): List<DriveFileRecord>\n\n    @Query(\n        \"\"\"\n        delete from drive_file_v1\n            where not exists(\n                select * from draft_file_v2_table as draft \n                    where draft.filePropertyId = drive_file_v1.id\n            )\n        \"\"\"\n    )\n    abstract suspend fun deleteUnUsedFiles()\n\n    @Query(\"select count(*) from drive_file_v1\")\n    abstract suspend fun count(): Int\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/DriveFileRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.drive.DeleteFileDTO\nimport net.pantasystem.milktea.api.misskey.drive.ShowFile\nimport net.pantasystem.milktea.api.misskey.drive.toJsonObject\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.FilePropertyDTOEntityConverter\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.drive.*\nimport net.pantasystem.milktea.model.file.AppFile\nimport javax.inject.Inject\n\n\nclass DriveFileRepositoryImpl @Inject constructor(\n    val getAccount: GetAccount,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val driveFileDataSource: FilePropertyDataSource,\n    private val driveFileUploaderProvider: FileUploaderProvider,\n    private val filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : DriveFileRepository {\n    override suspend fun find(id: FileProperty.Id): FileProperty {\n        return withContext(ioDispatcher) {\n            val file = driveFileDataSource.find(id).getOrNull()\n            if (file != null) {\n                return@withContext file\n            }\n            val account = getAccount.get(id.accountId)\n            val api = misskeyAPIProvider.get(account.normalizedInstanceUri)\n            val response = api.showFile(ShowFile(fileId = id.fileId, i = account.token))\n                .throwIfHasError()\n            val fp = filePropertyDTOEntityConverter.convert(response.body()!!, account)\n            driveFileDataSource.add(fp)\n            return@withContext fp\n        }\n    }\n\n    override suspend fun toggleNsfw(id: FileProperty.Id) {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(id.accountId)\n            val api = misskeyAPIProvider.get(account.normalizedInstanceUri)\n            val fileProperty = find(id)\n            val result = api.updateFile(\n                UpdateFileProperty(\n                    fileProperty.id,\n                    isSensitive = ValueType.Some(!fileProperty.isSensitive)\n                ).toJsonObject(account.token)\n            ).throwIfHasError()\n\n            driveFileDataSource.add(\n                filePropertyDTOEntityConverter.convert(\n                    result.body()!!,\n                    account\n                )\n            )\n        }\n    }\n\n    override suspend fun create(accountId: Long, file: AppFile.Local): Result<FileProperty> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val property = driveFileUploaderProvider.get(getAccount.get(accountId))\n                    .upload(UploadSource.LocalFile(file), true)\n                driveFileDataSource.add(property).getOrThrow()\n                driveFileDataSource.find(property.id).getOrThrow()\n            }\n\n        }\n    }\n\n    override suspend fun delete(id: FileProperty.Id): Result<Unit> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = getAccount.get(id.accountId)\n                val property = find(id)\n                misskeyAPIProvider.get(account).deleteFile(\n                    DeleteFileDTO(i = account.token, fileId = id.fileId)\n                )\n                driveFileDataSource.remove(property)\n            }\n        }\n    }\n\n    override suspend fun update(updateFileProperty: UpdateFileProperty): Result<FileProperty> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val res =\n                    misskeyAPIProvider.get(getAccount.get(updateFileProperty.fileId.accountId))\n                        .updateFile(\n                            updateFileProperty.toJsonObject(\n                                getAccount.get(updateFileProperty.fileId.accountId).token,\n                            )\n                        ).throwIfHasError()\n                        .body()!!\n                filePropertyDTOEntityConverter.convert(\n                    res,\n                    getAccount.get(updateFileProperty.fileId.accountId)\n                ).also {\n                    driveFileDataSource.add(it)\n                }\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/FilePaginator.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.misskey.drive.FilePropertyDTO\nimport net.pantasystem.milktea.api.misskey.drive.RequestFile\nimport net.pantasystem.milktea.app_store.drive.FilePropertyPagingStore\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.FilePropertyDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.model.drive.Directory\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport javax.inject.Inject\n\n\nclass FilePropertyPagingStoreImpl @Inject constructor(\n    misskeyAPIProvider: MisskeyAPIProvider,\n    filePropertyDataSource: FilePropertyDataSource,\n    filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n) : FilePropertyPagingStore {\n\n    private var currentDirectoryId: String? = null\n\n    private var currentAccount: Account? = null\n\n    companion object;\n    private val filePropertyPagingImpl = FilePropertyPagingImpl(\n        misskeyAPIProvider,\n        filePropertyDataSource,\n        filePropertyDTOEntityConverter,\n        {\n            currentAccount?: throw UnauthorizedException()\n        },\n        {\n            currentDirectoryId\n        },\n    )\n\n    private val previousPagingController: PreviousPagingController<FilePropertyDTO, FileProperty.Id> =\n        PreviousPagingController.create(\n            filePropertyPagingImpl,\n        )\n\n    override val state = this.filePropertyPagingImpl.state\n\n    override val isLoading: Boolean get() = this.filePropertyPagingImpl.mutex.isLocked\n\n    override suspend fun loadPrevious(): Result<Int> {\n        return previousPagingController.loadPrevious()\n    }\n\n    override suspend fun clear() {\n        this.filePropertyPagingImpl.mutex.withLock {\n            this.filePropertyPagingImpl.setState(PageableState.Loading.Init())\n        }\n    }\n\n    override suspend fun setCurrentDirectory(directory: Directory?) {\n        this.clear()\n        this.currentDirectoryId = directory?.id?.directoryId\n    }\n\n    override suspend fun setCurrentAccount(account: Account?) {\n        this.clear()\n        this.currentAccount = account\n    }\n\n    /**\n     * DriveFileが作成されたタイミングで呼び出される\n     */\n    override fun onCreated(id: FileProperty.Id) {\n        filePropertyPagingImpl.setState(\n            filePropertyPagingImpl.getState().convert {\n                it.toMutableList().also { list ->\n                    list.add(0, id)\n                }\n            }\n        )\n    }\n\n}\n\n\nclass FilePropertyPagingImpl(\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n    private val getAccount: suspend () -> Account,\n    private val getCurrentFolderId: () -> String?,\n) : PaginationState<FileProperty.Id>,\n    IdGetter<String>, PreviousLoader<FilePropertyDTO>,\n    EntityConverter<FilePropertyDTO, FileProperty.Id>,\n    StateLocker {\n\n    private val _state = MutableStateFlow<PageableState<List<FileProperty.Id>>>(\n        PageableState.Fixed(\n            StateContent.NotExist()\n        )\n    )\n    override val state: Flow<PageableState<List<FileProperty.Id>>>\n        get() = _state\n\n    override val mutex: Mutex = Mutex()\n\n    override fun setState(state: PageableState<List<FileProperty.Id>>) {\n        _state.value = state\n    }\n\n    override fun getState(): PageableState<List<FileProperty.Id>> {\n        return _state.value\n    }\n\n    override suspend fun getSinceId(): String? {\n        return (getState().content as? StateContent.Exist<List<FileProperty.Id>>)?.rawContent?.firstOrNull()?.fileId\n    }\n\n    override suspend fun getUntilId(): String? {\n        return (getState().content as? StateContent.Exist<List<FileProperty.Id>>)?.rawContent?.lastOrNull()?.fileId\n    }\n\n    override suspend fun loadPrevious(): Result<List<FilePropertyDTO>> {\n        return runCancellableCatching {\n            misskeyAPIProvider.get(getAccount.invoke().normalizedInstanceUri).getFiles(\n                RequestFile(\n                    folderId = getCurrentFolderId.invoke(),\n                    untilId = this.getUntilId(),\n                    i = getAccount.invoke().token,\n                    limit = 20\n                )\n            ).throwIfHasError().body()!!\n        }\n    }\n\n    override suspend fun convertAll(list: List<FilePropertyDTO>): List<FileProperty.Id> {\n        val entities = list.map {\n            filePropertyDTOEntityConverter.convert(it, getAccount())\n        }\n        filePropertyDataSource.addAll(entities)\n        return entities.map {\n            it.id\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/InMemoryFielPropertyDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSourceState\nimport net.pantasystem.milktea.model.drive.FilePropertyNotFoundException\nimport javax.inject.Inject\n\n\nclass InMemoryFilePropertyDataSource @Inject constructor(): FilePropertyDataSource {\n    private var map = mapOf<FileProperty.Id, FileProperty>()\n    private var _state = MutableStateFlow(FilePropertyDataSourceState(map))\n    val state: StateFlow<FilePropertyDataSourceState> = _state\n\n    private val lock = Mutex()\n\n    override suspend fun add(fileProperty: FileProperty): Result<AddResult> {\n        val result: AddResult\n        lock.withLock {\n            map = map.toMutableMap().also {\n                result = if(it.put(fileProperty.id, fileProperty) == null) AddResult.Created else AddResult.Updated\n            }\n        }\n        _state.value = _state.value.copy(\n            map = map\n        )\n        return Result.success(result)\n    }\n\n    override suspend fun addAll(list: List<FileProperty>): Result<List<AddResult>> = runCancellableCatching {\n        list.map {\n            add(it).getOrElse {\n                AddResult.Canceled\n            }\n        }\n    }\n\n    override suspend fun find(filePropertyId: FileProperty.Id): Result<FileProperty> = runCancellableCatching {\n        map[filePropertyId]?: throw FilePropertyNotFoundException(filePropertyId)\n    }\n\n    override suspend fun remove(fileProperty: FileProperty): Result<Boolean> {\n        val result: Boolean\n        lock.withLock {\n            map = map.toMutableMap().also {\n                result = it.remove(fileProperty.id) != null\n            }\n        }\n        _state.value = _state.value.copy(\n            map = map\n        )\n        return Result.success(result)\n\n    }\n\n\n    override suspend fun clearUnusedCaches(): Result<Unit> {\n        lock.withLock {\n            map = emptyMap()\n        }\n        return Result.success(Unit)\n    }\n\n    override fun observe(id: FileProperty.Id): Flow<FileProperty?> {\n        return _state.map {\n            it.getOrNull(id)\n        }\n    }\n\n    override fun observeIn(ids: List<FileProperty.Id>): Flow<List<FileProperty>> {\n        return _state.map {\n            it.findIn(ids)\n        }\n    }\n\n\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/InputStreamRequestBody.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport okhttp3.MediaType\nimport okhttp3.MediaType.Companion.toMediaType\nimport okhttp3.RequestBody\nimport okio.BufferedSink\nimport okio.source\nimport java.io.InputStream\n\ninternal class InputStreamRequestBody(\n    val type: String,\n    val inputStream: InputStream,\n) : RequestBody() {\n    override fun contentType(): MediaType {\n        return type.toMediaType()\n    }\n\n    override fun writeTo(sink: BufferedSink) {\n        inputStream.source().use {\n            sink.writeAll(it)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/MastodonOkHttpFileUploader.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport android.content.Context\nimport android.net.Uri\nimport kotlinx.coroutines.delay\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.mastodon.media.TootMediaAttachment\nimport net.pantasystem.milktea.api.mastodon.media.UpdateMediaAttachment\nimport net.pantasystem.milktea.common.throwErrorFromStatusCode\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIFactory\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.toFileProperty\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport okhttp3.MultipartBody\nimport okhttp3.Request\nimport java.net.URL\n\nclass MastodonOkHttpFileUploader(\n    val context: Context,\n    val account: Account,\n    val json: Json,\n    private val mastodonAPIFactory: MastodonAPIFactory,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val filePropertyDataSource: FilePropertyDataSource,\n) : FileUploader {\n\n    override suspend fun upload(file: UploadSource, isForce: Boolean): FileProperty {\n\n        return when (file) {\n            is UploadSource.LocalFile -> {\n                upload(file)\n            }\n            is UploadSource.OtherAccountFile -> {\n                TODO()\n            }\n        }\n\n    }\n\n    private suspend fun upload(file: UploadSource.LocalFile): FileProperty {\n        val okHttpClient =\n            mastodonAPIFactory.getOkHttp(account.normalizedInstanceUri, account.token)\n        val builder = MultipartBody.Builder()\n            .setType(MultipartBody.FORM)\n            .addFormDataPart(\n                \"file\",\n                file.file.name,\n                UriRequestBody(Uri.parse(file.file.path), context)\n            )\n        val request = Request.Builder()\n            .url(URL(\"${account.normalizedInstanceUri}/api/v2/media\"))\n            .post(builder.build()).build()\n        val response = okHttpClient.newCall(request).execute()\n        throwErrorFromStatusCode(response.code)\n        val result = json.decodeFromString<TootMediaAttachment>(requireNotNull(response.body?.string()))\n        val property = result.toFileProperty(account, false).also {\n            filePropertyDataSource.add(it).getOrThrow()\n        }\n        var code = response.code\n        while(code == 202 || code == 206) {\n            code = checkUploadStatus(property.id.fileId)\n            throwErrorFromStatusCode(code)\n            delay(100)\n        }\n        if (!file.file.comment.isNullOrBlank()) {\n            mastodonAPIProvider.get(account).updateMediaAttachment(result.id, UpdateMediaAttachment(\n                description = file.file.comment ?: \"\",\n                focus = \"0.00,0.00\"\n            )).throwIfHasError()\n        }\n\n        return property\n    }\n\n    private fun checkUploadStatus(fileId: String): Int {\n        val okHttpClient =\n            mastodonAPIFactory.getOkHttp(account.normalizedInstanceUri, account.token)\n        val request = Request.Builder()\n            .url(URL(\"${account.normalizedInstanceUri}/api/v1/media/${fileId}\"))\n            .get()\n            .build()\n        return okHttpClient.newCall(\n            request\n        ).execute().code\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/MediatorFilePropertyDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.collection.LRUCache\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.drive.FilePropertyNotFoundException\nimport javax.inject.Inject\n\nclass MediatorFilePropertyDataSource @Inject constructor(\n    private val driveFileRecordDao: DriveFileRecordDao,\n    private val loggerFactory: Logger.Factory,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : FilePropertyDataSource {\n\n    val logger by lazy {\n        loggerFactory.create(\"MediatorFilePropertyDataSource\")\n    }\n\n    val cache = LRUCache<FileProperty.Id, FileProperty>(25)\n\n\n    override suspend fun add(\n        fileProperty: FileProperty\n    ): Result<AddResult> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            cache.put(fileProperty.id, fileProperty)\n            val record = runCancellableCatching {\n                driveFileRecordDao.findOne(fileProperty.id.accountId, fileProperty.id.fileId)\n            }.getOrNull()\n            try {\n                if (record == null) {\n                    driveFileRecordDao.insert(DriveFileRecord.from(fileProperty))\n                    return@withContext AddResult.Created\n                } else if (record.toFileProperty() != fileProperty) {\n                    driveFileRecordDao.update(\n                        DriveFileRecord.from(fileProperty).copy(id = record.id)\n                    )\n                    return@withContext AddResult.Updated\n                }\n            } catch (e: Exception) {\n                return@withContext AddResult.Canceled\n            }\n\n            return@withContext AddResult.Canceled\n        }\n    }\n\n    override suspend fun addAll(\n        list: List<FileProperty>\n    ): Result<List<AddResult>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            if (list.isEmpty()) {\n                return@withContext emptyList()\n            }\n            list.forEach {\n                cache.put(it.id, it)\n            }\n            val insertResults = driveFileRecordDao.insertAll(list.map {\n                DriveFileRecord.from(it)\n            })\n\n            // NOTE: 既に作成されいているためInsertがキャンセルされたファイル\n            val ignored = list.filterIndexed { index, _ ->\n                insertResults[index] == -1L\n            }\n\n            logger.debug { \"insert結果:$insertResults\" }\n            if (ignored.isEmpty()) {\n                return@withContext list.map {\n                    AddResult.Created\n                }\n            }\n\n            // NOTE: DB上の同一のエンティティを取得する\n            val records = findRecords(ignored.map { it.id })\n            val idAndFileMap = ignored.associateBy { it.id }\n\n            // NOTE: 内容に変更があったファイルをフィルタする\n            val needUpdates = records.filter { record ->\n                val property = idAndFileMap.getValue(record.toFilePropertyId())\n                record.equalFileProperty(property)\n            }\n\n            if (needUpdates.isEmpty()) {\n                return@withContext insertResults.map {\n                    if (it == -1L) AddResult.Canceled else AddResult.Created\n                }\n            }\n\n            logger.debug { \"必要更新件数:${needUpdates.size}\" }\n            // NOTE: 内容に変更があった場合更新をする\n            needUpdates.map { record ->\n                driveFileRecordDao.update(record.update(idAndFileMap.getValue(record.toFilePropertyId())))\n            }\n\n            return@withContext list.mapIndexed { index, fileProperty ->\n                if (insertResults[index] != -1L) {\n                    AddResult.Created\n                } else if (needUpdates.any { it.equalFileProperty(fileProperty) }) {\n                    AddResult.Updated\n                } else {\n                    AddResult.Canceled\n                }\n            }\n        }\n    }\n\n    override suspend fun find(\n        filePropertyId: FileProperty.Id\n    ): Result<FileProperty> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            var result = cache.get(filePropertyId)\n            if (result != null) {\n                return@withContext result\n            }\n            result = runCancellableCatching {\n                driveFileRecordDao.findOne(filePropertyId.accountId, filePropertyId.fileId)\n                    ?.toFileProperty()\n            }.getOrNull()\n\n            result ?: throw FilePropertyNotFoundException(filePropertyId)\n        }\n    }\n\n    override suspend fun remove(\n        fileProperty: FileProperty\n    ): Result<Boolean> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            try {\n                driveFileRecordDao.delete(fileProperty.id.accountId, fileProperty.id.fileId)\n                true\n            } catch (e: Exception) {\n                false\n            }.also {\n                cache.remove(fileProperty.id)\n            }\n        }\n    }\n\n\n    override fun observe(id: FileProperty.Id): Flow<FileProperty?> {\n        return driveFileRecordDao.observe(id.accountId, id.fileId).distinctUntilChanged().map {\n            it?.toFileProperty()\n        }.flowOn(ioDispatcher)\n    }\n\n    override fun observeIn(ids: List<FileProperty.Id>): Flow<List<FileProperty>> {\n        if (ids.isEmpty()) {\n            return flowOf(emptyList())\n        }\n        val accountIds = ids.map { it.accountId }.distinct()\n        val flows = accountIds.map { accountId ->\n            driveFileRecordDao.observeIn(\n                accountId,\n                ids.filter { it.accountId == accountId }.map { it.fileId })\n        }\n        return combine(flows) { events ->\n            val l1 = events.map { list ->\n                list.map {\n                    it.toFileProperty()\n                }\n            }\n            l1.reduce { acc, list ->\n                acc.toMutableList().also {\n                    it.addAll(list)\n                }\n            }.associateBy {\n                it.id\n            }\n        }.map { map ->\n            ids.mapNotNull { id ->\n                map[id]\n            }\n        }.distinctUntilChanged().onEach { list ->\n            list.forEach {\n                cache.put(it.id, it)\n            }\n        }.flowOn(ioDispatcher)\n    }\n\n    override suspend fun findIn(\n        ids: List<FileProperty.Id>\n    ): Result<List<FileProperty>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val inMemories = ids.mapNotNull {\n                cache.get(it)\n            }\n            if (inMemories.size == ids.size) {\n                return@withContext inMemories\n            }\n            val sets = inMemories.map { it.id }.toSet()\n            val notExistsIds = ids.filterNot {\n                sets.contains(it)\n            }\n\n            val onDb = findRecords(notExistsIds).map {\n                it.toFileProperty()\n            }\n            val map = (inMemories + onDb).associateBy {\n                it.id\n            }\n            return@withContext ids.mapNotNull {\n                map[it]\n            }\n        }\n    }\n\n    override suspend fun clearUnusedCaches(): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            driveFileRecordDao.deleteUnUsedFiles()\n        }\n    }\n\n    private suspend fun findRecords(ids: List<FileProperty.Id>): List<DriveFileRecord> {\n\n        val accountGroup = ids.groupBy {\n            it.accountId\n        }\n\n        if (accountGroup.isEmpty()) {\n            return emptyList()\n        }\n\n        val recordGroupedByAccount = accountGroup.map { accountIdAndIds ->\n            driveFileRecordDao.findIn(accountIdAndIds.key, accountIdAndIds.value.map { it.fileId })\n        }\n\n        return recordGroupedByAccount.reduce { acc, list ->\n            acc.toMutableList().also { mutable ->\n                mutable.addAll(list)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/MisskeyOkHttpDriveFileUploader.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport android.content.Context\nimport android.net.Uri\nimport android.util.Log\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.api.misskey.drive.FilePropertyDTO\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.ErrorType\nimport net.pantasystem.milktea.common.formatter\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwErrorFromStatusCode\nimport net.pantasystem.milktea.data.converters.FilePropertyDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FileUploadFailedException\nimport okhttp3.MultipartBody\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\nimport okhttp3.RequestBody\nimport java.io.InputStream\nimport java.net.URL\nimport java.util.concurrent.TimeUnit\n\n\nobject MisskeyOkHttpDriveFileUploaderConstants {\n    const val i = \"i\"\n    const val force = \"force\"\n    const val file = \"file\"\n    const val folderId = \"folderId\"\n    const val isSensitive = \"isSensitive\"\n    const val comment = \"comment\"\n}\n\nclass MisskeyOkHttpDriveFileUploader(\n    val context: Context,\n    val account: Account,\n    val json: Json,\n    private val okHttpClientProvider: OkHttpClientProvider,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n) : FileUploader {\n    override suspend fun upload(file: UploadSource, isForce: Boolean): FileProperty {\n        return when (file) {\n            is UploadSource.LocalFile -> upload(file.file, isForce)\n            is UploadSource.OtherAccountFile -> transferUpload(file.fileProperty, isForce)\n        }.let {\n            val property = filePropertyDTOEntityConverter.convert(it, account)\n            filePropertyDataSource.add(property).getOrThrow()\n            property\n        }\n    }\n\n    private fun transferUpload(fileProperty: FileProperty, isForce: Boolean): FilePropertyDTO {\n        return try {\n            val client = getOkHttpClient()\n            val res = client.newCall(Request.Builder().url(fileProperty.url).build())\n\n            val requestBodyBuilder = MultipartBody.Builder()\n                .setType(MultipartBody.FORM)\n                .addFormDataPart(MisskeyOkHttpDriveFileUploaderConstants.i, account.token)\n                .addFormDataPart(MisskeyOkHttpDriveFileUploaderConstants.force, isForce.toString())\n                //.addFormDataPart(\"file\", uploadFile.file.name, RequestBody.create(MediaType.parse(mime), uploadFile.file))\n                .addFormDataPart(\n                    MisskeyOkHttpDriveFileUploaderConstants.file,\n                    fileProperty.name,\n                    createRequestBody(fileProperty.type, res.execute().body!!.byteStream())\n                )\n\n            if (fileProperty.folderId != null) {\n                requestBodyBuilder.addFormDataPart(\n                    MisskeyOkHttpDriveFileUploaderConstants.folderId,\n                    fileProperty.folderId!!\n                )\n            }\n\n            if (fileProperty.comment != null) {\n                requestBodyBuilder.addFormDataPart(\n                    MisskeyOkHttpDriveFileUploaderConstants.comment,\n                    fileProperty.comment ?: \"\"\n                )\n            }\n\n            val requestBody = requestBodyBuilder.build()\n\n            val request =\n                Request.Builder()\n                    .url(URL(\"${account.normalizedInstanceUri}/api/drive/files/create\"))\n                    .post(requestBody).build()\n            val response = client.newCall(request).execute()\n            if (response.isSuccessful) {\n                json.decodeFromString<FilePropertyDTO>(response.body!!.string())\n            } else {\n                val body = response.body?.string()\n                val error = try {\n                    throwErrorFromStatusCode(response.code, body?.let {\n                        runCancellableCatching {\n                            ErrorType.Misskey(formatter.decodeFromString(it))\n                        }.getOrNull() ?: ErrorType.Raw(it)\n                    })\n                    null\n                } catch (e: APIError) {\n                    e\n                }\n                throw FileUploadFailedException(\n                    AppFile.Remote(fileProperty.id),\n                    error,\n                    response.code,\n                    body,\n                )\n            }\n        } catch (e: Throwable) {\n            throw FileUploadFailedException(\n                AppFile.Remote(fileProperty.id),\n                e,\n                null,\n                null,\n            )\n        }\n\n\n    }\n\n    private fun upload(file: AppFile.Local, isForce: Boolean): FilePropertyDTO {\n        Log.d(\"FileUploader\", \"アップロードしようとしている情報:$file\")\n        return try {\n            val client = getOkHttpClient()\n            val requestBodyBuilder = MultipartBody.Builder()\n                .setType(MultipartBody.FORM)\n                .addFormDataPart(MisskeyOkHttpDriveFileUploaderConstants.i, account.token)\n                .addFormDataPart(MisskeyOkHttpDriveFileUploaderConstants.force, isForce.toString())\n                //.addFormDataPart(\"file\", uploadFile.file.name, RequestBody.create(MediaType.parse(mime), uploadFile.file))\n                .addFormDataPart(\n                    MisskeyOkHttpDriveFileUploaderConstants.file,\n                    file.name,\n                    createRequestBody(Uri.parse(file.path))\n                )\n\n            if (file.comment != null) {\n                requestBodyBuilder.addFormDataPart(\n                    MisskeyOkHttpDriveFileUploaderConstants.comment,\n                    file.comment ?: \"\"\n                )\n            }\n\n            val isSensitive = file.isSensitive\n            requestBodyBuilder.addFormDataPart(\n                MisskeyOkHttpDriveFileUploaderConstants.isSensitive,\n                isSensitive.toString()\n            )\n\n            val folderId = file.folderId\n            if (folderId != null) requestBodyBuilder.addFormDataPart(\n                MisskeyOkHttpDriveFileUploaderConstants.folderId,\n                folderId\n            )\n\n            val requestBody = requestBodyBuilder.build()\n\n            val request =\n                Request.Builder()\n                    .url(URL(\"${account.normalizedInstanceUri}/api/drive/files/create\"))\n                    .post(requestBody).build()\n            val response = client.newCall(request).execute()\n            val code = response.code\n            if (code in 200 until 300) {\n                json.decodeFromString<FilePropertyDTO>(response.body!!.string())\n            } else {\n                val resBody = response.body?.string()\n                val error = try {\n                    throwErrorFromStatusCode(code, resBody?.let {\n                        runCancellableCatching {\n                            ErrorType.Misskey(formatter.decodeFromString(it))\n                        }.getOrNull() ?: ErrorType.Raw(it)\n                    })\n                    null\n                } catch (e: APIError) {\n                    e\n                }\n                throw FileUploadFailedException(\n                    file,\n                    error,\n                    code,\n                    resBody,\n                )\n            }\n        } catch (e: Exception) {\n            Log.w(\"OkHttpConnection\", \"post file error\", e)\n            throw FileUploadFailedException(file, e, null, null)\n        }\n    }\n\n\n    private fun createRequestBody(type: String, inputStream: InputStream): RequestBody {\n        return InputStreamRequestBody(type = type, inputStream = inputStream)\n    }\n\n    private fun createRequestBody(uri: Uri): RequestBody {\n        return UriRequestBody(uri, context)\n    }\n\n    private fun getOkHttpClient(): OkHttpClient {\n        return okHttpClientProvider.get().newBuilder()\n            .connectTimeout(20, TimeUnit.SECONDS)\n            .writeTimeout(114514, TimeUnit.SECONDS)\n            .readTimeout(20, TimeUnit.SECONDS)\n            .build()\n\n    }\n\n\n}\n\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/UriRequestBody.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.graphics.Matrix\nimport android.net.Uri\nimport androidx.exifinterface.media.ExifInterface\nimport okhttp3.MediaType\nimport okhttp3.MediaType.Companion.toMediaType\nimport okhttp3.RequestBody\nimport okio.BufferedSink\nimport okio.source\n\n\ninternal class UriRequestBody(\n    val uri: Uri,\n    val context: Context,\n) : RequestBody() {\n    override fun contentType(): MediaType? {\n        val type = context.contentResolver.getType(uri)\n        return type?.toMediaType()\n    }\n\n\n    override fun writeTo(sink: BufferedSink) {\n        context.contentResolver.openInputStream(uri)?.use { inputStream ->\n\n            val type = context.contentResolver.getType(uri)\n            if (type?.startsWith(\"image\") == true\n                && (type.split(\"/\").getOrNull(1)?.let {\n                    it == \"jpeg\" || it == \"jpg\"\n                } == true)\n            ) {\n\n                val bitmap =\n                    rotateImageIfRequired(BitmapFactory.decodeStream(inputStream), uri)\n                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, sink.outputStream())\n                bitmap.recycle()\n\n            } else {\n                sink.writeAll(inputStream.source())\n            }\n        }\n    }\n\n    /**\n     * 与えられたBitmapを元ファイルのExif情報を元に回転させる処理\n     */\n    private fun rotateImageIfRequired(bitmap: Bitmap, uri: Uri): Bitmap {\n        context.contentResolver.openFileDescriptor(uri, \"r\").use {\n            val fileDescriptor = it!!.fileDescriptor\n            val exif = ExifInterface(fileDescriptor)\n\n            return when (exif.getAttributeInt(\n                ExifInterface.TAG_ORIENTATION,\n                ExifInterface.ORIENTATION_NORMAL\n            )) {\n                ExifInterface.ORIENTATION_ROTATE_90 -> rotateImage(bitmap, 90)\n                ExifInterface.ORIENTATION_ROTATE_180 -> rotateImage(bitmap, 180)\n                ExifInterface.ORIENTATION_ROTATE_270 -> rotateImage(bitmap, 270)\n                else -> bitmap\n            }\n        }\n\n\n    }\n\n    /**\n     * 回転状態に基づきBitmapを回転させる\n     */\n    private fun rotateImage(bitmap: Bitmap, degree: Int): Bitmap {\n        val matrix = Matrix()\n        matrix.postRotate(degree.toFloat())\n        val rotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)\n        bitmap.recycle()\n        return rotated\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/drive/uploaders.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.drive\n\nimport android.content.Context\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIFactory\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.converters.FilePropertyDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FileUploadFailedException\n\ninterface FileUploader {\n    @Throws(FileUploadFailedException::class)\n    suspend fun upload(file: UploadSource, isForce: Boolean): FileProperty\n}\n\nsealed interface UploadSource {\n    data class OtherAccountFile(\n        val fileProperty: FileProperty\n    ) : UploadSource\n\n    data class LocalFile(val file: AppFile.Local) : UploadSource\n}\n\n\ninterface FileUploaderProvider {\n    fun create(account: Account): FileUploader\n    fun get(account: Account): FileUploader\n}\n\nclass OkHttpFileUploaderProvider(\n    val okHttpClientProvider: OkHttpClientProvider,\n    val context: Context,\n    val json: Json,\n    val filePropertyDataSource: FilePropertyDataSource,\n    private val mastodonAPIFactory: MastodonAPIFactory,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n) : FileUploaderProvider {\n    private val lock = Mutex()\n    private var instances = mapOf<Long, FileUploader>()\n\n    override fun create(account: Account): FileUploader {\n        return runBlocking {\n            lock.withLock {\n                val map = instances.toMutableMap()\n                when (account.instanceType) {\n                    Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                        map[account.accountId] = MisskeyOkHttpDriveFileUploader(\n                            context,\n                            account,\n                            json,\n                            okHttpClientProvider,\n                            filePropertyDataSource,\n                            filePropertyDTOEntityConverter,\n                        )\n                        instances = map\n                        instances[account.accountId]\n                            ?: throw IllegalStateException(\"生成したはずのインスタンスが消滅しました！！\")\n                    }\n                    Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                        map[account.accountId] = MastodonOkHttpFileUploader(\n                            context,\n                            account,\n                            json,\n                            mastodonAPIFactory,\n                            mastodonAPIProvider,\n                            filePropertyDataSource\n                        )\n                        instances = map\n                        instances[account.accountId]\n                            ?: throw IllegalStateException(\"生成したはずのインスタンスが消滅しました！！\")\n                    }\n                }\n\n            }\n        }\n    }\n\n    override fun get(account: Account): FileUploader {\n        return instances[account.accountId] ?: create(account)\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport net.pantasystem.milktea.api.misskey.EmptyRequest\nimport net.pantasystem.milktea.api.misskey.instance.RequestMeta\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.emoji.V13EmojiUrlResolver\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.emoji.EmojiWithAlias\nimport net.pantasystem.milktea.model.instance.Version\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.getVersion\nimport javax.inject.Inject\n\n\ninternal interface CustomEmojiApiAdapter {\n    suspend fun fetch(nodeInfo: NodeInfo): List<EmojiWithAlias>\n}\n\ninternal class CustomEmojiApiAdapterImpl @Inject constructor(\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val misskeyAPIProvider: MisskeyAPIProvider\n) : CustomEmojiApiAdapter {\n\n    override suspend fun fetch(nodeInfo: NodeInfo): List<EmojiWithAlias> {\n        return when (nodeInfo.type) {\n            is NodeInfo.SoftwareType.Mastodon -> {\n                val emojis = mastodonAPIProvider.get(\"https://${nodeInfo.host}\").getCustomEmojis()\n                    .throwIfHasError()\n                    .body()\n                emojis?.map {\n                    it.toEmojiWithAlias()\n                }\n            }\n            is NodeInfo.SoftwareType.Pleroma -> {\n                val emojis = mastodonAPIProvider.get(nodeInfo.host).getCustomEmojis()\n                    .throwIfHasError()\n                    .body()\n                emojis?.map {\n                    it.toEmojiWithAlias()\n                }\n            }\n            is NodeInfo.SoftwareType.Misskey -> {\n                if (\n                    nodeInfo.type.getVersion() >= Version(\"13\")\n                    && nodeInfo.type !is NodeInfo.SoftwareType.Misskey.Calckey\n                ) {\n                    val emojis =\n                        misskeyAPIProvider.get(\"https://${nodeInfo.host}\").getEmojis(EmptyRequest)\n                            .throwIfHasError()\n                            .body()\n                    emojis?.emojis?.map {\n                        it.toModelWithAlias()\n                    }?.map {\n                        it.copy(\n                            emoji = it.emoji.copy(\n                                url = if (it.emoji.url == null) V13EmojiUrlResolver.resolve(it.emoji, \"https://${nodeInfo.host}\") else it.emoji.url,\n                                uri = if (it.emoji.uri == null) V13EmojiUrlResolver.resolve(it.emoji, \"https://${nodeInfo.host}\") else it.emoji.uri,\n                            )\n                        )\n                    }\n                } else {\n                    misskeyAPIProvider.get(\"https://${nodeInfo.host}\")\n                        .getMeta(RequestMeta(detail = true))\n                        .throwIfHasError()\n                        .body()\n                        ?.emojis?.map {\n                            it.toModelWithAlias()\n                        }\n                }\n            }\n            is NodeInfo.SoftwareType.Firefish -> {\n                misskeyAPIProvider.get(\"https://${nodeInfo.host}\")\n                    .getMeta(RequestMeta(detail = true))\n                    .throwIfHasError()\n                    .body()\n                    ?.emojis?.map {\n                        it.toModelWithAlias()\n                    }\n            }\n            is NodeInfo.SoftwareType.Other -> throw IllegalStateException()\n        } ?: throw IllegalArgumentException()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiAspectRatioDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx.room.Upsert\n\n@Dao\ninterface CustomEmojiAspectRatioDAO {\n\n    @Query(\"\"\"\n        SELECT * FROM custom_emoji_aspects WHERE uri in (:uris)\n    \"\"\")\n    suspend fun findIn(uris: List<String>): List<CustomEmojiAspectRatioEntity>\n\n    @Query(\"\"\"\n        SELECT * FROM custom_emoji_aspects WHERE uri = :uri\n    \"\"\")\n    suspend fun findOne(uri: String): CustomEmojiAspectRatioEntity?\n\n    @Upsert\n    suspend fun upsert(entity: CustomEmojiAspectRatioEntity)\n\n    @Query(\"DELETE FROM custom_emoji_aspects WHERE uri = :uri\")\n    suspend fun delete(uri: String)\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiAspectRatioDataSourceImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatio\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioDataSource\nimport javax.inject.Inject\n\nclass CustomEmojiAspectRatioDataSourceImpl @Inject constructor(\n    private val customEmojiAspectRatioDAO: CustomEmojiAspectRatioDAO,\n    @IODispatcher val coroutineDispatcher: CoroutineDispatcher,\n) : CustomEmojiAspectRatioDataSource {\n\n\n    override suspend fun findIn(uris: List<String>): Result<List<CustomEmojiAspectRatio>> =\n        runCancellableCatching {\n            withContext(coroutineDispatcher) {\n                uris.chunked(50).map {\n                    customEmojiAspectRatioDAO.findIn(it)\n                }\n            }.flatten().map {\n                CustomEmojiAspectRatio(it.uri, it.aspectRatio)\n            }\n        }\n\n    override suspend fun findOne(uri: String): Result<CustomEmojiAspectRatio> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            customEmojiAspectRatioDAO.findOne(uri)?.let {\n                CustomEmojiAspectRatio(it.uri, it.aspectRatio)\n            } ?: throw NoSuchElementException()\n        }\n    }\n\n    override suspend fun save(ratio: CustomEmojiAspectRatio): Result<CustomEmojiAspectRatio> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            customEmojiAspectRatioDAO.upsert(\n                CustomEmojiAspectRatioEntity(\n                    ratio.uri,\n                    ratio.aspectRatio,\n                )\n            )\n        }\n        findOne(ratio.uri).getOrThrow()\n    }\n\n    override suspend fun delete(ratio: CustomEmojiAspectRatio): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            customEmojiAspectRatioDAO.delete(ratio.uri)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiAspectRatioEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\n\n@Entity(\n    tableName = \"custom_emoji_aspects\"\n)\ndata class CustomEmojiAspectRatioEntity(\n    @PrimaryKey(autoGenerate = false) val uri: String,\n    @ColumnInfo(\"aspect_ratio\") val aspectRatio: Float\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.collection.LRUCache\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass CustomEmojiCache @Inject constructor() : MemoryCacheCleaner.Cleanable {\n    private val lock = Mutex()\n    private val mappedCache = LRUCache<String, Map<String, CustomEmoji>>(3)\n    private val listCache = LRUCache<String, List<CustomEmoji>>(3)\n\n    suspend fun put(host: String, emojis: List<CustomEmoji>): Map<String, CustomEmoji> {\n        return lock.withLock {\n            val mapped = emojis.associateBy {\n                it.name\n            }\n            mappedCache.put(host, mapped)\n            listCache.put(host, emojis)\n            mapped\n        }\n    }\n\n    fun get(host: String): List<CustomEmoji>? {\n        return listCache[host]\n    }\n\n    fun getMap(host: String): Map<String, CustomEmoji>? {\n        return mappedCache[host]\n    }\n\n    override suspend fun clean() {\n        lock.withLock {\n            mappedCache.clear()\n            listCache.clear()\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface CustomEmojiDAO {\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertAll(emojis: List<CustomEmojiRecord>): List<Long>\n\n    @Insert\n    suspend fun insert(emoji: CustomEmojiRecord): Long\n\n    @Query(\"SELECT * FROM custom_emojis WHERE emojiHost = :host\")\n    suspend fun findByHost(host: String): List<CustomEmojiRecord>\n\n    @Query(\"SELECT * FROM custom_emojis WHERE emojiHost = :host AND name = :name\")\n    suspend fun findByHostAndName(host: String, name: String): List<CustomEmojiRecord>\n\n    @Query(\"DELETE FROM custom_emojis WHERE emojiHost = :host\")\n    suspend fun deleteByHost(host: String)\n\n    @Query(\"\"\"\n        DELETE FROM custom_emojis WHERE emojiHost = :host AND name IN (:names)\n    \"\"\")\n    suspend fun deleteByHostAndNames(host: String, names: List<String>)\n\n\n    @Insert(\n        onConflict = OnConflictStrategy.REPLACE,\n    )\n    suspend fun insertAliases(aliases: List<CustomEmojiAliasRecord>): List<Long>\n\n    @Query(\"SELECT * FROM custom_emojis WHERE emojiHost = :host\")\n    fun observeBy(host: String): Flow<List<CustomEmojiRecord>>\n\n    @Query(\"\"\"\n        SELECT * FROM custom_emojis \n            WHERE emojiHost = :host AND name LIKE '%' || :keyword || '%'\n            OR EXISTS(\n                SELECT 1 FROM custom_emoji_aliases WHERE emojiHost = :host AND name LIKE '%' || :keyword || '%'\n                    AND custom_emoji_aliases.emojiId = custom_emojis.id\n            )\n    \"\"\")\n    fun observeAndSearch(host: String, keyword: String): Flow<List<CustomEmojiRecord>>\n\n    @Query(\"\"\"\n        SELECT * FROM custom_emojis \n            WHERE emojiHost = :host AND name LIKE '%' || :keyword || '%'\n            OR EXISTS(\n                SELECT 1 FROM custom_emoji_aliases WHERE emojiHost = :host AND name LIKE '%' || :keyword || '%'\n                    AND custom_emoji_aliases.emojiId = custom_emojis.id\n            )\n    \"\"\")\n    suspend fun search(host: String, keyword: String): List<CustomEmojiRecord>\n\n    @Query(\"\"\"\n        SELECT * FROM custom_emojis\n            WHERE emojiHost = :host AND name IN (:names)\n    \"\"\")\n    suspend fun findByNames(host: String, names: List<String>): List<CustomEmojiRecord>\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiInserter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport androidx.annotation.VisibleForTesting\nimport net.pantasystem.milktea.common.coroutines.PessimisticCollectiveMutex\nimport net.pantasystem.milktea.model.emoji.EmojiWithAlias\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass CustomEmojiInserter @Inject constructor(\n    private val customEmojiDAO: CustomEmojiDAO,\n) {\n    private val mutex = PessimisticCollectiveMutex<String>()\n\n    suspend fun convertAndReplaceAll(host: String, emojis: List<EmojiWithAlias>): List<CustomEmojiRecord> {\n        val emojisBeforeInsert = emojis.map {\n            CustomEmojiRecord.from(it.emoji, host)\n        }\n        val inserted = replaceAll(\n            host,\n            emojisBeforeInsert,\n        )\n        insertAliases(\n            inserted.map {\n                it.id\n            },\n            emojis.map {\n                it.aliases ?: emptyList()\n            }\n        )\n        return inserted\n    }\n\n    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)\n    suspend fun replaceAll(host: String, emojis: List<CustomEmojiRecord>): List<CustomEmojiRecord> {\n        return mutex.withLock(host) {\n            customEmojiDAO.deleteByHost(host)\n            val inserted = emojis.chunked(500).map { chunkedEmojis ->\n                val ids = customEmojiDAO.insertAll(chunkedEmojis)\n                chunkedEmojis.mapIndexed { index, customEmojiRecord ->\n                    customEmojiRecord.copy(id = ids[index])\n                }\n            }.flatten()\n            inserted\n        }\n    }\n\n    private suspend fun insertAliases(emojiIds: List<Long>, aliases: List<List<String>>) {\n        assert(emojiIds.size == aliases.size) {\n            \"emojis.size != aliases.size\"\n        }\n        emojiIds.asSequence().mapIndexed { index, l ->\n            aliases[index].map {\n                CustomEmojiAliasRecord(\n                    name = it,\n                    emojiId = l\n                )\n            }\n        }.flatten().chunked(500).toList().map { chunkedAliases ->\n            customEmojiDAO.insertAliases(chunkedAliases)\n        }.flatten().toList()\n\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\n\n@Entity(\n    tableName = \"custom_emojis\",\n    indices = [\n        Index(value = [\"emojiHost\", \"name\"]),\n        Index(value = [\"emojiHost\"]),\n        Index(value = [\"name\"])\n    ]\n)\ndata class CustomEmojiRecord(\n    val name: String,\n    val emojiHost: String,\n    val url: String? = null,\n    val uri: String? = null,\n    val type: String? = null,\n    val serverId: String? = null,\n    val category: String? = null,\n    @PrimaryKey(autoGenerate = true) val id: Long = 0L,\n) {\n\n    companion object {\n        fun from(model: CustomEmoji, host: String, id: Long = 0L): CustomEmojiRecord {\n            return CustomEmojiRecord(\n                name = model.name,\n                emojiHost = host,\n                url = model.url,\n                uri = model.uri,\n                type = model.type,\n                serverId = model.id,\n                category = model.category,\n                id = id,\n            )\n        }\n    }\n\n\n    fun toModel(aspectRatio: Float? = null, cachePath: String? = null): CustomEmoji {\n        return CustomEmoji(\n            id = serverId,\n            name = name,\n            host = emojiHost,\n            url = url,\n            uri = uri,\n            type = type,\n            category = category,\n            aspectRatio = aspectRatio,\n            cachePath = cachePath,\n        )\n    }\n}\n\n@Entity(\n    tableName = \"custom_emoji_aliases\",\n    foreignKeys = [\n        ForeignKey(\n            entity = CustomEmojiRecord::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"emojiId\"],\n            onDelete = ForeignKey.CASCADE\n        )\n    ],\n    indices = [\n        Index(value = [\"emojiId\"]),\n        Index(value = [\"name\"]),\n    ],\n    primaryKeys = [\"name\", \"emojiId\"],\n)\ndata class CustomEmojiAliasRecord(\n    val name: String,\n    val emojiId: Long,\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/CustomEmojiRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.onStart\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.DefaultDispatcher\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioDataSource\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.EmojiWithAlias\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport javax.inject.Inject\n\ninternal class CustomEmojiRepositoryImpl @Inject constructor(\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val customEmojiApiAdapter: CustomEmojiApiAdapter,\n    private val customEmojiCache: CustomEmojiCache,\n    private val aspectRatioDataSource: CustomEmojiAspectRatioDataSource,\n    private val imageCacheRepository: ImageCacheRepository,\n    private val customEmojiDAO: CustomEmojiDAO,\n    private val customEmojiInserter: CustomEmojiInserter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n    @DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher,\n    memoryCacheCleaner: MemoryCacheCleaner,\n) : CustomEmojiRepository {\n\n    init {\n        memoryCacheCleaner.register(customEmojiCache)\n    }\n\n    override suspend fun findBy(host: String): Result<List<CustomEmoji>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val emojisInMemory = customEmojiCache.get(host)\n            if (emojisInMemory != null) {\n                return@withContext emojisInMemory\n            }\n\n            val converted = loadAndConvert(host)\n\n            customEmojiCache.put(host, converted)\n            converted\n        }\n    }\n\n    override suspend fun findByName(host: String, name: String): Result<List<CustomEmoji>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val dtoList = customEmojiDAO.findByHostAndName(host, name)\n            val aspects = aspectRatioDataSource.findIn(\n                dtoList.mapNotNull {\n                    it.url ?: it.uri\n                }\n            ).getOrElse { emptyList() }.associateBy {\n                it.uri\n            }\n            val fileCaches = imageCacheRepository.findBySourceUrls(dtoList.mapNotNull {\n                it.url ?: it.uri\n            }).getOrElse { emptyList() }.associateBy {\n                it.sourceUrl\n            }\n            dtoList.map {\n                it.toModel(\n                    aspects[it.url ?: it.uri]?.aspectRatio,\n                    fileCaches[it.url ?: it.uri]?.cachePath,\n                )\n\n            }\n        }\n    }\n\n    override suspend fun sync(host: String): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val nodeInfo = nodeInfoRepository.find(host).getOrThrow()\n            val remoteEmojis = fetch(nodeInfo).getOrThrow()\n            val aspects = aspectRatioDataSource.findIn(remoteEmojis.mapNotNull {\n                it.emoji.url ?: it.emoji.uri\n            }).getOrElse { emptyList() }.associateBy {\n                it.uri\n            }\n            val fileCaches = imageCacheRepository.findBySourceUrls(remoteEmojis.mapNotNull {\n                it.emoji.url ?: it.emoji.uri\n            }).getOrElse { emptyList() }.associateBy {\n                it.sourceUrl\n            }\n            val emojis = remoteEmojis.map {\n                it.emoji.copy(\n                    aspectRatio = aspects[it.emoji.url ?: it.emoji.uri]?.aspectRatio ?: it.emoji.aspectRatio,\n                    cachePath = fileCaches[it.emoji.url ?: it.emoji.uri]?.cachePath,\n                )\n            }\n\n            customEmojiCache.put(host, emojis)\n            customEmojiInserter.convertAndReplaceAll(\n                nodeInfo.host,\n                remoteEmojis,\n            )\n        }\n    }\n\n    override fun observeBy(host: String, withAliases: Boolean): Flow<List<CustomEmoji>> {\n        return customEmojiDAO.observeBy(host).map { list ->\n            convertToModel(list)\n        }.onEach {\n            if (!withAliases) {\n                customEmojiCache.put(host, it)\n            }\n        }.flowOn(ioDispatcher)\n    }\n\n    private suspend fun loadAndConvert(host: String): List<CustomEmoji> {\n        val nodeInfo = nodeInfoRepository.find(host).getOrThrow()\n\n        val emojis =  customEmojiDAO.findByHost(host).ifEmpty {\n            val remoteEmojis = fetch(nodeInfo).getOrThrow()\n            customEmojiInserter.convertAndReplaceAll(\n                host,\n                remoteEmojis,\n            )\n        }\n\n\n        val aspects = aspectRatioDataSource.findIn(emojis.mapNotNull {\n            it.url ?: it.uri\n        }).getOrElse { emptyList() }.associateBy {\n            it.uri\n        }\n        val fileCaches = imageCacheRepository.findBySourceUrls(emojis.mapNotNull {\n            it.url ?: it.uri\n        }).getOrElse { emptyList() }.associateBy {\n            it.sourceUrl\n        }\n\n        return emojis.map {\n            it.toModel(\n                aspectRatio = aspects[it.url ?: it.uri]?.aspectRatio,\n                cachePath = fileCaches[it.url ?: it.uri]?.cachePath,\n            )\n        }\n    }\n\n    private suspend fun fetch(nodeInfo: NodeInfo): Result<List<EmojiWithAlias>> = runCancellableCatching {\n        customEmojiApiAdapter.fetch(nodeInfo)\n    }\n\n    override fun get(host: String): List<CustomEmoji>? {\n        return customEmojiCache.get(host)\n    }\n\n    override suspend fun addEmojis(host: String, emojis: List<EmojiWithAlias>): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val ids = customEmojiDAO.insertAll(\n                emojis.map {\n                    CustomEmojiRecord.from(it.emoji, host)\n                }\n            )\n            insertAliases(ids, emojis.map {\n                it.aliases ?: emptyList()\n            })\n            // NOTE: inMemキャッシュなどを更新したい\n            findBy(host).getOrThrow()\n        }\n    }\n\n    override suspend fun deleteEmojis(host: String, emojis: List<CustomEmoji>): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            customEmojiDAO.deleteByHostAndNames(host, emojis.map { it.name })\n            // NOTE: inMemキャッシュなどを更新したい\n            findBy(host).getOrThrow()\n        }\n    }\n\n    override fun getAndConvertToMap(host: String): Map<String, CustomEmoji>? {\n        return customEmojiCache.getMap(host)\n    }\n\n    override suspend fun findAndConvertToMap(\n        host: String\n    ): Result<Map<String, CustomEmoji>> = runCancellableCatching{\n        val cached = customEmojiCache.getMap(host)\n        if (cached.isNullOrEmpty()) {\n\n            val converted = withContext(ioDispatcher) {\n                loadAndConvert(host)\n            }\n            customEmojiCache.put(host, converted)\n        } else {\n            cached\n        }\n    }\n\n    override fun observeWithSearch(host: String, keyword: String): Flow<List<CustomEmoji>> {\n        return customEmojiDAO.observeAndSearch(host, keyword).map { list ->\n            convertToModel(list)\n        }.flowOn(defaultDispatcher).onStart {\n            customEmojiCache.get(host)?.filter {\n                it.name.contains(keyword)\n            }?.let {\n                emit(it)\n            }\n        }\n    }\n\n    override suspend fun findByNames(host: String, names: List<String>): Result<List<CustomEmoji>>  = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val allEmojis = customEmojiCache.getMap(host)\n            val inMemEmojis = names.mapNotNull {\n                allEmojis?.get(it)\n            }\n            val records = customEmojiDAO.findByNames(host, names.filter {\n                allEmojis?.get(it) == null\n            })\n            val aspects = aspectRatioDataSource.findIn(records.mapNotNull {\n                it.url ?: it.uri\n            }).getOrElse { emptyList() }.associateBy {\n                it.uri\n            }\n            val fileCaches = imageCacheRepository.findBySourceUrls(records.mapNotNull {\n                it.url ?: it.uri\n            }).getOrElse { emptyList() }.associateBy {\n                it.sourceUrl\n            }\n            inMemEmojis + records.map { record ->\n                record.toModel(\n                    aspects[record.url ?: record.uri]?.aspectRatio,\n                    fileCaches[record.url ?: record.uri]?.cachePath,\n                )\n            }\n        }\n    }\n\n    override suspend fun search(host: String, keyword: String): Result<List<CustomEmoji>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            convertToModel(customEmojiDAO.search(host, keyword))\n        }\n    }\n\n    private suspend fun convertToModel(emojis: List<CustomEmojiRecord>): List<CustomEmoji> {\n        val aspects = aspectRatioDataSource.findIn(\n            emojis.mapNotNull {\n                it.url ?: it.uri\n            }\n        ).getOrElse { emptyList() }.associateBy {\n            it.uri\n        }\n        val fileCaches = imageCacheRepository.findBySourceUrls(emojis.mapNotNull {\n            it.url ?: it.uri\n        }).getOrElse { emptyList() }.associateBy {\n            it.sourceUrl\n        }\n        return emojis.map {\n            it.toModel(\n                aspects[it.url ?: it.uri]?.aspectRatio,\n                fileCaches[it.url ?: it.uri]?.cachePath,\n            )\n        }\n    }\n\n    private suspend fun insertAliases(emojiIds: List<Long>, aliases: List<List<String>>) {\n        assert(emojiIds.size == aliases.size) {\n            \"emojis.size != aliases.size\"\n        }\n        emojiIds.asSequence().mapIndexed { index, l ->\n            aliases[index].map {\n                CustomEmojiAliasRecord(\n                    name = it,\n                    emojiId = l\n                )\n            }\n        }.flatten().chunked(500).toList().map { chunkedAliases ->\n            customEmojiDAO.insertAliases(chunkedAliases)\n        }.flatten().toList()\n\n    }\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/EmojiEventHandlerImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.SupervisorJob\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.api_streaming.EmojiAdded\nimport net.pantasystem.milktea.api_streaming.EmojiDeleted\nimport net.pantasystem.milktea.api_streaming.EmojiUpdated\nimport net.pantasystem.milktea.api_streaming.SocketMessageEventListener\nimport net.pantasystem.milktea.api_streaming.StreamingEvent\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.EmojiEventHandler\nimport net.pantasystem.milktea.model.emoji.EmojiWithAlias\nimport net.pantasystem.milktea.model.instance.SyncMetaExecutor\nimport javax.inject.Inject\n\nclass EmojiEventHandlerImpl @Inject constructor(\n    private val socketProvider: SocketWithAccountProvider,\n    private val executor: SyncMetaExecutor,\n    private val customEmojiRepository: CustomEmojiRepository,\n    private val loggerFactory: Logger.Factory\n) : EmojiEventHandler, SocketMessageEventListener {\n\n    private var currentAccount: Account? = null\n    private val coroutineScope = CoroutineScope(SupervisorJob())\n    private val logger by lazy {\n        loggerFactory.create(\"EmojiEventHandlerImpl\")\n    }\n\n    override fun observe(account: Account?) {\n        synchronized(this) {\n            currentAccount?.let {\n                socketProvider.get(it)\n            }?.removeMessageEventListener(this)\n            if (account != null) {\n                socketProvider.get(account.accountId)?.addMessageEventListener(true, this)\n            }\n            currentAccount = account\n\n        }\n    }\n\n    override fun onMessage(e: StreamingEvent): Boolean {\n        return when(e) {\n            is EmojiAdded -> {\n                if (currentAccount != null) {\n                    executor.invoke(requireNotNull(currentAccount).normalizedInstanceUri)\n                }\n                true\n            }\n            is EmojiUpdated -> {\n                if (currentAccount != null) {\n                    coroutineScope.launch {\n                        customEmojiRepository.addEmojis(\n                            requireNotNull(currentAccount?.getHost()),\n                            e.body.emojis.map {\n                                EmojiWithAlias(\n                                    emoji = it.toModel(),\n                                    aliases = it.aliases ?: emptyList()\n                                )\n                            }\n                        ).onFailure {\n                            logger.error(\"addEmojis failed\", it)\n                        }\n                    }\n                }\n               true\n            }\n            is EmojiDeleted -> {\n                if (currentAccount != null) {\n                    coroutineScope.launch {\n                        customEmojiRepository.deleteEmojis(\n                            requireNotNull(currentAccount?.getHost()),\n                            e.body.emojis.map {\n                                it.toModel()\n                            }\n                        ).onFailure {\n                            logger.error(\"deleteEmojis failed\", it)\n                        }\n                    }\n                }\n                true\n            }\n            else -> {\n                false\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/UserEmojiConfigCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfig\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UserEmojiConfigCache @Inject constructor() {\n\n    private var cache = mutableMapOf<String, List<UserEmojiConfig>>()\n\n    fun put(instanceDomain: String, config: List<UserEmojiConfig>) {\n        synchronized(cache) {\n            cache[instanceDomain] = config\n        }\n    }\n\n    fun get(instanceDomain: String): List<UserEmojiConfig>? {\n        return cache[instanceDomain]\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/emoji/UserEmojiConfigRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.emoji\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSetting\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSettingDao\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfig\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfigRepository\nimport javax.inject.Inject\n\nclass UserEmojiConfigRepositoryImpl @Inject constructor(\n    val reactionUserSettingDao: ReactionUserSettingDao,\n    private val userEmojiConfigCache: UserEmojiConfigCache,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n): UserEmojiConfigRepository {\n\n    override suspend fun save(config: UserEmojiConfig): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            reactionUserSettingDao.insert(\n                ReactionUserSetting(\n                    reaction = config.reaction,\n                    instanceDomain = config.instanceDomain,\n                    weight = config.weight\n                )\n            )\n            userEmojiConfigCache.put(config.instanceDomain, findByInstanceDomain(instanceDomain = config.instanceDomain))\n        }\n    }\n\n    override suspend fun saveAll(configs: List<UserEmojiConfig>): Result<Unit> = runCancellableCatching{\n        withContext(ioDispatcher) {\n            reactionUserSettingDao.insertAll(configs.map {\n                ReactionUserSetting(\n                    reaction = it.reaction,\n                    instanceDomain = it.instanceDomain,\n                    weight = it.weight\n                )\n            })\n            val domains = configs.map {\n                it.instanceDomain\n            }.distinct()\n            domains.map {\n                userEmojiConfigCache.put(it, findByInstanceDomain(it))\n            }\n        }\n    }\n\n    override suspend fun findByInstanceDomain(instanceDomain: String): List<UserEmojiConfig> {\n        return withContext(ioDispatcher) {\n            reactionUserSettingDao.findByInstanceDomain(instanceDomain)?.map {\n                UserEmojiConfig(\n                    reaction = it.reaction,\n                    instanceDomain = it.instanceDomain,\n                    weight = it.weight\n                )\n            } ?: emptyList()\n        }.also {\n            userEmojiConfigCache.put(instanceDomain, it)\n        }\n    }\n\n    override suspend fun deleteAll(settings: List<UserEmojiConfig>): Result<Unit> = runCancellableCatching {\n        reactionUserSettingDao.deleteAll(settings.map {\n            ReactionUserSetting(\n                reaction = it.reaction,\n                instanceDomain = it.instanceDomain,\n                weight = it.weight\n            )\n        })\n        val domains = settings.map {\n            it.instanceDomain\n        }.distinct()\n        domains.map {\n            userEmojiConfigCache.put(it, findByInstanceDomain(it))\n        }\n    }\n\n    override suspend fun delete(setting: UserEmojiConfig): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            reactionUserSettingDao.delete(ReactionUserSetting(\n                reaction = setting.reaction,\n                instanceDomain = setting.instanceDomain,\n                weight = setting.weight\n            ))\n        }\n        userEmojiConfigCache.put(setting.instanceDomain, findByInstanceDomain(setting.instanceDomain))\n    }\n\n    override fun observeByInstanceDomain(instanceDomain: String): Flow<List<UserEmojiConfig>> {\n        return reactionUserSettingDao.observeByInstanceDomain(instanceDomain).map { settings ->\n            settings.map {\n                UserEmojiConfig(\n                    reaction = it.reaction,\n                    instanceDomain = it.instanceDomain,\n                    weight = it.weight\n                )\n            }\n        }.onEach {\n            userEmojiConfigCache.put(instanceDomain, it)\n        }.onStart {\n            userEmojiConfigCache.get(instanceDomain)?.let {\n                emit(it)\n            }\n        }.flowOn(ioDispatcher)\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/file/CopyFileToAppDirRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.file\n\nimport android.content.Context\nimport android.net.Uri\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Hash\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.CopyFileToAppDirRepository\nimport java.io.File\nimport javax.inject.Inject\n\nclass CopyFileToAppDirRepositoryImpl @Inject constructor(\n    @ApplicationContext private val context: Context,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n): CopyFileToAppDirRepository {\n\n    companion object {\n        const val USER_FILE_DIR = \"user_files\"\n    }\n\n    override suspend fun copyFileToAppDir(uri: Uri): Result<AppFile.Local> = runCancellableCatching{\n        withContext(ioDispatcher) {\n            val localFile = uri.toAppFile(context)\n//            val appDir = context.filesDir ?: throw IllegalStateException(\"アプリディレクトリの取得に失敗\")\n//            val pathHash = Hash.sha256(localFile.path)\n//            val copyTo = File(appDir, USER_FILE_DIR).apply {\n//                if (!exists()) {\n//                    mkdirs()\n//                }\n//            }.resolve(pathHash)\n//            context.contentResolver.openInputStream(uri)?.use { inputStream ->\n//                copyTo.outputStream().use { outputStream ->\n//                    inputStream.copyTo(outputStream)\n//                }\n//            } ?: throw IllegalStateException(\"ファイルのコピーに失敗\")\n//            localFile.copy(path = copyTo.path).also {\n//                Log.d(\"CopyFileToAppDir\", \"copyTo: $copyTo\")\n//            }\n            return@withContext localFile\n        }\n    }\n\n    override suspend fun exists(uri: Uri): Boolean {\n        val localFile = uri.toAppFile(context)\n        val appDir = context.filesDir ?: throw IllegalStateException(\"アプリディレクトリの取得に失敗\")\n        val pathHash = Hash.sha256(localFile.path)\n        val copyTo = File(appDir, USER_FILE_DIR).apply {\n            if (!exists()) {\n                mkdirs()\n            }\n        }.resolve(pathHash)\n        return copyTo.exists()\n    }\n\n    override suspend fun delete(appFile: AppFile.Local): Boolean {\n        val appDir = context.filesDir ?: throw IllegalStateException(\"アプリディレクトリの取得に失敗\")\n        val copyToDir = File(appDir, USER_FILE_DIR).apply {\n            if (!exists()) {\n                mkdirs()\n            }\n        }\n\n        val file = File(appFile.path)\n        // fileがappDir以下にあるかどうかを確認\n        if (!file.absolutePath.startsWith(copyToDir.absolutePath)) {\n            // ない場合はユーザディレクトリの可能性があるので削除しない\n            return false\n        }\n\n        return file.delete()\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/file/UriToAppFileUseCaseImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.file\n\nimport android.content.Context\nimport android.net.Uri\nimport android.provider.MediaStore\nimport android.provider.OpenableColumns\nimport android.util.Log\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.UriToAppFileUseCase\nimport javax.inject.Inject\n\nclass UriToAppFileUseCaseImpl @Inject constructor(\n    @ApplicationContext private val context: Context\n) : UriToAppFileUseCase {\n    override operator fun invoke(uri: Uri): AppFile.Local {\n        return uri.toAppFile(context)\n    }\n\n}\n\n\ninternal fun Uri.toAppFile(context: Context): AppFile.Local {\n    val fileName = try {\n        context.getFileName(this)\n    } catch (e: Exception) {\n        Log.d(\"FileUtils\", \"ファイル名の取得に失敗しました\", e)\n        null\n    }\n\n    val mimeType = context.contentResolver.getType(this)\n\n    val isMedia = mimeType?.startsWith(\"image\") ?: false || mimeType?.startsWith(\"video\") ?: false\n    val thumbnail = if (isMedia) this.toString() else null\n    val fileSize = getFileSize(context)\n    return AppFile.Local(\n        fileName ?: \"name none\",\n        path = this.toString(),\n        type = mimeType ?: \"\",\n        thumbnailUrl = thumbnail,\n        isSensitive = false,\n        folderId = null,\n        fileSize = fileSize,\n        comment = null,\n    )\n}\n\nfun Uri.getFileSize(context: Context): Long {\n    var fileSize: Long = -1\n    context.contentResolver.query(this, null, null, null, null)?.use { cursor ->\n        if (cursor.moveToFirst()) {\n            fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(OpenableColumns.SIZE))\n        }\n    }\n    return fileSize\n}\n\n\nprivate fun Context.getFileName(uri: Uri): String {\n    return when (uri.scheme) {\n        \"content\" -> {\n            this.contentResolver\n                .query(uri, arrayOf(MediaStore.MediaColumns.DISPLAY_NAME), null, null, null)?.use {\n                    if (it.moveToFirst()) {\n                        val index = it.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)\n                        if (index != -1) {\n                            it.getString(index)\n                        } else {\n                            null\n                        }\n                    } else {\n                        null\n                    }\n                } ?: throw IllegalArgumentException(\"ファイル名の取得に失敗しました\")\n        }\n        \"file\" -> {\n            java.io.File(uri.path!!).name\n        }\n        else -> throw IllegalArgumentException(\"scheme不明\")\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/filter/MastodonWordFilterCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.filter\n\nimport net.pantasystem.milktea.model.filter.MastodonWordFilter\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MastodonWordFilterCache @Inject constructor() {\n\n    private var map = mutableMapOf<Long, List<MastodonWordFilter>>()\n\n    fun put(accountId: Long, filters: List<MastodonWordFilter>) {\n        synchronized(this) {\n            map[accountId] = filters\n        }\n    }\n\n    fun get(accountId: Long): List<MastodonWordFilter>? {\n        return map[accountId]\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/filter/MastodonWordFilterRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.filter\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.filter.db.MastodonFilterDao\nimport net.pantasystem.milktea.data.infrastructure.filter.db.MastodonWordFilterRecord\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.filter.MastodonWordFilter\nimport net.pantasystem.milktea.model.filter.MastodonWordFilterRepository\nimport javax.inject.Inject\n\nclass MastodonWordFilterRepositoryImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val mastodonWordFilterCache: MastodonWordFilterCache,\n    private val mastodonWordFilterDao: MastodonFilterDao,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : MastodonWordFilterRepository {\n    override suspend fun sync(accountId: Long): Result<Unit> = runCancellableCatching{\n        fetchAndUpdate(accountId)\n    }\n\n    override suspend fun findAll(accountId: Long): Result<List<MastodonWordFilter>> = runCancellableCatching{\n        withContext(ioDispatcher) {\n            val inCache = mastodonWordFilterCache.get(accountId)\n            if (inCache != null) {\n                return@withContext inCache\n            }\n            val inDb = mastodonWordFilterDao.findByAccount(accountId).map {\n                it.toModel()\n            }\n            if (inDb.isNotEmpty()) {\n                mastodonWordFilterCache.put(accountId, inDb)\n                return@withContext inDb\n            }\n            fetchAndUpdate(accountId)\n        }\n    }\n\n    override suspend fun observeAll(accountId: Long): Flow<List<MastodonWordFilter>> {\n        return mastodonWordFilterDao.observeByAccount(accountId).map { list ->\n            list.map {\n                it.toModel()\n            }\n        }.flowOn(ioDispatcher).onEach {\n            mastodonWordFilterCache.put(accountId, it)\n        }\n    }\n\n    private suspend fun fetchAndUpdate(accountId: Long): List<MastodonWordFilter> {\n        val account = accountRepository.get(accountId).getOrThrow()\n        require(account.instanceType == Account.InstanceType.MASTODON) {\n            \"アカウントの種別はmastodonである必要性があります。account:$account\"\n        }\n        val body = mastodonAPIProvider.get(account).getFilters()\n            .throwIfHasError()\n            .body()\n        val remoteRes = requireNotNull(body).map {\n            it.toModel(account)\n        }\n        mastodonWordFilterCache.put(accountId, remoteRes)\n        mastodonWordFilterDao.deleteByAccount(accountId)\n        mastodonWordFilterDao.insertAll(\n            remoteRes.map {\n                MastodonWordFilterRecord.from(it)\n            }\n        )\n        return remoteRes\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/filter/db/MastodonFilterDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.filter.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface MastodonFilterDao {\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertAll(filters: List<MastodonWordFilterRecord>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insert(filter: MastodonWordFilterRecord): Long\n\n    @Query(\"\"\"\n        select * from mastodon_word_filters_v1 where accountId = :accountId\n    \"\"\")\n    suspend fun findByAccount(accountId: Long): List<MastodonWordFilterRecord>\n\n    @Query(\"\"\"\n        select * from mastodon_word_filters_v1 where accountId = :accountId\n    \"\"\")\n    fun observeByAccount(accountId: Long): Flow<List<MastodonWordFilterRecord>>\n\n    @Query(\"\"\"\n       delete from mastodon_word_filters_v1 where accountId = :accountId\n    \"\"\")\n    suspend fun deleteByAccount(accountId: Long)\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/filter/db/MastodonWordFilterRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.filter.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.filter.MastodonWordFilter\n\n@Entity(\n    tableName = \"mastodon_word_filters_v1\",\n    primaryKeys = [\"accountId\", \"filterId\"]\n)\ndata class MastodonWordFilterRecord(\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"filterId\")\n    val filterId: String,\n\n    @ColumnInfo(name = \"phrase\")\n    val phrase: String,\n\n    @ColumnInfo(name = \"wholeWord\")\n    val wholeWord: Boolean,\n\n    @ColumnInfo(name = \"expiresAt\")\n    val expiresAt: Instant?,\n\n    @ColumnInfo(name = \"irreversible\")\n    val irreversible: Boolean,\n\n    @ColumnInfo(name = \"isContextHome\")\n    val isContextHome: Boolean,\n\n    @ColumnInfo(name = \"isContextNotifications\")\n    val isContextNotifications: Boolean,\n\n    @ColumnInfo(name = \"isContextPublic\")\n    val isContextPublic: Boolean,\n\n    @ColumnInfo(name = \"isContextThread\")\n    val isContextThread: Boolean,\n\n    @ColumnInfo(name = \"isContextAccount\")\n    val isContextAccount: Boolean,\n) {\n\n    fun toModel(): MastodonWordFilter {\n        return MastodonWordFilter(\n            MastodonWordFilter.Id(accountId, filterId),\n            phrase = phrase,\n            wholeWord = wholeWord,\n            expiresAt = expiresAt,\n            irreversible = irreversible,\n            context = listOfNotNull(\n                if (isContextHome) MastodonWordFilter.FilterContext.Home else null,\n                if (isContextNotifications) MastodonWordFilter.FilterContext.Notifications else null,\n                if (isContextPublic) MastodonWordFilter.FilterContext.Public else null,\n                if (isContextThread) MastodonWordFilter.FilterContext.Thread else null,\n                if (isContextAccount) MastodonWordFilter.FilterContext.Account else null,\n            )\n        )\n    }\n\n    companion object {\n        fun from(model: MastodonWordFilter): MastodonWordFilterRecord {\n            return MastodonWordFilterRecord(\n                model.id.accountId,\n                model.id.filterId,\n                phrase = model.phrase,\n                wholeWord = model.wholeWord,\n                expiresAt = model.expiresAt,\n                irreversible = model.irreversible,\n                isContextAccount = model.context.any {\n                    it == MastodonWordFilter.FilterContext.Account\n                },\n                isContextHome = model.context.any {\n                    it == MastodonWordFilter.FilterContext.Home\n                },\n                isContextNotifications = model.context.any {\n                    it == MastodonWordFilter.FilterContext.Notifications\n                },\n                isContextPublic = model.context.any {\n                    it == MastodonWordFilter.FilterContext.Public\n                },\n                isContextThread = model.context.any {\n                    it == MastodonWordFilter.FilterContext.Thread\n                }\n            )\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/gallery/GalleryRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.gallery\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.MisskeyAPI\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Delete\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Like\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Show\nimport net.pantasystem.milktea.api.misskey.v12_75_0.UnLike\nimport net.pantasystem.milktea.api.misskey.v12_75_0.Update\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.GalleryPostDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.drive.FileUploaderProvider\nimport net.pantasystem.milktea.data.infrastructure.drive.UploadSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.gallery.CreateGalleryPost\nimport net.pantasystem.milktea.model.gallery.GalleryDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryNotFoundException\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.gallery.GalleryRepository\nimport net.pantasystem.milktea.model.gallery.UpdateGalleryPost\nimport javax.inject.Inject\nimport net.pantasystem.milktea.api.misskey.v12_75_0.CreateGallery as CreateGalleryDTO\n\n\nclass GalleryRepositoryImpl @Inject constructor(\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val galleryDataSource: GalleryDataSource,\n    private val fileUploaderProvider: FileUploaderProvider,\n    private val accountRepository: AccountRepository,\n    private val galleryPostDTOEntityConverter: GalleryPostDTOEntityConverter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : GalleryRepository {\n\n\n    override suspend fun create(createGalleryPost: CreateGalleryPost): GalleryPost {\n        return withContext(ioDispatcher) {\n            val files = coroutineScope {\n                createGalleryPost.files.map {\n                    async {\n                        when (it) {\n                            is AppFile.Remote -> it.id\n                            is AppFile.Local -> {\n                                fileUploaderProvider.get(createGalleryPost.author)\n                                    .upload(UploadSource.LocalFile(it), true).id\n                            }\n                        }\n                    }\n                }.awaitAll()\n            }\n\n            val created = getMisskeyAPI(createGalleryPost.author).createGallery(\n                CreateGalleryDTO(\n                    createGalleryPost.author.token,\n                    createGalleryPost.title,\n                    createGalleryPost.description,\n                    fileIds = files.map {\n                        it.fileId\n                    },\n                    isSensitive = createGalleryPost.isSensitive\n                )\n            ).throwIfHasError().body()\n            requireNotNull(created)\n\n            val gallery = galleryPostDTOEntityConverter.convert(created, createGalleryPost.author)\n            galleryDataSource.add(gallery)\n            gallery\n        }\n    }\n\n    override suspend fun delete(id: GalleryPost.Id) {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(id.accountId).getOrThrow()\n            val res = getMisskeyAPI(account).deleteGallery(\n                Delete(\n                    i = account.token,\n                    postId = id.galleryId\n                )\n            ).throwIfHasError()\n            require(res.isSuccessful)\n        }\n    }\n\n    override suspend fun find(id: GalleryPost.Id): GalleryPost {\n        return withContext(ioDispatcher) {\n            try {\n                return@withContext galleryDataSource.find(id).getOrThrow()\n            } catch (_: GalleryNotFoundException) {\n\n            }\n            val account = accountRepository.get(id.accountId).getOrThrow()\n            val res = getMisskeyAPI(account).showGallery(\n                Show(\n                    i = account.token,\n                    postId = id.galleryId\n                )\n            ).throwIfHasError()\n            val body = res.body()\n            requireNotNull(body)\n            val gallery = galleryPostDTOEntityConverter.convert(body, account)\n            galleryDataSource.add(gallery)\n            gallery\n        }\n    }\n\n    override suspend fun like(id: GalleryPost.Id) {\n        withContext(ioDispatcher) {\n            val gallery = find(id) as? GalleryPost.Authenticated\n                ?: throw UnauthorizedException()\n            val account = accountRepository.get(id.accountId).getOrThrow()\n            getMisskeyAPI(account).likeGallery(\n                Like(\n                    i = account.token,\n                    postId = id.galleryId\n                )\n            ).throwIfHasError()\n            galleryDataSource.add(gallery.copy(isLiked = true))\n        }\n    }\n\n    override suspend fun unlike(id: GalleryPost.Id) {\n        withContext(ioDispatcher) {\n            val gallery = find(id) as? GalleryPost.Authenticated\n                ?: throw UnauthorizedException()\n            val account = accountRepository.get(id.accountId).getOrThrow()\n            getMisskeyAPI(account).unlikeGallery(\n                UnLike(\n                    i = account.token,\n                    postId = id.galleryId\n                )\n            ).throwIfHasError()\n            galleryDataSource.add(gallery.copy(isLiked = false))\n        }\n    }\n\n    override suspend fun update(updateGalleryPost: UpdateGalleryPost): GalleryPost {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(updateGalleryPost.id.accountId).getOrThrow()\n            val files = coroutineScope {\n                updateGalleryPost.files.map {\n                    async {\n                        when (it) {\n                            is AppFile.Remote -> it.id\n                            is AppFile.Local -> {\n                                fileUploaderProvider.get(account)\n                                    .upload(UploadSource.LocalFile(it), true).id\n                            }\n                        }\n                    }\n                }.awaitAll()\n            }\n            val body = getMisskeyAPI(account).updateGallery(\n                Update(\n                    i = account.token,\n                    postId = updateGalleryPost.id.galleryId,\n                    description = updateGalleryPost.description,\n                    title = updateGalleryPost.title,\n                    fileIds = files.map { it.fileId },\n                    isSensitive = updateGalleryPost.isSensitive\n                )\n            ).throwIfHasError().body()\n            requireNotNull(body)\n            val gallery = galleryPostDTOEntityConverter.convert(body, account)\n            galleryDataSource.add(gallery)\n            gallery\n        }\n    }\n\n    private fun getMisskeyAPI(account: Account): MisskeyAPI {\n        return misskeyAPIProvider.get(account.normalizedInstanceUri)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/gallery/InMemoryGalleryDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.gallery\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.gallery.GalleryDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryNotFoundException\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport javax.inject.Inject\n\nclass InMemoryGalleryDataSource @Inject constructor(): GalleryDataSource {\n\n    private val galleryEvents = MutableSharedFlow<GalleryDataSource.Event>(extraBufferCapacity = 1000)\n    override fun events(): Flow<GalleryDataSource.Event> {\n        return galleryEvents\n    }\n\n    private var galleries = mapOf<GalleryPost.Id, GalleryPost>()\n        set(value) {\n            field = value\n            _state.value = value\n        }\n        get() {\n            return state.value\n        }\n    private val lock = Mutex()\n\n    private val _state = MutableStateFlow<Map<GalleryPost.Id, GalleryPost>>(emptyMap())\n\n    override val state: StateFlow<Map<GalleryPost.Id, GalleryPost>> = _state\n\n    override suspend fun add(galleryPost: GalleryPost): Result<AddResult> = runCancellableCatching {\n        val result = lock.withLock {\n            val map = galleries.toMutableMap()\n            if(galleries[galleryPost.id] == null){\n                map[galleryPost.id] = galleryPost\n                galleries = map\n                AddResult.Created\n            }else{\n                map[galleryPost.id] = galleryPost\n                galleries = map\n                AddResult.Updated\n            }\n        }\n        if(result == AddResult.Created) {\n            galleryEvents.tryEmit(GalleryDataSource.Event.Created(galleryPost.id, galleryPost))\n        }else if(result == AddResult.Updated) {\n            galleryEvents.tryEmit(GalleryDataSource.Event.Updated(galleryPost.id, galleryPost))\n        }\n        result\n    }\n\n    override suspend fun addAll(posts: List<GalleryPost>): Result<List<AddResult>> {\n        return Result.success(\n            posts.map {\n                add(it).getOrElse {\n                    AddResult.Canceled\n                }\n            }\n        )\n    }\n\n\n\n    override suspend fun find(galleryPostId: GalleryPost.Id): Result<GalleryPost> = runCancellableCatching {\n        galleries[galleryPostId] ?: throw GalleryNotFoundException(galleryPostId)\n    }\n\n    override suspend fun remove(galleryPostId: GalleryPost.Id): Result<Boolean> = runCancellableCatching {\n        val result = lock.withLock {\n            val map = galleries.toMutableMap()\n            map.remove(galleryPostId) != null\n        }\n        galleryEvents.tryEmit(GalleryDataSource.Event.Deleted(galleryPostId))\n        result\n    }\n\n    override suspend fun findAll(): Result<List<GalleryPost>> = runCancellableCatching {\n        galleries.values.toList()\n    }\n\n    override suspend fun filterByAccountId(accountId: Long): Result<List<GalleryPost>> = runCancellableCatching {\n        findAll().getOrThrow().filter {\n            it.id.accountId == accountId\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/gallery/MediatorGalleryPostPaginator.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.gallery\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.app_store.gallery.GalleryPostsStore\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.FuturePagingController\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.GalleryPostDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\n\n\nclass GalleryPostsStoreImpl(\n    pageable: Pageable.Gallery,\n    getAccount: suspend () -> Account,\n    misskeyAPIProvider: MisskeyAPIProvider,\n    galleryDataSource: GalleryDataSource,\n    galleryPostDTOEntityConverter: GalleryPostDTOEntityConverter,\n) : GalleryPostsStore {\n\n    class Factory @Inject constructor(\n        val misskeyAPIProvider: MisskeyAPIProvider,\n        val filePropertyDataSource: FilePropertyDataSource,\n        val userDataSource: UserDataSource,\n        val galleryDataSource: GalleryDataSource,\n        val userDTOEntityConverter: UserDTOEntityConverter,\n        val galleryPostDTOEntityConverter: GalleryPostDTOEntityConverter,\n    ) : GalleryPostsStore.Factory {\n        override fun create(\n            pageable: Pageable.Gallery,\n            getAccount: suspend () -> Account,\n        ): GalleryPostsStore {\n            return if (pageable is Pageable.Gallery.ILikedPosts) {\n                LikedGalleryPostStoreImpl(\n                    getAccount,\n                    misskeyAPIProvider,\n                    galleryDataSource,\n                    galleryPostDTOEntityConverter\n                )\n            } else {\n                GalleryPostsStoreImpl(\n                    pageable,\n                    getAccount,\n                    misskeyAPIProvider,\n                    galleryDataSource,\n                    galleryPostDTOEntityConverter,\n                )\n            }\n        }\n    }\n\n\n    override val mutex: Mutex = Mutex()\n\n    private val galleryPostState = GalleryPostsState()\n    private val entityAdder =\n        GalleryPostsConverter(\n            getAccount,\n            galleryPostDTOEntityConverter,\n            galleryDataSource = galleryDataSource,\n        )\n    private val loader = GalleryPostsLoader(pageable, galleryPostState, misskeyAPIProvider, getAccount)\n    private val previousPagingController =\n        PreviousPagingController(entityAdder, this, galleryPostState, loader)\n    private val futurePaginatorController =\n        FuturePagingController(entityAdder, this, galleryPostState, loader)\n\n    override suspend fun loadPrevious(): Result<Int> {\n        return previousPagingController.loadPrevious()\n    }\n\n    override suspend fun loadFuture(): Result<Int> {\n        return futurePaginatorController.loadFuture()\n    }\n\n    override suspend fun clear() {\n        mutex.withLock {\n            galleryPostState.setState(PageableState.Fixed(StateContent.NotExist()))\n        }\n    }\n\n    override val state: Flow<PageableState<List<GalleryPost.Id>>> = galleryPostState.getFlow()\n}\n\nclass LikedGalleryPostStoreImpl(\n    getAccount: suspend () -> Account,\n    misskeyAPIProvider: MisskeyAPIProvider,\n    galleryDataSource: GalleryDataSource,\n    galleryPostDTOEntityConverter: GalleryPostDTOEntityConverter,\n) : GalleryPostsStore {\n\n    override val mutex: Mutex = Mutex()\n\n    private val galleryPostState = LikedGalleryPostsState()\n    private val entityAdder = LikedGalleryPostsConverter(\n        getAccount,\n        galleryDataSource,\n        galleryPostDTOEntityConverter = galleryPostDTOEntityConverter,\n    )\n    private val loader =\n        LikedGalleryPostsLoader(galleryPostState, misskeyAPIProvider, getAccount)\n    private val previousPagingController =\n        PreviousPagingController(entityAdder, this, galleryPostState, loader)\n    private val futurePaginatorController =\n        FuturePagingController(entityAdder, this, galleryPostState, loader)\n\n    override suspend fun loadPrevious(): Result<Int> {\n        return previousPagingController.loadPrevious()\n    }\n\n    override suspend fun loadFuture(): Result<Int> {\n        return futurePaginatorController.loadFuture()\n    }\n\n    override suspend fun clear() {\n        mutex.withLock {\n            galleryPostState.setState(PageableState.Fixed(StateContent.NotExist()))\n        }\n    }\n\n    override val state: Flow<PageableState<List<GalleryPost.Id>>> = galleryPostState.getFlow()\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/gallery/gallery_posts_paginators.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.gallery\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.update\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.v12_75_0.GetPosts\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.*\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.GalleryPostDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.gallery.GalleryDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport retrofit2.Response\nimport net.pantasystem.milktea.api.misskey.v12_75_0.GalleryPost as GalleryPostDTO\n\n\ninterface GetGalleryPostsStateFlow {\n    fun getFlow(): Flow<PageableState<List<GalleryPost.Id>>>\n}\n\n/**\n * EntityはDataSourceが保持しているので、ここではタイムラインの順番を保持する\n */\nclass GalleryPostsState : PaginationState<GalleryPost.Id>, IdGetter<String>,\n    GetGalleryPostsStateFlow {\n\n    private val _state = MutableStateFlow<PageableState<List<GalleryPost.Id>>>(\n        PageableState.Fixed(\n            StateContent.NotExist()\n        )\n    )\n    override val state: Flow<PageableState<List<GalleryPost.Id>>> = _state\n\n    override fun getFlow(): Flow<PageableState<List<GalleryPost.Id>>> {\n        return state\n    }\n\n    private fun getList(): List<GalleryPost.Id> {\n        return (_state.value.content as? StateContent.Exist)?.rawContent ?: emptyList()\n    }\n\n    override suspend fun getSinceId(): String? {\n        return getList().firstOrNull()?.galleryId\n    }\n\n    override suspend fun getUntilId(): String? {\n        return getList().lastOrNull()?.galleryId\n    }\n\n    override fun getState(): PageableState<List<GalleryPost.Id>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<GalleryPost.Id>>) {\n        _state.update {\n            state\n        }\n    }\n}\n\nclass GalleryPostsConverter(\n    private val getAccount: suspend () -> Account,\n    private val galleryPostDTOEntityConverter: GalleryPostDTOEntityConverter,\n    private val galleryDataSource: GalleryDataSource,\n) : EntityConverter<GalleryPostDTO, GalleryPost.Id> {\n\n    override suspend fun convertAll(list: List<GalleryPostDTO>): List<GalleryPost.Id> {\n        val posts = list.map {\n            galleryPostDTOEntityConverter.convert(it, getAccount.invoke())\n        }\n        galleryDataSource.addAll(posts)\n        return posts.map {\n            it.id\n        }\n    }\n}\n\nclass GalleryPostsLoader(\n    private val pageable: Pageable.Gallery,\n    private val idGetter: IdGetter<String>,\n    private val apiProvider: MisskeyAPIProvider,\n    private val getAccount: suspend () -> Account,\n) : FutureLoader<GalleryPostDTO>, PreviousLoader<GalleryPostDTO> {\n    init {\n        if (pageable is Pageable.Gallery.ILikedPosts) {\n            throw IllegalArgumentException(\"${pageable::class.simpleName}は対応していません。\")\n        }\n    }\n\n    override suspend fun loadFuture(): Result<List<GalleryPostDTO>> {\n        return runCancellableCatching {\n            api(untilId = idGetter.getSinceId()).invoke().throwIfHasError().body()!!\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<List<GalleryPostDTO>> {\n        return runCancellableCatching {\n            api(untilId = idGetter.getUntilId()).invoke().throwIfHasError().body()!!\n        }\n    }\n\n\n    suspend fun api(\n        sinceId: String? = null,\n        untilId: String? = null\n    ): suspend () -> Response<List<GalleryPostDTO>> {\n        val i = getAccount.invoke().token\n        val api = apiProvider.get(getAccount.invoke().normalizedInstanceUri)\n        when (pageable) {\n            is Pageable.Gallery.MyPosts -> {\n                return {\n                    api.myGalleryPosts(\n                        GetPosts(\n                            i,\n                            sinceId = sinceId,\n                            untilId = untilId,\n                            limit = 20,\n                        )\n                    )\n                }\n            }\n            is Pageable.Gallery.ILikedPosts -> {\n                throw IllegalStateException()\n            }\n            is Pageable.Gallery.User -> {\n                return {\n                    api.userPosts(\n                        GetPosts(\n                            i,\n                            sinceId = sinceId,\n                            untilId = untilId,\n                            limit = 20,\n                            userId = pageable.userId\n                        )\n                    )\n                }\n            }\n            is Pageable.Gallery.Posts -> {\n                return {\n                    api.galleryPosts(GetPosts(i, sinceId = sinceId, untilId = untilId, limit = 20))\n                }\n            }\n            is Pageable.Gallery.Featured -> {\n                return {\n                    api.featuredGalleries(I(i))\n                }\n            }\n            is Pageable.Gallery.Popular -> {\n                return {\n                    api.popularGalleries(I(i))\n                }\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/gallery/liked_gallery_posts_paginator.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.gallery\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.map\nimport net.pantasystem.milktea.api.misskey.v12_75_0.GetPosts\nimport net.pantasystem.milktea.api.misskey.v12_75_0.LikedGalleryPost\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.FutureLoader\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.GalleryPostDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.gallery.GalleryDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryPost\n\ndata class LikedGalleryPostId(\n    val id: String,\n    val postId: GalleryPost.Id\n)\n\nclass LikedGalleryPostsState : PaginationState<LikedGalleryPostId>, IdGetter<String>,\n    GetGalleryPostsStateFlow {\n\n    private val _state = MutableStateFlow<PageableState<List<LikedGalleryPostId>>>(\n        PageableState.Fixed(\n            StateContent.NotExist()\n        )\n    )\n\n    override fun getFlow(): Flow<PageableState<List<GalleryPost.Id>>> {\n        return _state.map {\n            it.convert { list ->\n                list.map { liked ->\n                    liked.postId\n                }\n            }\n\n        }\n    }\n\n\n    private fun getList(): List<LikedGalleryPostId> {\n        return (_state.value.content as? StateContent.Exist)?.rawContent ?: emptyList()\n    }\n\n    override suspend fun getSinceId(): String? {\n        return getList().firstOrNull()?.id\n    }\n\n    override suspend fun getUntilId(): String? {\n        return getList().lastOrNull()?.id\n    }\n\n\n    override val state: Flow<PageableState<List<LikedGalleryPostId>>> = _state\n\n    override fun getState(): PageableState<List<LikedGalleryPostId>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<LikedGalleryPostId>>) {\n        this._state.value = state\n    }\n}\n\nclass LikedGalleryPostsConverter(\n    private val getAccount: suspend () -> Account,\n    private val galleryDataSource: GalleryDataSource,\n    private val galleryPostDTOEntityConverter: GalleryPostDTOEntityConverter\n) : EntityConverter<LikedGalleryPost, LikedGalleryPostId> {\n\n    override suspend fun convertAll(list: List<LikedGalleryPost>): List<LikedGalleryPostId> {\n        val account = getAccount.invoke()\n        return list.map {\n            LikedGalleryPostId(\n                it.id,\n                galleryPostDTOEntityConverter.convert(it.post, account).also { post ->\n                    galleryDataSource.add(post)\n                }.id\n            )\n        }\n    }\n}\n\nclass LikedGalleryPostsLoader(\n    private val idGetter: IdGetter<String>,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val getAccount: suspend () -> Account,\n) : FutureLoader<LikedGalleryPost>, PreviousLoader<LikedGalleryPost> {\n\n    override suspend fun loadFuture(): Result<List<LikedGalleryPost>> {\n        return runCancellableCatching {\n            val api = misskeyAPIProvider.get(getAccount.invoke().normalizedInstanceUri)\n            api.likedGalleryPosts(\n                GetPosts(\n                    sinceId = idGetter.getSinceId(),\n                    i = getAccount.invoke().token\n                )\n            ).throwIfHasError().body()!!\n        }\n\n    }\n\n    override suspend fun loadPrevious(): Result<List<LikedGalleryPost>> {\n        return runCancellableCatching {\n            val api =\n                misskeyAPIProvider.get(getAccount.invoke().normalizedInstanceUri)\n            api.likedGalleryPosts(\n                GetPosts(\n                    untilId = idGetter.getUntilId(),\n                    i = getAccount.invoke().token\n                )\n            ).throwIfHasError().body()!!\n        }\n\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/group/GroupDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.group\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface GroupDao {\n\n    @Insert\n    suspend fun insert(group: GroupRecord): Long\n\n    @Update\n    suspend fun update(group: GroupRecord)\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertUserIds(members: List<GroupMemberIdRecord>): List<Long>\n\n    @Delete\n    suspend fun deleteMember(member: GroupMemberIdRecord)\n\n    @Delete\n    suspend fun delete(group: GroupRecord)\n\n    @Query(\"delete from group_v1 where accountId = :accountId and serverId = :serverId\")\n    suspend fun delete(accountId: Long, serverId: String)\n\n    @Query(\"delete from group_v1 where accountId = :accountId\")\n    suspend fun clearByAccountId(accountId: Long)\n\n    @Query(\"delete from group_member_v1 where groupId = :groupId\")\n    suspend fun detachMembers(groupId: Long)\n\n\n    @Query(\n        \"\"\"\n        select * from group_v1 where exists (\n            select 1 from group_member_v1 \n                where group_v1.id = group_member_v1.groupId \n                    and group_member_v1.groupId = :userId\n                    and group_v1.accountId = :accountId\n        )\n    \"\"\"\n    )\n    @Transaction\n    fun findJoinedGroups(accountId: Long, userId: String): List<GroupRelatedRecord>\n\n    @Query(\n        \"\"\"\n        select * from group_v1 where exists (\n            select 1 from group_member_v1 \n                where group_v1.id = group_member_v1.groupId \n                    and group_member_v1.groupId = group_v1.id\n                    and group_member_v1.userId = :userId\n                    and group_v1.accountId = :accountId\n        )\n    \"\"\"\n    )\n    @Transaction\n    fun observeJoinedGroups(accountId: Long, userId: String): Flow<List<GroupRelatedRecord>?>\n\n\n    @Query(\n        \"\"\"\n        select * from group_v1 where accountId = :accountId\n            and ownerId = :userId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findOwnedGroups(accountId: Long, userId: String): List<GroupRelatedRecord>\n\n    @Query(\n        \"\"\"\n        select * from group_v1 where accountId = :accountId\n            and ownerId = :userId\n        \"\"\"\n    )\n    @Transaction\n    fun observeOwnedGroups(accountId: Long, userId: String): Flow<List<GroupRelatedRecord>?>\n\n\n    @Query(\n        \"\"\"\n        select * from group_v1 where accountId = :accountId\n            and serverId = :serverId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findOne(accountId: Long, serverId: String): GroupRelatedRecord?\n\n    @Query(\n        \"\"\"\n        select * from group_v1 where accountId = :accountId\n            and serverId = :serverId\n        \"\"\"\n    )\n    @Transaction\n    fun observeOne(accountId: Long, serverId: String): Flow<GroupRelatedRecord?>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/group/GroupDataSourceImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.group\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.group.*\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\nclass GroupDataSourceImpl @Inject constructor(\n    private val groupDao: GroupDao,\n    private val getAccount: GetAccount,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : GroupDataSource {\n\n    override suspend fun add(group: Group): Result<AddResult> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val record = groupDao.findOne(group.id.accountId, group.id.groupId)\n            val newEntity = GroupRecord.from(group)\n            if (record == null) {\n                val id = groupDao.insert(newEntity)\n                groupDao.insertUserIds(\n                    group.userIds.map {\n                        GroupMemberIdRecord(id, it.id, 0L)\n                    }\n                )\n                AddResult.Created\n            } else {\n                groupDao.update(newEntity.copy(id = record.group.id))\n                groupDao.detachMembers(record.group.id)\n                groupDao.insertUserIds(\n                    group.userIds.map {\n                        GroupMemberIdRecord(record.group.id, it.id, 0L)\n                    }\n                )\n                AddResult.Updated\n            }\n        }\n    }\n\n    override suspend fun addAll(groups: List<Group>): Result<List<AddResult>> = runCancellableCatching {\n        groups.map {\n            add(it).getOrElse {\n                AddResult.Canceled\n            }\n        }\n    }\n\n    override suspend fun delete(groupId: Group.Id): Result<Boolean> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val exists = groupDao.findOne(groupId.accountId, groupId.groupId) != null\n            groupDao.delete(groupId.accountId, groupId.groupId)\n            exists\n        }\n    }\n\n    override suspend fun find(groupId: Group.Id): Result<Group> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            groupDao.findOne(groupId.accountId, groupId.groupId)\n                ?.toModel()\n                ?: throw GroupNotFoundException(groupId)\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun observeJoinedGroups(accountId: Long): Flow<List<GroupWithMember>> {\n        return flow {\n            emit(getAccount.get(accountId))\n        }.flatMapLatest {\n            groupDao.observeJoinedGroups(accountId, it.remoteId).distinctUntilChanged()\n        }.filterNotNull().map {\n            it.map { record ->\n                GroupWithMember(\n                    record.toModel(),\n                    record.members.map {\n                        GroupMember(User.Id(record.group.accountId, it.serverId), it.avatarUrl)\n                    }\n                )\n            }\n        }.distinctUntilChanged().flowOn(ioDispatcher)\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun observeOwnedGroups(accountId: Long): Flow<List<GroupWithMember>> {\n        return flow {\n            emit(getAccount.get(accountId))\n        }.flatMapLatest {\n            groupDao.observeOwnedGroups(accountId, it.remoteId).distinctUntilChanged()\n        }.filterNotNull().map { groups ->\n            groups.map { record ->\n                GroupWithMember(\n                    record.toModel(),\n                    record.members.map {\n                        GroupMember(User.Id(record.group.accountId, it.serverId), it.avatarUrl)\n                    }\n                )\n            }\n        }.distinctUntilChanged().flowOn(ioDispatcher)\n    }\n\n    override fun observeOne(groupId: Group.Id): Flow<GroupWithMember> {\n        return groupDao.observeOne(groupId.accountId, groupId.groupId).distinctUntilChanged().filterNotNull().map { record ->\n            GroupWithMember(\n                record.toModel(),\n                record.members.map {\n                    GroupMember(User.Id(record.group.accountId, it.serverId), it.avatarUrl)\n                }\n            )\n        }.filterNotNull().flowOn(ioDispatcher)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/group/GroupRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.group\n\nimport androidx.room.*\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.user.User\n\n@Entity(\n    tableName = \"group_v1\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"accountId\"],\n            entity = AccountRecord::class,\n            childColumns = [\"accountId\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        ),\n    ],\n    indices = [\n        Index(\"accountId\"),\n        Index(\"serverId\"),\n        Index(\"accountId\", \"serverId\", unique = true)\n    ]\n)\ndata class GroupRecord(\n    @ColumnInfo(name = \"serverId\")\n    val serverId: String,\n\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"createdAt\")\n    val createdAt: Instant,\n\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    @ColumnInfo(name = \"ownerId\")\n    val ownerId: String,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true)\n    val id: Long\n) {\n    companion object {\n        fun from(model: Group): GroupRecord {\n            return GroupRecord(\n                model.id.groupId,\n                model.id.accountId,\n                model.createdAt,\n                model.name,\n                model.ownerId.id,\n                id = 0L\n            )\n        }\n    }\n}\n\n@Entity(\n    tableName = \"group_member_v1\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"groupId\"],\n            entity = GroupRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        ),\n    ],\n    indices = [\n        Index(\"groupId\"),\n        Index(\"groupId\", \"userId\", unique = true)\n    ]\n)\ndata class GroupMemberIdRecord(\n    @ColumnInfo(name = \"groupId\")\n    val groupId: Long,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: String,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true)\n    val id: Long,\n)\n\n@DatabaseView(\n    \"\"\"\n        select m.groupId, u.id as userId, u.avatarUrl, u.serverId from group_member_v1 as m \n            inner join group_v1 as g\n            inner join user as u\n            on m.groupId = g.id\n                and m.userId = u.serverId\n                and g.accountId = u.accountId\n    \"\"\",\n    viewName = \"group_member_view\"\n)\ndata class GroupMemberView(\n    @ColumnInfo(name = \"groupId\")\n    val groupId: Long,\n\n    @ColumnInfo(name = \"avatarUrl\")\n    val avatarUrl: String?,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: Long,\n\n    @ColumnInfo(name = \"serverId\")\n    val serverId: String,\n)\n\ndata class GroupRelatedRecord(\n    @Embedded val group: GroupRecord,\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"groupId\",\n        entity = GroupMemberIdRecord::class\n    )\n    val userIds: List<GroupMemberIdRecord>,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"groupId\",\n        entity = GroupMemberView::class\n    )\n    val members: List<GroupMemberView>,\n) {\n    fun toModel(): Group {\n        return Group(\n            id = Group.Id(accountId = group.accountId, group.serverId),\n            createdAt = group.createdAt,\n            name = group.name,\n            ownerId = User.Id(\n                group.accountId,\n                group.ownerId,\n            ),\n            userIds = userIds.map {\n                User.Id(group.accountId, it.userId)\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/group/GroupRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.group\n\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.MisskeyAPI\nimport net.pantasystem.milktea.api.misskey.groups.AcceptInvitationDTO\nimport net.pantasystem.milktea.api.misskey.groups.CreateGroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.InviteUserDTO\nimport net.pantasystem.milktea.api.misskey.groups.RejectInvitationDTO\nimport net.pantasystem.milktea.api.misskey.groups.RemoveUserDTO\nimport net.pantasystem.milktea.api.misskey.groups.ShowGroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.TransferGroupDTO\nimport net.pantasystem.milktea.api.misskey.groups.UpdateGroupDTO\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.toGroup\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.group.CreateGroup\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.group.GroupDataSource\nimport net.pantasystem.milktea.model.group.GroupNotFoundException\nimport net.pantasystem.milktea.model.group.GroupRepository\nimport net.pantasystem.milktea.model.group.InvitationId\nimport net.pantasystem.milktea.model.group.Invite\nimport net.pantasystem.milktea.model.group.Pull\nimport net.pantasystem.milktea.model.group.Transfer\nimport net.pantasystem.milktea.model.group.UpdateGroup\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass GroupRepositoryImpl @Inject constructor(\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val accountRepository: AccountRepository,\n    private val groupDataSource: GroupDataSource,\n    private val loggerFactory: Logger.Factory,\n    private val userRepository: UserRepository,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : GroupRepository {\n\n    private val logger: Logger by lazy {\n        loggerFactory.create(\"GroupRepositoryImpl\")\n    }\n\n    override suspend fun create(createGroup: CreateGroup): Group {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(createGroup.author).getOrThrow()\n            val api = getMisskeyAPI(account)\n\n            val res = api.createGroup(\n                CreateGroupDTO(\n                    i = account.token,\n                    name = createGroup.name\n                )\n            ).throwIfHasError()\n            val group = res.body()?.toGroup(account.accountId)\n            require(group != null)\n            groupDataSource.add(group)\n            group\n        }\n    }\n\n    override suspend fun syncOne(groupId: Group.Id): Group {\n        return withContext(ioDispatcher) {\n            var group = groupDataSource.find(groupId).onFailure {\n                logger.debug { \"ローカルには存在しません。:${groupId}\" }\n            }.getOrNull()\n\n            if (group != null) {\n                return@withContext group\n            }\n            val account = accountRepository.get(groupId.accountId).getOrThrow()\n            val api = getMisskeyAPI(account)\n\n            val res =\n                api.showGroup(ShowGroupDTO(account.token, groupId = groupId.groupId))\n                    .throwIfHasError()\n            val body = res.body()\n                ?: throw GroupNotFoundException(groupId)\n            group = body.toGroup(account.accountId)\n            groupDataSource.add(group)\n            userRepository.syncIn(group.userIds).getOrThrow()\n\n            group\n        }\n\n    }\n\n    override suspend fun syncByJoined(accountId: Long): List<Group> {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            val api =\n                getMisskeyAPI(account).joinedGroups(I(account.token)).throwIfHasError()\n            val groups = api.body()?.map {\n                it.toGroup(account.accountId)\n            } ?: emptyList()\n            groupDataSource.addAll(groups)\n            val userIds = groups.map {\n                it.userIds\n            }.flatten()\n            userRepository.syncIn(userIds).getOrThrow()\n            groups\n        }\n    }\n\n    override suspend fun syncByOwned(accountId: Long): List<Group> {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            val api =\n                getMisskeyAPI(account).ownedGroups(I(account.token)).throwIfHasError()\n            val groups = api.body()?.map {\n                it.toGroup(account.accountId)\n            } ?: emptyList()\n            groupDataSource.addAll(groups)\n            val userIds = groups.map {\n                it.userIds\n            }.flatten()\n            userRepository.syncIn(userIds).getOrThrow()\n            groups\n        }\n    }\n\n    override suspend fun pull(pull: Pull): Group {\n        return withContext(ioDispatcher) {\n            var group = syncOne(pull.groupId)\n            val account = accountRepository.get(pull.groupId.accountId).getOrThrow()\n            getMisskeyAPI(account).pullUser(\n                RemoveUserDTO(\n                    i = account.token,\n                    userId = pull.userId.id,\n                    groupId = pull.groupId.groupId\n                )\n            )\n                .throwIfHasError()\n\n            group = group.copy(userIds = group.userIds.filterNot {\n                it == pull.userId\n            })\n            groupDataSource.add(group)\n            group\n        }\n    }\n\n    override suspend fun transfer(transfer: Transfer): Group {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(transfer.groupId.accountId).getOrThrow()\n            val body = getMisskeyAPI(account).transferGroup(\n                TransferGroupDTO(\n                    i = account.token,\n                    groupId = transfer.groupId.groupId,\n                    userId = transfer.userId.id\n                )\n            ).throwIfHasError().body()\n\n            require(body != null)\n            body.toGroup(account.accountId).also {\n                groupDataSource.add(it)\n            }\n        }\n    }\n\n    override suspend fun update(updateGroup: UpdateGroup): Group {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(updateGroup.groupId.accountId).getOrThrow()\n            val body = getMisskeyAPI(account).updateGroup(\n                UpdateGroupDTO(\n                    i = account.token,\n                    groupId = updateGroup.groupId.groupId,\n                    name = updateGroup.name\n                )\n            )\n                .throwIfHasError().body()\n            require(body != null)\n\n            val group = body.toGroup(account.accountId)\n            groupDataSource.add(group)\n            group\n        }\n    }\n\n    override suspend fun invite(invite: Invite): Result<Unit> = runCancellableCatching<Unit> {\n        return@runCancellableCatching withContext(ioDispatcher) {\n            val account = accountRepository.get(invite.groupId.accountId).getOrThrow()\n            getMisskeyAPI(account).invite(\n                InviteUserDTO(\n                    groupId = invite.groupId.groupId,\n                    i = account.token,\n                    userId = invite.userId.id,\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun accept(invitationId: InvitationId): Result<Unit> = runCancellableCatching {\n        return@runCancellableCatching withContext(ioDispatcher) {\n            val account = accountRepository.get(invitationId.accountId).getOrThrow()\n            getMisskeyAPI(account).acceptInvitation(\n                AcceptInvitationDTO(\n                    i = account.token,\n                    invitationId = invitationId.invitationId\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun reject(invitationId: InvitationId): Result<Unit> = runCancellableCatching {\n        return@runCancellableCatching withContext(ioDispatcher) {\n            val account = accountRepository.get(invitationId.accountId).getOrThrow()\n            getMisskeyAPI(account).rejectInvitation(\n                RejectInvitationDTO(\n                    i = account.token,\n                    invitationId = invitationId.invitationId\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    private fun getMisskeyAPI(account: Account): MisskeyAPI {\n        return misskeyAPIProvider.get(account.normalizedInstanceUri)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/hashtag/HashtagRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.hashtag\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.EmptyRequest\nimport net.pantasystem.milktea.api.misskey.hashtag.SearchHashtagRequest\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.hashtag.HashTag\nimport net.pantasystem.milktea.model.hashtag.HashtagRepository\nimport javax.inject.Inject\n\nclass HashtagRepositoryImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : HashtagRepository {\n    override suspend fun search(\n        accountId: Long,\n        query: String,\n        limit: Int,\n        offset: Int,\n    ): Result<List<String>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            when (account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    misskeyAPIProvider.get(account).searchHashtag(\n                        SearchHashtagRequest(\n                            query = query,\n                            limit = limit,\n                            offset = offset\n                        )\n                    ).throwIfHasError().body() ?: emptyList()\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    mastodonAPIProvider.get(account).search(\n                        q = query,\n                        limit = limit,\n                        offset = offset,\n                        type = \"hashtags\"\n                    ).throwIfHasError().body()?.hashtags?.map {\n                        it.name\n                    } ?: emptyList()\n                }\n            }\n\n        }\n    }\n\n    override suspend fun trends(accountId: Long): Result<List<HashTag>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val body = requireNotNull(\n                        misskeyAPIProvider.get(account).getTrendingHashtags(EmptyRequest)\n                            .throwIfHasError()\n                            .body()\n                    )\n                    body.map {\n                        it.toModel()\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val body = requireNotNull(\n                        mastodonAPIProvider.get(account).getTagTrends()\n                            .throwIfHasError()\n                            .body()\n                    )\n                    body.map {\n                        it.toModel()\n                    }\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/image/ImageCacheDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.image\n\nimport androidx.room.Dao\nimport androidx.room.Query\nimport androidx.room.Upsert\n\n@Dao\ninterface ImageCacheDAO {\n\n    @Query(\n        \"\"\"\n            SELECT * FROM image_caches WHERE source_url = :url AND cached_at > :newerThan\n        \"\"\"\n    )\n    suspend fun findBySourceUrl(url: String, newerThan: Long): ImageCacheEntity?\n\n    @Query(\n        \"\"\"\n            SELECT * FROM image_caches WHERE cached_at < :olderThan\n        \"\"\"\n    )\n    suspend fun findOlder(olderThan: Long): List<ImageCacheEntity>\n\n    @Query(\n        \"\"\"\n            DELETE FROM image_caches;\n        \"\"\"\n    )\n    suspend fun clear()\n\n    @Query(\n        \"\"\"\n            SELECT * FROM image_caches WHERE source_url in (:urls)\n                AND cached_at > :newerThan\n        \"\"\"\n    )\n    suspend fun findBySourceUrls(urls: List<String>, newerThan: Long): List<ImageCacheEntity>\n\n    @Upsert\n    suspend fun upsert(entity: ImageCacheEntity): Long\n\n\n    @Query(\n        \"\"\"\n            SELECT count(*) FROM image_caches\n        \"\"\"\n    )\n    suspend fun count(): Long\n\n    @Query(\"\"\"DELETE FROM image_caches WHERE source_url = :url\"\"\")\n    suspend fun deleteByUrl(url: String)\n\n    @Query(\"\"\"SELECT * FROM image_caches\"\"\")\n    suspend fun findAll(): List<ImageCacheEntity>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/image/ImageCacheEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.image\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.image.ImageCache\n\n@Entity(\n    tableName = \"image_caches\",\n    indices = [\n        Index(\n            \"source_url\",\n            unique = true,\n        ),\n        Index(\n            \"cached_at\"\n        )\n    ]\n)\ndata class ImageCacheEntity(\n    @ColumnInfo(\"source_url\") val sourceUrl: String,\n    @ColumnInfo(\"cache_path\") val cachePath: String,\n    @ColumnInfo(\"cached_at\") val cachedAt: Long,\n    @ColumnInfo(\"width\") val width: Int?,\n    @ColumnInfo(\"height\") val height: Int?,\n    @ColumnInfo(\"id\") @PrimaryKey(autoGenerate = true) val id: Long = 0L,\n) {\n\n    companion object {\n        fun from(model: ImageCache): ImageCacheEntity {\n            return ImageCacheEntity(\n                sourceUrl = model.sourceUrl,\n                cachePath = model.cachePath,\n                cachedAt = model.cachedAt.toEpochMilliseconds(),\n                width = model.width,\n                height = model.height,\n            )\n        }\n    }\n\n    fun toModel(): ImageCache {\n        return ImageCache(\n            sourceUrl = sourceUrl,\n            cachePath = cachePath,\n            cachedAt = Instant.fromEpochMilliseconds(cachedAt),\n            width = width,\n            height = height,\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/image/ImageCacheRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.image\n\nimport android.content.Context\nimport android.graphics.BitmapFactory\nimport android.util.Log\nimport com.caverock.androidsvg.SVG\nimport com.caverock.androidsvg.SVGParseException\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.common.Hash\nimport net.pantasystem.milktea.common.glide.svg.SvgDecoder\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.image.ImageCache\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport okhttp3.Request\nimport java.io.File\nimport javax.inject.Inject\nimport kotlin.time.Duration.Companion.days\n\n\nclass ImageCacheRepositoryImpl @Inject constructor(\n    private val okHttpClientProvider: OkHttpClientProvider,\n    @ApplicationContext val context: Context,\n    @IODispatcher val coroutineDispatcher: CoroutineDispatcher,\n    private val imageCacheDAO: ImageCacheDAO,\n) : ImageCacheRepository {\n\n    companion object {\n        const val cacheDir = \"milktea_image_caches\"\n        val cacheExpireDuration = 7.days\n        val cacheIgnoreUpdateDuration = 3.days\n    }\n\n    override suspend fun save(url: String) = runCancellableCatching {\n        when (val cache = findBySourceUrl(url).getOrThrow()) {\n            null -> Unit\n            else -> if (cache.cachedAt + cacheIgnoreUpdateDuration > Clock.System.now()) {\n                if (File(cache.cachePath).exists()) {\n                    return@runCancellableCatching cache\n                }\n            }\n        }\n        withContext(coroutineDispatcher) {\n            val fileName = Hash.sha256(url)\n            val file = File(context.filesDir, cacheDir).apply {\n                if (!exists()) {\n                    mkdirs()\n                }\n            }.resolve(fileName)\n\n            val (width, height) = downloadAndSaveFile(url, file)\n\n            val cache = ImageCache(\n                sourceUrl = url,\n                cachePath = File(context.filesDir, cacheDir).resolve(fileName).absolutePath,\n                cachedAt = Clock.System.now(),\n                width = width,\n                height = height,\n            )\n            upInsert(cache)\n            return@withContext cache\n        }\n    }\n\n    override suspend fun findBySourceUrl(url: String): Result<ImageCache?> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val now = Clock.System.now()\n            imageCacheDAO.findBySourceUrl(url, (now - cacheExpireDuration).toEpochMilliseconds())?.let {\n                it.toModel()\n            }\n        }\n    }\n\n    override suspend fun deleteExpiredCaches(): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val now = Clock.System.now()\n            val targets = imageCacheDAO.findOlder((now - cacheExpireDuration).toEpochMilliseconds())\n            targets.forEach {\n                imageCacheDAO.deleteByUrl(it.sourceUrl)\n                val file = File(it.cachePath)\n                if (file.exists()) {\n                    file.delete()\n                }\n                imageCacheDAO.deleteByUrl(it.sourceUrl)\n            }\n        }\n    }\n\n    override suspend fun clear(): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            imageCacheDAO.clear()\n            File(context.filesDir, cacheDir).deleteRecursively()\n        }\n    }\n\n    override suspend fun findBySourceUrls(urls: List<String>): Result<List<ImageCache>> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val now = Clock.System.now()\n            urls.chunked(300).map { list ->\n                imageCacheDAO.findBySourceUrls(\n                    list,\n                    (now - cacheExpireDuration).toEpochMilliseconds(),\n                )\n            }\n        }.flatten().map { it.toModel() }\n    }\n\n    private suspend fun upInsert(cache: ImageCache) {\n        imageCacheDAO.upsert(ImageCacheEntity.from(cache))\n    }\n\n    private fun downloadAndSaveFile(url: String, file: File): Pair<Int?, Int?> {\n        return file.outputStream().use { out ->\n            val req = Request.Builder().url(url).build()\n            val response = okHttpClientProvider.get().newCall(req).execute()\n            val contentLength = response.header(\"Content-Length\")?.toLongOrNull()\n            response.body?.byteStream()\n                ?.use { inStream ->\n                    val bytesCopied = inStream.copyTo(out)\n                    if (contentLength != null && bytesCopied != contentLength) {\n                        throw Exception(\"Download failed: url=$url\")\n                    }\n                }\n\n            // check svg\n            val source = file.inputStream()\n            source.use {\n                if (SvgDecoder.isSvg(file.inputStream())) {\n                    try {\n                        val svg = SVG.getFromInputStream(source)\n                        Log.d(\"ImageCache\", \"SVGのサイズ: width=${svg.documentWidth}, height=${svg.documentHeight}\")\n                        svg.documentWidth.toInt() to svg.documentHeight.toInt()\n                    } catch (e: SVGParseException) {\n                        Log.e(\"ImageCache\", \"SVGParseException\", e)\n                        throw e\n                    }\n                } else {\n                    val options = BitmapFactory.Options()\n                    options.inJustDecodeBounds = true\n                    BitmapFactory.decodeFile(\n                        file.absolutePath, options\n                    ) ?: return null to null\n                    options.outWidth to options.outHeight\n                }\n            }\n        }\n    }\n\n    override suspend fun findCachedFileCount(reality: Boolean): Result<Long> = runCancellableCatching {\n        if (reality) {\n            val dir = File(context.filesDir, cacheDir).apply {\n                if (!exists()) {\n                    mkdirs()\n                }\n            }\n            dir.listFiles()?.size?.toLong() ?: 0L\n        } else {\n            imageCacheDAO.count()\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/FeatureEnablesImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.instance.Version\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.nodeinfo.getVersion\nimport java.net.URL\nimport javax.inject.Inject\n\nclass FeatureEnablesImpl @Inject constructor(\n    val nodeInfoRepository: NodeInfoRepository,\n    private val instanceInfoService: InstanceInfoService,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n): FeatureEnables {\n    override suspend fun isEnable(instanceDomain: String, type: FeatureType, default: Boolean): Boolean {\n        val features = enableFeatures(instanceDomain)\n        return if (features.isEmpty()) {\n            default\n        } else {\n            features.contains(type)\n        }\n    }\n\n    override suspend fun enableFeatures(instanceDomain: String): Set<FeatureType> {\n        return withContext(ioDispatcher) {\n            val instanceInfo = instanceInfoService.find(instanceDomain).getOrNull()\n            val nodeInfo = nodeInfoRepository.find(URL(instanceDomain).host).getOrNull() ?: return@withContext emptySet()\n            val version = instanceInfo?.version ?: nodeInfo.type.getVersion()\n            val isMisskey = instanceInfo is InstanceInfoType.Misskey\n            val isCalckey = isMisskey && nodeInfo.type is NodeInfo.SoftwareType.Misskey.Calckey\n            val isMastodon = instanceInfo is InstanceInfoType.Mastodon\n            val isFirefish = instanceInfo is InstanceInfoType.Firefish\n            setOfNotNull(\n                if (isMisskey && version >= Version(\"12.75.0\") || isFirefish) FeatureType.Gallery else null,\n                if (isMisskey && version >= Version(\"12\") || isFirefish) FeatureType.Channel else null,\n                if (isMisskey && version >= Version(\"11\") && version <= Version(\"13.6.1\") || isCalckey || isFirefish) FeatureType.Group else null,\n                if (isMisskey && version >= Version(\"12.75.0\") || isFirefish) FeatureType.Antenna else null,\n                if (isMisskey && version >= Version(\"12\") || isFirefish) FeatureType.UserReactionHistory else null,\n                if (isMisskey && version >= Version(\"12\") || isFirefish) FeatureType.Clip else null,\n                if (isMisskey && version <= Version(\"13.6.1\") || isCalckey || isFirefish) FeatureType.Messaging else null,\n                if (isMisskey || isFirefish) FeatureType.Drive else null,\n                if (isMastodon) FeatureType.Bookmark else null,\n                if (nodeInfo.type is NodeInfo.SoftwareType.Misskey.Normal && version >= Version(\"13\")) FeatureType.ReactionAcceptance else null,\n                if (isMisskey || isFirefish) FeatureType.PostReactionUsers else null,\n                if (isMisskey || isFirefish) FeatureType.PostLocalOnlyVisibility else null,\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/MastodonInstanceInfoCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance\n\nimport net.pantasystem.milktea.common.collection.LRUCache\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfo\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * InMemoryなMetaのCache\n */\n@Singleton\nclass MastodonInstanceInfoCache @Inject constructor(){\n\n    private val lruCache = LRUCache<String, MastodonInstanceInfo>(100)\n\n    fun put(instanceBaseURL: String, instanceInfo: MastodonInstanceInfo) {\n        lruCache[instanceBaseURL] = instanceInfo\n    }\n\n    fun get(instanceBaseURL: String): MastodonInstanceInfo? {\n        return lruCache[instanceBaseURL]\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/MastodonInstanceInfoRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.instance.db.FedibirdCapabilitiesRecord\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MastodonInstanceInfoDAO\nimport net.pantasystem.milktea.data.infrastructure.instance.db.MastodonInstanceInfoRecord\nimport net.pantasystem.milktea.data.infrastructure.instance.db.PleromaMetadataFeatures\nimport net.pantasystem.milktea.data.infrastructure.instance.db.from\nimport net.pantasystem.milktea.data.infrastructure.instance.db.toModel\nimport net.pantasystem.milktea.data.infrastructure.toModel\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfo\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfoRepository\nimport java.net.URL\nimport javax.inject.Inject\n\nclass MastodonInstanceInfoRepositoryImpl @Inject constructor(\n    private val mastodonInstanceInfoDAO: MastodonInstanceInfoDAO,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val cache: MastodonInstanceInfoCache,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : MastodonInstanceInfoRepository {\n\n    override suspend fun find(instanceDomain: String): Result<MastodonInstanceInfo> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                var info = cache.get(instanceDomain)\n                if (info != null) {\n                    return@withContext info\n                }\n                info = mastodonInstanceInfoDAO.findBy(URL(instanceDomain).host)?.toModel()\n                if (info != null) {\n                    cache.put(instanceDomain, info)\n                    return@withContext info\n                }\n\n                info = mastodonAPIProvider.get(instanceDomain).getInstance().toModel()\n                upInsert(info)\n                cache.put(instanceDomain, info)\n                info\n            }\n        }\n\n\n    override fun observe(instanceDomain: String): Flow<MastodonInstanceInfo?> {\n        return mastodonInstanceInfoDAO.observeBy(URL(instanceDomain).host).map {\n            it?.toModel()\n        }.onEach {\n            if (it != null) {\n                cache.put(instanceDomain, it)\n            }\n        }.flowOn(ioDispatcher)\n    }\n\n    override suspend fun sync(instanceDomain: String): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val model = mastodonAPIProvider.get(instanceDomain).getInstance().toModel()\n            cache.put(instanceDomain, model)\n            upInsert(model)\n        }\n    }\n\n    private suspend fun upInsert(instanceInfo: MastodonInstanceInfo) {\n        val exists = mastodonInstanceInfoDAO.findBy(instanceInfo.uri)\n        if (exists == null) {\n            mastodonInstanceInfoDAO.insert(MastodonInstanceInfoRecord.from(instanceInfo))\n            instanceInfo.fedibirdCapabilities?.let { capabilities ->\n                mastodonInstanceInfoDAO.insertFedibirdCapabilities(\n                    capabilities.map {\n                        FedibirdCapabilitiesRecord(it, instanceInfo.uri)\n                    }\n                )\n            }\n            instanceInfo.pleroma?.let { pleroma ->\n                mastodonInstanceInfoDAO.insertPleromaMetadataFeatures(\n                    pleroma.metadata.features.map {\n                        PleromaMetadataFeatures(\n                            type = it,\n                            uri = instanceInfo.uri,\n                        )\n                    }\n                )\n            }\n        } else {\n            mastodonInstanceInfoDAO.update(MastodonInstanceInfoRecord.from(instanceInfo))\n            mastodonInstanceInfoDAO.clearFedibirdCapabilities(instanceInfo.uri)\n            mastodonInstanceInfoDAO.clearPleromaMetadataFeatures(instanceInfo.uri)\n            instanceInfo.fedibirdCapabilities?.let { capabilities ->\n                mastodonInstanceInfoDAO.insertFedibirdCapabilities(\n                    capabilities.map {\n                        FedibirdCapabilitiesRecord(it, instanceInfo.uri)\n                    }\n                )\n            }\n            instanceInfo.pleroma?.let { pleroma ->\n                mastodonInstanceInfoDAO.insertPleromaMetadataFeatures(\n                    pleroma.metadata.features.map {\n                        PleromaMetadataFeatures(\n                            type = it,\n                            uri = instanceInfo.uri,\n                        )\n                    }\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/MetaCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance\n\nimport net.pantasystem.milktea.common.collection.LRUCache\nimport net.pantasystem.milktea.model.instance.Meta\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * InMemoryなMetaのCache\n */\n@Singleton\nclass MetaCache @Inject constructor(){\n\n    private val lruCache = LRUCache<String, Meta>(100)\n\n    fun put(instanceBaseURL: String, meta: Meta) {\n        lruCache[instanceBaseURL] = meta\n    }\n\n    fun get(instanceBaseURL: String): Meta? {\n        return lruCache[instanceBaseURL]\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/MetaRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.instance.HostWithVersion\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.instance.MetaDataSource\nimport net.pantasystem.milktea.model.instance.MetaRepository\nimport net.pantasystem.milktea.api.misskey.instance.RequestMeta\nimport java.net.URL\nimport javax.inject.Inject\n\nclass MetaRepositoryImpl @Inject constructor(\n    private val metaDataSource: MetaDataSource,\n    private val metaCache: MetaCache,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n): MetaRepository {\n\n    override suspend fun sync(instanceDomain: String): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val meta = fetch(instanceDomain)\n            metaDataSource.add(meta)\n            metaCache.put(meta.uri, meta)\n            HostWithVersion.put(URL(meta.uri).host, meta.getVersion())\n        }\n    }\n\n    override suspend fun find(instanceDomain: String): Result<Meta> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val cacheMeta = metaCache.get(instanceDomain)\n            if (cacheMeta != null) {\n                return@withContext cacheMeta\n            }\n            val localMeta = metaDataSource.get(instanceDomain)\n            if (localMeta == null) {\n                val meta = fetch(instanceDomain)\n                metaDataSource.add(meta)\n            } else {\n                localMeta\n            }.also { meta ->\n                metaCache.put(meta.uri, meta)\n                HostWithVersion.put(URL(meta.uri).host, meta.getVersion())\n            }\n        }\n\n    }\n\n\n    override fun observe(instanceDomain: String): Flow<Meta?> {\n        return metaDataSource.observe(instanceDomain).onEach { meta ->\n            if (meta != null) {\n                metaCache.put(instanceDomain, meta)\n                HostWithVersion.put(URL(meta.uri).host, meta.getVersion())\n            }\n        }\n    }\n\n    private suspend fun fetch(instanceDomain: String): Meta {\n        val res = misskeyAPIProvider.get(instanceDomain).getMeta(RequestMeta(detail = true))\n            .throwIfHasError()\n        return res.body()!!.toModel()\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/InMemoryMetaDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.instance.MetaDataSource\n\nclass InMemoryMetaDataSource : MetaDataSource {\n\n    private val instanceDomainAndMeta = MutableStateFlow(emptyMap<String, Meta>())\n    private val lock = Mutex()\n\n    override suspend fun add(meta: Meta): Meta {\n        lock.withLock {\n            instanceDomainAndMeta.value = instanceDomainAndMeta.value.toMutableMap().also {\n                it[meta.uri] = meta\n            }\n            return meta\n        }\n\n\n    }\n\n    override suspend fun delete(meta: Meta) {\n        lock.withLock {\n            instanceDomainAndMeta.value = instanceDomainAndMeta.value.toMutableMap().also {\n                it.remove(meta.uri)\n            }\n        }\n    }\n\n    override suspend fun get(instanceDomain: String): Meta? {\n        lock.withLock {\n            return instanceDomainAndMeta.value[instanceDomain]\n        }\n    }\n\n    override fun observe(instanceDomain: String): Flow<Meta?> {\n        return instanceDomainAndMeta.map {\n            it[instanceDomain]\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/InstanceInfoDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface InstanceInfoDao {\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insert(instanceInfoRecord: InstanceInfoRecord): Long\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertAll(instanceInfoRecords: List<InstanceInfoRecord>): List<Long>\n\n    @Query(\"delete from instance_info_v1_table\")\n    suspend fun clear()\n\n    @Query(\"select * from instance_info_v1_table where id = :id\")\n    suspend fun findById(id: String): InstanceInfoRecord?\n\n    @Query(\"select * from instance_info_v1_table\")\n    suspend fun findAll(): List<InstanceInfoRecord>\n\n    @Query(\"select * from instance_info_v1_table where host = :host\")\n    suspend fun findByHost(host: String): InstanceInfoRecord?\n\n    @Query(\"select * from instance_info_v1_table where host = :host\")\n    fun observeByHost(host: String): Flow<InstanceInfoRecord?>\n\n    @Query(\"select * from instance_info_v1_table\")\n    fun observeAll(): Flow<List<InstanceInfoRecord>>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/InstanceInfoRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\n\n@Entity(\n    tableName = \"instance_info_v1_table\",\n    indices = [Index(\"host\", unique = true)]\n)\ndata class InstanceInfoRecord(\n    @PrimaryKey(autoGenerate = false)\n    @ColumnInfo(name = \"id\")\n    val id: String,\n\n    @ColumnInfo(name = \"host\")\n    val host: String,\n\n    @ColumnInfo(name = \"name\")\n    val name: String?,\n\n    @ColumnInfo(name = \"description\")\n    val description: String?,\n\n    @ColumnInfo(name = \"clientMaxBodyByteSize\")\n    val clientMaxBodyByteSize: Long?,\n\n    @ColumnInfo(name= \"iconUrl\")\n    val iconUrl: String?,\n\n    @ColumnInfo(name = \"themeColor\")\n    val themeColor: String?,\n)\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/MastodonInstanceInfoDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\nabstract class MastodonInstanceInfoDAO {\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract suspend fun insert(instanceInfo: MastodonInstanceInfoRecord)\n\n    @Update\n    abstract suspend fun update(instanceInfo: MastodonInstanceInfoRecord)\n\n    @Delete\n    abstract suspend fun delete(instanceInfo: MastodonInstanceInfoRecord)\n\n    @Query(\"\"\"\n        select * from mastodon_instance_info where uri = :uri\n    \"\"\")\n    @Transaction\n    abstract suspend fun findBy(uri: String): MastodonInstanceInfoRelated?\n\n    @Query(\"\"\"\n        select * from mastodon_instance_info where uri = :uri\n    \"\"\")\n    @Transaction\n    abstract fun observeBy(uri: String): Flow<MastodonInstanceInfoRelated?>\n\n    @Query(\"\"\"\n        delete from mastodon_instance_fedibird_capabilities where uri = :uri\n    \"\"\")\n    abstract fun clearFedibirdCapabilities(uri: String)\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun insertFedibirdCapabilities(list: List<FedibirdCapabilitiesRecord>): List<Long>\n\n    @Query(\"\"\"\n        delete from pleroma_metadata_features where uri = :uri\n    \"\"\")\n    abstract fun clearPleromaMetadataFeatures(uri: String)\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun insertPleromaMetadataFeatures(list: List<PleromaMetadataFeatures>): List<Long>\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/MastodonInstanceInfoRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport androidx.room.*\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfo\n\n@Entity(\n    tableName = \"mastodon_instance_info\"\n)\ndata class MastodonInstanceInfoRecord(\n    @PrimaryKey(autoGenerate = false)\n    @ColumnInfo(name = \"uri\")\n    val uri: String,\n\n    @ColumnInfo(name = \"title\")\n    val title: String,\n\n    @ColumnInfo(name = \"description\")\n    val description: String,\n\n    @ColumnInfo(name = \"email\")\n    val email: String,\n\n    @ColumnInfo(name = \"version\")\n    val version: String,\n    @Embedded(prefix = \"urls_\") val urls: Urls,\n    @Embedded(prefix = \"configuration_\") val configuration: Configuration? = null,\n) {\n    companion object;\n\n    data class Configuration(\n        @Embedded(prefix = \"statuses_\") val statuses: Statuses? = null,\n        @Embedded(prefix = \"polls_\")val polls: Polls? = null,\n        @Embedded(prefix = \"emoji_reactions_\") val emojiReactions: EmojiReactions? = null,\n    ) {\n\n        data class Statuses(\n            val maxCharacters: Int? = null,\n            val maxMediaAttachments: Int? = null,\n        )\n\n        data class Polls(\n            @ColumnInfo(name = \"maxOptions\")\n            val maxOptions: Int? = null,\n\n            @ColumnInfo(name = \"maxCharactersPerOption\")\n            val maxCharactersPerOption: Int? = null,\n\n            @ColumnInfo(name = \"minExpiration\")\n            val minExpiration: Int? = null,\n\n            @ColumnInfo(name = \"maxExpiration\")\n            val maxExpiration: Int? = null,\n        )\n\n        data class EmojiReactions(\n            @ColumnInfo(name = \"myReactions\")\n            val maxReactions: Int? = null,\n\n            @ColumnInfo(name = \"maxReactionsPerAccount\")\n            val maxReactionsPerAccount: Int? = null,\n        )\n    }\n\n    data class Urls(\n        @ColumnInfo(name = \"streamingApi\")\n        val streamingApi: String? = null,\n    )\n}\n\n\n@Entity(\n    tableName = \"mastodon_instance_fedibird_capabilities\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"uri\"],\n            childColumns = [\"uri\"],\n            entity = MastodonInstanceInfoRecord::class,\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [Index(\"uri\")],\n    primaryKeys = [\"uri\", \"type\"]\n)\ndata class FedibirdCapabilitiesRecord(\n    @ColumnInfo(name = \"type\")\n    val type: String,\n\n    @ColumnInfo(name = \"uri\")\n    val uri: String\n)\n\n@Entity(\n    tableName = \"pleroma_metadata_features\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"uri\"],\n            childColumns = [\"uri\"],\n            entity = MastodonInstanceInfoRecord::class,\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [Index(\"uri\")],\n    primaryKeys = [\"uri\", \"type\"]\n)\ndata class PleromaMetadataFeatures(\n    @ColumnInfo(name = \"type\")\n    val type: String,\n\n    @ColumnInfo(name = \"uri\")\n    val uri: String\n)\n\ndata class MastodonInstanceInfoRelated(\n    @Embedded val info: MastodonInstanceInfoRecord,\n    @Relation(\n        parentColumn = \"uri\",\n        entityColumn = \"uri\",\n        entity = FedibirdCapabilitiesRecord::class\n    )\n    val fedibirdCapabilities: List<FedibirdCapabilitiesRecord>?,\n\n    @Relation(\n        parentColumn = \"uri\",\n        entityColumn = \"uri\",\n        entity = PleromaMetadataFeatures::class\n    )\n    val pleromaMetadataFeatures: List<PleromaMetadataFeatures>?\n)\n\nfun MastodonInstanceInfoRecord.Companion.from(model: MastodonInstanceInfo): MastodonInstanceInfoRecord {\n    return MastodonInstanceInfoRecord(\n        uri = model.uri,\n        title = model.title,\n        description = model.description,\n        email = model.email,\n        urls = model.urls.let {\n            MastodonInstanceInfoRecord.Urls(\n                streamingApi = it.streamingApi\n            )\n        },\n        version = model.version,\n        configuration = model.configuration?.let { config ->\n            MastodonInstanceInfoRecord.Configuration(\n                statuses = config.statuses?.let {\n                    MastodonInstanceInfoRecord.Configuration.Statuses(\n                        maxCharacters = it.maxCharacters,\n                        maxMediaAttachments = it.maxMediaAttachments,\n                    )\n                },\n                polls = config.polls?.let {\n                    MastodonInstanceInfoRecord.Configuration.Polls(\n                        maxOptions = it.maxOptions,\n                        maxCharactersPerOption = it.maxCharactersPerOption,\n                        maxExpiration = it.maxExpiration,\n                        minExpiration = it.minExpiration,\n                    )\n                },\n                emojiReactions = config.emojiReactions?.let {\n                    MastodonInstanceInfoRecord.Configuration.EmojiReactions(\n                        maxReactions = it.maxReactions,\n                        maxReactionsPerAccount = it.maxReactionsPerAccount\n                    )\n                }\n            )\n        }\n    )\n}\n\n\nfun MastodonInstanceInfoRelated.toModel(): MastodonInstanceInfo {\n    return MastodonInstanceInfo(\n        uri = info.uri,\n        title = info.title,\n        description = info.description,\n        email = info.email,\n        urls = info.urls.let {\n            MastodonInstanceInfo.Urls(\n                streamingApi = it.streamingApi\n            )\n        },\n        version = info.version,\n        configuration = info.configuration?.let { config ->\n            MastodonInstanceInfo.Configuration(\n                statuses = config.statuses?.let {\n                    MastodonInstanceInfo.Configuration.Statuses(\n                        maxCharacters = it.maxCharacters,\n                        maxMediaAttachments = it.maxMediaAttachments,\n                    )\n                },\n                polls = config.polls?.let {\n                    MastodonInstanceInfo.Configuration.Polls(\n                        maxOptions = it.maxOptions,\n                        maxCharactersPerOption = it.maxCharactersPerOption,\n                        maxExpiration = it.maxExpiration,\n                        minExpiration = it.minExpiration,\n                    )\n                },\n                emojiReactions = config.emojiReactions?.let {\n                    MastodonInstanceInfo.Configuration.EmojiReactions(\n                        maxReactions = it.maxReactions,\n                        maxReactionsPerAccount = it.maxReactionsPerAccount\n                    )\n                }\n            )\n        },\n        fedibirdCapabilities = fedibirdCapabilities?.map { it.type },\n        pleroma = pleromaMetadataFeatures?.let {\n            MastodonInstanceInfo.Pleroma(\n                metadata = MastodonInstanceInfo.Pleroma.Metadata(\n                    features = it.map { feature ->\n                        feature.type\n                    }\n                )\n            )\n        }\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/MediatorMetaDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.instance.MetaDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MediatorMetaDataSource @Inject constructor(\n    private val roomMetaRepository: RoomMetaDataSource,\n    private val inMemoryMetaRepository: InMemoryMetaDataSource,\n) : MetaDataSource {\n\n    override suspend fun add(meta: Meta): Meta {\n        return inMemoryMetaRepository.add(roomMetaRepository.add(meta))\n    }\n\n    override suspend fun delete(meta: Meta) {\n        inMemoryMetaRepository.delete(meta)\n        roomMetaRepository.delete(meta)\n    }\n\n    override suspend fun get(instanceDomain: String): Meta? {\n\n        val inMem = inMemoryMetaRepository.get(instanceDomain)\n        if(inMem != null) {\n            return inMem\n        }\n        val dbMeta = roomMetaRepository.get(instanceDomain)\n\n        if(dbMeta != null) {\n            inMemoryMetaRepository.add(dbMeta)\n        }\n\n        return inMemoryMetaRepository.get(instanceDomain)\n    }\n\n    override fun observe(instanceDomain: String): Flow<Meta?> {\n        val inMemoryFlow = inMemoryMetaRepository.observe(instanceDomain)\n        val dbFlow = roomMetaRepository.observe(instanceDomain)\n        return combine(inMemoryFlow, dbFlow) { mem, db ->\n            db ?: mem\n        }.distinctUntilChanged()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/MetaDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\nabstract class MetaDAO{\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    abstract fun insert(meta: MetaDTO): Long\n\n    @Delete\n    abstract fun delete(meta: MetaDTO)\n\n    @Update\n    abstract fun update(meta: MetaDTO)\n\n    @Transaction\n    @Query(\"select * from meta_table where uri = :instanceDomain\")\n    abstract fun findByInstanceDomain(instanceDomain: String): MetaRelation?\n\n    @Transaction\n    @Query(\"select * from meta_table where uri = :instanceDomain\")\n    abstract fun observeByInstanceDomain(instanceDomain: String): Flow<MetaRelation?>\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/MetaDTO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.model.instance.Meta\n\n@Entity(tableName = \"meta_table\")\ndata class MetaDTO(\n    @PrimaryKey(autoGenerate = false)\n    @ColumnInfo(name = \"uri\")\n    val uri: String,\n\n    @ColumnInfo(name = \"bannerUrl\")\n    val bannerUrl: String?,\n\n    @ColumnInfo(name = \"cacheRemoteFiles\")\n    val cacheRemoteFiles: Boolean?,\n\n    @ColumnInfo(name = \"description\")\n    val description: String?,\n\n    @ColumnInfo(name = \"disableGlobalTimeline\")\n    val disableGlobalTimeline: Boolean?,\n\n    @ColumnInfo(name = \"disableLocalTimeline\")\n    val disableLocalTimeline: Boolean?,\n\n    @ColumnInfo(name = \"disableRegistration\")\n    val disableRegistration: Boolean?,\n\n    @ColumnInfo(name = \"driveCapacityPerLocalUserMb\")\n    val driveCapacityPerLocalUserMb: Int?,\n\n    @ColumnInfo(name = \"driveCapacityPerRemoteUserMb\")\n    val driveCapacityPerRemoteUserMb: Int?,\n\n    @ColumnInfo(name = \"enableDiscordIntegration\")\n    val enableDiscordIntegration: Boolean?,\n\n    @ColumnInfo(name = \"enableEmail\")\n    val enableEmail: Boolean?,\n\n    @ColumnInfo(name = \"enableEmojiReaction\")\n    val enableEmojiReaction: Boolean?,\n\n    @ColumnInfo(name = \"enableGithubIntegration\")\n    val enableGithubIntegration: Boolean?,\n\n    @ColumnInfo(name = \"enableRecaptcha\")\n    val enableRecaptcha: Boolean?,\n\n    @ColumnInfo(name = \"enableServiceWorker\")\n    val enableServiceWorker: Boolean?,\n\n    @ColumnInfo(name = \"enableTwitterIntegration\")\n    val enableTwitterIntegration: Boolean?,\n\n    @ColumnInfo(name = \"errorImageUrl\")\n    val errorImageUrl: String?,\n\n    @ColumnInfo(name = \"feedbackUrl\")\n    val feedbackUrl: String?,\n\n    @ColumnInfo(name = \"iconUrl\")\n    val iconUrl: String?,\n\n    @ColumnInfo(name = \"maintainerEmail\")\n    val maintainerEmail: String?,\n\n    @ColumnInfo(name = \"maintainerName\")\n    val maintainerName: String?,\n\n    @ColumnInfo(name = \"mascotImageUrl\")\n    val mascotImageUrl: String?,\n\n    @ColumnInfo(name = \"maxNoteTextLength\")\n    val maxNoteTextLength: Int?,\n\n    @ColumnInfo(name = \"name\")\n    val name: String?,\n\n    @ColumnInfo(name = \"recaptchaSiteKey\")\n    val recaptchaSiteKey: String?,\n\n    @ColumnInfo(name = \"secure\")\n    val secure: Boolean?,\n\n    @ColumnInfo(name = \"swPublicKey\")\n    val swPublicKey: String?,\n\n    @ColumnInfo(name = \"toSUrl\")\n    val toSUrl: String?,\n\n    @ColumnInfo(name = \"version\")\n    val version: String\n) {\n\n    constructor(meta: Meta) : this(\n        bannerUrl = meta.bannerUrl,\n        cacheRemoteFiles = meta.cacheRemoteFiles,\n        description = meta.description,\n        disableGlobalTimeline = meta.disableGlobalTimeline,\n        disableLocalTimeline = meta.disableLocalTimeline,\n        disableRegistration = meta.disableRegistration,\n        driveCapacityPerLocalUserMb = meta.driveCapacityPerLocalUserMb,\n        driveCapacityPerRemoteUserMb = meta.driveCapacityPerRemoteUserMb,\n        enableDiscordIntegration = meta.enableDiscordIntegration,\n        enableEmail = meta.enableEmail,\n        enableEmojiReaction = meta.enableEmojiReaction,\n        enableGithubIntegration = meta.enableGithubIntegration,\n        enableRecaptcha = meta.enableRecaptcha,\n        enableServiceWorker = meta.enableServiceWorker,\n        enableTwitterIntegration = meta.enableTwitterIntegration,\n        errorImageUrl = meta.errorImageUrl,\n        feedbackUrl = meta.feedbackUrl,\n        iconUrl = meta.iconUrl,\n        maintainerEmail = meta.maintainerEmail,\n        maintainerName = meta.maintainerName,\n        mascotImageUrl = meta.mascotImageUrl,\n        maxNoteTextLength = meta.maxNoteTextLength,\n        name = meta.name,\n        recaptchaSiteKey = meta.recaptchaSiteKey,\n        secure = meta.secure,\n        swPublicKey = meta.swPublicKey,\n        toSUrl = meta.toSUrl,\n        version = meta.version,\n        uri = meta.uri\n    )\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/MetaRelation.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport androidx.room.DatabaseView\nimport androidx.room.Embedded\nimport androidx.room.Ignore\nimport net.pantasystem.milktea.model.instance.Meta\n\n@DatabaseView\nclass MetaRelation {\n\n    @Embedded\n    lateinit var meta: MetaDTO\n\n    @Ignore\n    fun toMeta(): Meta {\n        return Meta(\n            bannerUrl = this.meta.bannerUrl,\n            cacheRemoteFiles = this.meta.cacheRemoteFiles,\n            description = this.meta.description,\n            disableGlobalTimeline = this.meta.disableGlobalTimeline,\n            disableLocalTimeline = this.meta.disableLocalTimeline,\n            disableRegistration = this.meta.disableRegistration,\n            driveCapacityPerLocalUserMb = this.meta.driveCapacityPerLocalUserMb,\n            driveCapacityPerRemoteUserMb = this.meta.driveCapacityPerRemoteUserMb,\n            enableDiscordIntegration = this.meta.enableDiscordIntegration,\n            enableEmail = this.meta.enableEmail,\n            enableEmojiReaction = this.meta.enableEmojiReaction,\n            enableGithubIntegration = this.meta.enableGithubIntegration,\n            enableRecaptcha = this.meta.enableRecaptcha,\n            enableServiceWorker = this.meta.enableServiceWorker,\n            enableTwitterIntegration = this.meta.enableTwitterIntegration,\n            errorImageUrl = this.meta.errorImageUrl,\n            feedbackUrl = this.meta.feedbackUrl,\n            iconUrl = this.meta.iconUrl,\n            maintainerEmail = this.meta.maintainerEmail,\n            maintainerName = this.meta.maintainerName,\n            mascotImageUrl = this.meta.mascotImageUrl,\n            maxNoteTextLength = this.meta.maxNoteTextLength,\n            name = this.meta.name,\n            recaptchaSiteKey = this.meta.recaptchaSiteKey,\n            secure = this.meta.secure,\n            swPublicKey = this.meta.swPublicKey,\n            toSUrl = this.meta.toSUrl,\n            version = this.meta.version,\n            uri = this.meta.uri\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/db/RoomMetaDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.db\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.instance.MetaDataSource\n\nclass RoomMetaDataSource(\n    private val metaDAO: MetaDAO,\n    val database: DataBase\n) : MetaDataSource {\n\n    override suspend fun add(meta: Meta): Meta {\n        return database.runInTransaction<Meta>{\n            val isExists = metaDAO.findByInstanceDomain(meta.uri) != null\n            if (isExists) {\n                metaDAO.update(MetaDTO(meta))\n            } else {\n                metaDAO.delete(MetaDTO(meta))\n                metaDAO.insert(MetaDTO(meta))\n            }\n\n\n            meta\n        }\n    }\n\n    override suspend fun delete(meta: Meta) {\n        metaDAO.delete(MetaDTO(meta))\n    }\n\n    override suspend fun get(instanceDomain: String): Meta? {\n        return metaDAO.findByInstanceDomain(instanceDomain)?.toMeta()\n    }\n\n    override fun observe(instanceDomain: String): Flow<Meta?> {\n        return metaDAO.observeByInstanceDomain(instanceDomain).map {\n            it?.toMeta()\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/online/user/count/OnlineUserCountRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.online.user.count\n\nimport net.pantasystem.milktea.api.misskey.EmptyRequest\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.instance.online.user.count.OnlineUserCountRepository\nimport net.pantasystem.milktea.model.instance.online.user.count.OnlineUserCountResult\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass OnlineUserCountRepositoryImpl @Inject constructor(\n    val accountRepository: AccountRepository,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n): OnlineUserCountRepository {\n    override suspend fun find(accountId: Long): Result<OnlineUserCountResult> = runCancellableCatching {\n        val account = accountRepository.get(accountId).getOrThrow()\n        when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val res = misskeyAPIProvider.get(account).getOnlineUsersCount(EmptyRequest)\n                    .throwIfHasError().body()\n                OnlineUserCountResult.Success(requireNotNull(res?.count))\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> OnlineUserCountResult.Unknown\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/ticker/InstanceTickerRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.ticker\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.milktea.instance.ticker.InstanceTickerAPIServiceBuilder\nimport net.pantasystem.milktea.common.collection.LRUCache\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.instance.ticker.db.InstanceTickerDAO\nimport net.pantasystem.milktea.data.infrastructure.instance.ticker.db.InstanceTickerRecord\nimport net.pantasystem.milktea.model.instance.ticker.InstanceTicker\nimport net.pantasystem.milktea.model.instance.ticker.InstanceTickerRepository\nimport javax.inject.Inject\n\nclass InstanceTickerRepositoryImpl @Inject constructor(\n    private val instanceTickerAPIServiceBuilder: InstanceTickerAPIServiceBuilder,\n    private val instanceTickerDAO: InstanceTickerDAO,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : InstanceTickerRepository {\n\n    private val lruCache = LRUCache<String, InstanceTicker>(32)\n\n    private val instanceTickerAPIService by lazy {\n        instanceTickerAPIServiceBuilder.build(\"https://milktea-instance-ticker.milktea.workers.dev/\")\n    }\n\n    override suspend fun sync(host: String): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val response = instanceTickerAPIService.getInstanceInfo(host)\n                .throwIfHasError()\n            val instanceTickerNetworkDTO = response.body()!!\n            val instanceTicker = instanceTickerNetworkDTO.toModel()\n            instanceTickerDAO.insert(InstanceTickerRecord.fromModel(instanceTicker))\n            lruCache[host] = instanceTicker\n        }\n\n    }\n\n    override suspend fun find(host: String): Result<InstanceTicker> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val cached = lruCache[host]\n            if (cached != null) {\n                return@withContext cached\n            }\n            val record = instanceTickerDAO.find(host)\n\n            if (record != null && !record.isRecordExpired()) {\n                val model = record.toModel()\n                lruCache[host] = model\n                model\n            } else {\n                val response = instanceTickerAPIService.getInstanceInfo(host)\n                    .throwIfHasError()\n                val instanceTickerNetworkDTO = response.body()!!\n                val instanceTicker = instanceTickerNetworkDTO.toModel()\n\n                instanceTickerDAO.insert(InstanceTickerRecord.fromModel(instanceTicker))\n                lruCache[host] = instanceTicker\n                instanceTicker\n            }\n        }\n    }\n\n    override suspend fun get(host: String): Result<InstanceTicker?> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val cached = lruCache[host]\n            if (cached != null) {\n                return@withContext cached\n            }\n            val record = instanceTickerDAO.find(host)\n\n            record?.toModel()?.also {\n                lruCache[host] = it\n            }\n        }\n    }\n\n    override suspend fun findIn(\n        hosts: List<String>\n    ): Result<List<InstanceTicker>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val records = instanceTickerDAO.findIn(hosts)\n\n            val cachedRecords = records.filterNot {\n                it.isRecordExpired()\n            }\n            val cachedHosts = cachedRecords.map { it.uri }\n            val uncachedHosts = hosts.filter { !cachedHosts.contains(it) }\n\n            val uncachedRecords = uncachedHosts.map { host ->\n                val response = instanceTickerAPIService.getInstanceInfo(host)\n                    .throwIfHasError()\n                val instanceTickerNetworkDTO = response.body()!!\n                val instanceTicker = instanceTickerNetworkDTO.toModel()\n\n                instanceTickerDAO.insert(InstanceTickerRecord.fromModel(instanceTicker))\n                instanceTicker\n            }\n\n            cachedRecords.map { it.toModel() } + uncachedRecords\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/ticker/db/InstanceTickerDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.ticker.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n@Dao\ninterface InstanceTickerDAO {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(record: InstanceTickerRecord): Long\n\n    @Query(\"\"\"\n        SELECT * FROM instance_tickers\n        WHERE uri = :host\n        LIMIT 1\n    \"\"\")\n    suspend fun find(host: String): InstanceTickerRecord?\n\n    @Query(\"\"\"\n        SELECT * FROM instance_tickers\n        WHERE uri IN (:hosts)\n    \"\"\")\n    suspend fun findIn(hosts: List<String>): List<InstanceTickerRecord>\n\n    @Query(\"\"\"\n        DELETE FROM instance_tickers\n        WHERE uri = :host\n    \"\"\")\n    suspend fun delete(host: String): Int\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/instance/ticker/db/InstanceTickerRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance.ticker.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.instance.ticker.InstanceTicker\nimport kotlin.time.Duration.Companion.days\n\n\n@Entity(\n    tableName = \"instance_tickers\",\n    primaryKeys = [\n        \"uri\",\n    ],\n)\ndata class InstanceTickerRecord(\n    @ColumnInfo(\"uri\") val uri: String,\n    @ColumnInfo(\"favicon_url\") val faviconUrl: String?,\n    @ColumnInfo(\"icon_url\") val iconUrl: String?,\n    @ColumnInfo(\"name\") val name: String?,\n    @ColumnInfo(\"software_name\") val softwareName: String?,\n    @ColumnInfo(\"software_version\") val softwareVersion: String?,\n    @ColumnInfo(\"theme_color\") val themeColor: String?,\n    @ColumnInfo(\"created_at\") val cachedAt: Instant,\n) {\n\n    companion object {\n        fun fromModel(instanceTicker: InstanceTicker): InstanceTickerRecord {\n            return InstanceTickerRecord(\n                uri = instanceTicker.uri,\n                faviconUrl = instanceTicker.faviconUrl,\n                iconUrl = instanceTicker.iconUrl,\n                name = instanceTicker.name,\n                softwareName = instanceTicker.softwareName,\n                softwareVersion = instanceTicker.softwareVersion,\n                themeColor = instanceTicker.themeColor,\n                cachedAt = Clock.System.now(),\n            )\n        }\n    }\n\n    fun toModel(): InstanceTicker {\n        return InstanceTicker(\n            uri = uri,\n            faviconUrl = faviconUrl,\n            iconUrl = iconUrl,\n            name = name,\n            softwareName = softwareName,\n            softwareVersion = softwareVersion,\n            themeColor = themeColor,\n        )\n    }\n\n    fun isRecordExpired(): Boolean {\n        return cachedAt < Clock.System.now().minus(7.days)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/list/UserListDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.list\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface UserListDao {\n\n    @Query(\n        \"\"\"select * from user_list where accountId = :accountId\"\"\"\n    )\n    @Transaction\n    fun observeUserListRelatedWhereByAccountId(\n        accountId: Long,\n    ): Flow<List<UserListRelatedRecord>>\n\n    @Query(\n        \"\"\"select * from user_list where accountId = :accountId\"\"\"\n    )\n    @Transaction\n    suspend fun findUserListRelatedWhereByAccountId(\n        accountId: Long,\n    ): List<UserListRelatedRecord>\n\n    @Query(\n        \"\"\"\n            select * from user_list where accountId = :accountId\n                and serverId in (:serverIds)\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findUserListWhereIn(\n        accountId: Long,\n        serverIds: List<String>\n    ): List<UserListRecord>\n\n    @Query(\n        \"\"\"\n            select * from user_list \n                where accountId = :accountId\n                and serverId = :serverId\n            \"\"\"\n    )\n    @Transaction\n    suspend fun findByServerId(\n        accountId: Long,\n        serverId: String\n    ): UserListRelatedRecord?\n\n    @Query(\n        \"\"\"\n            select * from user_list \n                where accountId = :accountId\n                and serverId = :serverId\n            \"\"\"\n    )\n    @Transaction\n    fun observeByServerId(\n        accountId: Long,\n        serverId: String,\n    ): Flow<UserListRelatedRecord?>\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insert(userList: UserListRecord): Long\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertAll(userList: List<UserListRecord>): List<Long>\n\n    @Update\n    suspend fun update(userListRecord: UserListRecord)\n\n    @Query(\n        \"\"\"\n            delete from user_list_member\n                where userListId = :userListId\n        \"\"\"\n    )\n    suspend fun detachUserIds(userListId: Long)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun attachMemberIds(memberIds: List<UserListMemberIdRecord>)\n\n    @Query(\n        \"\"\"\n            delete from user_list\n                where accountId = :accountId\n        \"\"\"\n    )\n    suspend fun deleteByAccountId(accountId: Long)\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/list/UserListRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.list\n\nimport androidx.room.*\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.user.User\n\n@Entity(\n    tableName = \"user_list\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"accountId\"],\n            entity = AccountRecord::class,\n            childColumns = [\"accountId\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        ),\n    ],\n    indices = [\n        Index(\"accountId\"),\n        Index(\"serverId\"),\n        Index(\"accountId\", \"serverId\", unique = true)\n    ]\n)\ndata class UserListRecord(\n    @ColumnInfo(name = \"serverId\")\n    val serverId: String,\n\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"createdAt\")\n    val createdAt: Instant,\n\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true)\n    val id: Long = 0L\n)\n\n@Entity(\n    tableName = \"user_list_member\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"userListId\"],\n            entity = UserListRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        ),\n    ],\n    indices = [\n        Index(\"userListId\"),\n        Index(\"userListId\", \"userId\", unique = true)\n    ]\n)\ndata class UserListMemberIdRecord(\n    @ColumnInfo(name = \"userListId\")\n    val userListId: Long,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: String,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true)\n    val id: Long = 0L,\n)\n\n@DatabaseView(\n    \"\"\"\n        select m.userListId, u.id as userId, u.avatarUrl, u.serverId from user_list_member as m \n            inner join user_list as ul\n            inner join user as u\n            on m.userListId = ul.id\n                and m.userId = u.serverId\n                and ul.accountId = u.accountId\n    \"\"\",\n    viewName = \"user_list_member_view\"\n)\ndata class UserListMemberView(\n    val userListId: Long,\n    val avatarUrl: String?,\n    val userId: Long,\n    val serverId: String,\n)\n\n\ndata class UserListRelatedRecord(\n    @Embedded val userList: UserListRecord,\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userListId\",\n        entity = UserListMemberIdRecord::class\n    )\n    val userIds: List<UserListMemberIdRecord>,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userListId\",\n        entity = UserListMemberView::class\n    )\n    val members: List<UserListMemberView>,\n) {\n\n    fun toModel(): UserList {\n        return UserList(\n            id = UserList.Id(accountId = userList.accountId, userList.serverId),\n            createdAt = userList.createdAt,\n            name = userList.name,\n            userIds = userIds.map {\n                User.Id(userList.accountId, it.userId)\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/list/UserListRepositoryWebAPIImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.list\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.mastodon.list.CreateListRequest\nimport net.pantasystem.milktea.api.mastodon.list.ListDTO\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.list.CreateList\nimport net.pantasystem.milktea.api.misskey.list.ListId\nimport net.pantasystem.milktea.api.misskey.list.ListUserOperation\nimport net.pantasystem.milktea.api.misskey.list.UpdateList\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.toEntity\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.list.UserListMember\nimport net.pantasystem.milktea.model.list.UserListRepository\nimport net.pantasystem.milktea.model.list.UserListWithMembers\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UserListRepositoryWebAPIImpl @Inject constructor(\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val accountRepository: AccountRepository,\n    private val userListDao: UserListDao,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : UserListRepository {\n    override suspend fun findByAccountId(accountId: Long): List<UserList> {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val api = misskeyAPIProvider.get(account)\n                    val body = api.userList(I(account.token))\n                        .throwIfHasError()\n                        .body()\n                    body!!.map {\n                        it.toEntity(account)\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val body = mastodonAPIProvider.get(account).getMyLists()\n                        .throwIfHasError()\n                        .body()\n                    body!!.map {\n                        it.toModel(account)\n                    }\n                }\n            }\n\n        }\n    }\n\n    override suspend fun create(accountId: Long, name: String): UserList {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val res = misskeyAPIProvider.get(account).createList(\n                        CreateList(\n                            account.token,\n                            name = name\n                        )\n                    ).throwIfHasError()\n                    res.body()!!.toEntity(account).also {\n                        upsert(it)\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val res = mastodonAPIProvider.get(account)\n                        .createList(\n                            CreateListRequest(\n                                title = name,\n                                repliesPolicy = ListDTO.RepliesPolicyType.List,\n                            )\n                        ).throwIfHasError()\n                    res.body()!!.toModel(account).also {\n                        upsert(it)\n                    }\n                }\n            }\n\n        }\n    }\n\n    override suspend fun update(listId: UserList.Id, name: String) {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(listId.accountId).getOrThrow()\n            misskeyAPIProvider.get(account).updateList(\n                UpdateList(\n                    account.token,\n                    name = name,\n                    listId = listId.userListId\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun appendUser(\n        listId: UserList.Id,\n        userId: User.Id\n    ) {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(listId.accountId).getOrThrow()\n            val misskeyAPI = misskeyAPIProvider.get(account)\n            misskeyAPI.pushUserToList(\n                ListUserOperation(\n                    userId = userId.id,\n                    listId = listId.userListId,\n                    i = account.token\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun removeUser(\n        listId: UserList.Id,\n        userId: User.Id\n    ) {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(listId.accountId).getOrThrow()\n            val misskeyAPI = misskeyAPIProvider.get(account)\n            misskeyAPI.pullUserFromList(\n                ListUserOperation(\n                    userId = userId.id,\n                    listId = listId.userListId,\n                    i = account.token\n                )\n            ).throwIfHasError()\n        }\n    }\n\n    override suspend fun delete(listId: UserList.Id) {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(listId.accountId).getOrThrow()\n            val misskeyAPI = misskeyAPIProvider.get(account)\n            misskeyAPI.deleteList(ListId(account.token, listId.userListId))\n                .throwIfHasError()\n        }\n    }\n\n    override suspend fun findOne(userListId: UserList.Id): UserList {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(userListId.accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val misskeyAPI = misskeyAPIProvider.get(account)\n                    val res = misskeyAPI.showList(ListId(account.token, userListId.userListId))\n                        .throwIfHasError()\n                    res.body()!!.toEntity(account)\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val res = mastodonAPIProvider.get(account).getList(userListId.userListId)\n                        .throwIfHasError()\n                    requireNotNull(res.body()).toModel(account)\n                }\n            }\n\n        }\n    }\n\n    override fun observeByAccountId(accountId: Long): Flow<List<UserListWithMembers>> {\n        return userListDao.observeUserListRelatedWhereByAccountId(accountId)\n            .map { list ->\n                list.map { relatedRecord ->\n                    UserListWithMembers(\n                        userList = relatedRecord.toModel(),\n                        members = relatedRecord.members.map { member ->\n                            UserListMember(\n                                avatarUrl = member.avatarUrl,\n                                userId = User.Id(relatedRecord.userList.accountId, member.serverId)\n                            )\n                        }\n                    )\n                }\n            }\n    }\n\n    override suspend fun syncByAccountId(accountId: Long): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val source = findByAccountId(accountId)\n            upInsertAll(accountId, source)\n        }\n    }\n\n    override suspend fun syncOne(userListId: UserList.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val source = findOne(userListId)\n            upsert(source)\n        }\n\n    }\n\n    override fun observeOne(userListId: UserList.Id): Flow<UserListWithMembers?> {\n        return userListDao.observeByServerId(userListId.accountId, userListId.userListId)\n            .distinctUntilChanged()\n            .map { relatedRecord ->\n                relatedRecord?.let {\n                    UserListWithMembers(\n                        userList = relatedRecord.toModel(),\n                        members = relatedRecord.members.map { member ->\n                            UserListMember(\n                                avatarUrl = member.avatarUrl,\n                                userId = User.Id(relatedRecord.userList.accountId, member.serverId)\n                            )\n                        }\n                    )\n                }\n            }.flowOn(ioDispatcher)\n    }\n\n    private suspend fun upsert(source: UserList) {\n        val beforeInsertRecord = UserListRecord(\n            serverId = source.id.userListId,\n            accountId = source.id.accountId,\n            createdAt = source.createdAt,\n            name = source.name,\n        )\n        val resultId = userListDao.insert(\n            beforeInsertRecord\n        )\n\n        val id = if (resultId == -1L) {\n            val exists = userListDao.findByServerId(source.id.accountId, source.id.userListId)!!\n            userListDao.update(\n                beforeInsertRecord.copy(\n                    id = exists.userList.id\n                )\n            )\n            exists.userList.id\n        } else {\n            resultId\n        }\n        userListDao.detachUserIds(id)\n        userListDao.attachMemberIds(\n            source.userIds.map {\n                UserListMemberIdRecord(\n                    id,\n                    userId = it.id\n                )\n            }\n        )\n    }\n\n    private suspend fun upInsertAll(accountId: Long, source: List<UserList>) {\n        val beforeInsertRecords = source.map { ul ->\n            UserListRecord(\n                serverId = ul.id.userListId,\n                accountId = ul.id.accountId,\n                createdAt = ul.createdAt,\n                name = ul.name,\n            )\n        }\n        val resultIds = userListDao.insertAll(beforeInsertRecords)\n        val localLists =\n            userListDao.findUserListWhereIn(accountId, source.map { it.id.userListId })\n\n        val ids = resultIds.mapIndexed { index, resultId ->\n            if (resultId == -1L) {\n                localLists[index].id\n            } else {\n                resultId\n            }\n        }\n        resultIds.forEachIndexed { index, l ->\n            if (l == -1L) {\n                val id = ids[index]\n                val updateTarget = beforeInsertRecords[index]\n                userListDao.update(updateTarget.copy(id = id))\n            }\n        }\n\n\n\n        ids.forEachIndexed { index, l ->\n            userListDao.detachUserIds(l)\n            userListDao.attachMemberIds(\n                source[index].userIds.map {\n                    UserListMemberIdRecord(\n                        userId = it.id,\n                        userListId = l\n                    )\n                }\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/markers/MarkerCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.markers\n\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.model.markers.MarkerType\nimport net.pantasystem.milktea.model.markers.Markers\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass MarkerCache @Inject constructor() {\n\n    private var markersMap = mapOf<Key, Markers>()\n    private val mutex = Mutex()\n\n    suspend fun put(key: Key, markers: Markers) {\n        mutex.withLock {\n            markersMap = markersMap.toMutableMap().also {\n                it[key] = markers\n            }\n        }\n    }\n\n    fun get(key: Key): Markers? {\n        return markersMap[key]\n    }\n\n    data class Key(\n        val accountId: Long,\n        val types: List<MarkerType>\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/markers/MarkerRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.markers\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.mastodon.marker.SaveMarkersRequest\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.markers.MarkerRepository\nimport net.pantasystem.milktea.model.markers.MarkerType\nimport net.pantasystem.milktea.model.markers.Markers\nimport net.pantasystem.milktea.model.markers.SaveMarkerParams\nimport javax.inject.Inject\n\nclass MarkerRepositoryImpl @Inject constructor(\n    val accountRepository: AccountRepository,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    private val cache: MarkerCache,\n    @IODispatcher val coroutineDispatcher: CoroutineDispatcher\n) : MarkerRepository {\n\n    override suspend fun find(accountId: Long, types: List<MarkerType>): Result<Markers> = runCancellableCatching{\n        withContext(coroutineDispatcher) {\n            when(val marker = cache.get(MarkerCache.Key(accountId, types))) {\n                null -> Unit\n                else -> return@withContext marker\n            }\n            val account = accountRepository.get(accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> throw IllegalArgumentException(\"Not support markers feature when use misskey.\")\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val body = mastodonAPIProvider.get(account).getMarkers(types.map {\n                        it.name.lowercase()\n                    }).throwIfHasError().body()\n                    val markers = Markers(\n                        home = requireNotNull(body).home?.toModel(),\n                        notifications = body.notifications?.toModel()\n                    )\n                    cache.put(MarkerCache.Key(accountId, types), markers)\n                    markers\n                }\n            }\n        }\n    }\n\n    override suspend fun save(accountId: Long, params: SaveMarkerParams): Result<Markers> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> throw IllegalArgumentException(\"Not support markers feature when use misskey.\")\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val body = mastodonAPIProvider.get(account).saveMarkers(\n                        markers = SaveMarkersRequest(\n                            home = params.home?.let {\n                                SaveMarkersRequest.SaveParams(it)\n                            },\n                            notifications = params.notifications?.let {\n                                SaveMarkersRequest.SaveParams(it)\n                            }\n                        )\n                    ).throwIfHasError().body()\n                    val markers = Markers(\n                        home = requireNotNull(body).home?.toModel(),\n                        notifications = body.notifications?.toModel()\n                    )\n                    cache.put(MarkerCache.Key(accountId, listOfNotNull(\n                        if (params.home == null) null else MarkerType.Home,\n                        if (params.notifications == null) null else MarkerType.Notifications\n                    )), markers)\n                    markers\n                }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/messaging/MessageDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.messaging\n\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.map\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport net.pantasystem.milktea.model.messaging.UnReadMessages\nimport javax.inject.Inject\n\ninterface MessageDataSource {\n    suspend fun add(message: Message): Result<AddResult>\n\n    suspend fun addAll(messages: List<Message>): Result<List<AddResult>>\n\n    suspend fun delete(messageId: Message.Id): Result<Boolean>\n\n    suspend fun find(messageId: Message.Id): Result<Message?>\n\n    suspend fun readAllMessages(accountId: Long): Result<Unit>\n}\n\nclass InMemoryMessageDataSource @Inject constructor(\n    private val accountRepository: AccountRepository\n) : MessageDataSource, UnReadMessages {\n\n    private val messageIdAndMessage = mutableMapOf<Message.Id, Message>()\n    private val messagesState = MutableStateFlow(\n        synchronized(messageIdAndMessage){\n            messageIdAndMessage.values.toList()\n        }\n    )\n\n    override suspend fun add(message: Message): Result<AddResult> = runCancellableCatching {\n        createOrUpdate(message).also {\n            updateState()\n        }\n    }\n\n    override suspend fun addAll(messages: List<Message>): Result<List<AddResult>> = runCancellableCatching {\n        messages.map {\n            add(it).getOrElse { AddResult.Canceled }\n        }\n    }\n\n    override suspend fun delete(messageId: Message.Id): Result<Boolean> = runCancellableCatching {\n        remove(messageId).also {\n            updateState()\n        }\n    }\n\n    override suspend fun find(messageId: Message.Id): Result<Message?> {\n        return Result.success(get(messageId))\n    }\n\n    override fun findByMessagingId(messagingId: MessagingId): Flow<List<Message>> {\n        return messagesState.map {\n            val ac = accountRepository.get(messagingId.accountId).getOrThrow()\n            it.filterNot { msg ->\n                msg.isRead || msg.userId.id == ac.remoteId\n            }.filter { msg ->\n                messagingId == msg.messagingId(ac)\n            }\n        }\n    }\n\n    override fun findByAccountId(accountId: Long): Flow<List<Message>> {\n        return messagesState.map {\n            val ac = accountRepository.get(accountId).getOrThrow()\n            it.filterNot { msg ->\n                msg.isRead || msg.userId.id == ac.remoteId\n            }.filter { msg ->\n                msg.id.accountId == accountId\n            }\n        }\n    }\n\n    override fun findAll(): Flow<List<Message>> {\n        return messagesState.map {\n            it.filterNot { msg ->\n                val ac = accountRepository.get(msg.id.accountId).getOrThrow()\n                msg.isRead || msg.userId.id == ac.remoteId\n            }\n        }\n    }\n\n    override suspend fun readAllMessages(accountId: Long): Result<Unit> = runCancellableCatching {\n        readAllMessagesByAccountId(accountId)\n        updateState()\n    }\n\n    private fun readAllMessagesByAccountId(accountId: Long) {\n        synchronized(messageIdAndMessage) {\n            messageIdAndMessage.keys.filter {\n                it.accountId == accountId\n            }.mapNotNull {\n                messageIdAndMessage[it]\n            }.filterNot {\n                it.isRead\n            }.map {\n                it.read()\n            }.forEach {\n                messageIdAndMessage[it.id] = it\n            }\n        }\n    }\n\n    private fun createOrUpdate(message: Message): AddResult {\n        synchronized(messageIdAndMessage) {\n            messageIdAndMessage[message.id]?.let{\n                messageIdAndMessage[message.id] = message\n                return AddResult.Updated\n            }\n            messageIdAndMessage[message.id] = message\n            return AddResult.Created\n        }\n    }\n\n    private fun get(messageId: Message.Id): Message? {\n        synchronized(messageIdAndMessage) {\n            return messageIdAndMessage[messageId]\n        }\n    }\n\n    private fun remove(messageId: Message.Id): Boolean {\n        synchronized(messageIdAndMessage) {\n            return messageIdAndMessage.remove(messageId) != null\n        }\n    }\n\n    private fun updateState() {\n        synchronized(messageIdAndMessage) {\n            this.messagesState.value = messageIdAndMessage.values.toList()\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/messaging/MessageObserverImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.messaging\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.channel.ChannelAPI\nimport net.pantasystem.milktea.data.streaming.ChannelAPIWithAccountProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.MessageObserver\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\n@Singleton\nclass MessageObserverImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val channelAPIProvider: ChannelAPIWithAccountProvider,\n    private val messageAdder: MessageAdder,\n) : MessageObserver {\n\n\n    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n    override fun observeAllAccountsMessages(): Flow<Message>{\n        return suspend {\n            accountRepository.findAll().getOrThrow()\n        }.asFlow().flatMapLatest {\n            it.map{ ac ->\n                observeAccountMessages(ac)\n            }.merge()\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun observeByMessagingId(messagingId: MessagingId): Flow<Message>{\n        return flow {\n            val accountId = when(messagingId) {\n                is MessagingId.Direct -> messagingId.userId.accountId\n                is MessagingId.Group -> messagingId.groupId.accountId\n            }\n            emit(accountRepository.get(accountId).getOrNull())\n        }.filterNotNull().filter {\n            it.instanceType == Account.InstanceType.MISSKEY || it.instanceType == Account.InstanceType.FIREFISH\n        }.flatMapLatest { ac ->\n            requireNotNull(channelAPIProvider.get(ac)).connect(ChannelAPI.Type.Main).map{\n                (it as? ChannelBody.Main.MessagingMessage)?.body\n            }.filterNotNull().map {\n                messageAdder.add(ac, it)\n            }.map {\n                it.message\n            }.filter {\n                messagingId == it.messagingId(ac)\n            }\n        }\n    }\n\n\n    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n    override fun observeAccountMessages(ac: Account): Flow<Message>{\n        return suspend {\n            channelAPIProvider.get(ac)\n        }.asFlow().filterNotNull().flatMapLatest {\n            it.connect(ChannelAPI.Type.Main)\n        }.map{\n            (it as? ChannelBody.Main.MessagingMessage)?.body\n        }.filterNotNull().map {\n            messageAdder.add(ac, it)\n        }.map {\n            it.message\n        }\n    }\n\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/messaging/MessagePagingStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.messaging\n\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.misskey.messaging.MessageDTO\nimport net.pantasystem.milktea.api.misskey.messaging.RequestMessage\nimport net.pantasystem.milktea.app_store.messaging.MessagePagingStore\nimport net.pantasystem.milktea.app_store.messaging.MessagingPagingState\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.*\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport javax.inject.Inject\n\nclass MessagePagingStoreImpl @Inject constructor(\n    val getAccount: GetAccount,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    messageAdder: MessageAdder,\n) : MessagePagingStore {\n\n    private val messagePagingModel: MessagePagingModel = MessagePagingModel(\n        getAccount = getAccount,\n        misskeyAPIProvider = misskeyAPIProvider,\n        messageAdder = messageAdder,\n    )\n\n\n    private val receivedMessageQueue = MutableSharedFlow<Message.Id>(\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n        extraBufferCapacity = 1000\n    )\n\n    override suspend fun setMessagingId(messagingId: MessagingId) {\n        this.messagePagingModel.messagingId = messagingId\n    }\n\n\n    override val state: Flow<MessagingPagingState>\n        get() = messagePagingModel.state.map {\n            MessagingPagingState(it)\n        }\n\n    private var latestReceivedMessageId: Message.Id? = null\n\n    private val previousPagingController = MessagingPreviousPaging(\n        messagePagingModel,\n        messagePagingModel,\n        messagePagingModel,\n        messagePagingModel,\n    )\n\n\n    override suspend fun clear() {\n        messagePagingModel.mutex.withLock {\n            messagePagingModel.setState(PageableState.Loading.Init())\n        }\n    }\n\n\n    override suspend fun loadPrevious() {\n        latestReceivedMessageId = null\n        previousPagingController.loadPrevious()\n    }\n\n    override fun onReceiveMessage(msg: Message.Id) {\n        receivedMessageQueue.tryEmit(msg)\n    }\n\n    override fun latestReceivedMessageId(): Message.Id? {\n        return latestReceivedMessageId\n    }\n\n    override suspend fun collectReceivedMessageQueue(): Nothing {\n        receivedMessageQueue.collect { msgId ->\n            messagePagingModel.mutex.withLock {\n                val state = messagePagingModel.getState()\n                val existsItem = when (val content = state.content) {\n                    is StateContent.Exist -> {\n                        content.rawContent.contains(msgId)\n                    }\n                    is StateContent.NotExist -> false\n                }\n                if(!existsItem) {\n                    latestReceivedMessageId = msgId\n                }\n                messagePagingModel.setState(\n                    state.convert {\n                        if (existsItem) {\n                            it\n                        } else {\n                            it + msgId\n                        }\n                    }\n                )\n            }\n        }\n    }\n}\n\nclass MessagingPreviousPaging<DTO, E>(\n    private val entityConverter: EntityConverter<DTO, E>,\n    private val locker: StateLocker,\n    private val state: PaginationState<E>,\n    private val previousLoader: PreviousLoader<DTO>\n) {\n\n\n    suspend fun loadPrevious() {\n        locker.mutex.withLock {\n            runCancellableCatching {\n                val body = previousLoader.loadPrevious().getOrThrow().asReversed()\n                entityConverter.convertAll(body)\n            }.onFailure {\n                val errorState = PageableState.Error(\n                    state.getState().content,\n                    it\n                )\n                state.setState(errorState)\n            }.onSuccess {\n                when(val content = this.state.getState().content) {\n                    is StateContent.Exist -> {\n                        val newList = content.rawContent.toMutableList()\n                        newList.addAll(0, it)\n                        state.setState(\n                            PageableState.Fixed(\n                                StateContent.Exist(\n                                    newList\n                                )\n                            )\n                        )\n                    }\n                    is StateContent.NotExist -> {\n                        state.setState(\n                            PageableState.Fixed(\n                                StateContent.Exist(it)\n                            )\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n}\n\n\nclass MessagePagingModel(\n    val getAccount: GetAccount,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    private val messageAdder: MessageAdder,\n    var messagingId: MessagingId? = null,\n) : StateLocker, PreviousLoader<MessageDTO>, FutureLoader<MessageDTO>,\n    IdGetter<Message.Id>, PaginationState<Message.Id>, EntityConverter<MessageDTO, Message.Id> {\n\n    override val mutex: Mutex = Mutex()\n\n    private val _state = MutableStateFlow<PageableState<List<Message.Id>>>(\n        PageableState.Loading.Init()\n    )\n\n    override val state: Flow<PageableState<List<Message.Id>>> = _state\n\n    override suspend fun getSinceId(): Message.Id? {\n        return null\n    }\n\n    override fun getState(): PageableState<List<Message.Id>> {\n        return _state.value\n    }\n\n    override suspend fun getUntilId(): Message.Id? {\n        return (_state.value.content as? StateContent.Exist)?.rawContent?.firstOrNull()\n    }\n\n    override suspend fun loadFuture(): Result<List<MessageDTO>> = runCancellableCatching {\n        require(messagingId != null) {\n            \"messagingIdがNullの段階で読み込みはできません\"\n        }\n        val account = getAccount.get(messagingId!!.accountId)\n        misskeyAPIProvider.get(account).getMessages(\n            RequestMessage(\n                i = account.token,\n                sinceId = getSinceId()?.messageId,\n                groupId = (messagingId as? MessagingId.Group)?.groupId?.groupId,\n                userId = (messagingId as? MessagingId.Direct)?.userId?.id\n            )\n        ).throwIfHasError().body()!!\n    }\n\n    override suspend fun loadPrevious(): Result<List<MessageDTO>> = runCancellableCatching {\n        require(messagingId != null) {\n            \"messagingIdがNullの段階で読み込みはできません\"\n        }\n        val account = getAccount.get(messagingId!!.accountId)\n        misskeyAPIProvider.get(account).getMessages(\n            RequestMessage(\n                i = account.token,\n                untilId = getUntilId()?.messageId,\n                groupId = (messagingId as? MessagingId.Group)?.groupId?.groupId,\n                userId = (messagingId as? MessagingId.Direct)?.userId?.id\n            )\n        ).throwIfHasError().body()!!\n    }\n\n    override fun setState(state: PageableState<List<Message.Id>>) {\n        _state.value = state\n    }\n\n    override suspend fun convertAll(list: List<MessageDTO>): List<Message.Id> {\n        val account = getAccount.get(messagingId!!.accountId)\n        return list.map {\n            messageAdder.add(account, it)\n        }.map {\n            it.message.id\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/messaging/MessageRelationGetterImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.messaging\n\nimport net.pantasystem.milktea.api.misskey.messaging.MessageDTO\nimport net.pantasystem.milktea.data.converters.FilePropertyDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.toGroup\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.group.GroupDataSource\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.MessageNotFoundException\nimport net.pantasystem.milktea.model.messaging.MessageRelation\nimport net.pantasystem.milktea.model.messaging.MessageRelationGetter\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\ninterface MessageAdder {\n    suspend fun add(account: Account, messageDTO: MessageDTO): MessageRelation\n}\n\n@Singleton\nclass MessageRelationGetterImpl @Inject constructor(\n    private val messageDataSource: MessageDataSource,\n    private val userDataSource: UserDataSource,\n    private val groupDataSource: GroupDataSource,\n    private val accountRepository: AccountRepository,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n) : MessageRelationGetter, MessageAdder {\n\n    override suspend fun add(account: Account, messageDTO: MessageDTO): MessageRelation {\n        val (message, users) = messageDTO.entities(\n            account,\n            userDTOEntityConverter,\n            filePropertyDTOEntityConverter\n        )\n        messageDataSource.add(message)\n        userDataSource.addAll(users)\n        messageDTO.group?.let {\n            groupDataSource.add(it.toGroup(account.accountId))\n        }\n        return get(message)\n    }\n\n    @Throws(MessageNotFoundException::class)\n    override suspend fun get(messageId: Message.Id): MessageRelation {\n        val message = messageDataSource.find(messageId).getOrNull()\n            ?: throw MessageNotFoundException(messageId)\n        return get(message)\n    }\n\n    override suspend fun get(message: Message): MessageRelation {\n\n        return when (message) {\n            is Message.Direct -> {\n                MessageRelation.Direct(\n                    message,\n                    userDataSource.get(message.userId).getOrThrow(),\n                    accountRepository.get(message.id.accountId).getOrThrow()\n                )\n            }\n            is Message.Group -> {\n                MessageRelation.Group(\n                    message,\n                    userDataSource.get(message.userId).getOrThrow(),\n                    accountRepository.get(message.id.accountId).getOrThrow()\n                )\n            }\n        }\n    }\n}\n\n\nsuspend fun MessageDTO.entities(\n    account: Account,\n    userDTOEntityConverter: UserDTOEntityConverter,\n    filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n): Pair<Message, List<User>> {\n    val list = mutableListOf<User>()\n    val id = Message.Id(account.accountId, id)\n    list.add(userDTOEntityConverter.convert(account, user))\n    val message = if (groupId == null) {\n        require(recipientId != null)\n        Message.Direct(\n            id,\n            createdAt,\n            text,\n            User.Id(account.accountId, userId),\n            fileId,\n            file?.let {\n                filePropertyDTOEntityConverter.convert(it, account)\n            },\n            isRead,\n            emojis?.map { it.toModel() } ?: emptyList(),\n            recipientId = User.Id(account.accountId, recipientId!!)\n        )\n    } else {\n        Message.Group(\n            id,\n            createdAt,\n            text,\n            User.Id(account.accountId, userId),\n            fileId,\n            file?.let {\n                filePropertyDTOEntityConverter.convert(it, account)\n            },\n            isRead = reads?.contains(account.remoteId) ?: false,\n            emojis?.map { it.toModel() } ?: emptyList(),\n            Group.Id(account.accountId, groupId!!),\n            reads = reads?.map {\n                User.Id(account.accountId, it)\n            } ?: emptyList()\n        )\n    }\n    return message to list\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/messaging/MessageRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.messaging\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.messaging.MessageAction\nimport net.pantasystem.milktea.api.misskey.messaging.MessageDTO\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.messaging.CreateMessage\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.MessageRepository\nimport java.io.IOException\nimport javax.inject.Inject\n\n@Suppress(\"BlockingMethodInNonBlockingContext\")\nclass MessageRepositoryImpl @Inject constructor(\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val messageDataSource: MessageDataSource,\n    val accountRepository: AccountRepository,\n    val messageAdder: MessageAdder,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : MessageRepository {\n\n    @Throws(IOException::class)\n    override suspend fun read(messageId: Message.Id): Boolean {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(messageId.accountId).getOrThrow()\n            val result = misskeyAPIProvider.get(account).readMessage(\n                MessageAction(\n                    account.token,\n                    null,\n                    null,\n                    null,\n                    null,\n                    messageId.messageId\n                )\n            ).isSuccessful\n\n            if (result) {\n                messageDataSource.find(messageId).getOrNull()?.read()?.let {\n                    messageDataSource.add(it)\n                }\n            }\n\n            result\n        }\n    }\n\n    @Throws(IOException::class)\n    override suspend fun create(createMessage: CreateMessage): Message {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(createMessage.accountId).getOrThrow()\n            val i = account.token\n            val action = when (createMessage) {\n                is CreateMessage.Group -> {\n                    MessageAction(\n                        i,\n                        groupId = createMessage.groupId.groupId,\n                        text = createMessage.text,\n                        fileId = createMessage.fileId,\n                        messageId = null,\n                        userId = null\n                    )\n                }\n                is CreateMessage.Direct -> {\n                    MessageAction(\n                        i,\n                        groupId = null,\n                        text = createMessage.text,\n                        fileId = createMessage.fileId,\n                        messageId = null,\n                        userId = createMessage.userId.id\n                    )\n                }\n            }\n\n            val body: MessageDTO = misskeyAPIProvider.get(account).createMessage(action)\n                .throwIfHasError()\n                .body() ?: throw IllegalStateException(\"メッセージの作成に失敗しました\")\n\n            messageAdder.add(account, body).message\n        }\n    }\n\n    @Throws(IOException::class)\n    override suspend fun delete(messageId: Message.Id): Boolean {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(messageId.accountId).getOrThrow()\n            val result = misskeyAPIProvider.get(account).deleteMessage(\n                MessageAction(\n                    account.token,\n                    null,\n                    null,\n                    null,\n                    null,\n                    messageId.messageId\n                )\n            ).isSuccessful\n\n            if (result) {\n                messageDataSource.delete(messageId)\n            }\n\n            result\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/messaging/MessagingRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.messaging\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.toGroup\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.group.GroupDataSource\nimport net.pantasystem.milktea.model.messaging.MessageRelation\nimport net.pantasystem.milktea.model.messaging.MessagingRepository\nimport net.pantasystem.milktea.api.misskey.messaging.RequestMessageHistory\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\n\nclass MessagingRepositoryImpl @Inject constructor(\n    private val getAccount: GetAccount,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val groupDataSource: GroupDataSource,\n    private val userDataSource: UserDataSource,\n    private val messageAdder: MessageAdder,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : MessagingRepository {\n\n    override suspend fun findMessageSummaries(\n        accountId: Long,\n        isGroup: Boolean\n    ): Result<List<MessageRelation>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(accountId)\n            val request = RequestMessageHistory(\n                i = account.token, group = isGroup, limit = 100\n            )\n\n            val res = misskeyAPIProvider.get(account).getMessageHistory(request)\n            res.throwIfHasError()\n            res.body()!!.map {\n                it.group?.let { groupDTO ->\n                    groupDataSource.add(groupDTO.toGroup(account.accountId))\n                }\n                it.recipient?.let { userDTO ->\n                    userDataSource.add(userDTOEntityConverter.convert(account, userDTO))\n                }\n                messageAdder.add(account, it)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/nodeinfo/NodeInfoCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.nodeinfo\n\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass NodeInfoCache @Inject constructor() {\n    private val hostAndNodeInfo = mutableMapOf<String, NodeInfo>()\n\n    fun put(host: String, info: NodeInfo) {\n        synchronized(hostAndNodeInfo) {\n            hostAndNodeInfo[host] = info\n        }\n    }\n\n    fun get(host: String): NodeInfo? {\n        return synchronized(hostAndNodeInfo) {\n            hostAndNodeInfo[host]\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/nodeinfo/NodeInfoFetcher.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.nodeinfo\n\nimport net.pantasystem.milktea.api.activitypub.NodeInfoDTO\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.NodeInfoAPIBuilder\nimport javax.inject.Inject\n\ninterface NodeInfoFetcher {\n    suspend fun fetch(host: String): NodeInfoDTO?\n}\n\nclass NodeInfoFetcherImpl @Inject constructor(\n    private val nodeInfoAPIBuilder: NodeInfoAPIBuilder,\n    private val loggerFactory: Logger.Factory\n): NodeInfoFetcher {\n\n    val logger by lazy {\n        loggerFactory.create(\"NodeInfoFetcher\")\n    }\n\n    override suspend fun fetch(host: String): NodeInfoDTO? {\n        try {\n            val nodeInfoUrl = nodeInfoAPIBuilder.buildWellKnown(\"https://$host\")\n                .getWellKnownNodeInfo()\n                .throwIfHasError()\n                .body()?.links?.firstOrNull {\n                    it.rel.contains(\"2.0\")\n                }?.href ?: \"https://$host/nodeinfo/2.0\"\n            logger.debug(\"NodeInfoRepositoryImpl\", \"nodeInfoUrl:$nodeInfoUrl\")\n            return nodeInfoAPIBuilder.build().getNodeInfo(nodeInfoUrl).throwIfHasError().body()\n        } catch(e: Throwable) {\n            logger.error(\"error\", e)\n            throw e\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/nodeinfo/NodeInfoRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.nodeinfo\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.activitypub.NodeInfoDTO\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.db.NodeInfoDao\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.db.NodeInfoRecord\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport javax.inject.Inject\n\nclass NodeInfoRepositoryImpl @Inject constructor(\n    private val fetcher: NodeInfoFetcher,\n    private val cache: NodeInfoCache,\n    private val nodeInfoDao: NodeInfoDao,\n    @IODispatcher val ioDispatcher: CoroutineDispatcher,\n): NodeInfoRepository {\n\n    override suspend fun find(host: String): Result<NodeInfo> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val inCache = cache.get(host)\n            if (inCache != null) {\n                return@withContext inCache\n            }\n\n            val inDb = nodeInfoDao.find(host)\n            if (inDb != null) {\n                return@withContext inDb.toModel().also {\n                    cache.put(host, it)\n                }\n            }\n\n            val fetched = requireNotNull(fetcher.fetch(host)).toModel(host)\n            upInsert(fetched)\n            cache.put(host, fetched)\n            fetched\n\n        }\n\n    }\n\n    override fun get(host: String): NodeInfo? {\n        return cache.get(host)\n    }\n\n    override fun observe(host: String): Flow<NodeInfo?> {\n        return nodeInfoDao.observe(host).map {\n            it?.toModel()\n        }.onEach {\n            if (it != null) {\n                cache.put(host, it)\n            }\n        }\n    }\n\n    override suspend fun syncAll(): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            nodeInfoDao.findAll().map {\n                sync(it.host)\n            }.forEach {\n                it.getOrThrow()\n            }\n        }\n    }\n\n    override suspend fun sync(host: String): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val nodeInfo = requireNotNull(fetcher.fetch(host)).toModel(host)\n            cache.put(host, nodeInfo)\n            upInsert(nodeInfo)\n        }\n    }\n\n    private suspend fun upInsert(nodeInfo: NodeInfo) {\n        nodeInfoDao.upInsert(NodeInfoRecord.from(nodeInfo))\n    }\n\n\n}\n\nfun NodeInfoDTO.toModel(host: String): NodeInfo {\n    return NodeInfo(\n        host = host,\n        version = version,\n        software = NodeInfo.Software(\n            name = software.name,\n            version = software.version\n        )\n    )\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/nodeinfo/db/NodeInfoDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.nodeinfo.db\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface NodeInfoDao {\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insert(nodeInfo: NodeInfoRecord): Long\n\n    @Update\n    suspend fun update(nodeInfo: NodeInfoRecord)\n\n    @Delete\n    suspend fun delete(nodeInfo: NodeInfoRecord)\n\n    @Query(\"select * from nodeinfo where host = :host limit 1\")\n    fun observe(host: String): Flow<NodeInfoRecord?>\n\n    @Query(\"select * from nodeinfo where host = :host limit 1\")\n    suspend fun find(host: String): NodeInfoRecord?\n\n    @Query(\"select * from nodeinfo\")\n    suspend fun findAll(): List<NodeInfoRecord>\n\n    @Transaction\n    suspend fun upInsert(nodeInfoRecord: NodeInfoRecord) {\n        val record = find(nodeInfoRecord.host)\n        if (record == null) {\n            insert(nodeInfoRecord)\n        } else {\n            update(nodeInfoRecord)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/nodeinfo/db/NodeInfoRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.nodeinfo.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\n\n@Entity(\n    tableName = \"nodeinfo\",\n)\ndata class NodeInfoRecord(\n    @PrimaryKey(autoGenerate = false)\n    @ColumnInfo(name = \"host\")\n    val host: String,\n\n    @ColumnInfo(name = \"nodeInfoVersion\")\n    val nodeInfoVersion: String,\n\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    @ColumnInfo(name = \"version\")\n    val version: String\n) {\n\n    companion object {\n        fun from(nodeInfo: NodeInfo): NodeInfoRecord {\n            return NodeInfoRecord(\n                host = nodeInfo.host,\n                nodeInfoVersion = nodeInfo.version,\n                version = nodeInfo.software.version,\n                name = nodeInfo.software.name,\n            )\n        }\n    }\n\n    fun toModel(): NodeInfo {\n        return NodeInfo(\n            version = nodeInfoVersion,\n            host = host,\n            software = NodeInfo.Software(\n                version = version,\n                name = name,\n            )\n        )\n    }\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/FavoriteNoteTimelinePagingStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport android.util.Log\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.misskey.favorite.Favorite\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.FutureLoader\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.timeline.favorite.FavoriteTimelineRepository\n\n\ninternal class FavoriteNoteTimelinePagingStoreImpl(\n    val getAccount: suspend () -> Account,\n    private val favoriteTimelineRepository: FavoriteTimelineRepository,\n) : EntityConverter<Note.Id, Note.Id>, PreviousLoader<Note.Id>, FutureLoader<Note.Id>,\n    IdGetter<String>, StateLocker, TimelinePagingBase {\n\n    private var untilId: String? = null\n    private var sinceId: String? = null\n\n    private val _state =\n        MutableStateFlow<PageableState<List<Note.Id>>>(PageableState.Loading.Init())\n    override val state: Flow<PageableState<List<Note.Id>>>\n        get() = _state\n\n    override val mutex: Mutex = Mutex()\n\n    override suspend fun convertAll(list: List<Note.Id>): List<Note.Id> {\n        return list\n    }\n\n    override suspend fun getSinceId(): String? {\n        return sinceId\n    }\n\n    override suspend fun getUntilId(): String? {\n        return untilId\n    }\n\n    override suspend fun loadFuture(): Result<List<Note.Id>> {\n        val ac = getAccount.invoke()\n        return runCancellableCatching {\n\n            val res = favoriteTimelineRepository.findLaterTimeline(\n                ac.accountId,\n                sinceId = getSinceId(),\n                limit = LIMIT\n            ).getOrThrow()\n            if (!isEmpty() && res.timelineItems.isEmpty()) {\n                return@runCancellableCatching emptyList()\n            }\n            sinceId = res.sinceId\n            res.timelineItems\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<List<Note.Id>> {\n        return runCancellableCatching {\n            val ac = getAccount.invoke()\n            val res = favoriteTimelineRepository.findPreviousTimeline(\n                ac.accountId,\n                untilId = getUntilId(),\n                limit = LIMIT\n            ).getOrThrow()\n            if (!isEmpty() && res.timelineItems.isEmpty()) {\n                return@runCancellableCatching emptyList()\n            }\n            untilId = res.untilId\n            res.timelineItems\n        }\n    }\n\n\n    override fun getState(): PageableState<List<Note.Id>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<Note.Id>>) {\n        _state.value = state\n    }\n\n    private fun isEmpty(): Boolean {\n        return when(val content = _state.value.content) {\n            is StateContent.Exist -> content.rawContent.isEmpty()\n            is StateContent.NotExist -> true\n        }\n    }\n}\n\n\nsealed interface FavoriteType {\n    data class Misskey(val favorite: Favorite) : FavoriteType\n    data class Mastodon(val status: TootStatusDTO) : FavoriteType\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/MastodonTimelineStorePagingStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.common.MastodonLinkHeaderDecoder\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.FutureLoader\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.timeline.TimelineRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineResponse\nimport net.pantasystem.milktea.model.note.timeline.TimelineType\nimport retrofit2.Response\n\n\ninternal class MastodonTimelineStorePagingStoreImpl(\n    val pageableTimeline: Pageable.Mastodon,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val getAccount: suspend () -> Account,\n    val noteAdder: NoteDataSourceAdder,\n    val nodeInfoRepository: NodeInfoRepository,\n    private val timelineRepository: TimelineRepository,\n    private val pageId: Long?,\n) : EntityConverter<Note.Id, Note.Id>, PreviousLoader<Note.Id>,\n    FutureLoader<Note.Id>,\n    IdGetter<String>, StateLocker, TimelinePagingBase, StreamingReceivableStore {\n\n    private val _state =\n        MutableStateFlow<PageableState<List<Note.Id>>>(PageableState.Loading.Init())\n    override val state: Flow<PageableState<List<Note.Id>>>\n        get() = _state\n    override val mutex: Mutex = Mutex()\n\n    private var maxId: String? = null\n    private var minId: String? = null\n\n    override suspend fun convertAll(list: List<Note.Id>): List<Note.Id> {\n        return list\n    }\n\n    override suspend fun loadFuture(): Result<List<Note.Id>> = runCancellableCatching {\n        val api = mastodonAPIProvider.get(getAccount())\n        val minId = getSinceId()\n        if (minId == null && isShouldUseLinkHeader()) {\n            if (!isEmpty()) {\n                return@runCancellableCatching emptyList()\n            }\n        }\n\n        suspend fun findLater(): List<Note.Id> {\n            return timelineRepository.findLaterTimeline(\n                TimelineType(\n                    accountId = getAccount().accountId,\n                    pageable = pageableTimeline,\n                    pageId = pageId,\n                ),\n                sinceId = minId,\n                limit = 20\n            ).getOrThrow().timelineItems\n        }\n\n        suspend fun findLaterAndUpdateMinId(): List<Note.Id> {\n            return timelineRepository.findLaterTimeline(\n                TimelineType(\n                    accountId = getAccount().accountId,\n                    pageable = pageableTimeline,\n                    pageId = pageId,\n                ),\n                sinceId = minId,\n                limit = 20\n            ).getOrThrow().also {\n                updateMinIdFrom(it)\n            }.timelineItems\n        }\n\n        when (pageableTimeline) {\n            is Pageable.Mastodon.HashTagTimeline -> findLater()\n            is Pageable.Mastodon.HomeTimeline -> findLater()\n            is Pageable.Mastodon.ListTimeline -> findLater()\n            is Pageable.Mastodon.LocalTimeline -> findLater()\n            is Pageable.Mastodon.PublicTimeline -> findLater()\n            is Pageable.Mastodon.UserTimeline -> findLaterAndUpdateMinId()\n            Pageable.Mastodon.BookmarkTimeline -> findLaterAndUpdateMinId()\n            is Pageable.Mastodon.SearchTimeline -> {\n                return@runCancellableCatching emptyList()\n            }\n\n            is Pageable.Mastodon.TrendTimeline -> {\n                return@runCancellableCatching emptyList()\n            }\n\n            is Pageable.Mastodon.Mention -> {\n                api.getNotifications(\n                    minId = minId,\n                    types = listOf(MstNotificationDTO.NotificationType.Mention.value),\n                    excludeTypes = MstNotificationDTO.NotificationType.entries\n                        .filterNot { it == MstNotificationDTO.NotificationType.Mention }\n                        .map { it.value },\n                ).throwIfHasError().also {\n                    updateMinIdFrom(it)\n                }.body()?.mapNotNull {\n                    it.status\n                }?.let {\n                    noteAdder.addTootStatusDtoListIntoDataSource(getAccount(), it)\n                } ?: throw IllegalStateException(\"response is null\")\n            }\n        }.let { list ->\n            if (isShouldUseLinkHeader()) {\n                filterNotExistsStatuses(list)\n            } else {\n                list\n            }\n        }\n    }\n\n    override suspend fun getSinceId(): String? {\n        if (isShouldUseLinkHeader()) {\n            return minId\n        }\n        return (getState().content as? StateContent.Exist)?.rawContent?.maxByOrNull {\n            it.noteId\n        }?.noteId\n    }\n\n    override suspend fun getUntilId(): String? {\n        if (isShouldUseLinkHeader()) {\n            return maxId\n        }\n        return (getState().content as? StateContent.Exist)?.rawContent?.minByOrNull {\n            it.noteId\n        }?.noteId\n    }\n\n    override fun setState(state: PageableState<List<Note.Id>>) {\n        if (state is PageableState.Loading.Init) {\n            maxId = null\n            minId = null\n        }\n        _state.value = state\n    }\n\n    override fun getState(): PageableState<List<Note.Id>> {\n        return _state.value\n    }\n\n\n    override suspend fun loadPrevious(): Result<List<Note.Id>> = runCancellableCatching {\n        val api = mastodonAPIProvider.get(getAccount())\n        val maxId = getUntilId()\n\n        if (maxId == null && isShouldUseLinkHeader()) {\n            if (!isEmpty()) {\n                return@runCancellableCatching emptyList()\n            }\n        }\n\n        suspend fun findPrevious(): List<Note.Id> {\n            return timelineRepository.findPreviousTimeline(\n                TimelineType(\n                    accountId = getAccount().accountId,\n                    pageable = pageableTimeline,\n                    pageId = pageId,\n                ),\n                untilId = maxId,\n                limit = 20\n            ).getOrThrow().timelineItems\n        }\n\n        suspend fun findPreviousAndUpdateMinId(): List<Note.Id> {\n            return timelineRepository.findPreviousTimeline(\n                TimelineType(\n                    accountId = getAccount().accountId,\n                    pageable = pageableTimeline,\n                    pageId = pageId,\n                ),\n                untilId = maxId,\n                limit = 20\n            ).getOrThrow().also {\n                updateMaxIdFrom(it)\n            }.timelineItems\n        }\n\n        when (pageableTimeline) {\n            is Pageable.Mastodon.HashTagTimeline -> findPrevious()\n            is Pageable.Mastodon.HomeTimeline -> findPrevious()\n            is Pageable.Mastodon.ListTimeline -> findPrevious()\n            is Pageable.Mastodon.LocalTimeline -> findPrevious()\n            is Pageable.Mastodon.PublicTimeline -> findPrevious()\n            is Pageable.Mastodon.UserTimeline -> findPreviousAndUpdateMinId()\n            Pageable.Mastodon.BookmarkTimeline -> findPreviousAndUpdateMinId()\n\n            is Pageable.Mastodon.SearchTimeline -> {\n                api.search(\n                    q = pageableTimeline.query,\n                    type = \"statuses\",\n                    maxId = maxId,\n                    offset = (getState().content as? StateContent.Exist)?.rawContent?.size ?: 0,\n                    accountId = pageableTimeline.userId\n                ).throwIfHasError().also {\n                    updateMaxIdFrom(it)\n                }.body()?.statuses?.let {\n                    noteAdder.addTootStatusDtoListIntoDataSource(getAccount(), it)\n                }\n            }\n\n            is Pageable.Mastodon.TrendTimeline -> {\n                api.getTrendStatuses(\n                    offset = (getState().content as? StateContent.Exist)?.rawContent?.size ?: 0\n                ).getBodyOrFail().let {\n                    noteAdder.addTootStatusDtoListIntoDataSource(getAccount(), it)\n                }\n            }\n\n            is Pageable.Mastodon.Mention -> {\n                api.getNotifications(\n                    maxId = maxId,\n                    types = listOf(MstNotificationDTO.NotificationType.Mention.value),\n                    excludeTypes = MstNotificationDTO.NotificationType.entries\n                        .filterNot { it == MstNotificationDTO.NotificationType.Mention }\n                        .map { it.value },\n                ).throwIfHasError().also {\n                    updateMaxIdFrom(it)\n                }.body()?.mapNotNull {\n                    it.status\n                }?.let {\n                    noteAdder.addTootStatusDtoListIntoDataSource(getAccount(), it)\n                } ?: throw IllegalStateException(\"response is null\")\n            }\n        }!!.let { list ->\n            if (isShouldUseLinkHeader()) {\n                filterNotExistsStatuses(list)\n            } else {\n                list\n            }\n        }\n    }\n\n    private fun isEmpty(): Boolean {\n        return when (val content = _state.value.content) {\n            is StateContent.Exist -> content.rawContent.isEmpty()\n            is StateContent.NotExist -> true\n        }\n    }\n\n    private fun isShouldUseLinkHeader(): Boolean {\n        return pageableTimeline is Pageable.Mastodon.BookmarkTimeline\n                || pageableTimeline is Pageable.Mastodon.UserTimeline\n                || pageableTimeline is Pageable.Mastodon.Mention\n    }\n\n    /**\n     * 重複をフィルタする\n     */\n    private fun filterNotExistsStatuses(statuses: List<Note.Id>): List<Note.Id> {\n        val data = (_state.value.content as? StateContent.Exist)?.rawContent\n        if (data.isNullOrEmpty()) {\n            return statuses\n        }\n        return statuses.filterNot { id ->\n            data.any {\n                it == id\n            }\n        }\n    }\n\n    /**\n     * responseを元にmaxIdを更新するための関数\n     * responseのmaxIdがnullの場合は更新がキャンセルされる\n     * minIdがnullの場合はresponseのminIdが指定される\n     */\n    private fun updateMaxIdFrom(response: Response<*>) {\n        val decoder = MastodonLinkHeaderDecoder(response.headers()[\"link\"])\n\n        // NOTE: 次のページネーションのIdが取得できない場合は次のIdが取得できるまで同じIdを使い回し続ける\n        when (val nextId = decoder.getMaxId()) {\n            null -> Unit\n            else -> {\n                maxId = nextId\n            }\n        }\n        if (minId == null) {\n            minId = decoder.getMinId()\n        }\n    }\n\n    private fun updateMaxIdFrom(response: TimelineResponse) {\n        // NOTE: 次のページネーションのIdが取得できない場合は次のIdが取得できるまで同じIdを使い回し続ける\n        when (val nextId = response.sinceId) {\n            null -> Unit\n            else -> {\n                maxId = nextId\n            }\n        }\n        if (minId == null) {\n            minId = response.sinceId\n        }\n    }\n\n    /**\n     * responseを元にminIdを得るための関数\n     * responseのminIdがnullの場合は更新がキャンセルされる\n     * maxIdがnullの場合はresponseのmaxIdが指定される\n     */\n    private fun updateMinIdFrom(response: Response<*>) {\n        val decoder = MastodonLinkHeaderDecoder(response.headers()[\"link\"])\n\n        // NOTE: 次のページネーションのIdが取得できない場合は次のIdが取得できるまで同じIdを使い回し続ける\n        when (val nextId = decoder.getMinId()) {\n            null -> Unit\n            else -> {\n                minId = nextId\n            }\n        }\n        if (maxId == null) {\n            maxId = decoder.getMaxId()\n        }\n    }\n\n    private fun updateMinIdFrom(response: TimelineResponse) {\n\n        // NOTE: 次のページネーションのIdが取得できない場合は次のIdが取得できるまで同じIdを使い回し続ける\n        when (val nextId = response.untilId) {\n            null -> Unit\n            else -> {\n                minId = nextId\n            }\n        }\n        if (maxId == null) {\n            maxId = response.untilId\n        }\n    }\n\n    private fun Response<List<TootStatusDTO>>.getBodyOrFail(): List<TootStatusDTO> {\n        return requireNotNull(throwIfHasError().body())\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/NoteCaptureAPIAdapterImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.channelFlow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.api_streaming.NoteUpdated\nimport net.pantasystem.milktea.api_streaming.mastodon.Event\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.data.streaming.StreamingAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatioDataSource\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteCaptureAPIAdapter\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteNotFoundException\n\n/**\n * Noteの更新イベントをWebSocket経由でキャプチャーして\n * その更新イベントをキャッシュに反映するための実装\n */\nclass NoteCaptureAPIAdapterImpl(\n    private val accountRepository: AccountRepository,\n    private val noteDataSource: NoteDataSource,\n    private val noteCaptureAPIWithAccountProvider: NoteCaptureAPIWithAccountProvider,\n    private val streamingAPIProvider: StreamingAPIProvider,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val customEmojiAspectRatioDataSource: CustomEmojiAspectRatioDataSource,\n    private val imageCacheRepository: ImageCacheRepository,\n    loggerFactory: Logger.Factory,\n    cs: CoroutineScope,\n    private val dispatcher: CoroutineDispatcher = Dispatchers.Default,\n) : NoteDataSource.Listener, NoteCaptureAPIAdapter {\n\n    private val logger = loggerFactory.create(\"NoteCaptureAPIAdapter\")\n\n    private val coroutineScope = CoroutineScope(cs.coroutineContext + dispatcher)\n\n\n    init {\n        noteDataSource.addEventListener(this)\n    }\n\n    private val noteIdWithListeners =\n        mutableMapOf<Note.Id, MutableSet<(NoteDataSource.Event) -> Unit>>()\n\n    private val noteIdWithJob = mutableMapOf<Note.Id, Job>()\n\n    /**\n     * mastodonのStreaming APIから流れてきたEventがここに入る\n     */\n    private val streamingEventDispatcher = MutableSharedFlow<Pair<Account, Event>>(\n        extraBufferCapacity = 1000,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n\n    /**\n     * Noteのキャプチャーによって発生したイベントのQueue。\n     * ここから順番にイベントを取り出し、キャッシュに反映させるなどをしている。\n     */\n    private val noteUpdatedDispatcher = MutableSharedFlow<Pair<Account, NoteUpdated.Body>>(\n        extraBufferCapacity = 1000,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n\n//    /**\n//     * 使用されなくなったNoteのリソースが順番に入れられるQueue。\n//     */\n//    private val noteResourceReleaseEvent = MutableSharedFlow<Note.Id>(extraBufferCapacity = 1000)\n\n    init {\n        // NOTE: Noteのキャプチャーによって発生したイベントのQueueであるnoteUpdatedDispatcherのイベントを順番にキャッシュに反映させている。\n        coroutineScope.launch(dispatcher) {\n            noteUpdatedDispatcher.collect {\n                handleRemoteEvent(it.first, it.second)\n            }\n        }\n\n        coroutineScope.launch(dispatcher) {\n            streamingEventDispatcher.collect {\n                handleMastodonRemoteEvent(it.first, it.second)\n            }\n        }\n\n//        // NOTE: Noteのキャプチャーが一切行われなくなった場合キャッシュ上からも削除している。\n//        coroutineScope.launch(dispatcher) {\n//            noteResourceReleaseEvent.filterNot {\n//                isCaptured(it)\n//            }.collect {\n//                noteDataSource.remove(it)\n//            }\n//        }\n    }\n\n    override fun on(e: NoteDataSource.Event) {\n\n        synchronized(noteIdWithListeners) {\n            noteIdWithListeners[e.noteId]?.forEach { callback ->\n                coroutineScope.launch {\n                    callback.invoke(e)\n                }\n            }\n\n        }\n\n    }\n\n    /**\n     * ノートをキャプチャーするための実装。\n     * Flowでイベントを返却し、Flowが使用されなくなると、自動的にListenerが解除される仕組みになっている。\n     * また対象のNoteが他のどこからも購読されなくなくなれば、自動的にサーバからの購読を解除する仕組みになっている。\n     * また自動的に購読を解除する際はキャッシュ上からもリソースを削除するようにしている。\n     * @param id キャプチャーするNoteのId\n     * @return channelFlowが返却される。Flowが使用されなくなりある一定の条件が満たされれば購読が解除される。\n     */\n    override fun capture(id: Note.Id): Flow<NoteDataSource.Event> = channelFlow {\n        val account = accountRepository.get(id.accountId).getOrThrow()\n\n        val repositoryEventListener: (NoteDataSource.Event) -> Unit = { ev ->\n            trySend(ev)\n        }\n\n        captureAndDispatchEvent(account, id, repositoryEventListener)\n\n        awaitClose {\n            removeEventHandlerAndCancelJobIfNeed(id, repositoryEventListener)\n        }\n    }.flowOn(dispatcher)\n\n\n    private fun captureAndDispatchEvent(\n        account: Account,\n        id: Note.Id,\n        repositoryEventListener: (NoteDataSource.Event) -> Unit,\n    ) {\n        synchronized(noteIdWithJob) {\n            if (addRepositoryEventListener(id, repositoryEventListener)) {\n                logger.debug(\"未登録だったのでRemoteに対して購読を開始する\")\n                when (account.instanceType) {\n                    Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                        val job = requireNotNull(noteCaptureAPIWithAccountProvider.get(account))\n                            .capture(id.noteId)\n                            .catch { e ->\n                                logger.error(\"ノート更新イベント受信中にエラー発生\", e = e)\n                            }\n                            .onEach {\n                                noteUpdatedDispatcher.emit(account to it)\n                            }.launchIn(coroutineScope)\n                        noteIdWithJob[id] = job\n                    }\n                    Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                        val job = requireNotNull(streamingAPIProvider.get(account)).connectUser()\n                            .catch { e ->\n                                logger.error(\"ノート更新イベント受信中にエラー発生\", e = e)\n                            }.onEach {\n                                streamingEventDispatcher.tryEmit(account to it)\n                            }.launchIn(coroutineScope)\n                        noteIdWithJob[id] = job\n                    }\n                }\n\n            }\n        }\n    }\n\n    private fun removeEventHandlerAndCancelJobIfNeed(id: Note.Id, repositoryEventListener: (NoteDataSource.Event) -> Unit) {\n        synchronized(noteIdWithJob) {\n            // リスナーを解除する\n            removeRepositoryEventListener(id, repositoryEventListener).also { result ->\n                if (result) {\n\n                    // すべてのリスナーが解除されていればRemoteへの購読も解除する\n                    noteIdWithJob.remove(id)?.cancel() ?: run {\n                        logger.warning(\"購読解除しようとしたところすでに解除されていた\")\n                    }\n                }\n            }\n\n        }\n    }\n\n    /**\n     * @return Note.Idが初めてListenerに登録されるとtrueが返されます。\n     */\n    private fun addRepositoryEventListener(\n        noteId: Note.Id,\n        listener: (NoteDataSource.Event) -> Unit,\n    ): Boolean {\n        synchronized(noteIdWithListeners) {\n            val listeners = noteIdWithListeners[noteId]\n            return if (listeners.isNullOrEmpty()) {\n                noteIdWithListeners[noteId] = mutableSetOf(listener)\n                true\n            } else {\n                listeners.add(listener)\n                noteIdWithListeners[noteId] = listeners\n                false\n            }\n        }\n\n    }\n\n    /**\n     * @return Note.Idに関連するListenerすべてが解除されるとfalseが返されます。\n     */\n    private fun removeRepositoryEventListener(\n        noteId: Note.Id,\n        listener: (NoteDataSource.Event) -> Unit,\n    ): Boolean {\n\n        synchronized(noteIdWithListeners) {\n            val listeners: MutableSet<(NoteDataSource.Event) -> Unit> =\n                noteIdWithListeners[noteId] ?: return false\n\n            if (!listeners.remove(listener)) {\n                logger.warning(\"リスナーの削除に失敗しました。\")\n                return false\n            }\n\n            if (listeners.isEmpty()) {\n                return true\n            }\n            return false\n        }\n\n    }\n\n    /**\n     * イベントに応じてキャッシュを更新している。\n     */\n    private suspend fun handleRemoteEvent(account: Account, e: NoteUpdated.Body) {\n        val noteId = Note.Id(account.accountId, e.id)\n        try {\n            if (!noteDataSource.exists(noteId)) {\n                return\n            }\n            val note = noteDataSource.get(noteId).getOrThrow()\n            when (e) {\n                is NoteUpdated.Body.Deleted -> {\n                    noteDataSource.delete(noteId)\n                }\n                is NoteUpdated.Body.Reacted -> {\n                    noteDataSource.add(\n                        note.onReacted(\n                            account,\n                            e,\n                            aspectRatio = (e.body.emoji?.url ?: e.body.emoji?.url)?.let {\n                                customEmojiAspectRatioDataSource.findOne(\n                                    it\n                                ).getOrNull()\n                            },\n                            imageCache = (e.body.emoji?.url ?: e.body.emoji?.url)?.let {\n                                imageCacheRepository.findBySourceUrl(\n                                    it\n                                ).getOrNull()\n                            },\n                        )\n                    )\n                }\n                is NoteUpdated.Body.Unreacted -> {\n                    noteDataSource.add(note.onUnReacted(account, e))\n                }\n                is NoteUpdated.Body.PollVoted -> {\n                    noteDataSource.add(note.onPollVoted(account, e))\n                }\n\n            }\n        } catch (e: Exception) {\n            logger.warning(\"更新対称のノートが存在しませんでした:$noteId\", e = e)\n        }\n\n\n    }\n\n    private suspend fun handleMastodonRemoteEvent(account: Account, e: Event) {\n        try {\n            when (e) {\n                is Event.Delete -> {\n                    noteDataSource.delete(Note.Id(account.accountId, e.id))\n                }\n                is Event.Notification -> {}\n                is Event.Update -> {\n                    noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, e.status)\n                }\n                is Event.Reaction -> {\n                    val noteId = Note.Id(account.accountId, e.reaction.statusId)\n\n                    noteDataSource.get(noteId).mapCancellableCatching { note ->\n                        noteDataSource.add(\n                            note.onEmojiReacted(\n                                account, e.reaction,\n                                (e.reaction.url ?: e.reaction.staticUrl)?.let {\n                                    imageCacheRepository.findBySourceUrl(it).getOrNull()\n                                }\n                            ),\n                        )\n                    }.getOrThrow()\n\n                }\n                is Event.StatusUpdated -> {\n                    noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, e.status)\n                }\n            }\n        } catch (_: NoteNotFoundException) {\n            return\n        } catch (e: Exception) {\n            logger.warning(\"更新対称のノートが存在しませんでした\", e = e)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/NoteCaptureAPIWithAccountProvider.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api_streaming.NoteCaptureAPI\nimport net.pantasystem.milktea.api_streaming.NoteCaptureAPIImpl\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\n\ninterface NoteCaptureAPIWithAccountProvider {\n    fun get(account: Account): NoteCaptureAPI?\n}\n/**\n * NoteCaptureAPIのインスタンスをAccountに基づきいい感じに取得や生成をできるようにする。\n */\nclass NoteCaptureAPIWithAccountProviderImpl @Inject constructor(\n    private val socketWithAccountProvider: SocketWithAccountProvider,\n    private val loggerFactory: Logger.Factory?\n) : NoteCaptureAPIWithAccountProvider {\n\n    private val accountIdWithNoteCaptureAPI = mutableMapOf<Long, NoteCaptureAPI>()\n    private val lock = Mutex()\n\n    override fun get(account: Account) : NoteCaptureAPI? = runBlocking{\n        lock.withLock {\n            var channelAPI = accountIdWithNoteCaptureAPI[account.accountId]\n            if(channelAPI != null) {\n                return@runBlocking channelAPI\n            }\n\n            val socket = socketWithAccountProvider.get(account)\n                ?: return@runBlocking null\n            channelAPI =\n                NoteCaptureAPIImpl(socket, loggerFactory)\n            accountIdWithNoteCaptureAPI[account.accountId] = channelAPI\n\n            return@runBlocking channelAPI\n        }\n\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/NoteDataSourceAdder.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.converters.FilePropertyDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.NoteDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.TootDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.NoteDTOUnpacked\nimport net.pantasystem.milktea.data.infrastructure.toEntities\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\n@Singleton\nclass NoteDataSourceAdder @Inject constructor(\n    private val userDataSource: UserDataSource,\n    private val noteDataSource: NoteDataSource,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val noteDTOEntityConverter: NoteDTOEntityConverter,\n    private val filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n    private val tootDTOEntityConverter: TootDTOEntityConverter,\n    private val instanceInfoService: InstanceInfoService,\n    private val loggerFactory: Logger.Factory,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n) {\n\n    private val logger by lazy {\n        loggerFactory.create(\"NoteDataSourceAdder\")\n    }\n\n\n    suspend fun addNoteDtoListToDataSource(\n        account: Account,\n        noteDTOs: List<NoteDTO>,\n        skipExists: Boolean = false,\n        instanceType: InstanceInfoType? = null\n    ): List<Note.Id> {\n        val info = instanceType?.takeIf {\n            it.uri == account.normalizedInstanceUri\n        } ?: instanceInfoService.find(account.normalizedInstanceUri).getOrNull()\n        val entities = noteDTOs.map {\n            it.toEntities(\n                account,\n                userDTOEntityConverter,\n                filePropertyDTOEntityConverter,\n                info,\n            )\n        }\n        val notes = entities.flatMap {\n            it.notes\n        } + entities.map {\n            it.note\n        }\n        if (skipExists) {\n            userDataSource.addAll(\n                entities.flatMap {\n                    it.users\n                }.filterNot {\n                    userDataSource.get(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                noteDTOEntityConverter.convertAll(\n                    account,\n                    notes.filterNot {\n                        noteDataSource.exists(Note.Id(account.accountId, it.id))\n                    },\n                    info,\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            filePropertyDataSource.addAll(\n                entities.flatMap {\n                    it.files\n                }.filterNot {\n                    filePropertyDataSource.find(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n        } else {\n            userDataSource.addAll(entities.flatMap {\n                it.users\n            }).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                noteDTOEntityConverter.convertAll(\n                    account,\n                    notes,\n                    info,\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            filePropertyDataSource.addAll(entities.flatMap {\n                it.files\n            }).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n        }\n        return entities.map {\n            Note.Id(account.accountId, it.note.id)\n        }\n    }\n\n    suspend fun addNoteDtoToDataSource(\n        account: Account,\n        noteDTO: NoteDTO,\n        skipExists: Boolean = false,\n        instanceType: InstanceInfoType? = null\n    ): Note {\n        val info = instanceType?.takeIf {\n            it.uri == account.normalizedInstanceUri\n        } ?: instanceInfoService.find(account.normalizedInstanceUri).getOrNull()\n        val entities =\n            noteDTO.toEntities(\n                account,\n                userDTOEntityConverter,\n                filePropertyDTOEntityConverter,\n                info,\n            )\n        val willReturnNote = noteDTOEntityConverter.convert(account, entities.note)\n        if (skipExists) {\n            userDataSource.addAll(\n                entities.users.filterNot {\n                    userDataSource.get(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                noteDTOEntityConverter.convertAll(\n                    account,\n                    entities.notes.filterNot {\n                        noteDataSource.exists(Note.Id(account.accountId, it.id))\n                    }\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            if (!noteDataSource.exists(Note.Id(account.accountId, entities.note.id))) {\n                noteDataSource.add(willReturnNote).onFailure {\n                    logger.error(\"NoteDataSourceへの追加に失敗\", it)\n                }\n            }\n            filePropertyDataSource.addAll(\n                entities.files.filterNot {\n                    filePropertyDataSource.find(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n        } else {\n            userDataSource.addAll(entities.users).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                noteDTOEntityConverter.convertAll(\n                    account,\n                    entities.notes\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            filePropertyDataSource.addAll(entities.files).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n        }\n\n        return willReturnNote\n    }\n\n    suspend fun addTootStatusDtoListIntoDataSource(\n        account: Account,\n        statuses: List<TootStatusDTO>,\n        skipExists: Boolean = false\n    ): List<Note.Id> {\n        val entities = statuses.map {\n            it.toEntities(\n                account,\n                mastodonAccountDTOEntityConverter,\n            )\n        }\n        val notes = entities.flatMap {\n            it.toots\n        } + entities.map {\n            it.toot\n        }\n        val users = entities.flatMap {\n            it.users\n        }\n        val files = entities.flatMap {\n            it.files\n        }\n\n        if (skipExists) {\n            userDataSource.addAll(\n                users.filterNot {\n                    userDataSource.get(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                tootDTOEntityConverter.convertAll(\n                    account,\n                    notes.filterNot {\n                        noteDataSource.exists(Note.Id(account.accountId, it.id))\n                    }\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            filePropertyDataSource.addAll(\n                files.filterNot {\n                    filePropertyDataSource.find(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n\n        } else {\n            userDataSource.addAll(users).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                tootDTOEntityConverter.convertAll(\n                    account,\n                    notes\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            filePropertyDataSource.addAll(files).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n        }\n        return entities.map {\n            Note.Id(\n                account.accountId,\n                it.toot.id\n            )\n        }\n    }\n\n    suspend fun addTootStatusDtoIntoDataSource(\n        account: Account,\n        status: TootStatusDTO,\n        skipExists: Boolean = false\n    ): Note {\n        val entities = status.toEntities(account, mastodonAccountDTOEntityConverter)\n        val willReturnNote = tootDTOEntityConverter.convert(entities.toot, account)\n        noteDataSource.add(willReturnNote)\n        if (skipExists) {\n            userDataSource.addAll(\n                entities.users.filterNot {\n                    userDataSource.get(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                tootDTOEntityConverter.convertAll(\n                    account,\n                    entities.toots.filterNot {\n                        noteDataSource.exists(Note.Id(account.accountId, it.id))\n                    }\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            if (!noteDataSource.exists(Note.Id(account.accountId, entities.toot.id))) {\n                noteDataSource.add(willReturnNote).onFailure {\n                    logger.error(\"NoteDataSourceへの追加に失敗\", it)\n                }\n            }\n            filePropertyDataSource.addAll(\n                entities.files.filterNot {\n                    filePropertyDataSource.find(it.id).isSuccess\n                }\n            ).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n        } else {\n            userDataSource.addAll(entities.users).onFailure {\n                logger.error(\"UserDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.addAll(\n                tootDTOEntityConverter.convertAll(\n                    account,\n                    entities.toots,\n                )\n            ).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            noteDataSource.add(willReturnNote).onFailure {\n                logger.error(\"NoteDataSourceへの追加に失敗\", it)\n            }\n            filePropertyDataSource.addAll(entities.files).onFailure {\n                logger.error(\"FilePropertyDataSourceへの追加に失敗\", it)\n            }\n        }\n\n        return willReturnNote\n    }\n}\n\nsuspend fun NoteDTO.toEntities(\n    account: Account,\n    userDTOEntityConverter: UserDTOEntityConverter,\n    filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n    instanceType: InstanceInfoType?,\n): NoteDTOUnpacked {\n    val dtoList = mutableListOf<NoteDTO>()\n    dtoList.add(this)\n\n\n    if (this.reply != null) {\n\n        dtoList.add(this.reply!!)\n    }\n    if (this.reNote != null) {\n        dtoList.add(reNote!!)\n    }\n\n    val users = mutableListOf<User>()\n    val notes = mutableListOf<NoteDTO>()\n    val files = mutableListOf<FileProperty>()\n\n    pickEntities(\n        account,\n        notes,\n        users,\n        files,\n        userDTOEntityConverter,\n        filePropertyDTOEntityConverter,\n        instanceType,\n    )\n    return NoteDTOUnpacked(\n        note = this,\n        notes = notes,\n        users = users,\n        files = files\n    )\n}\n\nprivate suspend fun NoteDTO.pickEntities(\n    account: Account,\n    notes: MutableList<NoteDTO>,\n    users: MutableList<User>,\n    files: MutableList<FileProperty>,\n    userDTOEntityConverter: UserDTOEntityConverter,\n    filePropertyDTOEntityConverter: FilePropertyDTOEntityConverter,\n    instanceType: InstanceInfoType?,\n) {\n    val (note, user) = this.toNoteAndUser(\n        account,\n        userDTOEntityConverter,\n    )\n    notes.add(note)\n    users.add(user)\n    files.addAll(\n        this.files?.map {\n            filePropertyDTOEntityConverter.convert(it, account)\n        } ?: emptyList()\n    )\n    if (this.reply != null) {\n        this.reply!!.pickEntities(\n            account,\n            notes,\n            users,\n            files,\n            userDTOEntityConverter,\n            filePropertyDTOEntityConverter,\n            instanceType,\n        )\n    }\n\n    if (this.reNote != null) {\n        this.reNote!!.pickEntities(\n            account,\n            notes,\n            users,\n            files,\n            userDTOEntityConverter,\n            filePropertyDTOEntityConverter,\n            instanceType,\n        )\n    }\n}\n\nsuspend fun NoteDTO.toNoteAndUser(\n    account: Account,\n    userDTOEntityConverter: UserDTOEntityConverter,\n): Pair<NoteDTO, User> {\n    val user = userDTOEntityConverter.convert(account, user, false)\n    return this to user\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/NoteEventReducer.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport net.pantasystem.milktea.api_streaming.NoteUpdated\nimport net.pantasystem.milktea.api_streaming.mastodon.EmojiReaction\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmojiAspectRatio\nimport net.pantasystem.milktea.model.image.ImageCache\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\n\nfun Note.onUnReacted(account: Account, e: NoteUpdated.Body.Unreacted): Note {\n    val list = this.reactionCounts.toMutableList()\n    val newList = list.asSequence().map {\n        if (it.reaction == e.body.reaction) {\n            it.copy(count = it.count - 1)\n        } else {\n            it\n        }\n    }.filter {\n        it.count > 0\n    }.toList()\n\n    val myReaction = if (e.body.userId == account.remoteId) null else this.myReaction\n    return this.copy(\n        reactionCounts = newList.map {\n            it.copy(me = it.reaction == myReaction)\n        },\n        myReaction = myReaction\n    )\n}\n\nfun Note.onReacted(\n    account: Account,\n    e: NoteUpdated.Body.Reacted,\n    aspectRatio: CustomEmojiAspectRatio?,\n    imageCache: ImageCache?,\n): Note {\n    val hasItem = this.reactionCounts.any { count ->\n        count.reaction == e.body.reaction\n    }\n    var list = this.reactionCounts.map { count ->\n        if (count.reaction == e.body.reaction) {\n            count.copy(count = count.count + 1)\n        } else {\n            count\n        }\n    }\n\n    if (!hasItem) {\n        list = list + ReactionCount(reaction = e.body.reaction, count = 1, me = false)\n    }\n\n    val emojis = when (val emoji = e.body.emoji?.toModel(\n        aspectRatio = aspectRatio?.aspectRatio,\n        cachePath = imageCache?.cachePath\n    )) {\n        null -> this.emojis\n        else -> (this.emojis ?: emptyList()) + emoji\n    }\n\n    val myReaction = if (e.body.userId == account.remoteId) e.body.reaction else this.myReaction\n    return this.copy(\n        reactionCounts = list.map {\n            it.copy(\n                me = myReaction == it.reaction\n            )\n        },\n        myReaction = myReaction,\n        emojis = emojis?.distinct()\n    )\n}\n\nfun Note.onEmojiReacted(account: Account, e: EmojiReaction, imageCache: ImageCache?): Note {\n    val reactionCount = ReactionCount(e.reaction, e.count, me = false)\n    val hasItem = reactionCounts.any {\n        it.reaction == e.reaction\n    }\n    var list = reactionCounts.map { count ->\n        if (count.reaction == e.reaction) {\n            reactionCount\n        } else {\n            count\n        }\n    }\n\n    if (!hasItem) {\n        list = list + reactionCount\n    }\n\n    val emojis = when (val emoji = e.toEmoji(imageCache?.cachePath)) {\n        null -> this.emojis\n        else -> (this.emojis ?: emptyList()) + emoji\n    }\n    return this.copy(\n        reactionCounts = list.filter {\n            it.count > 0\n        }.map {\n            it.copy(\n                me = it.reaction == e.myReaction(account.remoteId)\n            )\n        },\n        myReaction = e.myReaction(account.remoteId),\n        emojis = emojis\n    )\n}\n\nfun Note.onPollVoted(account: Account, e: NoteUpdated.Body.PollVoted): Note {\n    val poll = this.poll\n    requireNotNull(poll) {\n        \"pollがNULLです\"\n    }\n    val updatedChoices = poll.choices.mapIndexed { index, choice ->\n        if (index == e.body.choice) {\n            choice.copy(\n                votes = choice.votes + 1,\n                isVoted = if (e.body.userId == account.remoteId) true else choice.isVoted\n            )\n        } else {\n            choice\n        }\n    }\n    return this.copy(\n        poll = poll.copy(choices = updatedChoices)\n    )\n}\n\nfun Note.onIReacted(reaction: String): Note {\n    var hasItem = false\n    var list = this.reactionCounts.map { count ->\n        if (count.reaction == reaction) {\n            hasItem = true\n            count.copy(count = count.count + 1)\n        } else {\n            count\n        }\n    }\n    if (!hasItem) {\n        val added = list.toMutableList()\n        added.add(ReactionCount(reaction = reaction, count = 1, me = false))\n        list = added\n    }\n\n    return this.copy(\n        reactionCounts = list.map {\n            it.copy(me = it.reaction == reaction)\n        },\n        myReaction = reaction,\n        emojis = emojis\n    )\n}\n\nfun Note.onIUnReacted(): Note {\n    val list = this.reactionCounts.toMutableList()\n    val newList = list.asSequence().map {\n        if (it.reaction == myReaction) {\n            it.copy(count = it.count - 1)\n        } else {\n            it\n        }\n    }.filter {\n        it.count > 0\n    }.toList()\n\n    return this.copy(\n        reactionCounts = newList.map {\n            it.copy(me = false)\n        },\n        myReaction = null\n\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/NoteStreamingImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.channel.ChannelAPI\nimport net.pantasystem.milktea.api_streaming.channel.connectUserTimeline\nimport net.pantasystem.milktea.api_streaming.mastodon.Event\nimport net.pantasystem.milktea.data.streaming.ChannelAPIWithAccountProvider\nimport net.pantasystem.milktea.data.streaming.StreamingAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.CanOnlyMedia\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteStreaming\nimport javax.inject.Inject\n\nclass NoteStreamingImpl @Inject constructor(\n    private val channelAPIProvider: ChannelAPIWithAccountProvider,\n    val noteDataSourceAdder: NoteDataSourceAdder,\n    val streamingAPIProvider: StreamingAPIProvider,\n) : NoteStreaming {\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun connect(getAccount: suspend () -> Account, pageable: Pageable): Flow<Note> {\n        return flow {\n            emit(getAccount())\n        }.filter {\n            pageable is Pageable.GlobalTimeline\n                    || pageable is Pageable.HybridTimeline\n                    || pageable is Pageable.LocalTimeline\n                    || pageable is Pageable.HomeTimeline\n                    || pageable is Pageable.UserListTimeline\n                    || pageable is Pageable.Antenna\n                    || pageable is Pageable.UserTimeline\n                    || pageable is Pageable.ChannelTimeline\n                    || pageable is Pageable.Mastodon.HomeTimeline\n                    || pageable is Pageable.Mastodon.LocalTimeline\n                    || pageable is Pageable.Mastodon.PublicTimeline\n                    || pageable is Pageable.Mastodon.ListTimeline\n                    || pageable is Pageable.Mastodon.HashTagTimeline\n                    || pageable is Pageable.CalckeyRecommendedTimeline\n        }.flatMapLatest { ac ->\n            when (pageable) {\n                is Pageable.GlobalTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac)).connect(ChannelAPI.Type.Global)\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.HybridTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac)).connect(ChannelAPI.Type.Hybrid)\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.LocalTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac)).connect(ChannelAPI.Type.Local)\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.HomeTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac)).connect(ChannelAPI.Type.Home)\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.UserListTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac))\n                        .connect(ChannelAPI.Type.UserList(userListId = pageable.listId))\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.Antenna -> {\n                    requireNotNull(channelAPIProvider.get(ac))\n                        .connect(ChannelAPI.Type.Antenna(antennaId = pageable.antennaId))\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.UserTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac))\n                        .connectUserTimeline(pageable.userId).convertToNote(ac, pageable)\n                }\n                is Pageable.ChannelTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac))\n                        .connect(ChannelAPI.Type.Channel(channelId = pageable.channelId))\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.CalckeyRecommendedTimeline -> {\n                    requireNotNull(channelAPIProvider.get(ac))\n                        .connect(ChannelAPI.Type.RecommendedTimeline)\n                        .convertToNote(ac, pageable)\n                }\n                is Pageable.Mastodon -> {\n                    when (pageable) {\n                        is Pageable.Mastodon.HashTagTimeline -> {\n                            requireNotNull(streamingAPIProvider.get(ac)).connectHashTag(pageable.hashtag)\n                                .convertToNoteFromStatus(ac, pageable)\n                        }\n                        is Pageable.Mastodon.HomeTimeline -> {\n                            requireNotNull(streamingAPIProvider.get(ac)).connectUser()\n                                .convertNoteFromEvent(getAccount)\n                        }\n                        is Pageable.Mastodon.ListTimeline -> requireNotNull(\n                            streamingAPIProvider.get(\n                                ac\n                            )\n                        ).connectUserList(pageable.listId).convertToNoteFromStatus(ac, pageable)\n                        is Pageable.Mastodon.LocalTimeline -> requireNotNull(\n                            streamingAPIProvider.get(\n                                ac\n                            )\n                        ).connectLocalPublic().convertToNoteFromStatus(ac, pageable)\n                        is Pageable.Mastodon.PublicTimeline -> requireNotNull(\n                            streamingAPIProvider.get(\n                                ac\n                            )\n                        ).connectPublic().convertToNoteFromStatus(ac, pageable)\n                        else -> throw IllegalStateException(\"Global, Hybrid, Local, Homeは以外のStreamは対応していません。\")\n                    }\n                }\n                else -> throw IllegalStateException(\"Global, Hybrid, Local, Homeは以外のStreamは対応していません。\")\n            }\n        }\n    }\n\n    private fun Flow<ChannelBody>.convertToNote(account: Account, pageable: Pageable): Flow<Note> {\n        return mapNotNull {\n            it as? ChannelBody.ReceiveNote\n        }.filter {\n            if (pageable is CanOnlyMedia<*>) {\n                if (pageable.getOnlyMedia()) {\n                    !it.body.fileIds.isNullOrEmpty()\n                } else {\n                    true\n                }\n            } else {\n                true\n            }\n        }.map {\n            noteDataSourceAdder.addNoteDtoToDataSource(account, it.body, skipExists = true)\n        }\n    }\n\n    private fun Flow<TootStatusDTO>.convertToNoteFromStatus(account: Account, pageable: Pageable): Flow<Note> {\n        return filter {\n            if (pageable is CanOnlyMedia<*>) {\n                if (pageable.getOnlyMedia()) {\n                    it.mediaAttachments.isNotEmpty()\n                } else {\n                    true\n                }\n            } else {\n                true\n            }\n        }.map {\n            noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, it, skipExists = true)\n        }\n    }\n\n    private fun Flow<Event>.convertNoteFromEvent(getAccount: suspend () -> Account): Flow<Note> {\n        return mapNotNull {\n            (it as? Event.Update?)?.status\n        }.map {\n            noteDataSourceAdder.addTootStatusDtoIntoDataSource(getAccount(), it)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/NoteTranslationStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.notes.translation.Translate\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationsState\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.Translation\nimport java.util.*\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass NoteTranslationStoreImpl @Inject constructor(\n    val accountRepository: AccountRepository,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n) : NoteTranslationStore {\n\n    private val _state = MutableStateFlow(NoteTranslationsState(emptyMap(), emptySet(), emptyMap()))\n\n    private val _mutex = Mutex()\n\n    override fun state(id: Note.Id): Flow<ResultState<Translation>> {\n        return _state.map { states ->\n            states.state(id)\n        }\n    }\n\n    override suspend fun translate(noteId: Note.Id) {\n        if (_state.value.isLoading(noteId)) {\n            return\n        }\n        _mutex.withLock {\n            _state.value = _state.value.loading(noteId)\n        }\n\n        runCancellableCatching {\n            withContext(Dispatchers.IO) {\n                val account = accountRepository.get(noteId.accountId).getOrThrow()\n                val api = misskeyAPIProvider.get(account.normalizedInstanceUri)\n                val req = Translate(\n                    i = account.token,\n                    targetLang = Locale.getDefault().language,\n                    noteId = noteId.noteId,\n                )\n\n                val res = api.translate(\n                    req\n                )\n                res.throwIfHasError().body()!!\n            }\n        }.onFailure {\n            _mutex.withLock {\n                _state.value = _state.value.complete(noteId, null, it)\n            }\n        }.onSuccess {\n            _mutex.withLock {\n                _state.value = _state.value.complete(\n                    noteId, Translation(\n                        sourceLang = it.sourceLang,\n                        text = it.text\n                    ), null\n                )\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/PageParams.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport net.pantasystem.milktea.api.misskey.notes.NoteRequest\nimport net.pantasystem.milktea.model.account.page.PageParams\n\n\nfun PageParams.toNoteRequest(i: String?) : NoteRequest {\n\n    return NoteRequest(\n        i = i,\n        withFiles = withFiles,\n        excludeNsfw = excludeNsfw,\n        includeMyRenotes = includeMyRenotes,\n        includeLocalRenotes = includeLocalRenotes,\n        includeRenotedMyNotes = includeRenotedMyRenotes,\n        listId = listId,\n        following = following,\n        visibility = visibility,\n        noteId = noteId,\n        tag = tag,\n        reply = reply,\n        renote = renote,\n        poll = poll,\n        offset = offset,\n        markAsRead = markAsRead,\n        channelId = channelId,\n        userId = userId\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/ReplyStreamingImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.channel.ChannelAPI\nimport net.pantasystem.milktea.api_streaming.mastodon.Event\nimport net.pantasystem.milktea.data.streaming.ChannelAPIWithAccountProvider\nimport net.pantasystem.milktea.data.streaming.StreamingAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.ReplyStreaming\nimport javax.inject.Inject\n\nclass ReplyStreamingImpl @Inject constructor(\n    private val channelAPIProvider: ChannelAPIWithAccountProvider,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val streamingAPIProvider: StreamingAPIProvider,\n) : ReplyStreaming {\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun connect(getAccount: suspend () -> Account): Flow<Note> {\n        return flow {\n            emit(getAccount())\n        }.flatMapLatest { ac ->\n            when(ac.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    requireNotNull(channelAPIProvider.get(ac)).connect(ChannelAPI.Type.Main).map {\n                        it as ChannelBody.Main.Reply\n                    }.map {\n                        it.body\n                    }.map {\n                        noteDataSourceAdder.addNoteDtoToDataSource(ac, it)\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    requireNotNull(streamingAPIProvider.get(ac)).connectUser().mapNotNull {\n                        (it as? Event.Update)?.status\n                    }.filter {\n                        it.inReplyToId != null\n                    }.map {\n                        noteDataSourceAdder.addTootStatusDtoIntoDataSource(ac, it)\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/TimelinePagingStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport net.pantasystem.milktea.api.misskey.notes.NoteRequest\nimport net.pantasystem.milktea.app_store.notes.InitialLoadQuery\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.FutureLoader\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.account.page.SincePaginate\nimport net.pantasystem.milktea.model.account.page.UntilPaginate\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.timeline.TimelineRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineType\n\n\ninternal class TimelinePagingStoreImpl(\n    private val pageableTimeline: Pageable,\n    private val getAccount: suspend () -> Account,\n    private val getInitialLoadQuery: () -> InitialLoadQuery?,\n    private val timelineRepository: TimelineRepository,\n    private val pageId: Long? = null,\n) : EntityConverter<Note.Id, Note.Id>, PreviousLoader<Note.Id>, FutureLoader<Note.Id>,\n    IdGetter<Note.Id>, TimelinePagingBase, StreamingReceivableStore {\n\n    private val _state =\n        MutableStateFlow<PageableState<List<Note.Id>>>(PageableState.Loading.Init())\n    override val state: Flow<PageableState<List<Note.Id>>>\n        get() = _state\n\n    override val mutex: Mutex = Mutex()\n\n    override suspend fun getSinceId(): Note.Id? {\n        return (getState().content as? StateContent.Exist)?.rawContent?.maxByOrNull {\n            it.noteId\n        }\n    }\n\n    override suspend fun getUntilId(): Note.Id? {\n        return (getState().content as? StateContent.Exist)?.rawContent?.minByOrNull {\n            it.noteId\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<List<Note.Id>> {\n        return runCancellableCatching {\n            val untilId = getUntilId()?.noteId\n            if (pageableTimeline !is UntilPaginate && untilId != null) {\n                return@runCancellableCatching emptyList()\n            }\n            val initialLoadQuery = getInitialLoadQuery.invoke()\n            val untilDate = (initialLoadQuery as? InitialLoadQuery.UntilDate)?.date\n            timelineRepository.findPreviousTimeline(\n                TimelineType(\n                    getAccount.invoke().accountId,\n                    pageableTimeline,\n                    pageId,\n                ),\n                untilId = untilId\n                    ?: (initialLoadQuery as? InitialLoadQuery.UntilId)?.noteId?.noteId,\n                untilDate = if (untilId == null) untilDate?.toEpochMilliseconds() else null,\n            ).getOrThrow().timelineItems\n\n        }\n    }\n\n    override suspend fun loadFuture(): Result<List<Note.Id>> {\n        return runCancellableCatching {\n            if (pageableTimeline !is SincePaginate) {\n                return@runCancellableCatching emptyList()\n            }\n\n            val builder = NoteRequest.Builder(\n                i = getAccount.invoke().token,\n                pageable = pageableTimeline,\n                limit = LIMIT\n            )\n            val req = builder.build(NoteRequest.Conditions(sinceId = getSinceId()?.noteId))\n\n            // MisskeyはsinceIdで取得した場合\n            // [1, 2, 3, 4, 5]という順番で取得されるようになっていた。\n            // しかしアプリ上では[5, 4, 3, 2, 1]という順番で扱えた方が好ましいため、\n            // FuturePagingControllerではasReverseする処理を行っている。\n            // しかしMisskey側の変更によって[5, 4, 3, 2, 1]という順番で取得されるようになったため、\n            // sortedByをして、ソート順が変わっても対応できるようにしている。\n            timelineRepository.findLaterTimeline(\n                TimelineType(\n                    getAccount.invoke().accountId,\n                    pageableTimeline,\n                    pageId,\n                ),\n                sinceId = getSinceId()?.noteId,\n            ).getOrThrow().timelineItems.sortedBy {\n                it.noteId\n            }\n        }\n    }\n\n    override suspend fun convertAll(list: List<Note.Id>): List<Note.Id> {\n        return list\n    }\n\n    override fun getState(): PageableState<List<Note.Id>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<Note.Id>>) {\n        _state.value = state\n    }\n\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/TimelineScrollPositionRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport android.content.SharedPreferences\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.TimelineScrollPositionRepository\n\nclass TimelineScrollPositionRepositoryImpl(\n    private val sharedPreferences: SharedPreferences\n) : TimelineScrollPositionRepository {\n    override suspend fun save(pageId: Long, noteId: Note.Id) {\n        sharedPreferences.edit()\n            .putString(\"timeline_scroll_position_note_id_$pageId\", noteId.noteId)\n            .putLong(\"timeline_scroll_position_account_id_$pageId\", noteId.accountId)\n            .apply()\n    }\n\n    override suspend fun get(pageId: Long): Note.Id? {\n        val noteId = sharedPreferences.getString(\"timeline_scroll_position_note_id_$pageId\", null)\n        val accountId = sharedPreferences.getLong(\"timeline_scroll_position_account_id_$pageId\", 0L).takeIf {\n            it > 0L\n        }\n        return if (noteId == null || accountId == null) {\n            null\n        } else {\n            Note.Id(accountId, noteId)\n        }\n    }\n\n    override suspend fun remove(pageId: Long) {\n        sharedPreferences.edit()\n            .remove(\"timeline_scroll_position_note_id_$pageId\")\n            .remove(\"timeline_scroll_position_account_id_$pageId\")\n            .apply()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/TimelineStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.app_store.notes.InitialLoadQuery\nimport net.pantasystem.milktea.app_store.notes.TimelineStore\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.FuturePagingController\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.timeline.TimelineRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineType\nimport net.pantasystem.milktea.model.note.timeline.favorite.FavoriteTimelineRepository\nimport javax.inject.Inject\n\n\nconst val LIMIT = 10\nconst val REMOVE_DIFF_COUNT = 20\n\nclass TimelineStoreImpl(\n    private val pageId: Long?,\n    private val pageableTimeline: Pageable,\n    private val noteAdder: NoteDataSourceAdder,\n    private val getAccount: suspend () -> Account,\n    private val coroutineScope: CoroutineScope,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val timelineRepository: TimelineRepository,\n    private val favoriteTimelineRepository: FavoriteTimelineRepository,\n) : TimelineStore {\n\n    class Factory @Inject constructor(\n        private val noteAdder: NoteDataSourceAdder,\n        private val mastodonAPIProvider: MastodonAPIProvider,\n        private val nodeInfoRepository: NodeInfoRepository,\n        private val timelineRepository: TimelineRepository,\n        private val favoriteTimelineRepository: FavoriteTimelineRepository,\n    ) : TimelineStore.Factory {\n        override fun create(\n            pageable: Pageable,\n            coroutineScope: CoroutineScope,\n            getAccount: suspend () -> Account,\n            pageId: Long?,\n        ): TimelineStore {\n            return TimelineStoreImpl(\n                pageId,\n                pageable,\n                noteAdder,\n                getAccount,\n                coroutineScope,\n                mastodonAPIProvider,\n                nodeInfoRepository = nodeInfoRepository,\n                timelineRepository = timelineRepository,\n                favoriteTimelineRepository = favoriteTimelineRepository,\n            )\n        }\n    }\n\n    private val willAddNoteQueue = MutableSharedFlow<Note.Id>(\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n        extraBufferCapacity = 1000\n    )\n\n    override val receiveNoteQueue: SharedFlow<Note.Id>\n        get() = willAddNoteQueue\n\n    private var activeStreamingChangedListener: ((Boolean) -> Unit)? = null\n\n\n    internal val pageableStore: TimelinePagingBase by lazy {\n        when (pageableTimeline) {\n            is Pageable.Favorite -> {\n                FavoriteNoteTimelinePagingStoreImpl(\n                    getAccount,\n                    favoriteTimelineRepository,\n                )\n            }\n            is Pageable.Mastodon -> {\n                MastodonTimelineStorePagingStoreImpl(\n                    pageableTimeline = pageableTimeline,\n                    mastodonAPIProvider = mastodonAPIProvider,\n                    getAccount = getAccount,\n                    noteAdder = noteAdder,\n                    nodeInfoRepository = nodeInfoRepository,\n                    timelineRepository = timelineRepository,\n                    pageId = pageId,\n                )\n            }\n            else -> TimelinePagingStoreImpl(\n                pageableTimeline = pageableTimeline,\n                getAccount = getAccount,\n                getInitialLoadQuery = {\n                    initialLoadQuery\n                },\n                timelineRepository = timelineRepository,\n                pageId = pageId,\n            )\n        }\n    }\n    override val timelineState: Flow<PageableState<List<Note.Id>>>\n        get() = pageableStore.state.distinctUntilChanged()\n\n    private var latestReceiveId: Note.Id? = null\n\n    private var initialLoadQuery: InitialLoadQuery? = null\n\n    override var isActiveStreaming: Boolean = true\n        private set(value) {\n            field = value\n            activeStreamingChangedListener?.invoke(value)\n        }\n\n    init {\n        coroutineScope.launch(Dispatchers.IO) {\n            willAddNoteQueue.collect { noteId ->\n                appendStreamEventNote(noteId)\n            }\n        }\n    }\n\n    override suspend fun loadFuture(): Result<Int> {\n        return runCancellableCatching<Int> {\n            val addedCount = when (val store = pageableStore) {\n                is TimelinePagingStoreImpl -> {\n                    FuturePagingController.create(\n                        store,\n                    ).loadFuture()\n                }\n                is FavoriteNoteTimelinePagingStoreImpl -> {\n                    FuturePagingController.create(\n                        store,\n                    ).loadFuture()\n                }\n                is MastodonTimelineStorePagingStoreImpl -> {\n                    FuturePagingController.create(\n                        store,\n                    ).loadFuture()\n                }\n            }\n            if (addedCount.getOrElse { Int.MAX_VALUE } < LIMIT) {\n                initialLoadQuery = null\n                isActiveStreaming = true\n            }\n            latestReceiveId = null\n            addedCount.getOrThrow()\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<Int> {\n        return runCancellableCatching<Int> {\n            val result = when (val store = pageableStore) {\n                is TimelinePagingStoreImpl -> {\n                    PreviousPagingController.create(\n                        store,\n                    ).loadPrevious()\n                }\n                is FavoriteNoteTimelinePagingStoreImpl -> {\n                    PreviousPagingController.create(\n                        store,\n                    ).loadPrevious()\n                }\n                is MastodonTimelineStorePagingStoreImpl -> {\n                    PreviousPagingController.create(\n                        store,\n                    ).loadPrevious()\n                }\n            }\n            latestReceiveId = null\n            result.getOrThrow()\n        }\n\n    }\n\n    override suspend fun clear(initialLoadQuery: InitialLoadQuery?) {\n        pageableStore.mutex.withLock {\n            this.initialLoadQuery = initialLoadQuery\n            isActiveStreaming = initialLoadQuery == null\n            pageableStore.setState(PageableState.Loading.Init())\n        }\n    }\n\n\n    override fun onReceiveNote(noteId: Note.Id) {\n        willAddNoteQueue.tryEmit(noteId)\n    }\n\n    override fun latestReceiveNoteId(): Note.Id? {\n        return latestReceiveId\n    }\n\n    override fun suspendStreaming() {\n        isActiveStreaming = false\n    }\n\n    override fun setActiveStreamingChangedListener(listener: (Boolean) -> Unit) {\n        activeStreamingChangedListener = listener\n    }\n\n    private suspend fun appendStreamEventNote(noteId: Note.Id) {\n        val store = pageableStore\n        if (store is StreamingReceivableStore) {\n            store.mutex.withLock {\n                if (initialLoadQuery != null) {\n                    return@withLock\n                }\n                if (!isActiveStreaming) {\n                    return@withLock\n                }\n                val content = store.getState().content\n\n                var added = false\n                store.setState(\n                    PageableState.Fixed(\n                        when (content) {\n                            is StateContent.NotExist -> {\n                                added = true\n                                StateContent.Exist(\n                                    listOf(noteId)\n                                )\n                            }\n                            is StateContent.Exist -> {\n                                if (content.rawContent.contains(noteId)) {\n                                    content\n                                } else {\n                                    added = true\n                                    content.copy(\n                                        listOf(noteId) + content.rawContent\n                                    )\n                                }\n                            }\n                        }\n                    )\n                )\n\n                if (added) {\n                    latestReceiveId = noteId\n                }\n            }\n            timelineRepository.add(\n                TimelineType(\n                    getAccount().accountId,\n                    pageableTimeline,\n                    pageId\n                ),\n                noteId\n            )\n        }\n    }\n\n    override suspend fun releaseUnusedPages(position: Int, offset: Int) {\n        releaseUnusedPage(pageableStore, position, offset, REMOVE_DIFF_COUNT)\n        if (pageableStore.mutex.isLocked) {\n            return\n        }\n    }\n\n}\n\n\n\ninternal sealed interface TimelinePagingBase : PaginationState<Note.Id>, StateLocker\n\ninterface StreamingReceivableStore : StateLocker\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/UnusedPageReleaser.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.StateLocker\n\ninternal suspend fun<T, V> releaseUnusedPage(pageableStore: T, position: Int, offset: Int, removeDiffCount: Int = 20) where T : PaginationState<V>, T : StateLocker {\n    if (pageableStore.mutex.isLocked) {\n        return\n    }\n\n    pageableStore.mutex.withLock {\n        val state = pageableStore.getState()\n        val newState = releaseUnusedPage(state, position, offset, removeDiffCount) ?: return@withLock\n\n        pageableStore.setState(\n            newState\n        )\n    }\n}\n\ninternal fun<V> releaseUnusedPage(state: PageableState<List<V>>, position: Int, offset: Int, removeDiffCount: Int = 20): PageableState<List<V>>? {\n    val items = when(val content = state.content) {\n        is StateContent.Exist -> content.rawContent\n        is StateContent.NotExist -> return null\n    }\n\n    // 末端の削除位置を求める\n    var end = position + offset\n    if (end >= items.size || end < 0) {\n        end = items.size\n    }\n    var diffCount = items.size - end\n\n    // 先頭の削除位置を求める\n    var start = position - offset\n    if (start < 0 || start >= items.size) {\n        start = 0\n    }\n\n    diffCount += start\n\n    // 削除件数が20件未満の時は削除しない\n    if (diffCount < removeDiffCount) {\n        return null\n    }\n\n    // 削除し状態に反映する\n    return state.convert {\n        items.subList(start, end)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/bookmark/BookmarkRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.bookmark\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.bookmark.BookmarkRepository\nimport net.pantasystem.milktea.model.note.favorite.FavoriteRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass BookmarkRepositoryImpl @Inject constructor(\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val accountRepository: AccountRepository,\n    private val favoriteRepository: FavoriteRepository,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n): BookmarkRepository {\n\n    override suspend fun create(noteId: Note.Id): Result<Unit> = runCancellableCatching{\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(noteId.accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> favoriteRepository.create(noteId).getOrThrow()\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val body = mastodonAPIProvider.get(account).bookmarkStatus(noteId.noteId)\n                        .throwIfHasError()\n                        .body()\n                    noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, requireNotNull(body))\n                }\n            }\n        }\n    }\n\n    override suspend fun delete(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = accountRepository.get(noteId.accountId).getOrThrow()\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> favoriteRepository.delete(noteId).getOrThrow()\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val body = mastodonAPIProvider.get(account).unbookmarkStatus(noteId.noteId)\n                        .throwIfHasError()\n                        .body()\n                    noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, requireNotNull(body))\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/DraftNoteRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveFileRecord\nimport net.pantasystem.milktea.data.infrastructure.drive.from\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.*\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport javax.inject.Inject\n\nclass DraftNoteRepositoryImpl @Inject constructor(\n    val draftNoteDao: DraftNoteDao,\n    val loggerFactory: Logger.Factory,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : DraftNoteRepository {\n    val logger by lazy {\n        loggerFactory.create(\"DraftNoteRepositoryImpl\")\n    }\n\n    override suspend fun save(draftNote: DraftNote): Result<DraftNote> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val id = draftNoteDao.insert(DraftNoteDTO.make(draftNote))\n\n                logger.debug(\"draftNoteId:$id\")\n                val inserted = draftNote.copy(draftNoteId = id)\n                val pollChoices = draftNote.draftPoll?.choices?.let {\n                    it.mapIndexed { index, s ->\n                        PollChoiceDTO(\n                            choice = s,\n                            draftNoteId = id,\n                            weight = index\n                        )\n                    }\n                }\n                val visibleUserIdDTOList = draftNote.visibleUserIds?.map {\n                    UserIdDTO(draftNoteId = id, userId = it)\n                }\n\n                draftNoteDao.deleteDraftJunctionFilesByDraftNoteId(id)\n\n                val refs = draftNote.draftFiles?.map {\n                    when (it) {\n                        is DraftNoteFile.Local -> {\n                            DraftFileJunctionRef(\n                                draftNoteId = id,\n                                localFileId = draftNoteDao.insertDraftLocalFile(\n                                    DraftLocalFile(\n                                        localFileId = it.localFileId,\n                                        filePath = it.filePath,\n                                        folderId = it.folderId,\n                                        name = it.name,\n                                        type = it.type,\n                                        thumbnailUrl = it.thumbnailUrl,\n                                        isSensitive = it.isSensitive,\n                                        fileSize = it.fileSize,\n                                        comment = it.comment\n                                    )\n                                ),\n                                filePropertyId = null,\n                            )\n                        }\n                        is DraftNoteFile.Remote -> {\n                            DraftFileJunctionRef(\n                                draftNoteId = id,\n                                filePropertyId = draftNoteDao.insertDriveFile(\n                                    DriveFileRecord.from(\n                                        it.fileProperty\n                                    )\n                                ),\n                                localFileId = null,\n                            )\n                        }\n                    }\n                } ?: emptyList()\n                draftNoteDao.insertFileRefs(refs)\n\n                if (!pollChoices.isNullOrEmpty()) {\n                    draftNoteDao.insertPollChoices(pollChoices)\n                }\n                if (!visibleUserIdDTOList.isNullOrEmpty()) {\n                    draftNoteDao.insertUserIds(visibleUserIdDTOList)\n                }\n\n                draftNoteDao.getDraftNote(inserted.accountId, inserted.draftNoteId)!!\n\n            }\n        }\n    }\n\n    override suspend fun delete(draftNoteId: Long): Result<Unit> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n\n                val relation = draftNoteDao.findOne(draftNoteId) ?: throw NoSuchElementException()\n\n                draftNoteDao.deleteDraftNote(\n                    relation.draftNoteDTO.accountId,\n                    relation.draftNoteDTO.draftNoteId!!\n                )\n            }\n        }\n    }\n\n    override suspend fun findOne(draftNoteId: Long): Result<DraftNote> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val relation = draftNoteDao.findOne(draftNoteId) ?: throw NoSuchElementException()\n                relation.toDraftNote(relation.draftNoteDTO.accountId)\n            }\n        }\n    }\n\n    override fun observeByAccountId(accountId: Long): Flow<List<DraftNote>> {\n        return draftNoteDao.observeDraftNotesRelation(accountId).map { notes ->\n            notes.map {\n                it.toDraftNote(accountId)\n            }\n        }.flowOn(ioDispatcher)\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/DraftFileDTO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.OnConflictStrategy\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveFileRecord\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\n\n@Entity(\n    tableName = \"draft_file_v2_table\",\n    indices = [Index(\n        \"draftNoteId\",\n        \"filePropertyId\",\n        \"localFileId\",\n        unique = true\n    ), Index(\"draftNoteId\"), Index(\"localFileId\"), Index(\"filePropertyId\")],\n    foreignKeys = [\n        ForeignKey(\n            entity = DriveFileRecord::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"filePropertyId\"],\n            onDelete = OnConflictStrategy.ABORT,\n            onUpdate = OnConflictStrategy.REPLACE,\n        ),\n        ForeignKey(\n            entity = DraftLocalFile::class,\n            parentColumns = [\"localFileId\"],\n            childColumns = [\"localFileId\"],\n            onDelete = OnConflictStrategy.ABORT,\n            onUpdate = OnConflictStrategy.REPLACE,\n        )\n\n    ]\n)\ndata class DraftFileJunctionRef(\n    @ColumnInfo(name = \"draftNoteId\")\n    val draftNoteId: Long,\n\n    @ColumnInfo(name = \"filePropertyId\")\n    val filePropertyId: Long?,\n\n    @ColumnInfo(name = \"localFileId\")\n    val localFileId: Long?,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true) val id: Long = 0L\n) {\n    companion object\n}\n\n\n\n\n@Entity(tableName = \"draft_local_file_v2_table\")\ndata class DraftLocalFile(\n    @ColumnInfo(name = \"name\") val name: String,\n    @ColumnInfo(name = \"file_path\") val filePath: String,\n    @ColumnInfo(name = \"is_sensitive\") val isSensitive: Boolean?,\n    @ColumnInfo(name = \"type\") val type: String,\n    @ColumnInfo(name = \"thumbnailUrl\") val thumbnailUrl: String?,\n    @ColumnInfo(name = \"folder_id\") val folderId: String?,\n    @ColumnInfo(name = \"file_size\") val fileSize: Long?,\n    @ColumnInfo(name = \"comment\") val comment: String?,\n\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = \"localFileId\")\n    val localFileId: Long = 0L,\n) {\n    companion object\n}\n\nfun DraftLocalFile.Companion.from(draftNote: DraftNoteFile.Local): DraftLocalFile {\n    return DraftLocalFile(\n        localFileId = draftNote.localFileId,\n        filePath = draftNote.filePath,\n        folderId = draftNote.folderId,\n        name = draftNote.name,\n        type = draftNote.type,\n        thumbnailUrl = draftNote.thumbnailUrl,\n        isSensitive = draftNote.isSensitive,\n        fileSize = draftNote.fileSize,\n        comment = draftNote.comment\n    )\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/DraftNoteDTO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Ignore\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport java.util.Date\n\n@Entity(\n    tableName = \"draft_note_table\", foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"accountId\"],\n            childColumns = [\"accountId\"],\n            entity = AccountRecord::class,\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n    indices = [Index(\"accountId\", \"text\")]\n)\ndata class DraftNoteDTO(\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"visibility\")\n    val visibility: String = \"public\",\n\n    @ColumnInfo(name = \"text\")\n    val text: String?,\n\n    @ColumnInfo(name = \"cw\")\n    val cw: String? = null,\n\n    @ColumnInfo(name = \"viaMobile\")\n    val viaMobile: Boolean? = null,\n\n    @ColumnInfo(name = \"localOnly\")\n    val localOnly: Boolean? = null,\n\n    @ColumnInfo(name = \"noExtractMentions\")\n    val noExtractMentions: Boolean? = null,\n\n    @ColumnInfo(name = \"noExtractHashtags\")\n    val noExtractHashtags: Boolean? = null,\n\n    @ColumnInfo(name = \"noExtractEmojis\")\n    val noExtractEmojis: Boolean? = null,\n\n    @ColumnInfo(name = \"replyId\")\n    val replyId: String? = null,\n\n    @ColumnInfo(name = \"renoteId\")\n    val renoteId: String? = null,\n\n    @ColumnInfo(name = \"channelId\")\n    val channelId: String? = null,\n\n    @ColumnInfo(name = \"scheduleWillPostAt\")\n    val scheduleWillPostAt: Date? = null,\n\n    @Embedded val poll: DraftPollDTO?,\n\n    @ColumnInfo(name = \"draft_note_id\")\n    @PrimaryKey(autoGenerate = true)\n    var draftNoteId: Long? = null,\n\n    @ColumnInfo(name = \"isSensitive\")\n    val isSensitive: Boolean? = null,\n\n    @ColumnInfo(name = \"reactionAcceptanceType\")\n    val reactionAcceptanceType: String? = null,\n) {\n\n\n\n    companion object {\n        fun make(draftNote: DraftNote): DraftNoteDTO {\n            return DraftNoteDTO(\n                draftNote.accountId,\n                draftNote.visibility,\n                draftNote.text,\n                draftNote.cw,\n                draftNote.viaMobile,\n                draftNote.localOnly,\n                draftNote.noExtractMentions,\n                draftNote.noExtractHashtags,\n                draftNote.noExtractEmojis,\n                draftNote.replyId,\n                draftNote.renoteId,\n                draftNote.channelId?.channelId,\n                draftNote.reservationPostingAt,\n                DraftPollDTO.make(draftNote.draftPoll),\n                draftNoteId = if(draftNote.draftNoteId == 0L) null else draftNote.draftNoteId,\n                isSensitive = draftNote.isSensitive,\n                reactionAcceptanceType = draftNote.reactionAcceptanceType?.name,\n            )\n        }\n    }\n\n    @Ignore\n    fun toDraftNote(\n        accountId: Long,\n        visibilityUserIds: List<UserIdDTO>?,\n        pollChoicesDTO: List<PollChoiceDTO>?,\n        draftFiles: List<DraftNoteFile>?,\n    ): DraftNote {\n        return DraftNote(\n            accountId,\n            visibility,\n            visibilityUserIds?.map {\n                it.userId\n            },\n            text,\n            cw,\n            draftFiles,\n            viaMobile,\n            localOnly,\n            noExtractMentions,\n            noExtractHashtags,\n            noExtractEmojis,\n            replyId,\n            renoteId,\n            poll?.toDraftPoll(pollChoicesDTO),\n            channelId = channelId?.let {\n                Channel.Id(accountId, it)\n            },\n            draftNoteId = draftNoteId ?: 0L,\n            reservationPostingAt = scheduleWillPostAt,\n            isSensitive = isSensitive,\n            reactionAcceptanceType = reactionAcceptanceType?.let { type ->\n                ReactionAcceptanceType.values().find {\n                    it.name == type\n                }\n            },\n        )\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/DraftNoteDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft.db\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveFileRecord\nimport net.pantasystem.milktea.model.note.draft.DraftNote\n\n@Dao\nabstract class DraftNoteDao {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract fun insert(draftNote: DraftNoteDTO): Long\n\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract fun insertPollChoices(pollChoices: List<PollChoiceDTO>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract fun insertUserIds(userIds: List<UserIdDTO>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertDriveFile(file: DriveFileRecord): Long\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertDraftLocalFile(file: DraftLocalFile): Long\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract fun insertFileRefs(files: List<DraftFileJunctionRef>): List<Long>\n\n    fun getDraftNote(accountId: Long, draftNoteId: Long): DraftNote?{\n        return getDraftNoteRelation(accountId, draftNoteId)?.toDraftNote(accountId)\n    }\n\n    @Transaction\n    @Query(\"select * from draft_note_table where accountId = :accountId and draft_note_id = :draftNoteId\")\n    abstract fun getDraftNoteRelation(accountId: Long, draftNoteId: Long): DraftNoteRelation?\n\n    @Transaction\n    @Query(\"select * from draft_note_table where draft_note_id = :draftNoteId\")\n    abstract suspend fun findOne(draftNoteId: Long): DraftNoteRelation?\n\n    @Transaction\n    @Query(\"delete from 'draft_note_table' where accountId = :accountId and draft_note_id = :draftNoteId\")\n    abstract fun deleteDraftNote(accountId: Long, draftNoteId: Long)\n\n    @Transaction\n    @Query(\"select * from draft_note_table where accountId = :accountId\")\n    abstract fun observeDraftNotesRelation(accountId: Long): Flow<List<DraftNoteRelation>>\n\n    @Query(\"delete from draft_file_v2_table where draftNoteId = :draftNoteId\")\n    abstract fun deleteDraftJunctionFilesByDraftNoteId(draftNoteId: Long)\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/DraftNoteRelation.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft.db\n\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport androidx.room.Junction\nimport androidx.room.Relation\nimport net.pantasystem.milktea.data.infrastructure.drive.DriveFileRecord\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\n\n@Entity\nclass DraftNoteRelation(\n    @Embedded\n    val draftNoteDTO: DraftNoteDTO,\n\n//    @Relation(\n//        parentColumn = \"draft_note_id\",\n//        entityColumn = \"draft_note_id\",\n//        entity = DraftFileDTO::class\n//    )\n//    var draftFiles: List<DraftFileDTO>? = null\n\n    @Relation(\n        parentColumn = \"draft_note_id\",\n        entityColumn = \"draft_note_id\",\n        entity = UserIdDTO::class\n    )\n    val visibilityUserIds: List<UserIdDTO>? = null,\n\n    @Relation(\n        parentColumn = \"draft_note_id\",\n        entityColumn = \"draft_note_id\",\n        entity = PollChoiceDTO::class\n    )\n    val pollChoices: List<PollChoiceDTO>? = null,\n\n    @Relation(parentColumn = \"draft_note_id\", entityColumn = \"draftNoteId\")\n    val draftNoteJunctionRefs: List<DraftFileJunctionRef>? = null,\n\n    @Relation(\n        parentColumn = \"draft_note_id\",\n        entityColumn = \"localFileId\",\n        associateBy = Junction(\n            DraftFileJunctionRef::class,\n            parentColumn = \"draftNoteId\"\n        )\n    )\n    val localFiles: List<DraftLocalFile>? = null,\n\n    @Relation(\n        parentColumn = \"draft_note_id\",\n        entityColumn = \"id\",\n        associateBy = Junction(\n            DraftFileJunctionRef::class,\n            parentColumn = \"draftNoteId\",\n            entityColumn = \"filePropertyId\"\n        )\n    )\n    val driveFileRecords: List<DriveFileRecord>? = null\n) {\n\n\n    @Ignore\n    fun getDraftNoteFiles(): List<DraftNoteFile> {\n        return draftNoteJunctionRefs?.filter {\n            it.filePropertyId != null || it.localFileId != null\n        }?.mapNotNull { ref ->\n            if (ref.localFileId != null) {\n                localFiles?.firstOrNull {\n                    it.localFileId == ref.localFileId\n                }?.apply {\n                    return@mapNotNull DraftNoteFile.Local(\n                        name = name,\n                        folderId = folderId,\n                        filePath = filePath,\n                        isSensitive = isSensitive,\n                        thumbnailUrl = thumbnailUrl,\n                        type = type,\n                        localFileId = ref.localFileId,\n                        fileSize = fileSize,\n                        comment = comment\n                    )\n                }\n\n            }\n            if (ref.filePropertyId != null) {\n                driveFileRecords?.firstOrNull {\n                    it.id == ref.filePropertyId\n                }?.apply {\n                    return@mapNotNull DraftNoteFile.Remote(toFileProperty())\n                }\n            }\n            null\n        } ?: emptyList()\n    }\n\n\n    @Ignore\n    fun toDraftNote(accountId: Long): DraftNote {\n\n        return draftNoteDTO.toDraftNote(\n            accountId,\n            visibilityUserIds,\n            pollChoices,\n            getDraftNoteFiles()\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/DraftPollDTO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Ignore\nimport net.pantasystem.milktea.model.note.draft.DraftPoll\n\n@Entity\nclass DraftPollDTO(\n    @ColumnInfo(name = \"multiple\")\n    val multiple: Boolean,\n\n    @ColumnInfo(name = \"expiresAt\")\n    val expiresAt: Long? = null\n){\n\n    companion object{\n\n        @JvmStatic\n        fun make(draftPoll: DraftPoll?): DraftPollDTO?{\n            return draftPoll?.let{\n               DraftPollDTO(draftPoll.multiple, draftPoll.expiresAt)\n           }\n        }\n    }\n\n    @Ignore\n    fun toDraftPoll(choices: List<PollChoiceDTO>?): DraftPoll?{\n        if(choices.isNullOrEmpty()){\n            return null\n        }\n        return DraftPoll(\n            choices.sortedBy {\n                it.weight\n            }.map{\n                it.choice\n            },\n            multiple,\n            expiresAt\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/PollChoiceDTO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\n\n\n@Entity(\n    tableName = \"poll_choice_table\",\n    primaryKeys = [\"choice\", \"weight\", \"draft_note_id\"],\n    foreignKeys = [\n        ForeignKey(\n            childColumns = [\"draft_note_id\"],\n            parentColumns = [\"draft_note_id\"],\n            entity = DraftNoteDTO::class,\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n    indices = [Index(\"draft_note_id\", \"choice\")]\n)\ndata class PollChoiceDTO(\n    @ColumnInfo(name = \"choice\")\n    val choice: String,\n\n    @ColumnInfo(name = \"draft_note_id\")\n    val draftNoteId: Long,\n\n    @ColumnInfo(name = \"weight\")\n    val weight: Int\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/draft/db/UserIdDTO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.draft.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\n\n@Entity(tableName = \"user_id\", primaryKeys = [\"userId\", \"draft_note_id\"],\n        foreignKeys = [\n        ForeignKey(\n            childColumns = [\"draft_note_id\"],\n            parentColumns = [\"draft_note_id\"],\n            entity = DraftNoteDTO::class,\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )],\n    indices = [Index(\"draft_note_id\")]\n)\ndata class UserIdDTO(\n    @ColumnInfo(name = \"userId\")\n    val userId: String,\n\n    @ColumnInfo(name = \"draft_note_id\")\n    val draftNoteId: Long\n){\n\n    companion object{\n        fun make(userId: String, draftNoteId: Long): UserIdDTO{\n            return UserIdDTO(userId, draftNoteId)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/favorite/FavoriteAPIAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.favorite\n\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.misskey.notes.favorite.CreateFavorite\nimport net.pantasystem.milktea.api.misskey.notes.favorite.DeleteFavorite\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.note.Note\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass FavoriteAPIAdapter @Inject constructor(\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val getAccount: GetAccount,\n) {\n\n    suspend fun create(noteId: Note.Id): SuccessfulResponseData {\n        val account = getAccount.get(noteId.accountId)\n        return when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).createFavorite(CreateFavorite(i = account.token, noteId = noteId.noteId))\n                    .throwIfHasError()\n                SuccessfulResponseData.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val status = mastodonAPIProvider.get(account).favouriteStatus(noteId.noteId)\n                    .throwIfHasError()\n                    .body()\n                SuccessfulResponseData.Mastodon(requireNotNull(status))\n            }\n        }\n    }\n\n    suspend fun delete(noteId: Note.Id): SuccessfulResponseData {\n        val account = getAccount.get(noteId.accountId)\n        return when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).deleteFavorite(DeleteFavorite(i = account.token, noteId = noteId.noteId))\n                    .throwIfHasError()\n                SuccessfulResponseData.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val status = mastodonAPIProvider.get(account).unfavouriteStatus(noteId.noteId)\n                    .throwIfHasError()\n                    .body()\n                SuccessfulResponseData.Mastodon(requireNotNull(status))\n            }\n        }\n    }\n}\n\nsealed interface SuccessfulResponseData {\n    object Misskey : SuccessfulResponseData\n    data class Mastodon(val tootStatusDTO: TootStatusDTO) : SuccessfulResponseData\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/favorite/FavoriteRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.favorite\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.favorite.FavoriteRepository\nimport javax.inject.Inject\n\nclass FavoriteRepositoryImpl @Inject constructor(\n    val getAccount: GetAccount,\n    val noteDataSourceAdder: NoteDataSourceAdder,\n    private val favoriteAPIAdapter: FavoriteAPIAdapter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : FavoriteRepository {\n\n    override suspend fun create(noteId: Note.Id): Result<Unit> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = getAccount.get(noteId.accountId)\n                when(val result = favoriteAPIAdapter.create(noteId)) {\n                    is SuccessfulResponseData.Mastodon -> {\n                        noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, result.tootStatusDTO)\n                    }\n                    SuccessfulResponseData.Misskey -> Unit\n                }\n            }\n        }\n    }\n\n    override suspend fun delete(noteId: Note.Id): Result<Unit> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = getAccount.get(noteId.accountId)\n                when(val result = favoriteAPIAdapter.delete(noteId)) {\n                    is SuccessfulResponseData.Mastodon -> {\n                        noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, result.tootStatusDTO)\n                    }\n                    SuccessfulResponseData.Misskey -> Unit\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/DraftNoteServiceImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl\n\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftLocalFile\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.DraftNoteDao\nimport net.pantasystem.milktea.data.infrastructure.note.draft.db.from\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.note.CreateNote\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNoteSavedEvent\nimport net.pantasystem.milktea.model.note.draft.DraftNoteService\nimport net.pantasystem.milktea.model.note.draft.DraftPoll\nimport net.pantasystem.milktea.model.note.draft.from\nimport net.pantasystem.milktea.model.note.isLocalOnly\nimport net.pantasystem.milktea.model.note.type\nimport net.pantasystem.milktea.model.note.visibleUserIds\nimport java.util.Date\nimport javax.inject.Inject\n\nclass DraftNoteServiceImpl @Inject constructor(\n    private val draftNoteRepository: DraftNoteRepository,\n    private val driveFileRepository: DriveFileRepository,\n    private val draftNoteDao: DraftNoteDao,\n) : DraftNoteService {\n\n    private val draftNoteSavedEvent = MutableSharedFlow<DraftNoteSavedEvent>(\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n        extraBufferCapacity = 256\n    )\n\n    override fun getDraftNoteSavedEventBy(accountId: Long): Flow<DraftNoteSavedEvent> {\n        return draftNoteSavedEvent\n    }\n\n    override suspend fun save(createNote: CreateNote): Result<DraftNote> {\n        return runCancellableCatching {\n            val draftFiles = createNote.files?.map {\n                when (it) {\n                    is AppFile.Remote -> {\n                        DraftNoteFile.Remote(\n                            driveFileRepository.find(it.id)\n                        )\n                    }\n                    is AppFile.Local -> {\n                        DraftNoteFile.Local.from(it)\n                    }\n                }\n            } ?: emptyList()\n            val draftPoll = createNote.poll?.let {\n                DraftPoll(it.choices, it.multiple, it.expiresAt)\n            }\n\n            draftNoteRepository.save(\n                DraftNote(\n                    accountId = createNote.author.accountId,\n                    text = createNote.text,\n                    visibility = createNote.visibility.type(),\n                    visibleUserIds = createNote.visibleUserIds(),\n                    cw = createNote.cw,\n                    draftFiles = draftFiles,\n                    viaMobile = createNote.viaMobile,\n                    localOnly = createNote.visibility.isLocalOnly(),\n                    noExtractEmojis = createNote.noExtractEmojis,\n                    noExtractHashtags = createNote.noExtractHashtags,\n                    noExtractMentions = createNote.noExtractMentions,\n                    replyId = createNote.replyId?.noteId,\n                    renoteId = createNote.renoteId?.noteId,\n                    draftPoll = draftPoll,\n                    reservationPostingAt = createNote.scheduleWillPostAt?.toEpochMilliseconds()\n                        ?.let {\n                            Date(it)\n                        },\n                    channelId = createNote.channelId,\n                    draftNoteId = createNote.draftNoteId ?: 0L,\n                    isSensitive = createNote.isSensitive,\n                    reactionAcceptanceType = createNote.reactionAcceptance\n                )\n            ).getOrThrow()\n        }.onFailure {\n            draftNoteSavedEvent.tryEmit(DraftNoteSavedEvent.Failed(createNote, it))\n        }.onSuccess {\n            draftNoteSavedEvent.tryEmit(DraftNoteSavedEvent.Success(it))\n        }\n\n    }\n\n    override suspend fun save(draftNoteFile: DraftNoteFile): Result<DraftNoteFile> {\n        return runCancellableCatching {\n            when (draftNoteFile) {\n                is DraftNoteFile.Local -> {\n                    draftNoteDao.insertDraftLocalFile(DraftLocalFile.from(draftNoteFile))\n                    draftNoteFile\n                }\n                is DraftNoteFile.Remote -> {\n                    driveFileRepository.update(\n                        draftNoteFile.fileProperty.update()\n                    )\n                    DraftNoteFile.Remote(\n                        driveFileRepository.find(draftNoteFile.fileProperty.id)\n                    )\n                }\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/InMemoryNoteDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteDeletedException\nimport net.pantasystem.milktea.model.note.NoteNotFoundException\nimport net.pantasystem.milktea.model.note.NoteResult\nimport net.pantasystem.milktea.model.note.NoteThreadContext\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\nclass InMemoryNoteDataSource @Inject constructor(\n    memoryCacheCleaner: MemoryCacheCleaner\n): NoteDataSource, MemoryCacheCleaner.Cleanable {\n\n\n    private var notes = mapOf<Note.Id, Note>()\n\n    private val mutex = Mutex()\n    private val listenersLock = Mutex()\n\n    private var listeners = setOf<NoteDataSource.Listener>()\n\n    private val _state = MutableStateFlow(NoteDataSourceState(emptyMap()))\n\n    private var deleteNoteIds = mutableSetOf<Note.Id>()\n\n    init {\n        addEventListener {\n            _state.update {\n                it.copy(map = notes)\n            }\n        }\n        memoryCacheCleaner.register(this)\n    }\n\n    override fun addEventListener(listener: NoteDataSource.Listener): Unit = runBlocking {\n        listeners = listeners.toMutableSet().apply {\n            add(listener)\n        }\n    }\n\n\n    override suspend fun get(noteId: Note.Id): Result<Note> = runCancellableCatching {\n        mutex.withLock{\n            if (deleteNoteIds.contains(noteId)) {\n                throw NoteDeletedException(noteId)\n            }\n            notes[noteId]\n                ?: throw NoteNotFoundException(noteId)\n        }\n    }\n\n    override suspend fun getIn(noteIds: List<Note.Id>): Result<List<Note>> = runCancellableCatching {\n        noteIds.mapNotNull { noteId ->\n            notes[noteId]\n        }\n    }\n\n    /**\n     * @param note 追加するノート\n     * @return ノートが新たに追加されるとtrue、上書きされた場合はfalseが返されます。\n     */\n    override suspend fun add(note: Note): Result<AddResult> = runCancellableCatching {\n       createOrUpdate(note).also {\n           if(it == AddResult.Created) {\n               publish(NoteDataSource.Event.Created(note.id, note))\n           }else if(it == AddResult.Updated) {\n               publish(NoteDataSource.Event.Updated(note.id, note))\n           }\n       }\n    }\n\n    override suspend fun addAll(notes: List<Note>): Result<List<AddResult>> = runCancellableCatching {\n        notes.map{\n            this.add(it).getOrElse {\n                AddResult.Canceled\n            }\n        }\n    }\n\n    override suspend fun exists(noteId: Note.Id): Boolean {\n        return notes[noteId] != null\n    }\n\n    /**\n     * @param noteId 削除するNoteのid\n     * @return 実際に削除されるとtrue、そもそも存在していなかった場合にはfalseが返されます\n     */\n    override suspend fun delete(noteId: Note.Id): Result<Boolean> = runCancellableCatching {\n        suspend fun delete(noteId: Note.Id): Boolean {\n            mutex.withLock{\n                val n = this.notes[noteId]\n                notes = notes - noteId\n                deleteNoteIds.add(noteId)\n                return n != null\n            }\n        }\n\n        delete(noteId).also {\n            if(it) {\n                publish(NoteDataSource.Event.Deleted(noteId))\n            }\n        }\n\n    }\n\n    override suspend fun deleteByUserId(userId: User.Id): Result<Int> = runCancellableCatching {\n        val result = mutex.withLock {\n            notes.values.filter {\n                it.userId == userId\n            }.mapNotNull {\n                if(this.delete(it.id).getOrThrow()) {\n                    it\n                }else null\n            }\n        }\n        result.mapNotNull {\n            delete(it.id).getOrNull()\n        }.count ()\n    }\n\n    override fun observeIn(noteIds: List<Note.Id>): Flow<List<Note>> {\n        return _state.map { state ->\n            noteIds.mapNotNull {\n                state.getOrNull(it)\n            }\n        }.distinctUntilChanged()\n    }\n\n\n    override suspend fun findByReplyId(id: Note.Id): Result<List<Note>> {\n        return Result.success(\n            _state.value.map.values.filter {\n                it.replyId == id\n            }\n        )\n    }\n\n    override fun observeOne(noteId: Note.Id): Flow<Note?> {\n        return _state.map {\n            it.getOrNull(noteId)\n        }.distinctUntilChanged()\n    }\n\n    private suspend fun createOrUpdate(note: Note): AddResult {\n        mutex.withLock{\n            val n = this.notes[note.id]\n            notes = notes + (note.id to note)\n\n            deleteNoteIds.remove(note.id)\n            return if(n == null){\n                AddResult.Created\n            } else {\n                AddResult.Updated\n            }\n        }\n    }\n\n    override suspend fun clean() {\n        mutex.withLock {\n            notes = emptyMap()\n        }\n    }\n\n    override suspend fun clear(): Result<Unit> = runCancellableCatching {\n        mutex.withLock {\n            notes = emptyMap()\n        }\n    }\n\n    override fun observeNoteThreadContext(noteId: Note.Id): Flow<NoteThreadContext?> {\n        return emptyFlow()\n    }\n\n    override suspend fun findNoteThreadContext(noteId: Note.Id): Result<NoteThreadContext> = Result.success(\n        NoteThreadContext(emptyList(), emptyList())\n    )\n\n    private fun publish(ev: NoteDataSource.Event) = runBlocking {\n        listenersLock.withLock {\n            listeners.forEach {\n                it.on(ev)\n            }\n        }\n    }\n\n    override suspend fun findLocalCount(): Result<Long> {\n        return Result.success(notes.size.toLong())\n    }\n\n    override suspend fun getWithState(noteId: Note.Id): Result<NoteResult> = runCancellableCatching {\n        if (deleteNoteIds.contains(noteId)) {\n            return@runCancellableCatching NoteResult.Deleted\n        }\n\n        when(val note = notes[noteId]) {\n            null -> NoteResult.NotFound\n            else -> NoteResult.Success(note)\n        }\n    }\n\n}\n\ndata class NoteDataSourceState(\n    val map: Map<Note.Id, Note>,\n) {\n    fun findIn(ids: List<Note.Id>): List<Note> {\n        return ids.mapNotNull {\n            map[it]\n        }\n    }\n\n    fun getOrNull(id: Note.Id): Note? {\n        return map[id]\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/NoteApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.mastodon.status.CreateStatus\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.misskey.notes.DeleteNote\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteRequest\nimport net.pantasystem.milktea.api.misskey.notes.Vote\nimport net.pantasystem.milktea.api.misskey.notes.mute.ToggleThreadMuteRequest\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.drive.FileUploaderProvider\nimport net.pantasystem.milktea.data.infrastructure.drive.UploadSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.note.CreateNote\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteState\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.repost.CreateRenote\nimport net.pantasystem.milktea.model.note.type4Mastodon\nimport javax.inject.Inject\n\n\ninterface NoteApiAdapter {\n\n    interface Factory {\n        suspend fun create(account: Account): NoteApiAdapter\n    }\n\n    suspend fun create(createNote: CreateNote): NoteCreatedResultType\n\n    suspend fun showNote(noteId: Note.Id): ShowNoteResultType\n    suspend fun delete(noteId: Note.Id): DeleteNoteResultType\n    suspend fun createThreadMute(noteId: Note.Id): ToggleThreadMuteResultType\n    suspend fun deleteThreadMute(noteId: Note.Id): ToggleThreadMuteResultType\n    suspend fun renote(createRenote: CreateRenote): RenoteResultType\n\n    suspend fun vote(noteId: Note.Id, choice: Poll.Choice, target: Note)\n\n    suspend fun findNoteState(target: Note): NoteState\n\n    suspend fun unrenote(noteId: Note.Id): UnrenoteResultType\n}\n\ninternal class NoteApiAdapterFactoryImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val uploader: FileUploaderProvider,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val loggerFactory: Logger.Factory,\n) : NoteApiAdapter.Factory {\n    override suspend fun create(account: Account): NoteApiAdapter {\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> NoteApiAdapterMisskeyPattern(\n                accountRepository = accountRepository,\n                misskeyAPIProvider = misskeyAPIProvider,\n                filePropertyDataSource = filePropertyDataSource,\n                uploader = uploader,\n                loggerFactory = loggerFactory,\n            )\n\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> NoteApiAdapterMastodonPattern(\n                uploader = uploader,\n                mastodonAPIProvider = mastodonAPIProvider,\n                accountRepository = accountRepository,\n            )\n        }\n    }\n}\n\nprivate class NoteApiAdapterMisskeyPattern(\n    val accountRepository: AccountRepository,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val filePropertyDataSource: FilePropertyDataSource,\n    private val uploader: FileUploaderProvider,\n    val loggerFactory: Logger.Factory\n) : NoteApiAdapter {\n    override suspend fun create(createNote: CreateNote): NoteResultType.Misskey {\n        val task = PostNoteTask(\n            createNote,\n            createNote.author,\n            loggerFactory,\n            filePropertyDataSource\n        )\n        val result = runCancellableCatching {\n            task.execute(\n                uploader.get(createNote.author)\n            ) ?: throw IllegalStateException(\"ファイルのアップロードに失敗しました\")\n        }.mapCancellableCatching {\n            misskeyAPIProvider.get(createNote.author).create(it).throwIfHasError()\n                .body()?.createdNote\n        }.onFailure {\n            loggerFactory.create(\"NoteApiAdapter\").error(\"create note error\", it)\n        }\n\n        val noteDTO = result.getOrThrow()\n        return NoteResultType.Misskey(requireNotNull(noteDTO))\n    }\n\n    override suspend fun showNote(noteId: Note.Id): ShowNoteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val body = misskeyAPIProvider.get(account).showNote(\n            NoteRequest(\n                i = account.token,\n                noteId = noteId.noteId\n            )\n        ).throwIfHasError().body()\n        return NoteResultType.Misskey(requireNotNull(body))\n    }\n\n    override suspend fun delete(noteId: Note.Id): DeleteNoteResultType.Misskey {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        misskeyAPIProvider.get(account).delete(\n            DeleteNote(\n                i = account.token,\n                noteId = noteId.noteId\n            )\n        ).throwIfHasError()\n        return DeleteNoteResultType.Misskey\n    }\n\n    override suspend fun createThreadMute(noteId: Note.Id): ToggleThreadMuteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        misskeyAPIProvider.get(account).createThreadMute(\n            ToggleThreadMuteRequest(\n                i = account.token,\n                noteId = noteId.noteId\n            )\n        ).throwIfHasError()\n        return ToggleThreadMuteResultType.Misskey\n    }\n\n    override suspend fun deleteThreadMute(noteId: Note.Id): ToggleThreadMuteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        misskeyAPIProvider.get(account).deleteThreadMute(\n            ToggleThreadMuteRequest(\n                i = account.token,\n                noteId = noteId.noteId,\n            )\n        ).throwIfHasError()\n        return ToggleThreadMuteResultType.Misskey\n    }\n\n    override suspend fun renote(createRenote: CreateRenote): RenoteResultType {\n        return create(\n            CreateNote(\n                author = createRenote.author,\n                renoteId = createRenote.renoteId,\n                channelId = createRenote.channelId,\n                text = null,\n                visibility = createRenote.visibility,\n            )\n        )\n    }\n\n    override suspend fun vote(noteId: Note.Id, choice: Poll.Choice, target: Note) {\n        val account = accountRepository.get(target.id.accountId).getOrThrow()\n        misskeyAPIProvider.get(account).vote(\n            Vote(\n                i = account.token,\n                choice = choice.index,\n                noteId = noteId.noteId\n            )\n        ).throwIfHasError()\n    }\n\n    override suspend fun findNoteState(target: Note): NoteState {\n        val account = accountRepository.get(target.id.accountId).getOrThrow()\n        return misskeyAPIProvider.get(account.normalizedInstanceUri).noteState(\n            NoteRequest(\n                i = account.token,\n                noteId = target.id.noteId\n            )\n        ).throwIfHasError().body()!!.let {\n            NoteState(\n                isFavorited = it.isFavorited,\n                isMutedThread = it.isMutedThread,\n                isWatching = when (val watching = it.isWatching) {\n                    null -> NoteState.Watching.None\n                    else -> NoteState.Watching.Some(watching)\n                }\n            )\n        }\n    }\n\n    override suspend fun unrenote(noteId: Note.Id): UnrenoteResultType {\n        delete(noteId)\n        return UnrenoteResultType.Misskey\n    }\n\n}\n\nprivate class NoteApiAdapterMastodonPattern(\n    private val uploader: FileUploaderProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val accountRepository: AccountRepository,\n) : NoteApiAdapter {\n    override suspend fun create(createNote: CreateNote): NoteCreatedResultType {\n        val fileIds = coroutineScope {\n            createNote.files?.map { appFile ->\n                async {\n                    when (appFile) {\n                        is AppFile.Local -> {\n                            uploader.get(createNote.author)\n                                .upload(UploadSource.LocalFile(appFile), false).id\n                        }\n\n                        is AppFile.Remote -> appFile.id\n                    }\n                }\n            }?.awaitAll()\n        }\n        val body = mastodonAPIProvider.get(createNote.author).createStatus(\n            CreateStatus(\n                status = createNote.text ?: \"\",\n                mediaIds = fileIds?.map {\n                    it.fileId\n                } ?: emptyList(),\n                inReplyToId = createNote.replyId?.noteId,\n                spoilerText = createNote.cw,\n                sensitive = createNote.isSensitive ?: false,\n                visibility = createNote.visibility.type4Mastodon(),\n                poll = createNote.poll?.let { poll ->\n                    CreateStatus.CreatePoll(\n                        options = poll.choices,\n                        multiple = poll.multiple,\n                        expiresIn = poll.expiresAt?.let {\n                            (it - Clock.System.now().toEpochMilliseconds()) / 1000\n                        }?.toInt() ?: (5 * 60),\n                    )\n                },\n                quoteId = createNote.renoteId?.noteId,\n            )\n        ).throwIfHasError().body()\n        return NoteResultType.Mastodon(requireNotNull(body))\n    }\n\n    override suspend fun showNote(noteId: Note.Id): ShowNoteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val body = mastodonAPIProvider.get(account)\n            .getStatus(noteId.noteId)\n            .throwIfHasError().body()\n        return NoteResultType.Mastodon(requireNotNull(body))\n    }\n\n    override suspend fun delete(noteId: Note.Id): DeleteNoteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val body = mastodonAPIProvider.get(account).deleteStatus(noteId.noteId)\n            .throwIfHasError()\n            .body()\n        return DeleteNoteResultType.Mastodon(requireNotNull(body))\n    }\n\n    override suspend fun createThreadMute(noteId: Note.Id): ToggleThreadMuteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val body = mastodonAPIProvider.get(account)\n            .muteConversation(noteId.noteId)\n            .throwIfHasError()\n            .body()\n        return ToggleThreadMuteResultType.Mastodon(requireNotNull(body))\n    }\n\n    override suspend fun deleteThreadMute(noteId: Note.Id): ToggleThreadMuteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val body = mastodonAPIProvider.get(account).unmuteConversation(noteId.noteId)\n            .throwIfHasError()\n            .body()\n        return ToggleThreadMuteResultType.Mastodon(requireNotNull(body))\n    }\n\n    override suspend fun renote(createRenote: CreateRenote): RenoteResultType {\n        val account = accountRepository.get(createRenote.author.accountId).getOrThrow()\n        val toot = mastodonAPIProvider.get(account).reblog(createRenote.renoteId.noteId)\n            .throwIfHasError()\n            .body()\n        return NoteResultType.Mastodon(requireNotNull(toot))\n    }\n\n    override suspend fun vote(noteId: Note.Id, choice: Poll.Choice, target: Note) {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        mastodonAPIProvider.get(account).voteOnPoll(\n            requireNotNull((target.type as Note.Type.Mastodon).pollId),\n            choices = listOf(choice.index)\n        )\n    }\n\n    override suspend fun findNoteState(target: Note): NoteState {\n        return NoteState(\n            isFavorited = (target.type as Note.Type.Mastodon).favorited ?: false,\n            isMutedThread = (target.type as Note.Type.Mastodon).muted ?: false,\n            isWatching = NoteState.Watching.None,\n        )\n    }\n\n    override suspend fun unrenote(noteId: Note.Id): UnrenoteResultType {\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val res = mastodonAPIProvider.get(account).unreblog(noteId.noteId)\n            .throwIfHasError()\n            .body()\n        return UnrenoteResultType.Mastodon(requireNotNull(res))\n    }\n}\n\nsealed interface NoteResultType {\n    data class Misskey(val note: NoteDTO) : NoteResultType\n    data class Mastodon(val status: TootStatusDTO) : NoteResultType\n}\n\nsealed interface DeleteNoteResultType {\n    data class Mastodon(val status: TootStatusDTO) : DeleteNoteResultType\n    data object Misskey : DeleteNoteResultType\n}\n\n\ntypealias ShowNoteResultType = NoteResultType\n\ntypealias NoteCreatedResultType = NoteResultType\n\n\nsealed interface ToggleThreadMuteResultType {\n    data object Misskey : ToggleThreadMuteResultType\n    data class Mastodon(val status: TootStatusDTO) : ToggleThreadMuteResultType\n}\n\ntypealias RenoteResultType = NoteResultType\n\nsealed interface UnrenoteResultType {\n    data object Misskey : UnrenoteResultType\n    data class Mastodon(val status: TootStatusDTO) : UnrenoteResultType\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/NoteRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.ErrorType\nimport net.pantasystem.milktea.common.MisskeyErrorCodes\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.note.CreateNote\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteDeletedException\nimport net.pantasystem.milktea.model.note.NoteNotFoundException\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.NoteResult\nimport net.pantasystem.milktea.model.note.NoteState\nimport net.pantasystem.milktea.model.note.NoteThreadContext\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.repost.CreateRenote\nimport javax.inject.Inject\n\nclass NoteRepositoryImpl @Inject constructor(\n    val noteDataSource: NoteDataSource,\n    val noteDataSourceAdder: NoteDataSourceAdder,\n    val getAccount: GetAccount,\n    private val noteApiAdapterFactory: NoteApiAdapter.Factory,\n    private val threadContextApiAdapterFactory: ThreadContextApiAdapter.Factory,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : NoteRepository {\n\n\n    override suspend fun create(createNote: CreateNote): Result<Note> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            convertAndAdd(createNote.author, noteApiAdapterFactory.create(createNote.author).create(createNote))\n        }\n    }\n\n    override suspend fun renote(createRenote: CreateRenote): Result<Note> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            convertAndAdd(createRenote.author, noteApiAdapterFactory.create(createRenote.author).renote(createRenote))\n        }\n    }\n\n    override suspend fun unrenote(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(noteId.accountId)\n            when(val result = noteApiAdapterFactory.create(account).unrenote(noteId)) {\n                is UnrenoteResultType.Mastodon -> {\n                    noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, requireNotNull(result.status))\n                }\n                UnrenoteResultType.Misskey -> Unit\n            }\n        }\n    }\n\n    override suspend fun delete(noteId: Note.Id): Result<Note> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(noteId.accountId)\n            val note = find(noteId).getOrThrow()\n            when (val result = noteApiAdapterFactory.create(account).delete(noteId)) {\n                is DeleteNoteResultType.Mastodon -> noteDataSourceAdder.addTootStatusDtoIntoDataSource(\n                    account,\n                    result.status\n                )\n                DeleteNoteResultType.Misskey -> note\n            }\n        }\n    }\n\n    override suspend fun find(noteId: Note.Id): Result<Note> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(noteId.accountId)\n\n            when(val state = noteDataSource.getWithState(noteId).getOrThrow()) {\n                NoteResult.Deleted -> throw NoteDeletedException(noteId)\n                is NoteResult.Success -> return@withContext state.note\n                NoteResult.NotFound -> Unit\n            }\n\n            val note = try {\n                convertAndAdd(account, noteApiAdapterFactory.create(account).showNote(noteId))\n            } catch (e: APIError.NotFoundException) {\n                // NOTE(pantasystem): 削除フラグが立つようになり次からNoteDeletedExceptionが投げられる\n                noteDataSource.delete(noteId)\n                throw NoteNotFoundException(noteId)\n            } catch (e: APIError.ClientException) {\n                // NOTE: Misskeyの場合、削除されたノートはstatusCode=400でerrorCodeで識別する必要性がある💢\n                if ((e.error as? ErrorType.Misskey)?.errorCodeeType == MisskeyErrorCodes.NoSuchNote) {\n                    noteDataSource.delete(noteId)\n                    throw NoteNotFoundException(noteId)\n                }\n                throw e\n            }\n            note\n        }\n    }\n\n    override suspend fun findIn(noteIds: List<Note.Id>): List<Note> {\n        return withContext(ioDispatcher) {\n            val notes = noteDataSource.getIn(noteIds).getOrThrow()\n            val notExistsIds = noteIds.filterNot {\n                notes.any { note -> note.id == it }\n            }\n            if (notExistsIds.isEmpty()) {\n                return@withContext notes\n            }\n\n            val notExistsAndNoteDeletedNoteIds = notExistsIds.filter { noteId ->\n                when(noteDataSource.getWithState(noteId).getOrThrow()) {\n                    NoteResult.Deleted -> false\n                    is NoteResult.Success -> false\n                    NoteResult.NotFound -> true\n                }\n            }\n\n            fetchIn(notExistsAndNoteDeletedNoteIds)\n            noteDataSource.getIn(noteIds).getOrThrow()\n        }\n    }\n\n\n    override suspend fun vote(noteId: Note.Id, choice: Poll.Choice): Result<Unit> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = getAccount.get(noteId.accountId)\n                val note = find(noteId).getOrThrow()\n                noteApiAdapterFactory.create(account).vote(noteId, choice, note)\n            }\n        }\n\n\n    private suspend fun fetchIn(noteIds: List<Note.Id>) {\n        val accountMap = noteIds.map {\n            it.accountId\n        }.distinct().mapNotNull {\n            runCancellableCatching {\n                getAccount.get(it)\n            }.getOrNull()\n        }.associateBy {\n            it.accountId\n        }\n\n        coroutineScope {\n            noteIds.map { noteId ->\n                async {\n                    try {\n                        val account = accountMap.getValue(noteId.accountId)\n                        convertAndAdd(account, noteApiAdapterFactory.create(account).showNote(noteId))\n                    } catch (e: Throwable) {\n                        if (e is APIError.NotFoundException) {\n                            noteDataSource.delete(noteId)\n                        }\n                        null\n                    }\n                }\n            }.awaitAll().filterNotNull()\n        }\n    }\n\n    override suspend fun syncThreadContext(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(noteId.accountId)\n            threadContextApiAdapterFactory.create(account).syncThreadContext(noteId)\n        }\n    }\n\n    override fun observeThreadContext(noteId: Note.Id): Flow<NoteThreadContext> {\n        return noteDataSource.observeNoteThreadContext(noteId).filterNotNull()\n    }\n\n    override suspend fun sync(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(noteId.accountId)\n            try {\n                convertAndAdd(account, noteApiAdapterFactory.create(account).showNote(noteId))\n            } catch (e: APIError.NotFoundException) {\n            // NOTE(pantasystem): 削除フラグが立つようになり次からNoteDeletedExceptionが投げられる\n                noteDataSource.delete(noteId)\n                throw NoteNotFoundException(noteId)\n            } catch (e: APIError.ClientException) {\n            // NOTE: Misskeyの場合、削除されたノートはstatusCode=400でerrorCodeで識別する必要性がある💢\n                if ((e.error as? ErrorType.Misskey)?.errorCodeeType == MisskeyErrorCodes.NoSuchNote) {\n                    noteDataSource.delete(noteId)\n                    throw NoteNotFoundException(noteId)\n                }\n                throw e\n            }\n        }\n    }\n\n    override suspend fun createThreadMute(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(noteId.accountId)\n            when (val result = noteApiAdapterFactory.create(account).createThreadMute(noteId)) {\n                is ToggleThreadMuteResultType.Mastodon -> {\n                    noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, result.status)\n                }\n                ToggleThreadMuteResultType.Misskey -> Unit\n            }\n        }\n    }\n\n    override suspend fun deleteThreadMute(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val account = getAccount.get(noteId.accountId)\n            when (val result = noteApiAdapterFactory.create(account).deleteThreadMute(noteId)) {\n                is ToggleThreadMuteResultType.Mastodon -> {\n                    noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, result.status)\n                }\n                ToggleThreadMuteResultType.Misskey -> Unit\n            }\n        }\n    }\n\n    override suspend fun findNoteState(noteId: Note.Id): Result<NoteState> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = getAccount.get(noteId.accountId)\n                val target = find(noteId).getOrThrow()\n                noteApiAdapterFactory.create(account).findNoteState(target)\n            }\n        }\n\n    override fun observeIn(noteIds: List<Note.Id>): Flow<List<Note>> {\n        return noteDataSource.observeIn(noteIds)\n    }\n\n    override fun observeOne(noteId: Note.Id): Flow<Note?> {\n        return noteDataSource.observeOne(noteId)\n    }\n\n    private suspend fun convertAndAdd(account: Account, type: NoteResultType): Note {\n        return when (type) {\n            is NoteResultType.Mastodon -> noteDataSourceAdder.addTootStatusDtoIntoDataSource(\n                account,\n                type.status\n            )\n            is NoteResultType.Misskey -> noteDataSourceAdder.addNoteDtoToDataSource(\n                account,\n                type.note\n            )\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/PostNoteTask.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.drive.FileUploader\nimport net.pantasystem.milktea.data.infrastructure.drive.UploadSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.note.*\nimport java.io.Serializable\nimport net.pantasystem.milktea.api.misskey.notes.CreateNote as CreateNoteDTO\nimport net.pantasystem.milktea.api.misskey.notes.ReactionAcceptanceType as RAT\n\n\nclass PostNoteTask(\n    val createNote: CreateNote,\n    val account: Account,\n    loggerFactory: Logger.Factory,\n    val filePropertyDataSource: FilePropertyDataSource,\n) : Serializable {\n\n\n    private val logger = loggerFactory.create(\"PostNoteTask\")\n    private var filesIds: List<FileProperty.Id>? = null\n\n\n    suspend fun execute(fileUploader: FileUploader): CreateNoteDTO? {\n        val ok = if (createNote.files.isNullOrEmpty()) {\n            true\n        } else {\n            executeFileUpload(fileUploader)\n        }\n        return if (ok) {\n            logger.debug(\"投稿データを作成しました。\")\n            CreateNoteDTO(\n                i = createNote.author.token,\n                visibility = createNote.visibility.type(),\n                localOnly = (createNote.visibility as? CanLocalOnly)?.isLocalOnly,\n                visibleUserIds = createNote.visibleUserIds(),\n                text = createNote.text,\n                cw = createNote.cw,\n                viaMobile = createNote.viaMobile,\n                noExtractEmojis = createNote.noExtractEmojis,\n                noExtractMentions = createNote.noExtractMentions,\n                noExtractHashtags = createNote.noExtractHashtags,\n                replyId = createNote.replyId?.noteId,\n                renoteId = createNote.renoteId?.noteId,\n                poll = createNote.poll,\n                fileIds = filesIds?.map { it.fileId },\n                channelId = createNote.channelId?.channelId,\n                reactionAcceptance = when (createNote.reactionAcceptance) {\n                    ReactionAcceptanceType.LikeOnly -> RAT.LikeOnly\n                    ReactionAcceptanceType.LikeOnly4Remote -> RAT.LikeOnly4Remote\n                    ReactionAcceptanceType.NonSensitiveOnly -> RAT.NonSensitiveOnly\n                    ReactionAcceptanceType.NonSensitiveOnly4LocalOnly4Remote -> RAT.NonSensitiveOnly4LocalOnly4Remote\n                    null -> null\n                },\n            )\n        } else {\n            logger.error(\"投稿データ作成に失敗しました。\")\n            null\n        }\n\n    }\n\n    private suspend fun executeFileUpload(fileUploader: FileUploader): Boolean {\n        val tmpFiles = createNote.files\n        filesIds = coroutineScope {\n            runCancellableCatching {\n                tmpFiles?.map {\n                    async(Dispatchers.IO) {\n                        when (it) {\n                            is AppFile.Remote -> {\n                                if (account.accountId == it.id.accountId) {\n                                    it.id\n                                } else {\n                                    val result = fileUploader.upload(\n                                        UploadSource.OtherAccountFile(\n                                            filePropertyDataSource.find(it.id).getOrThrow()\n                                        ), true\n                                    )\n                                    result.id\n                                }\n                            }\n\n                            is AppFile.Local -> {\n                                val result = fileUploader.upload(UploadSource.LocalFile(it), true)\n                                result.id\n                            }\n                        }\n                    }\n                }?.awaitAll()\n            }.getOrNull()\n\n        }\n        return tmpFiles != null && tmpFiles.size == filesIds?.size\n    }\n\n//    fun toDraftNote(draftNote: DraftNote? = null): DraftNote {\n//        logger.debug(\"下書きノートが作成された\")\n//        val draftPoll = createNote.poll?.let{\n//            DraftPoll(it.choices, it.multiple, it.expiresAt)\n//        }\n//\n//        return DraftNote(\n//            accountId = account.accountId,\n//            text = createNote.text,\n//            cw = createNote.cw,\n//            visibleUserIds = createNote.visibleUserIds(),\n//            draftPoll = draftPoll,\n//            visibility = createNote.visibility.type(),\n//            localOnly = createNote.visibility.isLocalOnly(),\n//            renoteId = createNote.renoteId?.noteId,\n//            replyId = createNote.replyId?.noteId,\n//            channelId = createNote.channelId,\n//            draftNoteId = draftNote?.draftNoteId ?: 0L,\n//            draftFiles =\n//        )\n//    }\n//\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/ThreadContextApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.api.misskey.notes.GetNoteChildrenRequest\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteRequest\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport javax.inject.Inject\n\n/**\n * このインターフェースは、ノートのスレッドを表す構造体のキャッシュと、API上のリソースを同期するための機能を提供します。\n */\ninterface ThreadContextApiAdapter {\n    interface Factory {\n        suspend fun create(account: Account): ThreadContextApiAdapter\n    }\n    suspend fun syncThreadContext(\n        noteId: Note.Id,\n    ): Result<Unit>\n}\n\n/**\n * このクラスは、ThreadContextApiAdapter.Factoryの実装クラスで、\n * 対応しているAPIに応じて対応しているThreadContextApiAdapterの実装クラスを生成します。\n */\nclass ThreadContextApiAdapterFactoryImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val noteDataSource: NoteDataSource,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val getAccount: GetAccount,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n) : ThreadContextApiAdapter.Factory {\n    override suspend fun create(account: Account): ThreadContextApiAdapter {\n        when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                return ThreadContextApiAdapterMisskeyPattern(\n                    getAccount = getAccount,\n                    misskeyAPIProvider = misskeyAPIProvider,\n                    noteDataSource = noteDataSource,\n                    noteDataSourceAdder = noteDataSourceAdder,\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                return ThreadContextApiAdapterMastodonPattern(\n                    accountRepository = accountRepository,\n                    mastodonAPIProvider = mastodonAPIProvider,\n                    noteDataSource = noteDataSource,\n                    noteDataSourceAdder = noteDataSourceAdder,\n                )\n            }\n        }\n    }\n}\n\n\n/**\n * このクラスは、Mastodon系のAPIに対応するThreadContextApiAdapterの実装クラスです。\n */\nclass ThreadContextApiAdapterMastodonPattern @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val noteDataSource: NoteDataSource,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n) : ThreadContextApiAdapter {\n    override suspend fun syncThreadContext(noteId: Note.Id): Result<Unit> = runCancellableCatching{\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val body = requireNotNull(\n            mastodonAPIProvider.get(account).getStatusesContext(noteId.noteId)\n                .throwIfHasError()\n                .body()\n        )\n        body.ancestors.map {\n            noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, it)\n        }\n\n        body.descendants.map {\n            noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, it)\n        }\n    }\n}\n\n/**\n * このクラスは、Misskey系のAPIに対応するThreadContextApiAdapterの実装クラスです。\n */\nclass ThreadContextApiAdapterMisskeyPattern @Inject constructor(\n    private val getAccount: GetAccount,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val noteDataSource: NoteDataSource,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n) : ThreadContextApiAdapter {\n    override suspend fun syncThreadContext(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        val account = getAccount.get(noteId.accountId)\n        requireNotNull(\n            misskeyAPIProvider.get(account).conversation(\n                NoteRequest(\n                    i = account.token,\n                    noteId = noteId.noteId,\n                )\n            ).throwIfHasError().body()\n        ).map {\n            noteDataSourceAdder.addNoteDtoToDataSource(account, it)\n        }\n        syncRecursiveThreadContext4Misskey(noteId, noteId)\n    }\n\n    private suspend fun syncRecursiveThreadContext4Misskey(\n        targetNoteId: Note.Id,\n        appendTo: Note.Id,\n    ) {\n        val account = getAccount.get(appendTo.accountId)\n        val descendants = getMisskeyDescendants(targetNoteId).map {\n            noteDataSourceAdder.addNoteDtoToDataSource(account, it)\n        }\n        coroutineScope {\n            descendants.map { note ->\n                async {\n                    syncRecursiveThreadContext4Misskey(note.id, appendTo)\n                }\n            }.awaitAll()\n        }\n    }\n\n    private suspend fun getMisskeyDescendants(targetNoteId: Note.Id): List<NoteDTO> {\n        val account = getAccount.get(targetNoteId.accountId)\n        return requireNotNull(\n            misskeyAPIProvider.get(account).children(\n                GetNoteChildrenRequest(\n                    i = account.token,\n                    noteId = targetNoteId.noteId,\n                    limit = 30,\n                    depth = 2,\n                )\n            ).throwIfHasError().body()\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/sqlite/NoteDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl.sqlite\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport androidx.room.Update\nimport kotlinx.coroutines.flow.Flow\n\n\n@Dao\ninterface NoteDAO {\n\n\n    @Query(\n        \"\"\"\n        SELECT * FROM notes\n            WHERE id IN (:ids)\n        \"\"\"\n    )\n    @Transaction\n    suspend fun getIn(ids: List<String>): List<NoteWithRelation>\n\n    @Query(\n        \"\"\"\n        SELECT * FROM notes\n            WHERE id = :id\n        \"\"\"\n    )\n    @Transaction\n    suspend fun get(id: String): NoteWithRelation?\n\n    @Query(\n        \"\"\"\n        SELECT * FROM notes\n            WHERE reply_id = :replyId\n            AND account_id = :accountId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findByReplyId(accountId: Long, replyId: String): List<NoteWithRelation>\n\n    // delete by id\n    @Query(\n        \"\"\"\n        DELETE FROM notes\n            WHERE id = :id\n        \"\"\"\n    )\n    @Transaction\n    suspend fun delete(id: String)\n\n    // count\n    @Query(\n        \"\"\"\n        SELECT COUNT(*) FROM notes\n            WHERE id = :id\n        \"\"\"\n    )\n    @Transaction\n    suspend fun count(id: String): Int\n\n    // flow by id\n    @Query(\n        \"\"\"\n        SELECT * FROM notes\n            WHERE id = :id\n        \"\"\"\n    )\n    @Transaction\n    fun observeById(id: String): Flow<NoteWithRelation?>\n\n    @Query(\n        \"\"\"\n        SELECT * FROM notes\n            WHERE id IN (:ids)\n        \"\"\"\n    )\n    @Transaction\n    fun observeByIds(ids: List<String>): Flow<List<NoteWithRelation>>\n\n    // delete by user id\n    @Query(\n        \"\"\"\n        DELETE FROM notes\n            WHERE user_id = :userId\n            AND account_id = :accountId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun deleteByUserId(accountId: Long, userId: String): Int\n\n    // clear\n    @Query(\n        \"\"\"\n        DELETE FROM notes\n        \"\"\"\n    )\n    @Transaction\n    suspend fun clear()\n\n    // count\n    @Query(\n        \"\"\"\n        SELECT COUNT(*) FROM notes\n        \"\"\"\n    )\n    @Transaction\n    suspend fun count(): Long\n\n    // insert note\n    @Transaction\n    @Insert()\n    suspend fun insert(note: NoteEntity)\n\n    // insert notes\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertAll(notes: List<NoteEntity>)\n\n    // update\n    @Transaction\n    @Update\n    suspend fun update(note: NoteEntity)\n\n    // insert reaction counts\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertReactionCounts(reactionCounts: List<ReactionCountEntity>)\n\n    // delete reaction by note id\n    @Transaction\n    @Query(\n        \"\"\"\n        DELETE FROM reaction_counts\n            WHERE note_id = :noteId\n        \"\"\"\n    )\n    suspend fun deleteReactionCountsByNoteId(noteId: String)\n\n    // delete reaction counts\n    @Transaction\n    @Update\n    suspend fun updateReactionCount(reactionCount: ReactionCountEntity)\n\n\n\n    @Query(\n        \"\"\"\n            DELETE FROM reaction_counts\n                WHERE id IN (:ids)\n        \"\"\"\n    )\n    suspend fun deleteReactionCounts(ids: List<String>)\n\n    // visible ids insert and delete\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertVisibleIds(visibleIds: List<NoteVisibleUserIdEntity>)\n\n\n    // poll choices insert and delete\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertPollChoices(pollChoices: List<NotePollChoiceEntity>)\n\n    @Transaction\n    @Query(\n        \"\"\"\n        DELETE FROM note_poll_choices\n            WHERE note_id = :noteId\n        \"\"\"\n    )\n    suspend fun deletePollChoicesByNoteId(noteId: String)\n\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertMastodonTags(tags: List<MastodonTagEntity>)\n\n    // mastodon mentions insert\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertMastodonMentions(mentions: List<MastodonMentionEntity>)\n\n    // custom emojis insert and delete\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertCustomEmojis(emojis: List<NoteCustomEmojiEntity>)\n\n    @Transaction\n    @Query(\n        \"\"\"\n        DELETE FROM note_custom_emojis\n            WHERE id IN (:ids)\n        \"\"\"\n    )\n    suspend fun deleteCustomEmojis(ids: List<String>)\n\n    @Transaction\n    @Query(\n        \"\"\"\n        DELETE FROM note_custom_emojis\n            WHERE note_id = :noteId\n        \"\"\"\n    )\n    suspend fun deleteCustomEmojisByNoteId(noteId: String)\n\n    // note files\n    @Transaction\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertNoteFiles(files: List<NoteFileEntity>)\n\n    // with recursive reply\n    @Query(\n        \"\"\"\n        WITH RECURSIVE reply_chain AS (\n            SELECT * FROM notes\n                WHERE id = :id\n            UNION ALL\n            SELECT notes.* FROM notes\n                JOIN reply_chain ON notes.reply_id = reply_chain.note_id\n                    AND notes.account_id = reply_chain.account_id\n        )\n        SELECT * FROM reply_chain\n        ORDER BY created_at DESC\n        \"\"\"\n    )\n    @Transaction\n    suspend fun getWithRecursiveReply(id: String): List<NoteWithRelation>\n\n    // with recursive parents\n    @Query(\n        \"\"\"\n        WITH RECURSIVE parent_chain AS (\n            SELECT * FROM notes\n                WHERE id = :id\n            UNION ALL\n            SELECT notes.* FROM notes\n                JOIN parent_chain ON notes.note_id = parent_chain.reply_id\n                    AND notes.account_id = parent_chain.account_id\n        )\n        SELECT * FROM parent_chain\n        ORDER BY created_at DESC\n        \"\"\"\n    )\n    @Transaction\n    suspend fun getWithRecursiveParents(id: String): List<NoteWithRelation>\n\n    // observe with recursive reply\n    @Query(\n        \"\"\"\n        WITH RECURSIVE reply_chain AS (\n            SELECT * FROM notes\n                WHERE id = :id\n            UNION ALL\n            SELECT notes.* FROM notes\n                JOIN reply_chain ON notes.reply_id = reply_chain.note_id\n                    AND notes.account_id = reply_chain.account_id\n        )\n        SELECT * FROM reply_chain\n        WHERE id <> :id\n        ORDER BY created_at DESC\n        \"\"\"\n    )\n    @Transaction\n    fun observeWithRecursiveReply(id: String): Flow<List<NoteWithRelation>>\n\n    // observe with recursive parents\n    @Query(\n        \"\"\"\n        WITH RECURSIVE parent_chain AS (\n            SELECT * FROM notes\n                WHERE id = :id\n            UNION ALL\n            SELECT notes.* FROM notes\n                JOIN parent_chain ON notes.note_id = parent_chain.reply_id\n                    AND notes.account_id = parent_chain.account_id\n        )\n        SELECT * FROM parent_chain\n        WHERE id <> :id\n        ORDER BY created_at DESC\n        \"\"\"\n    )\n    @Transaction\n    fun observeWithRecursiveParents(id: String): Flow<List<NoteWithRelation>>\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/sqlite/NoteEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl.sqlite\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport androidx.room.Relation\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\nimport net.pantasystem.milktea.model.note.type\nimport net.pantasystem.milktea.model.user.User\n\n@Entity(\n    tableName = \"notes\",\n)\ndata class NoteEntity(\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = false) val id: String,\n\n    @ColumnInfo(name = \"account_id\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"created_at\")\n    val createdAt: Instant,\n\n    @ColumnInfo(name = \"text\")\n    val text: String?,\n\n    @ColumnInfo(name = \"cw\")\n    val cw: String?,\n\n    @ColumnInfo(name = \"user_id\")\n    val userId: String,\n\n    @ColumnInfo(name = \"reply_id\")\n    val replyId: String?,\n\n    @ColumnInfo(name = \"repost_id\")\n    val repostId: String?,\n\n    @ColumnInfo(name = \"via_mobile\")\n    val viaMobile: Boolean?,\n\n    @ColumnInfo(name = \"visibility\")\n    val visibility: String,\n\n    @ColumnInfo(name = \"local_only\")\n    val localOnly: Boolean?,\n\n    @ColumnInfo(name = \"url\")\n    val url: String?,\n\n    @ColumnInfo(name = \"uri\")\n    val uri: String?,\n\n    @ColumnInfo(name = \"repost_count\")\n    val repostCount: Int,\n\n    @ColumnInfo(name = \"reply_count\")\n    val replyCount: Int,\n\n    @ColumnInfo(name = \"channel_id\")\n    val channelId: String?,\n\n    @ColumnInfo(name = \"max_reaction_per_account\")\n    val maxReactionPerAccount: Int,\n\n\n    // poll\n    @ColumnInfo(name = \"polls_expires_at\")\n    val pollExpiresAt: Instant?,\n\n    @ColumnInfo(name = \"polls_multiple\")\n    val pollMultiple: Boolean?,\n\n    @ColumnInfo(name = \"circle_id\")\n    val fedibirdCircleId: String?,\n\n    @ColumnInfo(name = \"type\")\n    val type: String,\n\n    @ColumnInfo(name = \"mastodon_reblogged\")\n    val mastodonReblogged: Boolean?,\n\n    @ColumnInfo(name = \"mastodon_favourited\")\n    val mastodonFavourited: Boolean?,\n\n    @ColumnInfo(name = \"mastodon_bookmarked\")\n    val mastodonBookmarked: Boolean?,\n\n    @ColumnInfo(name = \"mastodon_muted\")\n    val mastodonMuted: Boolean?,\n\n    @ColumnInfo(name = \"mastodon_favourites_count\")\n    val mastodonFavouritesCount: Int?,\n\n    @ColumnInfo(name = \"mastodon_is_fedibird_quote\")\n    val mastodonIsFedibirdQuote: Boolean?,\n\n    @ColumnInfo(name = \"mastodon_poll_id\")\n    val mastodonPollId: String?,\n\n    @ColumnInfo(name = \"mastodon_is_sensitive\")\n    val mastodonIsSensitive: Boolean?,\n\n    @ColumnInfo(name = \"mastodon_pure_text\")\n    val mastodonPureText: String?,\n\n    @ColumnInfo(name = \"mastodon_is_reaction_available\")\n    val mastodonIsReactionAvailable: Boolean?,\n\n    @ColumnInfo(\"misskey_channel_id\")\n    val misskeyChannelId: String?,\n\n    @ColumnInfo(\"misskey_channel_name\")\n    val misskeyChannelName: String?,\n\n    @ColumnInfo(\"misskey_is_accepting_only_like_reaction\")\n    val misskeyIsAcceptingOnlyLikeReaction: Boolean?,\n\n    @ColumnInfo(\"misskey_is_not_accepting_sensitive_reaction\")\n    val misskeyIsNotAcceptingSensitiveReaction: Boolean?,\n\n    @ColumnInfo(\"misskey_is_require_nyaize\")\n    val misskeyIsRequireNyaize: Boolean?,\n\n    ) {\n\n    companion object {\n        fun makeEntityId(accountId: Long, noteId: String): String {\n            return \"$accountId:$noteId\"\n        }\n\n        fun makeEntityId(noteId: Note.Id): String {\n            return makeEntityId(noteId.accountId, noteId.noteId)\n        }\n\n        fun fromModel(model: Note): NoteEntity {\n            return NoteEntity(\n                id = makeEntityId(model.id),\n                accountId = model.id.accountId,\n                noteId = model.id.noteId,\n                createdAt = model.createdAt,\n                text = model.text,\n                cw = model.cw,\n                userId = model.userId.id,\n                replyId = model.replyId?.noteId,\n                repostId = model.renoteId?.noteId,\n                viaMobile = model.viaMobile,\n                visibility = model.visibility.type(),\n                localOnly = model.localOnly,\n                url = model.url,\n                uri = model.uri,\n                repostCount = model.renoteCount,\n                replyCount = model.repliesCount,\n                channelId = model.channelId?.channelId,\n                maxReactionPerAccount = model.maxReactionsPerAccount,\n                pollExpiresAt = model.poll?.expiresAt,\n                pollMultiple = model.poll?.multiple,\n                fedibirdCircleId = (model.visibility as? Visibility.Limited)?.circleId,\n                type = when (model.type) {\n                    is Note.Type.Mastodon -> \"mastodon\"\n                    is Note.Type.Misskey -> \"misskey\"\n                },\n                mastodonReblogged = (model.type as? Note.Type.Mastodon)?.reblogged,\n                mastodonFavourited = (model.type as? Note.Type.Mastodon)?.favorited,\n                mastodonBookmarked = (model.type as? Note.Type.Mastodon)?.bookmarked,\n                mastodonMuted = (model.type as? Note.Type.Mastodon)?.muted,\n                mastodonFavouritesCount = (model.type as? Note.Type.Mastodon)?.favoriteCount,\n                mastodonIsFedibirdQuote = (model.type as? Note.Type.Mastodon)?.isFedibirdQuote,\n                mastodonPollId = (model.type as? Note.Type.Mastodon)?.pollId,\n                mastodonIsSensitive = (model.type as? Note.Type.Mastodon)?.isSensitive,\n                mastodonPureText = (model.type as? Note.Type.Mastodon)?.pureText,\n                mastodonIsReactionAvailable = (model.type as? Note.Type.Mastodon)?.isReactionAvailable,\n                misskeyChannelId = (model.type as? Note.Type.Misskey)?.channel?.id?.channelId,\n                misskeyChannelName = (model.type as? Note.Type.Misskey)?.channel?.name,\n                misskeyIsAcceptingOnlyLikeReaction = (model.type as? Note.Type.Misskey)?.isAcceptingOnlyLikeReaction,\n                misskeyIsNotAcceptingSensitiveReaction = (model.type as? Note.Type.Misskey)?.isNotAcceptingSensitiveReaction,\n                misskeyIsRequireNyaize = (model.type as? Note.Type.Misskey)?.isRequireNyaize,\n            )\n        }\n    }\n\n\n}\n\n@Entity(\n    tableName = \"reaction_counts\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"note_id\")\n    ]\n)\ndata class ReactionCountEntity(\n    @PrimaryKey(autoGenerate = false)\n    val id: String,\n\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"reaction\")\n    val reaction: String,\n\n    @ColumnInfo(name = \"count\")\n    val count: Int,\n\n    @ColumnInfo(name = \"me\")\n    val me: Boolean,\n\n    @ColumnInfo(name = \"weight\")\n    val weight: Int?,\n) {\n    companion object {\n        fun makeId(noteId: String, reaction: String): String {\n            return \"$noteId:$reaction\"\n        }\n    }\n}\n\n@Entity(\n    tableName = \"note_visible_user_ids\",\n    primaryKeys = [\"note_id\", \"user_id\"],\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"note_id\")\n    ],\n)\ndata class NoteVisibleUserIdEntity(\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"user_id\")\n    val userId: String,\n)\n\n@Entity(\n    tableName = \"note_poll_choices\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"note_id\")\n    ]\n)\ndata class NotePollChoiceEntity(\n    @PrimaryKey(autoGenerate = false)\n    val id: String,\n\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"index\")\n    val index: Int,\n\n    @ColumnInfo(name = \"text\")\n    val text: String,\n\n    @ColumnInfo(name = \"votes\")\n    val votes: Int,\n\n    @ColumnInfo(name = \"is_voted\")\n    val isVoted: Boolean,\n) {\n    companion object {\n        fun makeId(noteId: String, index: Int): String {\n            return \"$noteId:$index\"\n        }\n    }\n}\n\n@Entity(\n    tableName = \"mastodon_tags\",\n    primaryKeys = [\"note_id\", \"tag\"],\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"note_id\")\n    ]\n)\ndata class MastodonTagEntity(\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"tag\")\n    val tag: String,\n\n    @ColumnInfo(name = \"url\")\n    val url: String,\n)\n\n@Entity(\n    tableName = \"mastodon_mentions\",\n    primaryKeys = [\"note_id\", \"user_id\"],\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"note_id\")\n    ]\n)\ndata class MastodonMentionEntity(\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"user_id\")\n    val userId: String,\n\n    @ColumnInfo(name = \"username\")\n    val username: String,\n\n    @ColumnInfo(name = \"acct\")\n    val acct: String,\n\n    @ColumnInfo(name = \"url\")\n    val url: String,\n) {\n    companion object {\n        fun fromModel(model: Note.Type.Mastodon.Mention, noteId: String): MastodonMentionEntity {\n            return MastodonMentionEntity(\n                noteId = noteId,\n                userId = model.id,\n                username = model.username,\n                acct = model.acct,\n                url = model.url,\n            )\n        }\n    }\n}\n\n@Entity(\n    tableName = \"note_custom_emojis\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"note_id\")\n    ]\n)\ndata class NoteCustomEmojiEntity(\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = false)\n    val id: String,\n\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    @ColumnInfo(name = \"url\")\n    val url: String?,\n\n    @ColumnInfo(name = \"aspect_ratio\")\n    val aspectRatio: Float?,\n\n    @ColumnInfo(name = \"cache_path\")\n    val cachePath: String?,\n) {\n    companion object {\n        fun makeId(noteId: String, name: String): String {\n            return \"$noteId:$name\"\n        }\n\n        fun fromModel(model: CustomEmoji, noteId: String): NoteCustomEmojiEntity {\n            return NoteCustomEmojiEntity(\n                id = makeId(noteId, model.name),\n                noteId = noteId,\n                name = model.name,\n                url = model.url,\n                aspectRatio = model.aspectRatio,\n                cachePath = model.cachePath,\n            )\n        }\n    }\n\n    fun equalModel(\n        customEmoji: CustomEmoji\n    ): Boolean {\n        return (name == customEmoji.name\n                && url == (customEmoji.url ?: customEmoji.uri)\n                && aspectRatio == customEmoji.aspectRatio\n                && cachePath == customEmoji.cachePath)\n    }\n}\n\n@Entity(\n    tableName = \"note_files\",\n    primaryKeys = [\"note_id\", \"file_id\"],\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"note_id\")\n    ],\n)\ndata class NoteFileEntity(\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"file_id\")\n    val fileId: String,\n)\n\ndata class NoteWithRelation(\n    @Embedded\n    val note: NoteEntity,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"note_id\"\n    )\n    val reactionCounts: List<ReactionCountEntity>?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"note_id\"\n    )\n    val visibleUserIds: List<NoteVisibleUserIdEntity>?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"note_id\"\n    )\n    val pollChoices: List<NotePollChoiceEntity>?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"note_id\"\n    )\n    val mastodonTags: List<MastodonTagEntity>?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"note_id\"\n    )\n    val mastodonMentions: List<MastodonMentionEntity>?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"note_id\"\n    )\n    val customEmojis: List<NoteCustomEmojiEntity>?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"note_id\"\n    )\n    val noteFiles: List<NoteFileEntity>?,\n) {\n    fun toModel(): Note {\n        val emojis = customEmojis?.map {\n            CustomEmoji(\n                name = it.name,\n                url = it.url,\n                aspectRatio = it.aspectRatio,\n                cachePath = it.cachePath\n            )\n        }\n        return Note(\n            id = Note.Id(note.accountId, note.noteId),\n            createdAt = note.createdAt,\n            text = note.text,\n            cw = note.cw,\n            userId = User.Id(note.accountId, note.userId),\n            replyId = note.replyId?.let { Note.Id(note.accountId, it) },\n            renoteId = note.repostId?.let { Note.Id(note.accountId, it) },\n            viaMobile = note.viaMobile,\n            visibility = Visibility(note.visibility, note.fedibirdCircleId, note.localOnly),\n            localOnly = note.localOnly,\n            visibleUserIds = visibleUserIds?.map { User.Id(note.accountId, it.userId) },\n            url = note.url,\n            uri = note.uri,\n            renoteCount = note.repostCount,\n            reactionCounts = reactionCounts?.sortedBy {\n                it.weight\n            }?.map {\n                ReactionCount(it.reaction, it.count, it.me)\n            } ?: emptyList(),\n            emojis = emojis,\n            repliesCount = note.replyCount,\n            fileIds = noteFiles?.map { FileProperty.Id(note.accountId, it.fileId) },\n            poll = if (pollChoices.isNullOrEmpty()) {\n                null\n            } else {\n                Poll(\n                    expiresAt = note.pollExpiresAt,\n                    multiple = note.pollMultiple ?: false,\n                    choices = pollChoices.map {\n                        Poll.Choice(it.index, it.text, it.votes, it.isVoted)\n                    }.sortedBy { it.index }\n                )\n            },\n            myReaction = reactionCounts?.firstOrNull { it.me }?.reaction,\n            channelId = note.channelId?.let { Channel.Id(note.accountId, it) },\n            type = when (note.type) {\n                \"mastodon\" -> Note.Type.Mastodon(\n                    reblogged = note.mastodonReblogged,\n                    favorited = note.mastodonFavourited,\n                    bookmarked = note.mastodonBookmarked,\n                    muted = note.mastodonMuted,\n                    favoriteCount = note.mastodonFavouritesCount,\n                    tags = mastodonTags?.map {\n                        Note.Type.Mastodon.Tag(it.tag, it.url)\n                    } ?: emptyList(),\n                    mentions = mastodonMentions?.map {\n                        Note.Type.Mastodon.Mention(\n                            it.userId,\n                            it.username,\n                            it.acct,\n                            it.url\n                        )\n                    } ?: emptyList(),\n                    isFedibirdQuote = note.mastodonIsFedibirdQuote ?: false,\n                    pollId = note.mastodonPollId,\n                    isSensitive = note.mastodonIsSensitive,\n                    pureText = note.mastodonPureText,\n                    isReactionAvailable = note.mastodonIsReactionAvailable ?: false,\n                )\n\n                \"misskey\" -> Note.Type.Misskey(\n                    channel = note.channelId?.let {\n                        Note.Type.Misskey.SimpleChannelInfo(\n                            Channel.Id(note.accountId, it),\n                            note.misskeyChannelName ?: \"\",\n                        )\n                    },\n                    isAcceptingOnlyLikeReaction = note.misskeyIsAcceptingOnlyLikeReaction ?: false,\n                    isNotAcceptingSensitiveReaction = note.misskeyIsNotAcceptingSensitiveReaction\n                        ?: false,\n                    isRequireNyaize = note.misskeyIsRequireNyaize ?: false,\n                )\n\n                else -> Note.Type.Misskey()\n            },\n            maxReactionsPerAccount = note.maxReactionPerAccount,\n            emojiNameMap = emojis?.associateBy { it.name },\n        )\n    }\n\n    companion object {\n        fun fromModel(model: Note): NoteWithRelation {\n            return NoteWithRelation(\n                note = NoteEntity.fromModel(model),\n                reactionCounts = model.reactionCounts.mapIndexed { index, reactionCount ->\n                    ReactionCountEntity(\n                        id = ReactionCountEntity.makeId(\n                            NoteEntity.makeEntityId(model.id),\n                            reactionCount.reaction\n                        ),\n                        noteId = NoteEntity.makeEntityId(model.id),\n                        reaction = reactionCount.reaction,\n                        count = reactionCount.count,\n                        me = reactionCount.me,\n                        weight = index\n                    )\n                },\n                visibleUserIds = model.visibleUserIds?.map {\n                    NoteVisibleUserIdEntity(\n                        noteId = NoteEntity.makeEntityId(model.id),\n                        userId = it.id,\n                    )\n                },\n                pollChoices = model.poll?.choices?.map {\n                    NotePollChoiceEntity(\n                        noteId = NoteEntity.makeEntityId(model.id),\n                        index = it.index,\n                        text = it.text,\n                        votes = it.votes,\n                        isVoted = it.isVoted,\n                        id = NotePollChoiceEntity.makeId(\n                            NoteEntity.makeEntityId(model.id),\n                            it.index\n                        )\n                    )\n                },\n                mastodonTags = (model.type as? Note.Type.Mastodon)?.tags?.map {\n                    MastodonTagEntity(\n                        noteId = NoteEntity.makeEntityId(model.id),\n                        tag = it.name,\n                        url = it.url,\n                    )\n                },\n                mastodonMentions = (model.type as? Note.Type.Mastodon)?.mentions?.map {\n                    MastodonMentionEntity(\n                        noteId = NoteEntity.makeEntityId(model.id),\n                        userId = it.id,\n                        username = it.username,\n                        acct = it.acct,\n                        url = it.url,\n                    )\n                },\n                customEmojis = model.emojis?.map {\n                    NoteCustomEmojiEntity.fromModel(it, NoteEntity.makeEntityId(model.id))\n                },\n                noteFiles = model.fileIds?.map {\n                    NoteFileEntity(\n                        noteId = NoteEntity.makeEntityId(model.id),\n                        fileId = it.fileId,\n                    )\n                },\n            )\n\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/sqlite/NoteThreadDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl.sqlite\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport androidx.room.Update\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface NoteThreadDAO {\n    // insert, update, delete, select, relation用のinsert, deleteメソッドを追加\n\n    @Insert\n    suspend fun insert(noteThread: NoteThreadEntity)\n\n    // update\n    @Update\n    suspend fun update(noteThread: NoteThreadEntity)\n\n    // delete\n    @Query(\n        \"\"\"\n        DELETE FROM note_threads\n            WHERE id = :id\n        \"\"\"\n    )\n    suspend fun delete(id: String)\n\n    // attach ancestor\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun attachAncestors(noteAncestor: List<NoteAncestorEntity>)\n\n    // detach ancestor\n    @Query(\n        \"\"\"\n        DELETE FROM note_thread_ancestors\n            WHERE thread_id = :threadId\n        \"\"\"\n    )\n    suspend fun detachAncestors(threadId: String)\n\n    // attach descendant\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun attachDescendants(noteDescendant: List<NoteDescendantEntity>)\n\n    // detach descendant\n    @Query(\n        \"\"\"\n        DELETE FROM note_thread_descendants\n            WHERE thread_id = :threadId\n        \"\"\"\n    )\n    suspend fun detachDescendants(threadId: String)\n\n    // select\n    @Query(\n        \"\"\"\n        SELECT * FROM note_threads\n            WHERE id = :id\n        \"\"\"\n    )\n    suspend fun select(id: String): NoteThreadEntity?\n\n    // select with relation\n    @Query(\n        \"\"\"\n        SELECT * FROM note_threads\n            WHERE id = :id\n        \"\"\"\n    )\n    @Transaction\n    suspend fun selectWithRelation(id: String): NoteThreadWithRelation?\n\n    // coroutines flow\n    @Query(\n        \"\"\"\n        SELECT * FROM note_threads\n            WHERE id = :id\n        \"\"\"\n    )\n    @Transaction\n    fun observeWithRelation(id: String): Flow<NoteThreadWithRelation?>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/sqlite/NoteThreadEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl.sqlite\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport androidx.room.Relation\n\n@Entity(\n    tableName = \"note_threads\"\n)\ndata class NoteThreadEntity(\n    @PrimaryKey(autoGenerate = false)\n    val id: String,\n    val accountId: Long,\n    val targetNoteId: String,\n)\n\n// ancestors\n// descendants\n@Entity(\n    tableName = \"note_thread_ancestors\",\n    primaryKeys = [\"thread_id\", \"note_id\"]\n)\ndata class NoteAncestorEntity(\n    @ColumnInfo(\n        name = \"thread_id\"\n    )\n    val threadId: String,\n\n    @ColumnInfo(\n        name = \"note_id\"\n    )\n    val noteId: String,\n)\n\n@Entity(\n    tableName = \"note_thread_descendants\",\n    primaryKeys = [\"thread_id\", \"note_id\"]\n)\ndata class NoteDescendantEntity(\n    @ColumnInfo(\n        name = \"thread_id\"\n    )\n    val threadId: String,\n\n    @ColumnInfo(\n        name = \"note_id\"\n    )\n    val noteId: String,\n)\n\ndata class NoteThreadWithRelation(\n    @Embedded\n    val thread: NoteThreadEntity,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"thread_id\"\n    )\n    val ancestors: List<NoteAncestorEntity>,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"thread_id\"\n    )\n    val descendants: List<NoteDescendantEntity>,\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/impl/sqlite/SQLiteNoteDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl.sqlite\n\nimport androidx.room.Transaction\nimport androidx.room.withTransaction\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.DefaultDispatcher\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteNotFoundException\nimport net.pantasystem.milktea.model.note.NoteResult\nimport net.pantasystem.milktea.model.note.NoteThreadContext\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\nclass SQLiteNoteDataSource @Inject constructor(\n    private val noteDAO: NoteDAO,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n    @DefaultDispatcher private val defaultDispatcher: CoroutineDispatcher,\n    private val database: DataBase,\n) : NoteDataSource {\n\n    private var listeners = setOf<NoteDataSource.Listener>()\n    private val listenersLock = Mutex()\n\n    private val lock = Mutex()\n    private var deleteNoteIds = mutableSetOf<Note.Id>()\n\n    private val clearStorageLock = Mutex()\n\n    override fun addEventListener(listener: NoteDataSource.Listener): Unit = runBlocking {\n        listeners = listeners.toMutableSet().apply {\n            add(listener)\n        }\n    }\n\n    override suspend fun getIn(noteIds: List<Note.Id>): Result<List<Note>> =\n        runCancellableCatching {\n            val ids = noteIds.map {\n                NoteEntity.makeEntityId(it)\n            }.distinct()\n            if (ids.isEmpty()) {\n                return@runCancellableCatching emptyList()\n            }\n            val entities = withContext(ioDispatcher) {\n                noteDAO.getIn(ids)\n            }\n            withContext(defaultDispatcher) {\n                entities.map {\n                    it.toModel()\n                }\n            }\n        }\n\n    override suspend fun get(noteId: Note.Id): Result<Note> = runCancellableCatching {\n        if (deleteNoteIds.contains(noteId)) {\n            return Result.failure(Exception(\"Note is deleted\"))\n        }\n        val entity = withContext(ioDispatcher) {\n            noteDAO.get(NoteEntity.makeEntityId(noteId))\n        }\n        entity?.toModel() ?: throw NoteNotFoundException(noteId)\n    }\n\n    override suspend fun getWithState(noteId: Note.Id): Result<NoteResult> =\n        runCancellableCatching {\n            if (deleteNoteIds.contains(noteId)) {\n                return@runCancellableCatching NoteResult.Deleted\n            }\n            val entity = withContext(ioDispatcher) {\n                noteDAO.get(NoteEntity.makeEntityId(noteId))\n            }\n            when (entity) {\n                null -> NoteResult.NotFound\n                else -> NoteResult.Success(entity.toModel())\n            }\n        }\n\n    override suspend fun findByReplyId(id: Note.Id): Result<List<Note>> = runCancellableCatching {\n        val entities = withContext(ioDispatcher) {\n            noteDAO.findByReplyId(id.accountId, id.noteId)\n        }\n        withContext(defaultDispatcher) {\n            entities.map {\n                it.toModel()\n            }\n        }\n    }\n\n    override suspend fun exists(noteId: Note.Id): Boolean {\n        return runCancellableCatching {\n            val entity = withContext(ioDispatcher) {\n                noteDAO.get(NoteEntity.makeEntityId(noteId))\n            }\n            entity != null\n        }.getOrDefault(false)\n    }\n\n    override suspend fun delete(noteId: Note.Id): Result<Boolean> = runCancellableCatching {\n        val entityId = NoteEntity.makeEntityId(noteId)\n        val count = withContext(ioDispatcher) {\n            noteDAO.count(entityId)\n        }\n        withContext(ioDispatcher) {\n            noteDAO.delete(entityId)\n        }\n        lock.withLock {\n            deleteNoteIds.add(noteId)\n        }\n        if (count > 0) {\n            publish(NoteDataSource.Event.Deleted(noteId))\n        }\n\n        count > 0\n    }\n\n    @Transaction\n    override suspend fun add(note: Note): Result<AddResult> = runCancellableCatching {\n        val relationEntity = NoteWithRelation.fromModel(note)\n        // exists check\n        val existsEntity = withContext(ioDispatcher) {\n            noteDAO.get(relationEntity.note.id)\n        }\n        val entity = relationEntity.note\n        val needInsert = existsEntity == null\n        withContext(ioDispatcher) {\n            database.withTransaction {\n                if (existsEntity == null) {\n                    noteDAO.insert(entity)\n                } else {\n                    noteDAO.update(entity)\n                }\n                when (note.type) {\n                    is Note.Type.Mastodon -> {\n                        if (needInsert) {\n                            relationEntity.mastodonMentions?.let {\n                                noteDAO.insertMastodonMentions(\n                                    it\n                                )\n                            }\n                            relationEntity.mastodonTags?.let {\n                                noteDAO.insertMastodonTags(\n                                    it\n                                )\n                            }\n                        }\n                    }\n\n                    is Note.Type.Misskey -> Unit\n                }\n\n                if (needInsert) {\n                    relationEntity.noteFiles?.let {\n                        noteDAO.insertNoteFiles(it)\n                    }\n                    relationEntity.visibleUserIds?.let {\n                        noteDAO.insertVisibleIds(it)\n                    }\n                }\n\n                replaceReactionCountsIfNeed(\n                    relationEntity.reactionCounts?.associateBy { it.reaction } ?: emptyMap(),\n                    existsEntity?.reactionCounts?.associateBy { it.reaction } ?: emptyMap()\n                )\n                replaceCustomEmojisIfNeed(\n                    relationEntity.customEmojis?.associateBy { it.id } ?: emptyMap(),\n                    existsEntity?.customEmojis?.associateBy { it.id } ?: emptyMap()\n                )\n\n                replacePollChoicesIfNeed(\n                    relationEntity.pollChoices ?: emptyList(),\n                    existsEntity?.pollChoices ?: emptyList()\n                )\n            }\n\n\n        }\n\n        if (existsEntity == null) AddResult.Created else AddResult.Updated\n    }\n\n    override suspend fun addAll(notes: List<Note>): Result<List<AddResult>> =\n        runCancellableCatching {\n            val noteRelations = notes.map {\n                NoteWithRelation.fromModel(it)\n            }\n\n            val reactionCountsMap = noteRelations.mapNotNull {\n                it.reactionCounts\n            }.flatten().associateBy {\n                it.id\n            }\n\n            val customEmojis = noteRelations.mapNotNull {\n                it.customEmojis\n            }.flatten().associateBy {\n                it.id\n            }\n\n            val pollChoices = noteRelations.mapNotNull {\n                it.pollChoices\n            }.flatten()\n\n            withContext(ioDispatcher) {\n                database.withTransaction {\n                    val existsNotes = noteDAO.getIn(\n                        notes.map {\n                            NoteEntity.makeEntityId(it.id)\n                        },\n                    ).associateBy {\n                        it.note.id\n                    }\n\n                    val needInsertNotes = noteRelations.filter {\n                        existsNotes[it.note.id] == null\n                    }\n\n                    val needUpdateNotes = noteRelations.filter {\n                        existsNotes[it.note.id] != null\n                    }\n                    val existsReactionCountsMap = existsNotes.mapNotNull {\n                        it.value.reactionCounts\n                    }.flatten().associateBy {\n                        it.id\n                    }\n\n                    val existsPollChoices = existsNotes.mapNotNull {\n                        it.value.pollChoices\n                    }.flatten()\n\n                    val mastodonNotes = needInsertNotes.filter {\n                        it.note.type == \"mastodon\"\n                    }\n                    val mastodonMentions = mastodonNotes.mapNotNull {\n                        it.mastodonMentions\n                    }.flatten()\n                    val mastodonTags = mastodonNotes.mapNotNull {\n                        it.mastodonTags\n                    }.flatten()\n                    val noteFiles = needInsertNotes.mapNotNull {\n                        it.noteFiles\n                    }.flatten()\n\n                    val existsCustomEmojis = existsNotes.mapNotNull {\n                        it.value.customEmojis\n                    }.flatten().associateBy {\n                        it.id\n                    }\n\n                    noteDAO.insertAll(needInsertNotes.map { it.note })\n                    needUpdateNotes.forEach {\n                        noteDAO.update(it.note)\n                    }\n\n                    replaceCustomEmojisIfNeed(customEmojis, existsCustomEmojis)\n                    replaceReactionCountsIfNeed(reactionCountsMap, existsReactionCountsMap)\n                    replacePollChoicesIfNeed(pollChoices, existsPollChoices)\n\n\n                    noteDAO.insertMastodonMentions(mastodonMentions)\n                    noteDAO.insertMastodonTags(mastodonTags)\n                    noteDAO.insertNoteFiles(noteFiles)\n\n                    noteRelations.map {\n                        if (existsNotes[it.note.id] == null) AddResult.Created else AddResult.Updated\n                    }\n                }\n\n            }\n        }\n\n    override suspend fun clear(): Result<Unit> {\n        return runCancellableCatching {\n            clearStorageLock.withLock {\n                withContext(ioDispatcher) {\n                    noteDAO.clear()\n                }\n            }\n        }\n    }\n\n    override suspend fun findNoteThreadContext(noteId: Note.Id): Result<NoteThreadContext> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                val parents = noteDAO.getWithRecursiveParents(NoteEntity.makeEntityId(noteId))\n                val children = noteDAO.getWithRecursiveReply(NoteEntity.makeEntityId(noteId))\n\n                NoteThreadContext(\n                    ancestors = parents.map { it.toModel() },\n                    descendants = children.map { it.toModel() }\n                )\n            }\n        }\n\n    override suspend fun deleteByUserId(userId: User.Id): Result<Int> = runCancellableCatching {\n        val count = withContext(ioDispatcher) {\n            noteDAO.deleteByUserId(userId.accountId, userId.id)\n        }\n        count\n    }\n\n    override fun observeIn(noteIds: List<Note.Id>): Flow<List<Note>> {\n        val ids = noteIds.map {\n            NoteEntity.makeEntityId(it)\n        }.distinct()\n        if (ids.isEmpty()) {\n            return flowOf(emptyList())\n        }\n        return noteDAO.observeByIds(ids).flowOn(ioDispatcher).map { notes ->\n            notes.map {\n                it.toModel()\n            }\n        }.flowOn(defaultDispatcher)\n    }\n\n    override fun observeOne(noteId: Note.Id): Flow<Note?> {\n        return noteDAO.observeById(NoteEntity.makeEntityId(noteId)).flowOn(ioDispatcher).map {\n            it?.toModel()\n        }\n    }\n\n    override fun observeNoteThreadContext(noteId: Note.Id): Flow<NoteThreadContext?> {\n        return combine(\n            noteDAO.observeWithRecursiveParents(NoteEntity.makeEntityId(noteId)),\n            noteDAO.observeWithRecursiveReply(NoteEntity.makeEntityId(noteId)),\n        ) { parents, children ->\n            NoteThreadContext(\n                ancestors = parents.map { it.toModel() },\n                descendants = children.map { it.toModel() },\n            )\n        }\n    }\n\n    override suspend fun findLocalCount(): Result<Long> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            noteDAO.count()\n        }\n    }\n\n    private fun publish(ev: NoteDataSource.Event) = runBlocking {\n        listenersLock.withLock {\n            listeners.forEach {\n                it.on(ev)\n            }\n        }\n    }\n\n    private suspend fun replaceReactionCountsIfNeed(\n        reactionCountsMap: Map<String, ReactionCountEntity>,\n        existsNoteReactionCountMap: Map<String, ReactionCountEntity>,\n    ) {\n        val deleteList = existsNoteReactionCountMap.filter {\n            !reactionCountsMap.containsKey(it.key)\n        }.values.toList()\n        val insertList = reactionCountsMap.filter { (_, value) ->\n            value.id !in existsNoteReactionCountMap\n        }.values.toList()\n\n        val updateList = reactionCountsMap.filter { (_, value) ->\n            value.id in existsNoteReactionCountMap && value != existsNoteReactionCountMap[value.id]\n        }.values.toList()\n\n        withContext(ioDispatcher) {\n            noteDAO.insertReactionCounts(insertList)\n            noteDAO.deleteReactionCounts(deleteList.map { it.id })\n            updateList.forEach {\n                noteDAO.updateReactionCount(it)\n            }\n        }\n\n    }\n\n    private suspend fun replaceCustomEmojisIfNeed(\n        customEmojis: Map<String, NoteCustomEmojiEntity>,\n        existsCustomEmojis: Map<String, NoteCustomEmojiEntity>,\n    ) {\n        val deleteList = existsCustomEmojis.filter {\n            !customEmojis.containsKey(it.key)\n        }.values\n\n        val updateOrInsertList = customEmojis.mapNotNull { emoji ->\n            val exists = existsCustomEmojis[emoji.key]\n            if (exists == null || exists != emoji.value) {\n                emoji.value\n            } else {\n                null\n            }\n        }\n\n        withContext(ioDispatcher) {\n            noteDAO.insertCustomEmojis(updateOrInsertList)\n            noteDAO.deleteCustomEmojis(deleteList.map { it.id })\n        }\n    }\n\n    private suspend fun replacePollChoicesIfNeed(\n        pollChoices: List<NotePollChoiceEntity>,\n        existsPollChoices: List<NotePollChoiceEntity>,\n    ) {\n        // deleteの調整は必要ない\n        val updateOrInsertList = pollChoices.mapNotNull { choice ->\n            val exists = existsPollChoices.find {\n                it.id == choice.id\n            }\n            if (exists == null || exists != choice) {\n                choice\n            } else {\n                null\n            }\n        }\n        noteDAO.insertPollChoices(updateOrInsertList)\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/ReactionAuthorDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport androidx.room.Upsert\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface ReactionAuthorDAO {\n    @Transaction\n    @Query(\"\"\"\n        SELECT * FROM reaction_authors WHERE id = :id\n    \"\"\")\n    suspend fun findById(id: String): ReactionAuthorWithUsers?\n\n    @Upsert\n    suspend fun upsert(entity: ReactionAuthorEntity): Long\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun appendReactionUsers(users: List<ReactionUserEntity>): List<Long>\n\n    @Query(\"\"\"\n        DELETE FROM reaction_authors WHERE id = :id\n    \"\"\")\n    suspend fun remove(id: String)\n\n    @Transaction\n    @Query(\"\"\"\n        SELECT * FROM reaction_authors WHERE id = :id\n    \"\"\")\n    fun observeById(id: String): Flow<ReactionAuthorWithUsers?>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/ReactionAuthorEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport androidx.room.Relation\nimport net.pantasystem.milktea.model.note.Note\n\n@Entity(\n    tableName = \"reaction_authors\",\n    indices = [],\n)\ndata class ReactionAuthorEntity(\n    @PrimaryKey(autoGenerate = false) val id: String,\n    @ColumnInfo(name = \"account_id\") val accountId: Long,\n    @ColumnInfo(name = \"reaction\") val reaction: String?,\n    @ColumnInfo(name = \"note_id\") val noteId: String\n) {\n\n\n    companion object {\n        fun generateUniqueId(noteId: Note.Id, reaction: String?): String {\n            return if (reaction == null) {\n                \"${noteId.accountId}-${noteId.noteId}\"\n            } else {\n                \"${noteId.accountId}-${noteId.noteId}-$reaction\"\n            }\n\n        }\n    }\n}\n\n\n@Entity(\n    tableName = \"reaction_authors_users\",\n    indices = [\n        Index(\"reaction_author_id\", \"user_id\"),\n        Index(\"reaction_author_id\")\n    ],\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"reaction_author_id\"],\n            entity = ReactionAuthorEntity::class,\n        )\n    ],\n    primaryKeys = [\n        \"reaction_author_id\", \"user_id\"\n    ]\n)\ndata class ReactionUserEntity(\n    @ColumnInfo(\"reaction_author_id\") val reactionAuthorId: String,\n    @ColumnInfo(\"user_id\") val userId: String,\n)\n\ndata class ReactionAuthorWithUsers(\n    @Embedded\n    val reaction: ReactionAuthorEntity,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"reaction_author_id\",\n        entity = ReactionUserEntity::class,\n    )\n    val users: List<ReactionUserEntity>\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/ReactionRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.notes.CreateReactionDTO\nimport net.pantasystem.milktea.api.misskey.notes.DeleteNote\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.note.NoteCaptureAPIWithAccountProvider\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.data.infrastructure.note.onIReacted\nimport net.pantasystem.milktea.data.infrastructure.note.onIUnReacted\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.reaction.CreateReaction\nimport net.pantasystem.milktea.model.note.reaction.DeleteReaction\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.note.reaction.ReactionRepository\nimport javax.inject.Inject\n\nclass ReactionRepositoryImpl @Inject constructor(\n    private val getAccount: GetAccount,\n    private val noteCaptureAPIProvider: NoteCaptureAPIWithAccountProvider,\n    private val noteRepository: NoteRepository,\n    private val noteDataSource: NoteDataSource,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n) : ReactionRepository {\n\n    override suspend fun create(createReaction: CreateReaction): Result<Boolean> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                val account = getAccount.get(createReaction.noteId.accountId)\n                val note = noteRepository.find(createReaction.noteId).getOrThrow()\n\n                runCancellableCatching {\n                    when (account.instanceType) {\n                        Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                            if (postReaction(createReaction) && noteCaptureAPIProvider.get(account)\n                                    ?.isCaptured(createReaction.noteId.noteId) == false\n                            ) {\n                                noteDataSource.add(note.onIReacted(createReaction.reaction))\n                            }\n                        }\n                        Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                            val nodeInfo = nodeInfoRepository.find(account.getHost())\n                                .getOrThrow()\n                            if (nodeInfo.type !is NodeInfo.SoftwareType.Mastodon.Fedibird\n                                && nodeInfo.type !is NodeInfo.SoftwareType.Mastodon.Kmyblue\n                            ) {\n                                if (!note.isSupportEmojiReaction) {\n                                    throw IllegalArgumentException(\"Mastodon is not support reaction, host:${account.getHost()}, username:${account.userName}\")\n                                }\n                            }\n                            val body = mastodonAPIProvider.get(account).reaction(\n                                createReaction.noteId.noteId,\n                                Reaction(createReaction.reaction).getNameAndHost()\n                            ).throwIfHasError().body()\n                            noteDataSourceAdder.addTootStatusDtoIntoDataSource(\n                                account,\n                                requireNotNull(body)\n                            )\n                        }\n                    }\n\n                    true\n                }.getOrElse { e ->\n                    if (e is APIError.ClientException) {\n                        return@getOrElse false\n                    }\n                    throw e\n                }\n            }\n        }\n\n    override suspend fun delete(deleteReaction: DeleteReaction): Result<Boolean> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                val note = noteRepository.find(deleteReaction.noteId).getOrThrow()\n                val account = getAccount.get(deleteReaction.noteId.accountId)\n                when (account.instanceType) {\n                    Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                        postUnReaction(deleteReaction.noteId)\n                                && (noteCaptureAPIProvider.get(account)\n                            ?.isCaptured(deleteReaction.noteId.noteId) == true\n                                || (note.reactionCounts.any { it.me }\n                                && noteDataSource.add(note.onIUnReacted())\n                            .getOrThrow() != AddResult.Canceled))\n                    }\n                    Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                        val nodeInfo = nodeInfoRepository.find(account.getHost())\n                            .getOrThrow()\n                        if (nodeInfo.type !is NodeInfo.SoftwareType.Mastodon.Fedibird\n                            && nodeInfo.type !is NodeInfo.SoftwareType.Mastodon.Kmyblue\n                        ) {\n                            if (!note.isSupportEmojiReaction) {\n                                return@withContext false\n                            }\n                        }\n                        val res = mastodonAPIProvider.get(account)\n                            .deleteReaction(\n                                deleteReaction.noteId.noteId,\n                                Reaction(deleteReaction.reaction).getNameAndHost()\n                            )\n                            .throwIfHasError()\n                            .body()\n                        noteDataSourceAdder.addTootStatusDtoIntoDataSource(\n                            account,\n                            requireNotNull(res)\n                        )\n                        true\n                    }\n                }\n\n            }\n        }\n\n\n    private suspend fun postReaction(createReaction: CreateReaction): Boolean {\n        val account = getAccount.get(createReaction.noteId.accountId)\n        val res = misskeyAPIProvider.get(account).createReaction(\n            CreateReactionDTO(\n                i = account.token,\n                noteId = createReaction.noteId.noteId,\n                reaction = createReaction.reaction\n            )\n        )\n        res.throwIfHasError()\n        return res.isSuccessful\n    }\n\n    private suspend fun postUnReaction(noteId: Note.Id): Boolean {\n        val note = noteRepository.find(noteId).getOrThrow()\n        val account = getAccount.get(noteId.accountId)\n        val res = misskeyAPIProvider.get(account).deleteReaction(\n            DeleteNote(\n                noteId = note.id.noteId,\n                i = account.token\n            )\n        )\n        res.throwIfHasError()\n        return res.isSuccessful\n\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/ReactionUserRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport net.pantasystem.milktea.api.misskey.notes.reaction.ReactionHistoryDTO\nimport net.pantasystem.milktea.api.misskey.notes.reaction.RequestReactionHistoryDTO\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.ReactionUserRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass ReactionUserRepositoryImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val userRepository: UserRepository,\n    private val userDataSource: UserDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val reactionAuthorDAO: ReactionAuthorDAO,\n) : ReactionUserRepository {\n\n    override suspend fun syncBy(noteId: Note.Id, reaction: String?): Result<Unit> =\n        runCancellableCatching {\n            val account = accountRepository.get(noteId.accountId).getOrThrow()\n            reactionAuthorDAO.remove(ReactionAuthorEntity.generateUniqueId(noteId, reaction))\n            reactionAuthorDAO.upsert(\n                ReactionAuthorEntity(\n                    noteId = noteId.noteId,\n                    accountId = noteId.accountId,\n                    reaction = reaction,\n                    id = ReactionAuthorEntity.generateUniqueId(noteId, reaction),\n                )\n            )\n            when (account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    var reactions: List<ReactionHistoryDTO>\n                    var offset = 0\n                    do {\n                        reactions = requireNotNull(\n                            misskeyAPIProvider.get(account).reactions(\n                                RequestReactionHistoryDTO(\n                                    i = account.token,\n                                    noteId = noteId.noteId,\n                                    type = reaction,\n                                    offset = offset,\n                                    limit = 10\n                                )\n                            ).throwIfHasError().body()\n                        )\n                        offset += reactions.size\n                        reactionAuthorDAO.appendReactionUsers(\n                            reactions.map {\n                                ReactionUserEntity(\n                                    reactionAuthorId = ReactionAuthorEntity.generateUniqueId(\n                                        noteId,\n                                        reaction\n                                    ),\n                                    userId = it.user.id\n                                )\n                            }\n                        )\n                        userDataSource.addAll(reactions.map {\n                            userDTOEntityConverter.convert(\n                                account,\n                                it.user\n                            )\n                        })\n                    } while (reactions.size >= 10)\n\n                }\n\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val resBody = requireNotNull(\n                        mastodonAPIProvider.get(account).getStatus(noteId.noteId)\n                            .throwIfHasError()\n                            .body()\n                    )\n                    val emojiReaction = resBody.emojiReactions?.firstOrNull {\n                        it.reaction == reaction\n                    }\n                    val accountIds = if (reaction == null) {\n                        resBody.emojiReactions?.map {\n                            it.accountIds\n                        }?.flatten()\n                    } else {\n                        emojiReaction?.accountIds\n                    } ?: emptyList()\n\n                    userRepository.syncIn(accountIds.map {\n                        User.Id(account.accountId, it)\n                    })\n                    reactionAuthorDAO.upsert(\n                        ReactionAuthorEntity(\n                            noteId = noteId.noteId,\n                            accountId = noteId.accountId,\n                            reaction = reaction,\n                            id = ReactionAuthorEntity.generateUniqueId(noteId, reaction),\n                        )\n                    )\n                    reactionAuthorDAO.appendReactionUsers(\n                        accountIds.map {\n                            ReactionUserEntity(\n                                reactionAuthorId = ReactionAuthorEntity.generateUniqueId(\n                                    noteId,\n                                    reaction\n                                ),\n                                userId = it\n                            )\n                        }\n                    )\n                }\n\n            }\n        }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun observeBy(noteId: Note.Id, reaction: String?): Flow<List<User>> {\n        return reactionAuthorDAO.observeById(\n            ReactionAuthorEntity.generateUniqueId(noteId, reaction)\n        ).filterNotNull().flatMapLatest { users ->\n            userDataSource.observeIn(noteId.accountId, users.users.map { it.userId })\n        }\n    }\n\n    override suspend fun findBy(noteId: Note.Id, reaction: String?): Result<List<User>> =\n        runCancellableCatching {\n            val userIds = reactionAuthorDAO.findById(\n                ReactionAuthorEntity.generateUniqueId(\n                    noteId,\n                    reaction\n                )\n            )?.users?.map { it.userId } ?: emptyList()\n            userDataSource.getIn(noteId.accountId, userIds).getOrThrow()\n        }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/history/FrequentlyReactionAndUnFollowedUserRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history\n\nimport androidx.room.ColumnInfo\n\ndata class FrequentlyReactionAndUnFollowedUserRecord(\n    @ColumnInfo(name = \"targetUserId\") val targetUserId: String,\n    @ColumnInfo(name = \"accountId\") val accountId: Long,\n    @ColumnInfo(name = \"reactionCount\") val reactionCount: Int,\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/history/ReactionHistoryCountRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history\n\nimport androidx.room.ColumnInfo\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryCount\n\ndata class ReactionHistoryCountRecord (\n    val reaction: String,\n    @ColumnInfo(name = \"reaction_count\")\n    val count: Int\n) {\n    fun toReactionHistoryCount(): ReactionHistoryCount {\n        return ReactionHistoryCount(reaction, count)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/history/ReactionHistoryDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface ReactionHistoryDao {\n\n    @Query(\"select * from reaction_history\")\n    suspend fun findAll(): List<ReactionHistoryRecord>?\n\n    @Query(\"select reaction, count(reaction) as reaction_count from reaction_history where instance_domain=:instanceDomain group by reaction order by reaction_count desc limit :limit\")\n    suspend fun sumReactions(instanceDomain: String, limit: Int): List<ReactionHistoryCountRecord>\n\n    @Query(\"select reaction, count(reaction) as reaction_count from reaction_history where instance_domain=:instanceDomain group by reaction order by reaction_count desc limit :limit\")\n    fun observeSumReactions(\n        instanceDomain: String,\n        limit: Int\n    ): Flow<List<ReactionHistoryCountRecord>>\n\n    @Query(\"\"\"\n        select * from reaction_history as r1 \n            where exists(\n                select 1 from(\n                    select max(id) as id from reaction_history \n                        where instance_domain = :instanceDomain group by reaction, instance_domain\n                ) r2 where r1.id = r2.id\n            ) \n        order by id desc limit :limit\n    \"\"\")\n    fun observeRecentlyUsed(instanceDomain: String, limit: Int): Flow<List<ReactionHistoryRecord>>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(reactionHistory: ReactionHistoryRecord)\n\n\n    @Query(\n        \"\"\"\n            select \n                r1.accountId as accountId, \n                r1.target_user_id as targetUserId,\n                count(r1.id) as reactionCount\n            from reaction_history as r1\n                inner join user as u \n                    on r1.accountId = u.accountId and r1.target_user_id = u.serverId\n                inner join user_related_state as ur\n                    on u.id = ur.userId\n                where ur.isFollowing = 0\n                    and r1.accountId = :accountId\n                group by r1.accountId, r1.target_user_id\n                    order by count(r1.id) desc\n                limit :limit\n        \"\"\"\n    )\n    suspend fun findFrequentlyReactionUserAndUnFollowed(accountId: Long, limit: Int): List<FrequentlyReactionAndUnFollowedUserRecord>\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/history/ReactionHistoryRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistory\n\n@Entity(tableName = \"reaction_history\")\ndata class ReactionHistoryRecord(\n    @ColumnInfo(\"reaction\")\n    val reaction: String,\n\n    @ColumnInfo(name = \"instance_domain\")\n    val instanceDomain: String,\n\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long? = null,\n\n    @ColumnInfo(name = \"target_post_id\")\n    val targetPostId: String? = null,\n\n    @ColumnInfo(name = \"target_user_id\")\n    val targetUserId: String? = null,\n){\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(\"id\")\n    var id: Long? = null\n\n    companion object {\n        fun from(history: ReactionHistory): ReactionHistoryRecord {\n            return ReactionHistoryRecord(\n                reaction = history.reaction,\n                instanceDomain = history.instanceDomain,\n                targetUserId = history.targetUserId,\n                targetPostId = history.targetPostId,\n                accountId = history.accountId,\n            ).apply {\n                id = history.id\n            }\n        }\n    }\n\n    fun toHistory(): ReactionHistory {\n        return ReactionHistory(\n            reaction = reaction,\n            instanceDomain = instanceDomain,\n            accountId = accountId,\n            targetPostId = targetPostId,\n            targetUserId = targetUserId,\n            id = id,\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/history/ReactionHistoryRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistory\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryCount\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryRepository\nimport javax.inject.Inject\n\nclass ReactionHistoryRepositoryImpl @Inject constructor(\n    private val reactionHistoryDao: ReactionHistoryDao,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n): ReactionHistoryRepository {\n\n    override suspend fun create(reactionHistory: ReactionHistory): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            reactionHistoryDao.insert(ReactionHistoryRecord.from(reactionHistory))\n        }\n    }\n\n    override suspend fun findAll(): List<ReactionHistory> {\n        return withContext(ioDispatcher) {\n            (reactionHistoryDao.findAll() ?: emptyList()).map {\n                it.toHistory()\n            }\n        }\n    }\n\n    override fun observeSumReactions(instanceDomain: String, limit: Int): Flow<List<ReactionHistoryCount>> {\n        return reactionHistoryDao.observeSumReactions(instanceDomain, limit).map { list ->\n            list.map {\n                it.toReactionHistoryCount()\n            }\n        }\n    }\n\n    override suspend fun sumReactions(instanceDomain: String, limit: Int): List<ReactionHistoryCount> {\n        return withContext(ioDispatcher) {\n            reactionHistoryDao.sumReactions(instanceDomain, limit).map {\n                it.toReactionHistoryCount()\n            }\n        }\n    }\n\n    override fun observeRecentlyUsedBy(instanceDomain: String, limit: Int): Flow<List<ReactionHistory>> {\n        return reactionHistoryDao.observeRecentlyUsed(instanceDomain, limit).map { records ->\n            records.map { history ->\n                ReactionHistory(\n                    instanceDomain = history.instanceDomain,\n                    reaction = history.reaction,\n                    id = history.id,\n                    accountId = history.accountId,\n                    targetPostId = history.targetPostId,\n                    targetUserId = history.targetUserId,\n                )\n            }\n        }.flowOn(Dispatchers.IO)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/usercustom/ReactionUserSetting.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\n\n/**\n * リアクションPickerのユーザー設定\n * 原則としてインスタンスごととする\n */\n@Entity(tableName = \"reaction_user_setting\", primaryKeys=[\"reaction\", \"instance_domain\"])\ndata class ReactionUserSetting(\n    @ColumnInfo(\"reaction\")\n    val reaction: String,\n\n    @ColumnInfo(name = \"instance_domain\")\n    val instanceDomain: String,\n\n    @ColumnInfo(name = \"weight\")\n    var weight: Int\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/reaction/impl/usercustom/ReactionUserSettingDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface ReactionUserSettingDao{\n\n    @Query(\"select * from reaction_user_setting where instance_domain = :instanceDomain order by weight asc\")\n    suspend fun findByInstanceDomain(instanceDomain: String): List<ReactionUserSetting>?\n\n    @Query(\"select * from reaction_user_setting where instance_domain = :instanceDomain order by weight asc\")\n    fun observeByInstanceDomain(instanceDomain: String): Flow<List<ReactionUserSetting>>\n\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(setting: ReactionUserSetting): Long?\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertAll(settings: List<ReactionUserSetting>): List<Long?>\n\n    @Update\n    suspend fun update(setting: ReactionUserSetting)\n\n    @Update\n    suspend fun updateAll(settings: List<ReactionUserSetting>)\n\n    @Delete\n    suspend fun delete(setting: ReactionUserSetting)\n\n    @Delete\n    suspend fun deleteAll(settings: List<ReactionUserSetting>)\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/renote/RenotesPagingService.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.renote\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.misskey.notes.FindRenotes\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.common.MastodonLinkHeaderDecoder\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.repost.RenoteType\nimport net.pantasystem.milktea.model.note.repost.RenotesPagingService\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\n\n\nclass RenotesPagingServiceImpl(\n    targetNoteId: Note.Id,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val accountRepository: AccountRepository,\n    val noteDataSourceAdder: NoteDataSourceAdder,\n    val userDataSource: UserDataSource,\n    mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n    ) : RenotesPagingService {\n\n    class Factory @Inject constructor(\n        val misskeyAPIProvider: MisskeyAPIProvider,\n        val accountRepository: AccountRepository,\n        val noteDataSourceAdder: NoteDataSourceAdder,\n        val mastodonAPIProvider: MastodonAPIProvider,\n        val userDataSource: UserDataSource,\n        private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n    ) : RenotesPagingService.Factory {\n        override fun create(noteId: Note.Id): RenotesPagingService {\n            return RenotesPagingServiceImpl(\n                noteId,\n                misskeyAPIProvider,\n                mastodonAPIProvider,\n                accountRepository,\n                noteDataSourceAdder,\n                userDataSource,\n                mastodonAccountDTOEntityConverter,\n            )\n        }\n    }\n    private val pagingImpl = RenotesPagingImpl(\n        targetNoteId,\n        misskeyAPIProvider,\n        mastodonAPIProvider,\n        accountRepository,\n        noteDataSourceAdder,\n        userDataSource,\n        mastodonAccountDTOEntityConverter,\n    )\n    private val controller =\n        PreviousPagingController(pagingImpl, pagingImpl, pagingImpl, pagingImpl)\n\n    override val state: Flow<PageableState<List<RenoteType>>>\n        get() = pagingImpl.state\n\n    override suspend fun clear() {\n        pagingImpl.mutex.withLock {\n            pagingImpl.setState(PageableState.Fixed(StateContent.NotExist()))\n        }\n    }\n\n    override suspend fun next() {\n        controller.loadPrevious()\n    }\n\n    override suspend fun refresh() {\n        this.clear()\n        this.next()\n    }\n}\n\nclass RenotesPagingImpl(\n    private val targetNoteId: Note.Id,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val accountRepository: AccountRepository,\n    val noteDataSourceAdder: NoteDataSourceAdder,\n    val userDataSource: UserDataSource,\n    val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n) : PreviousLoader<RenoteNetworkDTO>,\n    EntityConverter<RenoteNetworkDTO, RenoteType>,\n    StateLocker,\n    PaginationState<RenoteType>,\n    IdGetter<String> {\n\n    private val _state: MutableStateFlow<PageableState<List<RenoteType>>> =\n        MutableStateFlow(PageableState.Fixed(StateContent.NotExist()))\n    override val state: Flow<PageableState<List<RenoteType>>>\n        get() = _state\n\n    override val mutex: Mutex = Mutex()\n\n    private var maxId: String? = null\n    private var minId: String? = null\n\n    override suspend fun loadPrevious(): Result<List<RenoteNetworkDTO>> {\n        return runCancellableCatching {\n            val account = accountRepository.get(targetNoteId.accountId).getOrThrow()\n            val i = account.token\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    misskeyAPIProvider.get(account.normalizedInstanceUri)\n                        .renotes(FindRenotes(i = i, noteId = targetNoteId.noteId, untilId = getUntilId()))\n                        .throwIfHasError().body()!!.let { list ->\n                            list.map {\n                                RenoteNetworkDTO.Renote(it)\n                            }\n                        }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    val untilId = getUntilId()\n                    val empty = (getState().content as? StateContent.Exist)?.rawContent.isNullOrEmpty()\n                    if (untilId == null && !empty) {\n                        return@runCancellableCatching emptyList()\n                    }\n                    val res = mastodonAPIProvider.get(account)\n                        .getRebloggedBy(targetNoteId.noteId, maxId = getUntilId())\n                        .throwIfHasError()\n                    MastodonLinkHeaderDecoder(res.headers()[\"Link\"]).let {\n                        maxId = it.getMaxId()\n                    }\n                    res.body()!!.let { list ->\n                        list.map {\n                            RenoteNetworkDTO.Reblog(it)\n                        }\n                    }\n                }\n            }\n\n        }\n    }\n\n    override suspend fun convertAll(list: List<RenoteNetworkDTO>): List<RenoteType> {\n        val account = accountRepository.get(targetNoteId.accountId).getOrThrow()\n        return list.map {\n            when(it) {\n                is RenoteNetworkDTO.Reblog -> {\n                    val model = mastodonAccountDTOEntityConverter.convert(account, it.accountDTO)\n                    userDataSource.add(model).getOrThrow()\n                    RenoteType.Reblog(model.id)\n                }\n                is RenoteNetworkDTO.Renote -> {\n                    val note = noteDataSourceAdder.addNoteDtoToDataSource(account, it.note)\n                    RenoteType.Renote(note.id, isQuote = note.isQuote())\n                }\n            }\n        }\n    }\n\n    override suspend fun getSinceId(): String? {\n        if (minId != null) {\n            return maxId\n        }\n        return ((getState().content as? StateContent.Exist)?.rawContent?.firstOrNull() as? RenoteType.Renote)?.noteId?.noteId\n    }\n\n    override suspend fun getUntilId(): String? {\n        if (maxId != null) {\n            return maxId\n        }\n        return ((getState().content as? StateContent.Exist)?.rawContent?.lastOrNull() as? RenoteType.Renote)?.noteId?.noteId\n    }\n\n    override fun getState(): PageableState<List<RenoteType>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<RenoteType>>) {\n        _state.value = state\n    }\n\n\n}\n\n\nsealed interface RenoteNetworkDTO {\n    data class Renote(val note: NoteDTO) : RenoteNetworkDTO\n\n    data class Reblog(val accountDTO: MastodonAccountDTO) : RenoteNetworkDTO\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineCacheDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n@Dao\ninterface TimelineCacheDAO {\n\n    @Query(\n        \"\"\"\n        SELECT * FROM timeline_item\n        WHERE account_id = :accountId\n        AND page_id = :pageId\n        ORDER BY note_id DESC\n        LIMIT :limit\n        \"\"\"\n    )\n    suspend fun getTimelineItems(\n        accountId: Long,\n        pageId: Long,\n        limit: Int,\n    ): List<TimelineItemEntity>\n\n    // sinceIdで取得した場合\n    @Query(\n        \"\"\"\n        SELECT * FROM timeline_item\n        WHERE account_id = :accountId\n        AND page_id = :pageId\n        AND note_id > :sinceId\n        ORDER BY note_id ASC\n        LIMIT :limit\n        \"\"\"\n    )\n    suspend fun getTimelineItemsSinceId(\n        accountId: Long,\n        pageId: Long,\n        sinceId: String,\n        limit: Int,\n    ): List<TimelineItemEntity>\n\n    // untilIdで取得した場合\n    @Query(\n        \"\"\"\n        SELECT * FROM timeline_item\n        WHERE account_id = :accountId\n        AND page_id = :pageId\n        AND note_id < :untilId\n        ORDER BY note_id DESC\n        LIMIT :limit\n        \"\"\"\n    )\n    suspend fun getTimelineItemsUntilId(\n        accountId: Long,\n        pageId: Long,\n        untilId: String,\n        limit: Int,\n    ): List<TimelineItemEntity>\n\n    // untilIdとsinceIdで取得した場合\n    @Query(\n        \"\"\"\n        SELECT * FROM timeline_item\n        WHERE account_id = :accountId\n        AND page_id = :pageId\n        AND note_id < :untilId\n        AND note_id > :sinceId\n        ORDER BY note_id DESC\n        LIMIT :limit\n        \"\"\"\n    )\n    suspend fun getTimelineItemsUntilIdAndSinceId(\n        accountId: Long,\n        pageId: Long,\n        untilId: String,\n        sinceId: String,\n        limit: Int,\n    ): List<TimelineItemEntity>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertAll(items: List<TimelineItemEntity>)\n\n    // clear\n    @Query(\n        \"\"\"\n        DELETE FROM timeline_item\n        WHERE account_id = :accountId\n        AND page_id = :pageId\n        \"\"\"\n    )\n    suspend fun clear(accountId: Long, pageId: Long)\n\n    // last previous id\n    @Query(\n        \"\"\"\n        SELECT note_id FROM timeline_item\n        WHERE account_id = :accountId\n        AND page_id = :pageId\n        ORDER BY note_id ASC\n        LIMIT 1\n        \"\"\"\n    )\n    suspend fun findLastPreviousId(accountId: Long, pageId: Long): String?\n\n    // first later id\n    @Query(\n        \"\"\"\n        SELECT note_id FROM timeline_item\n        WHERE account_id = :accountId\n        AND page_id = :pageId\n        ORDER BY note_id DESC\n        LIMIT 1\n        \"\"\"\n    )\n    suspend fun findFirstLaterId(accountId: Long, pageId: Long): String?\n\n    @Query(\n        \"\"\"\n        SELECT count(*) FROM timeline_item\n        \"\"\"\n    )\n    suspend fun count(): Long\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineFetcher.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.timeline.TimelineResponse\n\ninterface TimelineFetcher {\n    suspend fun fetchTimeline(\n        account: Account,\n        pageable: Pageable,\n        untilId: String?,\n        sinceId: String?,\n        untilDate: Long?,\n        sinceDate: Long?,\n        limit: Int\n    ): Result<TimelineResponse>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineFetcherImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport net.pantasystem.milktea.api.mastodon.status.TootStatusDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteRequest\nimport net.pantasystem.milktea.common.MastodonLinkHeaderDecoder\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIFactory\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineResponse\nimport retrofit2.Response\nimport javax.inject.Inject\n\ninternal class TimelineFetcherImpl @Inject constructor(\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIFactory: MastodonAPIFactory,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val nodeInfoRepository: NodeInfoRepository,\n) : TimelineFetcher {\n    override suspend fun fetchTimeline(\n        account: Account,\n        pageable: Pageable,\n        untilId: String?,\n        sinceId: String?,\n        untilDate: Long?,\n        sinceDate: Long?,\n        limit: Int\n    ): Result<TimelineResponse> = runCancellableCatching {\n        when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val res = fetchTimelineForMisskey(\n                    account,\n                    pageable,\n                    untilId,\n                    sinceId,\n                    untilDate,\n                    sinceDate,\n                    limit,\n                ).getOrThrow()\n                val notes = noteDataSourceAdder.addNoteDtoListToDataSource(account, res.filter {\n                    it.promotionId == null || it.tmpFeaturedId == null\n                })\n                val ids = notes.sortedByDescending {\n                    it.noteId\n                }\n                TimelineResponse(\n                    ids,\n                    sinceId = ids.firstOrNull()?.noteId,\n                    untilId = ids.lastOrNull()?.noteId\n                )\n            }\n\n            Account.InstanceType.PLEROMA, Account.InstanceType.MASTODON -> {\n\n                val res = fetchTimelineForMastodon(\n                    account,\n                    pageable,\n                    untilId,\n                    sinceId,\n                )\n                val ids =\n                    noteDataSourceAdder.addTootStatusDtoListIntoDataSource(account, res.body()!!)\n\n                val minMaxId = if (isShouldUseLinkHeader(pageable)) {\n                    getMaxOrMinId(res)\n\n                } else {\n                    val minId = ids.minByOrNull { it.noteId }?.noteId\n                    val maxId = ids.maxByOrNull { it.noteId }?.noteId\n                    MaxAndMinId(maxId, minId)\n                }\n\n                TimelineResponse(\n                    ids,\n                    sinceId = minMaxId.minId,\n                    untilId = minMaxId.maxId\n                )\n            }\n        }\n    }\n\n    private suspend fun fetchTimelineForMisskey(\n        account: Account,\n        pageable: Pageable,\n        untilId: String?,\n        sinceId: String?,\n        untilDate: Long?,\n        sinceDate: Long?,\n        limit: Int,\n    ): Result<List<NoteDTO>> {\n        val api = misskeyAPIProvider.get(account)\n        val closure = when (pageable) {\n            is Pageable.GlobalTimeline -> api::globalTimeline\n            is Pageable.LocalTimeline -> api::localTimeline\n            is Pageable.HybridTimeline -> api::hybridTimeline\n            is Pageable.HomeTimeline -> api::homeTimeline\n            is Pageable.Search -> api::searchNote\n            is Pageable.Favorite -> throw IllegalArgumentException(\"use FavoriteNotePagingStore.kt\")\n            is Pageable.UserTimeline -> api::userNotes\n            is Pageable.UserListTimeline -> api::userListTimeline\n            is Pageable.SearchByTag -> api::searchByTag\n            is Pageable.Featured -> api::featured\n            is Pageable.Mention -> api::mentions\n            is Pageable.CalckeyRecommendedTimeline -> api::getCalckeyRecommendedTimeline\n            is Pageable.ClipNotes -> api::getClipNotes\n            is Pageable.Antenna -> (api)::antennasNotes\n            is Pageable.ChannelTimeline -> api::channelTimeline\n            else -> throw IllegalArgumentException(\"unknown class:${pageable.javaClass}\")\n        }\n        val builder = NoteRequest.Builder(\n            i = account.token,\n            pageable = pageable,\n            limit = limit,\n        )\n        val req = builder.build(\n            NoteRequest.Conditions(\n                untilId = untilId,\n                sinceId = sinceId,\n                untilDate = untilDate,\n                sinceDate = sinceDate,\n            )\n        )\n        return runCancellableCatching {\n            requireNotNull(closure(req).throwIfHasError().body())\n        }\n    }\n\n    private suspend fun fetchTimelineForMastodon(\n        account: Account,\n        pageableTimeline: Pageable,\n        maxId: String?,\n        minId: String?,\n    ): Response<List<TootStatusDTO>> {\n        val api = mastodonAPIFactory.build(account.normalizedInstanceUri, account.token)\n        return when (pageableTimeline) {\n            is Pageable.Mastodon.HashTagTimeline -> api.getHashtagTimeline(\n                pageableTimeline.hashtag,\n                maxId = maxId,\n                minId = minId,\n                onlyMedia = pageableTimeline.getOnlyMedia()\n            )\n\n            is Pageable.Mastodon.HomeTimeline -> api.getHomeTimeline(\n                maxId = maxId,\n                minId = minId,\n                visibilities = getVisibilitiesParameter(account)\n            )\n\n            is Pageable.Mastodon.ListTimeline -> api.getListTimeline(\n                maxId = maxId,\n                listId = pageableTimeline.listId,\n            )\n\n            is Pageable.Mastodon.LocalTimeline -> api.getPublicTimeline(\n                local = true,\n                maxId = maxId,\n                visibilities = getVisibilitiesParameter(account),\n                onlyMedia = pageableTimeline.getOnlyMedia()\n            )\n\n            is Pageable.Mastodon.PublicTimeline -> api.getPublicTimeline(\n                maxId = maxId,\n                visibilities = getVisibilitiesParameter(account),\n                onlyMedia = pageableTimeline.getOnlyMedia()\n            )\n\n            is Pageable.Mastodon.UserTimeline -> {\n                api.getAccountTimeline(\n                    accountId = pageableTimeline.userId,\n                    onlyMedia = pageableTimeline.isOnlyMedia,\n                    excludeReplies = pageableTimeline.excludeReplies,\n                    excludeReblogs = pageableTimeline.excludeReblogs,\n                    maxId = maxId,\n                )\n            }\n\n            Pageable.Mastodon.BookmarkTimeline -> {\n                api.getBookmarks(\n                    maxId = maxId,\n                    minId = minId,\n                )\n            }\n\n            else -> throw IllegalArgumentException(\"unknown class:${pageableTimeline.javaClass}\")\n        }\n    }\n\n\n    private suspend fun getVisibilitiesParameter(account: Account): List<String>? {\n        val nodeInfo = nodeInfoRepository.find(account.getHost()).getOrNull() ?: return null\n        return if (nodeInfo.type is NodeInfo.SoftwareType.Mastodon.Fedibird || nodeInfo.type is NodeInfo.SoftwareType.Mastodon.Kmyblue) {\n            listOf(\"public\", \"unlisted\", \"private\", \"limited\", \"direct\", \"personal\")\n        } else {\n            null\n        }\n    }\n\n    private fun isShouldUseLinkHeader(pageableTimeline: Pageable): Boolean {\n        return pageableTimeline is Pageable.Mastodon.BookmarkTimeline\n                || pageableTimeline is Pageable.Mastodon.UserTimeline\n                || pageableTimeline is Pageable.Mastodon.Mention\n    }\n\n    private fun getMaxOrMinId(response: Response<*>): MaxAndMinId {\n        val decoder = MastodonLinkHeaderDecoder(response.headers()[\"link\"])\n\n        return MaxAndMinId(\n            maxId = decoder.getMaxId(),\n            minId = decoder.getMinId()\n        )\n    }\n\n}\n\n\ninternal data class MaxAndMinId(\n    val maxId: String?,\n    val minId: String?\n)\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineItemEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteEntity\n\n@Entity(\n    tableName = \"timeline_item\",\n    indices = [\n        Index(value = [\"account_id\", \"page_id\", \"note_id\"], unique = true),\n        Index(value = [\"note_id\"]),\n        Index(value = [\"note_local_id\"])\n    ],\n    foreignKeys = [\n        ForeignKey(\n            entity = NoteEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"note_local_id\"],\n        )\n    ],\n)\ndata class TimelineItemEntity(\n    @ColumnInfo(name = \"account_id\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"page_id\")\n    val pageId: Long,\n\n    @ColumnInfo(name = \"note_id\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"note_local_id\")\n    val noteLocalId: String,\n\n    @PrimaryKey(autoGenerate = true)\n    val id: Long = 0L,\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineLocalDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport net.pantasystem.milktea.model.note.timeline.TimelineResponse\nimport net.pantasystem.milktea.model.note.timeline.TimelineType\n\ninterface TimelineLocalDataSource {\n\n    suspend fun getFromCache(\n        accountId: Long,\n        pageId: Long,\n        untilId: String?,\n        sinceId: String?,\n        limit: Int\n    ): Result<TimelineResponse>\n\n    suspend fun saveToCache(\n        accountId: Long,\n        pageId: Long,\n        timelineItems: List<String>,\n    ): Result<Unit>\n\n    suspend fun clear(type: TimelineType): Result<Unit>\n\n    suspend fun findFirstLaterId(type: TimelineType): Result<String?>\n\n    suspend fun findLastPreviousId(type: TimelineType): Result<String?>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineLocalDataSourceImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.note.impl.sqlite.NoteEntity\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.timeline.TimelineResponse\nimport net.pantasystem.milktea.model.note.timeline.TimelineType\nimport javax.inject.Inject\n\ninternal class TimelineLocalDataSourceImpl @Inject constructor(\n    private val timelineCacheDAO: TimelineCacheDAO,\n): TimelineLocalDataSource {\n    override suspend fun saveToCache(\n        accountId: Long,\n        pageId: Long,\n        timelineItems: List<String>\n    ): Result<Unit> = runCancellableCatching {\n        timelineCacheDAO.insertAll(\n            timelineItems.map {\n                TimelineItemEntity(\n                    accountId = accountId,\n                    pageId = pageId,\n                    noteId = it,\n                    noteLocalId = NoteEntity.makeEntityId(accountId, it)\n                )\n            }\n        )\n    }\n\n    override suspend fun getFromCache(\n        accountId: Long,\n        pageId: Long,\n        untilId: String?,\n        sinceId: String?,\n        limit: Int\n    ): Result<TimelineResponse> = runCancellableCatching{\n        val localItems = when {\n            untilId != null && sinceId != null -> {\n                timelineCacheDAO.getTimelineItemsUntilIdAndSinceId(\n                    accountId,\n                    pageId,\n                    untilId,\n                    sinceId,\n                    limit\n                )\n            }\n\n            untilId != null -> {\n                timelineCacheDAO.getTimelineItemsUntilId(\n                    accountId,\n                    pageId,\n                    untilId,\n                    limit\n                )\n            }\n\n            sinceId != null -> {\n                timelineCacheDAO.getTimelineItemsSinceId(\n                    accountId,\n                    pageId,\n                    sinceId,\n                    limit\n                )\n            }\n\n            else -> {\n                timelineCacheDAO.getTimelineItems(\n                    accountId,\n                    pageId,\n                    limit\n                )\n            }\n        }\n        TimelineResponse(\n            localItems.map { Note.Id(it.accountId, it.noteId) },\n            sinceId = localItems.firstOrNull()?.noteId,\n            untilId = localItems.lastOrNull()?.noteId\n        )\n    }\n\n    override suspend fun clear(type: TimelineType): Result<Unit> = runCancellableCatching {\n        if (!type.canCache()) {\n            return@runCancellableCatching\n        }\n        timelineCacheDAO.clear(type.accountId, type.pageId!!)\n    }\n\n    override suspend fun findFirstLaterId(type: TimelineType): Result<String?> =\n        runCancellableCatching {\n            if (!type.canCache()) {\n                return@runCancellableCatching null\n            }\n            timelineCacheDAO.findFirstLaterId(type.accountId, type.pageId!!)\n        }\n\n    override suspend fun findLastPreviousId(type: TimelineType): Result<String?> =\n        runCancellableCatching {\n            if (!type.canCache()) {\n                return@runCancellableCatching null\n            }\n            timelineCacheDAO.findLastPreviousId(type.accountId, type.pageId!!)\n        }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/TimelineRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineResponse\nimport net.pantasystem.milktea.model.note.timeline.TimelineType\nimport javax.inject.Inject\n\nclass TimelineRepositoryImpl @Inject constructor(\n    private val getAccount: GetAccount,\n    private val applicationScope: CoroutineScope,\n    private val noteRepository: NoteRepository,\n    private val loggerFactory: Logger.Factory,\n    private val timelineFetcher: TimelineFetcher,\n    private val timelineLocalDataSource: TimelineLocalDataSource,\n) : TimelineRepository {\n\n    private val logger by lazy {\n        loggerFactory.create(\"TimelineRepository\")\n    }\n\n    override suspend fun findLaterTimeline(\n        type: TimelineType,\n        sinceId: String?,\n        sinceDate: Long?,\n        limit: Int\n    ): Result<TimelineResponse> = runCancellableCatching {\n        if (!type.isAllowPageable()) {\n            throw IllegalArgumentException(\"pageable is not allowed\")\n        }\n\n        val account = getAccount.get(type.accountId)\n\n        if (type.canCache() && sinceDate == null) {\n            val inCache = getFromCache(\n                type.accountId,\n                type.pageId!!,\n                null,\n                sinceId,\n                limit\n            ).getOrThrow()\n\n            logger.debug {\n                \"findLaterTimeline: inCache.size=${inCache.timelineItems.size} limit=$limit\"\n            }\n            if (inCache.timelineItems.size >= limit) {\n                applicationScope.launch {\n                    if (type.canCache()) {\n                        fetchTimeline(\n                            account,\n                            type.pageable,\n                            null,\n                            sinceId,\n                            null,\n                            null,\n                            limit\n                        ).mapCancellableCatching { response ->\n                            saveToCache(\n                                accountId = account.accountId,\n                                pageId = type.pageId!!,\n                                response.timelineItems.map { it.noteId },\n                            ).getOrThrow()\n                        }.onFailure {\n                            logger.error(\"failed sync timeline to cache\", it)\n                        }\n                    }\n                }\n                return@runCancellableCatching inCache\n            }\n        }\n\n        val res = fetchTimeline(\n            account,\n            type.pageable,\n            null,\n            sinceId,\n            null,\n            sinceDate,\n            limit\n        ).getOrThrow()\n        if (type.canCache() && type.pageId != null && sinceDate == null) {\n            saveToCache(\n                accountId = account.accountId,\n                pageId = type.pageId!!,\n                res.timelineItems.map { it.noteId }).getOrThrow()\n        }\n\n        res\n    }\n\n    override suspend fun findPreviousTimeline(\n        type: TimelineType,\n        untilId: String?,\n        untilDate: Long?,\n        limit: Int\n    ): Result<TimelineResponse> = runCancellableCatching {\n        if (!type.isAllowPageable()) {\n            throw IllegalArgumentException(\"pageable is not allowed\")\n        }\n\n        val account = getAccount.get(type.accountId)\n\n        if (type.canCache() && untilDate == null) {\n            val inCache = getFromCache(\n                type.accountId,\n                type.pageId!!,\n                untilId,\n                null,\n                limit\n            ).getOrThrow()\n\n            logger.debug {\n                \"findPreviousTimeline: inCache.size=${inCache.timelineItems.size} limit=$limit\"\n            }\n            if (inCache.timelineItems.size >= limit) {\n                applicationScope.launch {\n                    val lastItemId = inCache.timelineItems.lastOrNull()\n                    if (type.canCache()) {\n                        fetchTimeline(\n                            account,\n                            type.pageable,\n                            untilId ?: lastItemId?.noteId,\n                            null,\n                            null,\n                            null,\n                            limit\n                        ).mapCancellableCatching { response ->\n                            saveToCache(\n                                accountId = account.accountId,\n                                pageId = type.pageId!!,\n                                response.timelineItems.map { it.noteId },\n                            ).getOrThrow()\n                        }.onFailure {\n                            logger.error(\"failed sync timeline to cache\", it)\n                        }\n                    }\n                    if (untilId == null && lastItemId != null) {\n                        noteRepository.sync(lastItemId)\n                    }\n                }\n                return@runCancellableCatching inCache\n            }\n        }\n\n        val res = fetchTimeline(\n            account,\n            type.pageable,\n            untilId,\n            null,\n            untilDate,\n            null,\n            limit\n        ).getOrThrow()\n        if (type.canCache() && type.pageId != null && untilDate == null) {\n            saveToCache(\n                accountId = account.accountId,\n                pageId = type.pageId!!,\n                res.timelineItems.map { it.noteId }).getOrThrow()\n        }\n\n        res\n    }\n\n    override suspend fun add(type: TimelineType, noteId: Note.Id): Result<Unit> =\n        runCancellableCatching {\n            if (!type.canCache()) {\n                return@runCancellableCatching\n            }\n\n            val account = getAccount.get(type.accountId)\n            saveToCache(\n                accountId = account.accountId,\n                pageId = type.pageId!!,\n                listOf(noteId.noteId)\n            )\n        }\n\n    override suspend fun clear(type: TimelineType): Result<Unit> =\n        timelineLocalDataSource.clear(type)\n\n    override suspend fun findFirstLaterId(type: TimelineType): Result<String?> =\n        timelineLocalDataSource.findFirstLaterId(type)\n\n    override suspend fun findLastPreviousId(type: TimelineType): Result<String?> =\n        timelineLocalDataSource.findLastPreviousId(type)\n\n    private suspend fun fetchTimeline(\n        account: Account,\n        pageable: Pageable,\n        untilId: String?,\n        sinceId: String?,\n        untilDate: Long?,\n        sinceDate: Long?,\n        limit: Int\n    ): Result<TimelineResponse> = timelineFetcher.fetchTimeline(\n        account = account,\n        pageable = pageable,\n        untilId = untilId,\n        sinceId = sinceId,\n        untilDate = untilDate,\n        sinceDate = sinceDate,\n        limit = limit\n    )\n\n    private suspend fun getFromCache(\n        accountId: Long,\n        pageId: Long,\n        untilId: String?,\n        sinceId: String?,\n        limit: Int\n    ): Result<TimelineResponse> = timelineLocalDataSource.getFromCache(\n        accountId = accountId,\n        pageId = pageId,\n        untilId = untilId,\n        sinceId = sinceId,\n        limit = limit,\n    )\n\n\n    private suspend fun saveToCache(\n        accountId: Long,\n        pageId: Long,\n        timelineItems: List<String>,\n    ): Result<Unit> = timelineLocalDataSource.saveToCache(accountId, pageId, timelineItems)\n\n\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/timeline/favorite/FavoriteTimelineRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.timeline.favorite\n\nimport net.pantasystem.milktea.api.misskey.notes.NoteRequest\nimport net.pantasystem.milktea.common.MastodonLinkHeaderDecoder\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.timeline.favorite.FavoriteTimelineRepository\nimport net.pantasystem.milktea.model.note.timeline.favorite.FavoriteTimelineResponse\nimport javax.inject.Inject\n\nclass FavoriteTimelineRepositoryImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n): FavoriteTimelineRepository {\n    override suspend fun findPreviousTimeline(\n        accountId: Long,\n        untilId: String?,\n        untilDate: Long?,\n        limit: Int\n    ): Result<FavoriteTimelineResponse> = runCancellableCatching {\n        val account = accountRepository.get(accountId).getOrThrow()\n        when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val res = misskeyAPIProvider.get(account).favorites(\n                    NoteRequest(\n                        i = account.token,\n                        limit = limit,\n                        untilId = untilId,\n                        untilDate = untilDate\n                    )\n                ).throwIfHasError()\n                val nextSinceId = res.body()?.firstOrNull()?.id\n                val nextUntilId = res.body()?.lastOrNull()?.id\n                val ids = noteDataSourceAdder.addNoteDtoListToDataSource(\n                    account,\n                    requireNotNull(res.body()).map { it.note }\n                )\n                FavoriteTimelineResponse(\n                    timelineItems = ids,\n                    sinceId = nextSinceId,\n                    untilId = nextUntilId\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val res = mastodonAPIProvider.get(account).getFavouriteStatuses(\n                    maxId = untilId,\n                ).throwIfHasError()\n                val decoder = MastodonLinkHeaderDecoder(res.headers()[\"Link\"])\n                val maxId = decoder.getMaxId()\n                val minId = decoder.getMinId()\n                val ids = noteDataSourceAdder.addTootStatusDtoListIntoDataSource(\n                    account,\n                    requireNotNull(res.body())\n                )\n                FavoriteTimelineResponse(\n                    timelineItems = ids,\n                    sinceId = maxId,\n                    untilId = minId\n                )\n            }\n        }\n    }\n\n    override suspend fun findLaterTimeline(\n        accountId: Long,\n        sinceId: String?,\n        sinceDate: Long?,\n        limit: Int\n    ): Result<FavoriteTimelineResponse> = runCancellableCatching {\n        val account = accountRepository.get(accountId).getOrThrow()\n        when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val res = misskeyAPIProvider.get(account).favorites(\n                    NoteRequest(\n                        i = account.token,\n                        limit = limit,\n                        sinceId = sinceId,\n                        sinceDate = sinceDate\n                    )\n                ).throwIfHasError()\n                val nextSinceId = res.body()?.firstOrNull()?.id\n                val nextUntilId = res.body()?.lastOrNull()?.id\n                val ids = noteDataSourceAdder.addNoteDtoListToDataSource(\n                    account,\n                    requireNotNull(res.body()).map { it.note }\n                )\n                FavoriteTimelineResponse(\n                    timelineItems = ids,\n                    sinceId = nextSinceId,\n                    untilId = nextUntilId\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val res = mastodonAPIProvider.get(account).getFavouriteStatuses(\n                    minId = sinceId,\n                ).throwIfHasError()\n                val decoder = MastodonLinkHeaderDecoder(res.headers()[\"Link\"])\n                val maxId = decoder.getMaxId()\n                val minId = decoder.getMinId()\n                val ids = noteDataSourceAdder.addTootStatusDtoListIntoDataSource(\n                    account,\n                    requireNotNull(res.body())\n                )\n                FavoriteTimelineResponse(\n                    timelineItems = ids,\n                    sinceId = maxId,\n                    untilId = minId\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/wordmute/WordFilterConditionRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.wordmute\n\nimport androidx.room.*\nimport net.pantasystem.milktea.model.note.muteword.FilterConditionType\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfig\n\n@Entity(\n    tableName = \"word_filter_condition\"\n)\ndata class WordFilterConditionRecord(\n    @PrimaryKey(autoGenerate = true) val id: Long = 0L\n)\n\n@Entity(\n    tableName = \"word_filter_regex_condition\",\n    foreignKeys = [\n        ForeignKey(\n            entity = WordFilterConditionRecord::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"parentId\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n    indices = [Index(\"parentId\")]\n)\ndata class WordFilterConditionRegexRecord(\n    @ColumnInfo(name = \"pattern\")\n    val pattern: String,\n\n    @ColumnInfo(name = \"parentId\")\n    @PrimaryKey(autoGenerate = false)\n    val parentId: Long = 0L\n)\n\n@Entity(\n    tableName = \"word_filter_word_condition\",\n    foreignKeys = [\n        ForeignKey(\n            entity = WordFilterConditionRecord::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"parentId\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n    indices = [Index(\"parentId\")]\n)\ndata class WordFilterConditionWordRecord(\n    @ColumnInfo(name = \"word\")\n    val word: String,\n\n    @ColumnInfo(name = \"parentId\")\n    val parentId: Long,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true)\n    val id: Long = 0L,\n)\n\ndata class WordFilterConditionRelated(\n    @Embedded val condition: WordFilterConditionRecord,\n    @Relation(parentColumn = \"id\", entityColumn = \"parentId\")\n    val regexRecord: WordFilterConditionRegexRecord?,\n    @Relation(parentColumn = \"id\", entityColumn = \"parentId\")\n    val words: List<WordFilterConditionWordRecord>\n)\n\nfun List<WordFilterConditionRelated>.toModel(): WordFilterConfig {\n    return WordFilterConfig(map { related ->\n        if (related.regexRecord == null) {\n            FilterConditionType.Normal(related.words.map { it.word })\n        } else {\n            FilterConditionType.Regex(related.regexRecord.pattern)\n        }\n    })\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/wordmute/WordFilterConfigCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.wordmute\n\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfig\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass WordFilterConfigCache @Inject constructor() {\n    private var _config: WordFilterConfig? = null\n    fun get(): WordFilterConfig? {\n        return _config\n    }\n\n    fun put(config: WordFilterConfig?) {\n        _config = config\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/wordmute/WordFilterConfigDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.wordmute\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface WordFilterConfigDao {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertAll(conditions: List<WordFilterConditionRecord>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertRegex(regex: WordFilterConditionRegexRecord)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertWords(words: List<WordFilterConditionWordRecord>): List<Long>\n\n    @Query(\"select * from word_filter_condition order by id asc\")\n    @Transaction\n    suspend fun findAll(): List<WordFilterConditionRelated>\n\n    @Query(\"select * from word_filter_condition order by id asc\")\n    @Transaction\n    fun observeAll(): Flow<List<WordFilterConditionRelated>>\n\n    @Query(\"delete from word_filter_condition\")\n    suspend fun clear()\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/note/wordmute/WordFilterConfigRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.wordmute\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.BuildConfig\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.note.muteword.FilterConditionType\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfig\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfigRepository\nimport javax.inject.Inject\n\nclass WordFilterConfigRepositoryImpl @Inject constructor(\n    coroutineScope: CoroutineScope,\n    private val wordFilterConfigDao: WordFilterConfigDao,\n    loggerFactory: Logger.Factory,\n    private val cache: WordFilterConfigCache,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : WordFilterConfigRepository {\n\n    val logger = loggerFactory.create(\"WordFilterConfigRepositoryImpl\")\n\n    private val shared = wordFilterConfigDao.observeAll().map {\n        it.toModel()\n    }.catch {\n        logger.error(\"observe error\", it)\n    }.onEach {\n        cache.put(it)\n    }.flowOn(ioDispatcher).stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    override suspend fun get(): Result<WordFilterConfig> = runCancellableCatching{\n        withContext(ioDispatcher) {\n            val inMem = cache.get()\n            if (inMem != null) {\n                return@withContext inMem\n            }\n            val inDb = wordFilterConfigDao.findAll().toModel()\n            cache.put(inDb)\n            inDb\n        }\n    }\n\n    override fun observe(): Flow<WordFilterConfig> {\n        return shared.filterNotNull()\n    }\n\n    override suspend fun save(config: WordFilterConfig): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            wordFilterConfigDao.clear()\n            val records = config.conditions.map {\n                WordFilterConditionRecord()\n            }\n            val ids = wordFilterConfigDao.insertAll(records)\n            config.conditions.forEachIndexed { index, filterConditionType ->\n                val id = ids[index]\n                when(filterConditionType) {\n                    is FilterConditionType.Normal -> {\n                        val wordRecords = filterConditionType.words.map {\n                            WordFilterConditionWordRecord(it, parentId = id)\n                        }\n                        wordFilterConfigDao.insertWords(wordRecords)\n                    }\n                    is FilterConditionType.Regex -> {\n                        wordFilterConfigDao.insertRegex(WordFilterConditionRegexRecord(filterConditionType.pattern, id))\n                    }\n                }\n            }\n            cache.put(config)\n            if (BuildConfig.DEBUG) {\n                val dbModel = wordFilterConfigDao.findAll().toModel()\n                require(dbModel == config) {\n                    \"正常に保存できていない可能性 db:$dbModel, args:$config\"\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/AccountNotificationCount.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.Entity\n\n@Entity\ndata class AccountNotificationCount(\n    val accountId: Long,\n    val count: Int\n)\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/NotificationCacheDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport androidx.room.Transaction\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface NotificationCacheDAO {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertAll(items: List<NotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertFollowNotifications(items: List<FollowNotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertNoteNotifications(items: List<NoteNotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertReactionNotifications(items: List<ReactionNotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertPollVoteNotifications(items: List<PollVoteNotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertGroupInvitedNotifications(items: List<GroupInvitedNotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertUnknownNotifications(items: List<UnknownNotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertPollEndedNotifications(items: List<PollEndedNotificationEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertFollowRequestAcceptedNotifications(items: List<FollowRequestAcceptedNotificationEntity>)\n\n    @Query(\n        \"\"\"\n            select * from notifications\n                where account_id = :accountId\n                order by notification_id desc\n                limit :limit\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findNotifications(accountId: Long, limit: Int): List<NotificationWithDetails>\n\n    @Query(\n        \"\"\"\n            select * from notifications\n                where account_id = :accountId and notification_id < :untilId\n                order by notification_id desc\n                limit :limit\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findNotificationsByUntilId(accountId: Long, untilId: String, limit: Int): List<NotificationWithDetails>\n\n    @Query(\n        \"\"\"\n            select * from notifications\n                where account_id = :accountId and notification_id > :sinceId\n                order by notification_id desc\n                limit :limit\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findNotificationsBySinceId(accountId: Long, sinceId: String, limit: Int): List<NotificationWithDetails>\n\n    // findBy notificationId\n    @Query(\n        \"\"\"\n            select * from notifications\n                where id = :notificationId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findNotification(notificationId: String): NotificationWithDetails?\n\n    // observe in\n    @Query(\n        \"\"\"\n            select * from notifications\n                where id in (:notificationIds)\n                order by notification_id desc\n        \"\"\"\n    )\n    @Transaction\n    fun observeIn(notificationIds: List<String>): Flow<List<NotificationWithDetails>>\n\n    // observe one\n    @Query(\n        \"\"\"\n            select * from notifications\n                where account_id = :accountId and notification_id = :notificationId\n        \"\"\"\n    )\n    @Transaction\n    fun observeOne(accountId: Long, notificationId: String): Flow<NotificationWithDetails?>\n\n    // remove by id\n    @Query(\n        \"\"\"\n            delete from notifications\n                where id = :id\n        \"\"\"\n    )\n    suspend fun remove(id: String)\n\n    // exists\n    @Query(\n        \"\"\"\n            select count(*) from notifications\n                where id = :id\n        \"\"\"\n    )\n    suspend fun exists(id: String): Int\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/NotificationEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport androidx.room.Relation\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.group.InvitationId\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.notification.FavoriteNotification\nimport net.pantasystem.milktea.model.notification.FollowNotification\nimport net.pantasystem.milktea.model.notification.FollowRequestAcceptedNotification\nimport net.pantasystem.milktea.model.notification.GroupInvitedNotification\nimport net.pantasystem.milktea.model.notification.MentionNotification\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.PollEndedNotification\nimport net.pantasystem.milktea.model.notification.PollVoteNotification\nimport net.pantasystem.milktea.model.notification.PostNotification\nimport net.pantasystem.milktea.model.notification.QuoteNotification\nimport net.pantasystem.milktea.model.notification.ReactionNotification\nimport net.pantasystem.milktea.model.notification.ReceiveFollowRequestNotification\nimport net.pantasystem.milktea.model.notification.RenoteNotification\nimport net.pantasystem.milktea.model.notification.ReplyNotification\nimport net.pantasystem.milktea.model.notification.UnknownNotification\nimport net.pantasystem.milktea.model.user.User\n\n@Entity(\n    tableName = \"notifications\",\n    foreignKeys = [\n        // account_id\n        ForeignKey(\n            entity = AccountRecord::class,\n            parentColumns = [\"accountId\"],\n            childColumns = [\"account_id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        ),\n    ],\n    indices = [\n        // notification_id\n        Index(\n            \"account_id\"\n        )\n    ]\n)\ndata class NotificationEntity(\n    @PrimaryKey(autoGenerate = false) val id: String,\n    @ColumnInfo(name = \"notification_id\") val notificationId: String,\n    @ColumnInfo(name = \"account_id\") val accountId: Long,\n    @ColumnInfo(name = \"created_at\") val createdAt: Instant,\n    @ColumnInfo(name = \"type\") val type: String\n) {\n    companion object {\n        fun makeId(accountId: Long, notificationId: String): String {\n            return \"$accountId:$notificationId\"\n        }\n    }\n}\n\n@Entity(\n    tableName = \"follow_notifications\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NotificationEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n)\ndata class FollowNotificationEntity(\n    @PrimaryKey val id: String,\n    @ColumnInfo(name = \"user_id\") val userId: String,\n)\n\n@Entity(\n    tableName = \"note_notifications\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NotificationEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n)\ndata class NoteNotificationEntity(\n    @PrimaryKey val id: String,\n    @ColumnInfo(\"note_id\") val noteId: String,\n    @ColumnInfo(\"user_id\") val userId: String,\n)\n\n@Entity(\n    tableName = \"reaction_notifications\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NotificationEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n)\ndata class ReactionNotificationEntity(\n    @PrimaryKey val id: String,\n    val reaction: String\n)\n\n@Entity(\n    tableName = \"poll_vote_notifications\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NotificationEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n)\ndata class PollVoteNotificationEntity(\n    @PrimaryKey val id: String,\n    val choice: Int,\n)\n\n@Entity(\n    tableName = \"poll_ended_notifications\",\n)\ndata class PollEndedNotificationEntity(\n    @PrimaryKey val id: String,\n    @ColumnInfo(\"note_id\") val noteId: String,\n)\n\n// group invited\n@Entity(\n    tableName = \"group_invited_notifications\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NotificationEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n)\ndata class GroupInvitedNotificationEntity(\n    @PrimaryKey val id: String,\n    @ColumnInfo(\"group_id\") val groupId: String,\n    @ColumnInfo(\"group_name\") val groupName: String,\n    @ColumnInfo(\"group_owner_id\") val groupOwnerId: String,\n    @ColumnInfo(\"group_created_at\") val groupCreatedAt: Instant,\n    @ColumnInfo(\"invitation_id\") val invitationId: String,\n)\n\n@Entity(\n    tableName = \"unknown_notifications\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NotificationEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ],\n)\ndata class UnknownNotificationEntity(\n    @PrimaryKey val id: String,\n    @ColumnInfo(\"raw_type\") val rawType: String\n)\n\n@Entity(\n    tableName = \"follow_request_accepted_notifications\",\n    foreignKeys = [\n        ForeignKey(\n            entity = NotificationEntity::class,\n            parentColumns = [\"id\"],\n            childColumns = [\"id\"],\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE\n        )\n    ]\n)\ndata class FollowRequestAcceptedNotificationEntity(\n    @PrimaryKey val id: String,\n    @ColumnInfo(name = \"user_id\") val userId: String,\n)\n\ndata class NotificationWithDetails(\n    @Embedded val notification: NotificationEntity,\n    @Relation(\n        entity = FollowNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val followNotification: FollowNotificationEntity?,\n\n    @Relation(\n        entity = NoteNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val noteNotification: NoteNotificationEntity?,\n\n    @Relation(\n        entity = ReactionNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val reactionNotification: ReactionNotificationEntity?,\n\n    @Relation(\n        entity = PollVoteNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val pollVoteNotification: PollVoteNotificationEntity?,\n\n    @Relation(\n        entity = GroupInvitedNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val groupInvitedNotification: GroupInvitedNotificationEntity?,\n\n    @Relation(\n        entity = UnknownNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val unknownNotification: UnknownNotificationEntity?,\n\n    @Relation(\n        entity = UnreadNotification::class,\n        parentColumn = \"notification_id\",\n        entityColumn = \"notificationId\",\n    )\n    val unreadNotification: List<UnreadNotification>?,\n\n    @Relation(\n        entity = PollEndedNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val pollEndedNotification: PollEndedNotificationEntity?,\n\n    @Relation(\n        entity = FollowRequestAcceptedNotificationEntity::class,\n        parentColumn = \"id\",\n        entityColumn = \"id\"\n    )\n    val followRequestAccepted: FollowRequestAcceptedNotificationEntity?,\n) {\n\n    companion object {\n        fun fromModel(model: Notification): NotificationWithDetails {\n            val notificationEntity = NotificationEntity(\n                NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                model.id.notificationId,\n                model.id.accountId,\n                model.createdAt,\n                NotificationType.modelOf(model).value\n            )\n\n            fun unreadNotification(): List<UnreadNotification> {\n                return if (model.isRead) {\n                    listOf(\n                        UnreadNotification(\n                            model.id.accountId,\n                            model.id.notificationId\n                        )\n                    )\n                } else {\n                    emptyList()\n                }\n            }\n            return when (model) {\n                is FavoriteNotification -> NotificationWithDetails(\n                    notificationEntity,\n                    null,\n                    NoteNotificationEntity(\n                        NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                        model.noteId.noteId,\n                        model.userId.id,\n                    ),\n                    null,\n                    null,\n                    null,\n                    null,\n                    unreadNotification(),\n                    null,\n                    null,\n                )\n\n                is FollowNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        FollowNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.userId.id\n                        ),\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is FollowRequestAcceptedNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        FollowRequestAcceptedNotificationEntity(\n                            notificationEntity.id,\n                            userId = model.userId.id,\n                        )\n                    )\n                }\n\n                is GroupInvitedNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        null,\n                        null,\n                        null,\n                        GroupInvitedNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            groupId = model.group.id.groupId,\n                            groupName = model.group.name,\n                            groupOwnerId = model.group.ownerId.id,\n                            groupCreatedAt = model.group.createdAt,\n                            invitationId = model.invitationId.invitationId,\n                        ),\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is MentionNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        NoteNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.noteId.noteId,\n                            model.userId.id,\n                        ),\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is PollEndedNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        PollEndedNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.noteId.noteId,\n                        ),\n                        null,\n                    )\n                }\n\n                is PollVoteNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        null,\n                        null,\n                        PollVoteNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.choice,\n                        ),\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is PostNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        NoteNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.noteId.noteId,\n                            model.userId.id,\n                        ),\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is QuoteNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        NoteNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.noteId.noteId,\n                            model.userId.id,\n                        ),\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is ReactionNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        NoteNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.noteId.noteId,\n                            model.userId.id,\n                        ),\n                        ReactionNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.reaction,\n                        ),\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is ReceiveFollowRequestNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is RenoteNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        NoteNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.noteId.noteId,\n                            model.userId.id,\n                        ),\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is ReplyNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        NoteNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.noteId.noteId,\n                            model.userId.id,\n                        ),\n                        null,\n                        null,\n                        null,\n                        null,\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n\n                is UnknownNotification -> {\n                    NotificationWithDetails(\n                        notificationEntity,\n                        null,\n                        null,\n                        null,\n                        null,\n                        null,\n                        UnknownNotificationEntity(\n                            NotificationEntity.makeId(model.id.accountId, model.id.notificationId),\n                            model.rawType,\n                        ),\n                        unreadNotification(),\n                        null,\n                        null,\n                    )\n                }\n            }\n        }\n    }\n\n    fun toModel(): Notification {\n        val type = NotificationType.entries.firstOrNull { it.value == notification.type }\n            ?: NotificationType.Unknown\n        return when (type) {\n            NotificationType.Follow -> {\n                FollowNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, followNotification!!.userId),\n                    isRead()\n                )\n            }\n\n            NotificationType.Favorite -> {\n                FavoriteNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    Note.Id(notification.accountId, noteNotification.noteId),\n                    isRead(),\n                )\n            }\n\n            NotificationType.FollowRequestAccepted -> {\n                FollowRequestAcceptedNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, followRequestAccepted!!.userId),\n                    isRead(),\n                )\n            }\n\n            NotificationType.GroupInvited -> {\n                GroupInvitedNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    isRead(),\n                    notification.createdAt,\n                    Group(\n                        Group.Id(notification.accountId, groupInvitedNotification!!.groupId),\n                        name = groupInvitedNotification.groupName,\n                        ownerId = User.Id(\n                            notification.accountId,\n                            groupInvitedNotification.groupOwnerId\n                        ),\n                        createdAt = groupInvitedNotification.groupCreatedAt,\n                        userIds = emptyList(),\n                    ),\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    InvitationId(notification.accountId, groupInvitedNotification.invitationId),\n                )\n            }\n\n            NotificationType.Mention -> {\n                MentionNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    Note.Id(notification.accountId, noteNotification.noteId),\n                    isRead(),\n                )\n            }\n\n            NotificationType.PollEnded -> {\n                PollEndedNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    isRead(),\n                    Note.Id(notification.accountId, pollEndedNotification!!.noteId),\n                )\n            }\n\n            NotificationType.PollVote -> {\n                PollVoteNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    Note.Id(notification.accountId, noteNotification!!.noteId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification.userId),\n                    pollVoteNotification!!.choice,\n                    isRead()\n                )\n            }\n\n            NotificationType.Post -> {\n                PostNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    Note.Id(notification.accountId, noteNotification.noteId),\n                    isRead()\n                )\n            }\n\n            NotificationType.Quote -> {\n                QuoteNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    Note.Id(notification.accountId, noteNotification.noteId),\n                    isRead()\n                )\n            }\n\n            NotificationType.Reaction -> {\n                ReactionNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    Note.Id(notification.accountId, noteNotification.noteId),\n                    reactionNotification!!.reaction,\n                    isRead()\n                )\n            }\n\n            NotificationType.ReceiveFollowRequest -> {\n                ReceiveFollowRequestNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    isRead()\n                )\n            }\n\n            NotificationType.Renote -> {\n                RenoteNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    Note.Id(notification.accountId, noteNotification.noteId),\n                    isRead()\n                )\n            }\n\n            NotificationType.Unknown -> {\n                UnknownNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    isRead(),\n                    userId = User.Id(notification.accountId, noteNotification!!.userId),\n                    rawType = unknownNotification!!.rawType,\n                )\n            }\n\n            NotificationType.Reply -> {\n                ReplyNotification(\n                    Notification.Id(notification.accountId, notification.notificationId),\n                    notification.createdAt,\n                    User.Id(notification.accountId, noteNotification!!.userId),\n                    Note.Id(notification.accountId, noteNotification.noteId),\n                    isRead()\n                )\n            }\n        }\n    }\n\n    private fun isRead(): Boolean {\n        return unreadNotification?.none {\n            it.accountId == notification.accountId\n        } ?: true\n    }\n}\n\nenum class NotificationType(\n    val value: String\n) {\n    Favorite(\"favorite\"),\n    Follow(\"follow\"),\n    FollowRequestAccepted(\"follow_request_accepted\"),\n    GroupInvited(\"group_invited\"),\n    Mention(\"mention\"),\n    PollEnded(\"poll_ended\"),\n    PollVote(\"poll_vote\"),\n    Post(\"post\"),\n    Quote(\"quote\"),\n    Reaction(\"reaction\"),\n    ReceiveFollowRequest(\"receive_follow_request\"),\n    Renote(\"renote\"),\n    Reply(\"reply\"),\n    Unknown(\"unknown\");\n\n    companion object {\n        fun modelOf(model: Notification): NotificationType {\n            when (model) {\n                is FavoriteNotification -> return Favorite\n                is FollowNotification -> return Follow\n                is FollowRequestAcceptedNotification -> return FollowRequestAccepted\n                is GroupInvitedNotification -> return GroupInvited\n                is MentionNotification -> return Mention\n                is PollEndedNotification -> return PollEnded\n                is PollVoteNotification -> return PollVote\n                is PostNotification -> return Post\n                is QuoteNotification -> return Quote\n                is ReactionNotification -> return Reaction\n                is ReceiveFollowRequestNotification -> return ReceiveFollowRequest\n                is RenoteNotification -> return Renote\n                is ReplyNotification -> return Reply\n                is UnknownNotification -> return Unknown\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/NotificationJsonCacheRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Index\n\n@Entity(\n    tableName = \"notification_json_cache_v1\",\n    indices = [Index(\"key\")],\n    primaryKeys = [\"accountId\", \"notificationId\"]\n)\ndata class NotificationJsonCacheRecord(\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"notificationId\")\n    val notificationId: String,\n\n    @ColumnInfo(name = \"json\")\n    val json: String,\n\n    @ColumnInfo(name = \"key\")\n    val key: String?,\n\n    @ColumnInfo(name = \"weight\")\n    val weight: Int\n)\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/NotificationJsonCacheRecordDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n@Dao\ninterface NotificationJsonCacheRecordDAO {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertAll(items: List<NotificationJsonCacheRecord>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(item: NotificationJsonCacheRecord)\n\n    @Query(\n        \"\"\"\n            select * from notification_json_cache_v1 \n                where accountId = :accountId and `key` = :key order by weight asc\n        \"\"\"\n    )\n    suspend fun findByKey(accountId: Long, key: String): List<NotificationJsonCacheRecord>\n\n    @Query(\n        \"\"\"\n            select * from notification_json_cache_v1 \n                where accountId = :accountId and `key` is null order by weight asc\n        \"\"\"\n    )\n    suspend fun findByNullKey(accountId: Long): List<NotificationJsonCacheRecord>\n\n    @Query(\n        \"\"\"\n            select * from notification_json_cache_v1 \n                where accountId = :accountId and notificationId < :untilId\n                order by notificationId desc\n                limit :limit\n        \"\"\"\n    )\n    suspend fun filterPaged(accountId: Long, untilId: String, limit: Int): List<NotificationJsonCacheRecord>\n\n    @Query(\n        \"\"\"\n            delete from notification_json_cache_v1\n                where accountId = :accountId and `key` = :key\n        \"\"\"\n    )\n    suspend fun deleteByKey(accountId: Long, key: String)\n\n    @Query(\n        \"\"\"\n            delete from notification_json_cache_v1\n                where accountId = :accountId and `key` is null\n        \"\"\"\n    )\n    suspend fun deleteByNullKey(accountId: Long)\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/NotificationTimelineEntity.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.Dao\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.PrimaryKey\nimport androidx.room.Query\nimport androidx.room.Relation\nimport androidx.room.Transaction\n\n/**\n * キャッシュの塊を表すエンティティ\n */\n@Entity(\n    tableName = \"notification_timelines\"\n)\ndata class NotificationTimelineEntity(\n    val accountId: Long,\n    \n    @PrimaryKey(autoGenerate = true)\n    val id: Long = 0L\n)\n\n\n// exclude types\n@Entity(\n    tableName = \"notification_timeline_excluded_types\",\n    primaryKeys = [\"timelineId\", \"type\"]\n)\ndata class NotificationTimelineExcludedTypeEntity(\n    val timelineId: Long,\n    val type: String,\n)\n\n// include types\n@Entity(\n    tableName = \"notification_timeline_included_types\",\n    primaryKeys = [\"timelineId\", \"type\"]\n)\ndata class NotificationTimelineIncludedTypeEntity(\n    val timelineId: Long,\n    val type: String,\n)\n\n// relation\ndata class NotificationTimelineRelation(\n    @Embedded\n    val timeline: NotificationTimelineEntity,\n    \n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"timelineId\"\n    )\n    val excludedTypes: List<NotificationTimelineExcludedTypeEntity>,\n    \n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"timelineId\"\n    )\n    val includedTypes: List<NotificationTimelineIncludedTypeEntity>,\n)\n\n@Entity(\n    tableName = \"notification_timeline_items\",\n    primaryKeys = [\"timelineId\", \"notificationId\"],\n    indices = [\n        androidx.room.Index(\"timelineId\"),\n    ]\n)\ndata class NotificationTimelineItemEntity(\n    val timelineId: Long,\n    val notificationId: String,\n    val cachedAt: Long,\n)\n\n@Dao\ninterface NotificationTimelineDAO {\n\n    // insert\n    @Insert\n    suspend fun insert(entity: NotificationTimelineEntity): Long\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertExcludedTypes(entity: List<NotificationTimelineExcludedTypeEntity>)\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertIncludedTypes(entity: List<NotificationTimelineIncludedTypeEntity>)\n\n\n    @Query(\n        \"\"\"\n            SELECT * FROM notification_timelines\n            JOIN (\n                SELECT notification_timeline_excluded_types.timelineId FROM notification_timeline_excluded_types\n                WHERE type IN (:excludeTypes)\n                GROUP BY notification_timeline_excluded_types.timelineId\n                HAVING COUNT(notification_timeline_excluded_types.timelineId) = COUNT(:excludeTypesCount)\n            ) as excludes ON notification_timelines.id = excludes.timelineId\n            JOIN (\n                SELECT notification_timeline_included_types.timelineId FROM notification_timeline_included_types\n                WHERE type IN (:includeTypes)\n                GROUP BY notification_timeline_included_types.timelineId\n                HAVING COUNT(notification_timeline_included_types.timelineId) = COUNT(:includeTypesCount)\n            ) as includes ON notification_timelines.id = includes.timelineId\n            WHERE accountId = :accountId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findByExcludeTypesAndIncludeTypes(\n        accountId: Long,\n        excludeTypes: List<String>,\n        includeTypes: List<String>,\n        excludeTypesCount: Int = excludeTypes.size,\n        includeTypesCount: Int = includeTypes.size\n    ): List<NotificationTimelineRelation>\n\n    // リレーションが何一つ設定されていないタイムラインを取得\n    @Query(\n        \"\"\"\n            SELECT * FROM notification_timelines\n            WHERE id NOT IN (\n                SELECT timelineId FROM notification_timeline_excluded_types\n            ) AND id NOT IN (\n                SELECT timelineId FROM notification_timeline_included_types\n            )\n            AND accountId = :accountId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findEmpty(accountId: Long): List<NotificationTimelineRelation>\n\n    // include typesに完全一致し、exclude typesのリレーションが存在しないタイムラインを取得\n    @Query(\n        \"\"\"\n            SELECT * FROM notification_timelines\n            JOIN (\n                SELECT notification_timeline_included_types.timelineId FROM notification_timeline_included_types\n                WHERE type IN (:includeTypes)\n                GROUP BY notification_timeline_included_types.timelineId\n                HAVING COUNT(notification_timeline_included_types.timelineId) = COUNT(:includeTypesCount)\n            ) as includes ON notification_timelines.id = includes.timelineId\n            WHERE id NOT IN (\n                SELECT timelineId FROM notification_timeline_excluded_types\n            )\n            AND accountId = :accountId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findByIncludeTypes(accountId: Long, includeTypes: List<String>, includeTypesCount: Int = includeTypes.size): List<NotificationTimelineRelation>\n\n    // exclude typesに完全一致し、include typesのリレーションが存在しないタイムラインを取得\n    @Query(\n        \"\"\"\n            SELECT * FROM notification_timelines\n            JOIN (\n                SELECT notification_timeline_excluded_types.timelineId FROM notification_timeline_excluded_types\n                WHERE type IN (:excludeTypes)\n                GROUP BY notification_timeline_excluded_types.timelineId\n                HAVING COUNT(notification_timeline_excluded_types.timelineId) = COUNT(:excludeTypesCount)\n            ) as excludes ON notification_timelines.id = excludes.timelineId\n            WHERE id NOT IN (\n                SELECT timelineId FROM notification_timeline_included_types\n            )\n            AND accountId = :accountId\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findByExcludeTypes(accountId: Long, excludeTypes: List<String>, excludeTypesCount: Int = excludeTypes.size): List<NotificationTimelineRelation>\n\n    // find by id\n    @Query(\n        \"\"\"\n            SELECT * FROM notification_timelines\n            WHERE id = :id\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findById(id: Long): NotificationTimelineRelation?\n\n    // find notifications join notification_timeline_items\n    @Query(\n        \"\"\"\n            SELECT notifications.* FROM notification_timeline_items\n            JOIN notifications ON notification_timeline_items.notificationId = notifications.id\n            WHERE timelineId = :timelineId\n            ORDER BY notifications.notification_id DESC\n            LIMIT :limit\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findNotifications(timelineId: Long, limit: Int): List<NotificationWithDetails>\n\n    // find notifications join notification_timeline_items and untilId\n    @Query(\n        \"\"\"\n            SELECT notifications.* FROM notification_timeline_items\n            JOIN notifications ON notification_timeline_items.notificationId = notifications.id\n            WHERE timelineId = :timelineId AND notifications.notification_id < :untilId\n            ORDER BY notifications.notification_id DESC\n            LIMIT :limit\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findNotificationsUntilId(timelineId: Long, untilId: String, limit: Int): List<NotificationWithDetails>\n\n    @Query(\n        \"\"\"\n            SELECT notifications.* FROM notification_timeline_items\n            JOIN notifications ON notification_timeline_items.notificationId = notifications.id\n            WHERE timelineId = :timelineId AND notifications.notification_id > :sinceId\n            ORDER BY notifications.notification_id DESC\n            LIMIT :limit\n        \"\"\"\n    )\n    @Transaction\n    suspend fun findNotificationsSinceId(timelineId: Long, sinceId: String, limit: Int): List<NotificationWithDetails>\n\n    // insert notification_timeline_items\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insertNotificationItems(entity: List<NotificationTimelineItemEntity>)\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/UnreadNotification.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\n\n@Entity(\n    primaryKeys = [\"accountId\", \"notificationId\"],\n    foreignKeys = [ForeignKey(\n        entity = AccountRecord::class,\n        parentColumns = [\"accountId\"],\n        childColumns = [\"accountId\"],\n        onUpdate = ForeignKey.CASCADE,\n        onDelete = ForeignKey.CASCADE\n    )],\n    tableName = \"unread_notifications_table\"\n)\ndata class UnreadNotification(\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"notificationId\")\n    val notificationId: String\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/db/UnreadNotificationDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\nabstract class UnreadNotificationDAO {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insert(unreadNotification: UnreadNotification)\n\n    // insert all\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertAll(unreadNotifications: List<UnreadNotification>)\n\n    @Query(\"DELETE FROM unread_notifications_table WHERE accountId = :accountId AND notificationId = :notificationId\")\n    abstract suspend fun delete(accountId: Long, notificationId: String)\n\n    // delete in\n    @Query(\"DELETE FROM unread_notifications_table WHERE accountId = :accountId AND notificationId IN (:notificationIds)\")\n    abstract suspend fun deleteIn(accountId: Long, notificationIds: List<String>)\n\n\n    @Query(\"SELECT un.accountId AS accountId, COUNT(un.notificationId) AS count FROM unread_notifications_table AS un GROUP BY un.accountId\")\n    abstract fun countByAccount(): Flow<List<AccountNotificationCount>>\n\n\n\n    @Query(\"SELECT COUNT(*) FROM unread_notifications_table WHERE accountId = :accountId\")\n    abstract fun countByAccountId(accountId: Long) : Flow<Int>\n\n    @Query(\"DELETE FROM unread_notifications_table WHERE accountId = :accountId\")\n    abstract suspend fun deleteWhereAccountId(accountId: Long)\n\n    @Query(\"\"\"\n        SELECT * FROM unread_notifications_table\n            WHERE accountId = :accountId\n            ORDER BY notificationId DESC\n            LIMIT 1\n    \"\"\")\n    abstract suspend fun getLatestUnreadId(accountId: Long): UnreadNotification?\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/impl/MediatorNotificationDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.impl\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationCacheDAO\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationWithDetails\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotification\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotificationDAO\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.NotificationDataSource\nimport javax.inject.Inject\n\nclass MediatorNotificationDataSource @Inject constructor(\n    private val unreadNotificationDAO: UnreadNotificationDAO,\n    private val notificationCacheDAO: NotificationCacheDAO,\n) : NotificationDataSource {\n    override suspend fun add(notification: Notification): Result<AddResult> =\n        runCancellableCatching {\n            insertAll(\n                listOf(notification)\n            )\n            AddResult.Created\n        }\n\n    override suspend fun addAll(notifications: Collection<Notification>): Result<List<AddResult>> =\n        runCancellableCatching {\n            insertAll(notifications.toList())\n            notifications.map {\n                AddResult.Created\n            }\n        }\n\n    override fun addEventListener(listener: NotificationDataSource.Listener) {\n    }\n\n\n    override suspend fun get(notificationId: Notification.Id): Result<Notification> =\n        runCancellableCatching {\n            val entity = notificationCacheDAO.findNotification(\n                NotificationEntity.makeId(\n                    notificationId.accountId,\n                    notificationId.notificationId\n                )\n            )\n            entity?.toModel() ?: throw NoSuchElementException(\"Notification not found\")\n        }\n\n    override suspend fun remove(notificationId: Notification.Id): Result<Boolean> =\n        runCancellableCatching {\n            val count =\n                notificationCacheDAO.exists(\n                    NotificationEntity.makeId(\n                        notificationId.accountId,\n                        notificationId.notificationId\n                    )\n                )\n            notificationCacheDAO.remove(\n                NotificationEntity.makeId(\n                    notificationId.accountId,\n                    notificationId.notificationId\n                )\n            )\n            count > 0\n        }\n\n    override fun removeEventListener(listener: NotificationDataSource.Listener) {\n    }\n\n    override fun observeIn(notificationIds: List<Notification.Id>): Flow<List<Notification>> {\n        return notificationCacheDAO.observeIn(notificationIds.map {\n            NotificationEntity.makeId(\n                it.accountId,\n                it.notificationId\n            )\n        }).map { list ->\n            list.map { it.toModel() }\n        }\n    }\n\n    override fun observeOne(notificationId: Notification.Id): Flow<Notification?> {\n        return notificationCacheDAO.observeOne(\n            notificationId.accountId,\n            notificationId.notificationId\n        )\n            .map { it?.toModel() }\n    }\n\n    private suspend fun insertAll(notifications: List<Notification>) {\n        val relations = notifications.map {\n            NotificationWithDetails.fromModel(it)\n        }\n        notificationCacheDAO.insertAll(relations.map { it.notification })\n        notificationCacheDAO.insertFollowNotifications(relations.mapNotNull { it.followNotification })\n        notificationCacheDAO.insertNoteNotifications(relations.mapNotNull { it.noteNotification })\n        notificationCacheDAO.insertReactionNotifications(relations.mapNotNull { it.reactionNotification })\n        notificationCacheDAO.insertPollVoteNotifications(relations.mapNotNull { it.pollVoteNotification })\n        notificationCacheDAO.insertGroupInvitedNotifications(relations.mapNotNull { it.groupInvitedNotification })\n        notificationCacheDAO.insertUnknownNotifications(relations.mapNotNull { it.unknownNotification })\n        notificationCacheDAO.insertPollEndedNotifications(relations.mapNotNull { it.pollEndedNotification })\n        notificationCacheDAO.insertFollowRequestAcceptedNotifications(relations.mapNotNull { it.followRequestAccepted })\n\n        val unReads = notifications.filter { !it.isRead }.map {\n            UnreadNotification(it.id.accountId, it.id.notificationId)\n        }\n        val readNotificationIds = notifications.filter { !it.isRead }.map {\n            it.id\n        }.groupBy { it.accountId }\n\n        unreadNotificationDAO.insertAll(unReads)\n\n        readNotificationIds.forEach { (accountId, ids) ->\n            unreadNotificationDAO.deleteIn(accountId, ids.map { it.notificationId })\n        }\n\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/impl/NotificationCacheAdder.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.impl\n\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api.misskey.notification.NotificationDTO\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.NotificationDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.TootDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.data.infrastructure.toGroup\nimport net.pantasystem.milktea.data.infrastructure.toModel\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.group.GroupDataSource\nimport net.pantasystem.milktea.model.markers.MarkerRepository\nimport net.pantasystem.milktea.model.markers.MarkerType\nimport net.pantasystem.milktea.model.note.NoteRelationGetter\nimport net.pantasystem.milktea.model.notification.NotificationDataSource\nimport net.pantasystem.milktea.model.notification.NotificationRelation\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass NotificationCacheAdder @Inject constructor(\n    private val userDataSource: UserDataSource,\n    private val notificationDataSource: NotificationDataSource,\n    private val noteRelationGetter: NoteRelationGetter,\n    private val noteDataSourceAdder: NoteDataSourceAdder,\n    private val groupDataSource: GroupDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val notificationDTOEntityConverter: NotificationDTOEntityConverter,\n    private val markerRepository: MarkerRepository,\n    private val tootDTOEntityConverter: TootDTOEntityConverter,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n) {\n    suspend fun addAndConvert(account: Account, notificationDTO: NotificationDTO, skipExists: Boolean = false): NotificationRelation {\n        val user = notificationDTO.user?.let {\n            userDTOEntityConverter.convert(account, it)\n        }\n        if (user != null) {\n            if (!skipExists || userDataSource.get(user.id).isFailure) {\n                userDataSource.add(user)\n            }\n        }\n        val noteRelation = notificationDTO.note?.let{\n            noteRelationGetter.get(noteDataSourceAdder.addNoteDtoToDataSource(account, it, skipExists))\n        }\n        val notification = notificationDTOEntityConverter.convert(notificationDTO, account)\n\n        if (!skipExists || notificationDataSource.get(notification.id).isFailure) {\n            notificationDataSource.add(notification)\n        }\n\n        notificationDTO.invitation?.group?.toGroup(account.accountId)?.let { group ->\n            if (!skipExists || groupDataSource.find(group.id).isFailure) {\n                groupDataSource.add(group)\n            }\n        }\n        return NotificationRelation(\n            notification,\n            user,\n            noteRelation?.getOrNull()\n        )\n    }\n\n    suspend fun addConvert(account: Account, mstNotificationDTO: MstNotificationDTO, skipExists: Boolean = false): NotificationRelation {\n        val lastReadId = markerRepository.find(account.accountId, listOf(MarkerType.Notifications)).map {\n            it.notifications?.lastReadId ?: \"\"\n        }.getOrElse {\n            \"\"\n        }\n        val user = mastodonAccountDTOEntityConverter.convert(account, mstNotificationDTO.account)\n        val noteRelation = mstNotificationDTO.status?.let {\n            tootDTOEntityConverter.convert(it, account)\n        }?.let {\n            noteRelationGetter.get(it)\n        }\n\n        val notification = mstNotificationDTO.toModel(account, isRead = lastReadId >= mstNotificationDTO.id)\n        mstNotificationDTO.status?.let {\n            noteDataSourceAdder.addTootStatusDtoIntoDataSource(account, it, skipExists)\n        }\n\n        if (!skipExists || notificationDataSource.get(notification.id).isFailure) {\n            notificationDataSource.add(notification)\n        }\n\n        return NotificationRelation(\n            notification = notification,\n            user = user,\n            note = noteRelation?.getOrNull(),\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/impl/NotificationPagingStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.impl\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api.misskey.notification.NotificationDTO\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.FuturePagingController\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotificationDAO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.notification.NotificationPagingStore\nimport net.pantasystem.milktea.model.notification.NotificationRelation\nimport net.pantasystem.milktea.model.notification.NotificationRelationGetter\nimport javax.inject.Inject\n\nclass NotificationPagingStoreImpl(\n    val getAccount: suspend () -> Account,\n    val delegate: NotificationStoreImpl,\n    val unreadNotificationDAO: UnreadNotificationDAO,\n    private val notificationRelationGetter: NotificationRelationGetter,\n) : NotificationPagingStore {\n\n    class Factory @Inject constructor(\n        private val factory: NotificationStoreImpl.Factory,\n        private val unreadNotificationDAO: UnreadNotificationDAO,\n        private val notificationRelationGetter: NotificationRelationGetter,\n    ) : NotificationPagingStore.Factory {\n        override fun create(getAccount: suspend () -> Account): NotificationPagingStore {\n            return NotificationPagingStoreImpl(\n                getAccount,\n                delegate = factory.create(getAccount),\n                unreadNotificationDAO = unreadNotificationDAO,\n                notificationRelationGetter = notificationRelationGetter,\n            )\n        }\n    }\n\n    private val previousPagingController = PreviousPagingController(\n        entityConverter = delegate,\n        locker = delegate,\n        state = delegate,\n        previousLoader = delegate,\n    )\n\n    private val futurePagingController = FuturePagingController(\n        entityConverter = delegate,\n        locker = delegate,\n        state = delegate,\n        futureLoader = delegate,\n    )\n\n    override val notifications: Flow<PageableState<List<NotificationRelation>>> =\n        delegate.state.map { state ->\n            state.suspendConvert { list ->\n                list.map {\n                    notificationRelationGetter.get(it)\n                }\n            }\n        }\n\n    override suspend fun clear() {\n        delegate.mutex.withLock {\n            delegate.setState(\n                PageableState.Loading.Init()\n            )\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<Int> = runCancellableCatching {\n        if (delegate.mutex.isLocked) {\n            return@runCancellableCatching -1\n        }\n        unreadNotificationDAO.deleteWhereAccountId(getAccount().accountId)\n        previousPagingController.loadPrevious().getOrThrow()\n    }\n\n    override suspend fun loadFuture(): Result<Int> = runCancellableCatching  {\n        if (delegate.mutex.isLocked) {\n            return@runCancellableCatching -1\n        }\n        futurePagingController.loadFuture().getOrThrow()\n    }\n\n    override suspend fun onReceiveNewNotification(notificationRelation: NotificationRelation) {\n        delegate.mutex.withLock {\n            val state = delegate.getState()\n            val updated = when (state.content) {\n                is StateContent.Exist -> state.convert {\n                    listOf(\n                        notificationRelation.notification.id\n                    ) + it\n                }\n                is StateContent.NotExist -> state\n            }\n            delegate.setState(updated)\n        }\n    }\n}\n\n\n\n@kotlinx.serialization.Serializable\nsealed class NotificationItem {\n    abstract val nextId: String?\n    abstract val id: String\n    abstract val accountId: Long\n\n    @kotlinx.serialization.Serializable\n    data class Misskey(\n        val notificationDTO: NotificationDTO,\n        override val nextId: String?,\n        override val id: String,\n        override val accountId: Long\n    ) : NotificationItem()\n\n    @kotlinx.serialization.Serializable\n    data class Mastodon(\n        val mstNotificationDTO: MstNotificationDTO,\n        override val nextId: String?,\n        override val id: String,\n        override val accountId: Long\n    ) : NotificationItem()\n}\n\ndata class NotificationAndNextId(\n    val notification: NotificationRelation,\n    val nextId: String?,\n)"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/impl/NotificationRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.impl\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api_streaming.Send\nimport net.pantasystem.milktea.api_streaming.toJson\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotificationDAO\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.markers.MarkerRepository\nimport net.pantasystem.milktea.model.markers.SaveMarkerParams\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.NotificationDataSource\nimport net.pantasystem.milktea.model.notification.NotificationRepository\nimport javax.inject.Inject\n\nclass NotificationRepositoryImpl @Inject constructor(\n    private val notificationDataSource: NotificationDataSource,\n    private val socketProvider: SocketWithAccountProvider,\n    private val accountRepository: AccountRepository,\n    private val unreadNotificationDAO: UnreadNotificationDAO,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val markerRepository: MarkerRepository,\n) : NotificationRepository {\n\n\n    override suspend fun markAsRead(accountId: Long): Result<Unit> = runCancellableCatching {\n        val account = accountRepository.get(accountId).getOrThrow()\n        when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).markAllAsReadNotifications(\n                    I(\n                        account.token\n                    )\n                ).throwIfHasError()\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val latest = unreadNotificationDAO.getLatestUnreadId(accountId)\n                    ?: return@runCancellableCatching\n                markerRepository.save(\n                    accountId,\n                    SaveMarkerParams(\n                        notifications = latest.notificationId\n                    )\n                ).getOrThrow()\n            }\n        }\n    }\n\n    override suspend fun read(notificationId: Notification.Id) {\n        runCancellableCatching {\n            val account = accountRepository.get(notificationId.accountId).getOrThrow()\n            socketProvider.get(account)?.send(\n                Send.ReadNotification(\n                    Send.ReadNotification.Body(notificationId.notificationId)).toJson())\n            notificationDataSource.add(notificationDataSource.get(notificationId).getOrThrow().read())\n        }\n    }\n\n    override fun countUnreadNotification(accountId: Long): Flow<Int> {\n        return unreadNotificationDAO.countByAccountId(accountId)\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/impl/NotificationStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.impl\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.FutureLoader\nimport net.pantasystem.milktea.common.paginator.IdGetter\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.NotificationTimelineRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\nclass NotificationStoreImpl(\n    private val getAccount: suspend () -> Account,\n    private val notificationTimelineRepository: NotificationTimelineRepository,\n) : StateLocker, PreviousLoader<Notification>, PaginationState<Notification.Id>, FutureLoader<Notification>,\n    IdGetter<String>, EntityConverter<Notification, Notification.Id> {\n\n    @Singleton\n    class Factory @Inject constructor(\n        private val notificationTimelineRepository: NotificationTimelineRepository,\n    ) {\n        fun create(getAccount: suspend () -> Account): NotificationStoreImpl {\n            return NotificationStoreImpl(\n                getAccount = getAccount,\n                notificationTimelineRepository = notificationTimelineRepository,\n            )\n        }\n    }\n    override val mutex: Mutex = Mutex()\n\n    private val _state = MutableStateFlow<PageableState<List<Notification.Id>>>(\n        PageableState.Loading.Init()\n    )\n    override val state: Flow<PageableState<List<Notification.Id>>>\n        get() = _state\n\n    override fun getState(): PageableState<List<Notification.Id>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<Notification.Id>>) {\n        _state.value = state\n    }\n\n\n    override suspend fun convertAll(list: List<Notification>): List<Notification.Id> {\n        return list.map {\n            it.id\n        }.distinct()\n    }\n\n    override suspend fun loadPrevious(): Result<List<Notification>> = runCancellableCatching {\n        val account = getAccount()\n        notificationTimelineRepository.findPreviousTimeline(\n            accountId = account.accountId,\n            untilId = getUntilId(),\n        ).getOrThrow()\n    }\n\n    override suspend fun loadFuture(): Result<List<Notification>> = runCancellableCatching{\n        val account = getAccount()\n        notificationTimelineRepository.findLaterTimeline(\n            accountId = account.accountId,\n            sinceId = getSinceId(),\n        ).getOrThrow()\n    }\n\n    override suspend fun getSinceId(): String? {\n        return (_state.value.content as? StateContent.Exist)?.rawContent?.firstOrNull()?.notificationId\n    }\n\n    override suspend fun getUntilId(): String? {\n        return (_state.value.content as? StateContent.Exist)?.rawContent?.lastOrNull()?.notificationId\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/impl/NotificationStreamingImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.impl\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.withContext\nimport kotlinx.serialization.encodeToString\nimport kotlinx.serialization.json.Json\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.channel.ChannelAPI\nimport net.pantasystem.milktea.api_streaming.mastodon.Event\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationJsonCacheRecord\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationJsonCacheRecordDAO\nimport net.pantasystem.milktea.data.streaming.ChannelAPIWithAccountProvider\nimport net.pantasystem.milktea.data.streaming.StreamingAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.notification.NotificationRelation\nimport net.pantasystem.milktea.model.notification.NotificationStreaming\nimport javax.inject.Inject\n\nclass NotificationStreamingImpl @Inject constructor(\n    val channelAPIWithAccountProvider: ChannelAPIWithAccountProvider,\n    private val notificationCacheAdder: NotificationCacheAdder,\n    private val streamingAPIProvider: StreamingAPIProvider,\n    private val loggerFactory: Logger.Factory,\n    private val notificationJsonCacheRecordDAO: NotificationJsonCacheRecordDAO,\n    @IODispatcher val ioDispatcher: CoroutineDispatcher,\n) : NotificationStreaming {\n\n    val logger by lazy {\n        loggerFactory.create(\"NotificationStreamingImpl\")\n    }\n\n    private val decoder = Json {\n        ignoreUnknownKeys = true\n    }\n\n    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n    override fun connect(getAccount: () -> Account): Flow<NotificationRelation> {\n        return getAccount.asFlow().flatMapLatest { account ->\n            when (account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    requireNotNull(channelAPIWithAccountProvider.get(account)).connect(ChannelAPI.Type.Main)\n                        .mapNotNull { body ->\n                            body as? ChannelBody.Main.Notification\n                        }.map {\n                        runCancellableCatching {\n                            appendCache(account, it)\n                        }.onFailure {\n                            logger.error(\"キャッシュへの追加に失敗\", it)\n                        }\n                        notificationCacheAdder.addAndConvert(account, it.body)\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> requireNotNull(streamingAPIProvider.get(account)).connectUser()\n                    .mapNotNull {\n                        (it as? Event.Notification)?.notification\n                    }.mapNotNull {\n                    runCancellableCatching {\n                        appendCache(account, it)\n                    }.onFailure {\n                        logger.error(\"キャッシュへの追加に失敗\", it)\n                    }\n                    runCatching {\n                        notificationCacheAdder.addConvert(account, it)\n                    }.getOrNull()\n                }\n            }\n        }.catch {\n            logger.error(\"streaming listen error\", it)\n        }\n    }\n\n    private suspend fun appendCache(account: Account, event: ChannelBody.Main.Notification) {\n        withContext(ioDispatcher) {\n            val item: NotificationItem = NotificationItem.Misskey(\n                notificationDTO = event.body,\n                accountId = account.accountId,\n                id = event.id,\n                nextId = null\n            )\n            val record = NotificationJsonCacheRecord(\n                item.accountId,\n                json = decoder.encodeToString(item),\n                key = null,\n                notificationId = item.id,\n                weight = 0\n            )\n            val items =\n                listOf(record) + notificationJsonCacheRecordDAO.findByNullKey(item.accountId)\n            notificationJsonCacheRecordDAO.insertAll(items.mapIndexed { index, notificationJsonCacheRecord ->\n                notificationJsonCacheRecord.copy(weight = index)\n            })\n        }\n    }\n\n    private suspend fun appendCache(account: Account, event: MstNotificationDTO) {\n        withContext(ioDispatcher) {\n            val item: NotificationItem = NotificationItem.Mastodon(\n                mstNotificationDTO = event,\n                accountId = account.accountId,\n                id = event.id,\n                nextId = null\n            )\n            val record = NotificationJsonCacheRecord(\n                item.accountId,\n                json = decoder.encodeToString(item),\n                key = null,\n                notificationId = item.id,\n                weight = 0\n            )\n            val items =\n                listOf(record) + notificationJsonCacheRecordDAO.findByNullKey(item.accountId)\n            notificationJsonCacheRecordDAO.insertAll(items.mapIndexed { index, notificationJsonCacheRecord ->\n                notificationJsonCacheRecord.copy(weight = index)\n            })\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/notification/impl/NotificationTimelineRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.notification.impl\n\nimport androidx.room.withTransaction\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.api.mastodon.notification.MstNotificationDTO\nimport net.pantasystem.milktea.api.misskey.notification.NotificationDTO\nimport net.pantasystem.milktea.api.misskey.notification.NotificationRequest\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.DataBase\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineExcludedTypeEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineIncludedTypeEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineItemEntity\nimport net.pantasystem.milktea.data.infrastructure.notification.db.NotificationTimelineRelation\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.NotificationTimelineRepository\nimport javax.inject.Inject\n\nclass NotificationTimelineRepositoryImpl @Inject constructor(\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val accountRepository: AccountRepository,\n    private val notificationAdder: NotificationCacheAdder,\n    private val coroutineScope: CoroutineScope,\n    private val dataBase: DataBase,\n) : NotificationTimelineRepository {\n\n    // 最後に初期読み込みした時間をマップに保存しておく(key = accountId, value = lastFetchTime)\n    private var lastFetchTimeMap = mapOf<Long, Long>()\n    override suspend fun findPreviousTimeline(\n        accountId: Long,\n        untilId: String?,\n        limit: Int,\n        excludeTypes: List<String>?,\n        includeTypes: List<String>?,\n    ): Result<List<Notification>> = runCancellableCatching {\n        val timelineHolder = makeNotificationTimelineHolder(\n            accountId = accountId,\n            excludeTypes = excludeTypes ?: emptyList(),\n            includeTypes = includeTypes ?: emptyList()\n        )\n        val account = accountRepository.get(accountId).getOrThrow()\n        val models = if (untilId == null) {\n            dataBase.notificationTimelineDAO().findNotifications(timelineHolder.timeline.id, limit)\n        } else {\n            dataBase.notificationTimelineDAO()\n                .findNotificationsUntilId(timelineHolder.timeline.id, untilId, limit)\n        }.map {\n            it.toModel()\n        }\n        val lastInitialFetchTime = lastFetchTimeMap[accountId] ?: System.currentTimeMillis()\n        val now = System.currentTimeMillis()\n        val fetched = if (models.size < limit) {\n            fetch(\n                timelineHolder.timeline.id,\n                account,\n                untilId,\n                null,\n                excludeTypes,\n                includeTypes\n            ).getOrThrow()\n        } else {\n            coroutineScope.launch {\n                if (now - lastInitialFetchTime > 1000 * 60 * 3) {\n                    fetch(\n                        timelineHolder.timeline.id,\n                        account,\n                        untilId,\n                        null,\n                        excludeTypes,\n                        includeTypes\n                    )\n                }\n            }\n            models\n        }\n\n        if (untilId == null) {\n            lastFetchTimeMap += accountId to now\n        }\n\n        fetched.filterNot {\n            it.id.notificationId == untilId\n        }\n    }\n\n    override suspend fun findLaterTimeline(\n        accountId: Long,\n        sinceId: String?,\n        limit: Int,\n        excludeTypes: List<String>?,\n        includeTypes: List<String>?\n    ): Result<List<Notification>> = runCancellableCatching {\n        val timelineHolder = makeNotificationTimelineHolder(\n            accountId = accountId,\n            excludeTypes = excludeTypes ?: emptyList(),\n            includeTypes = includeTypes ?: emptyList()\n        )\n        val account = accountRepository.get(accountId).getOrThrow()\n        val models = if (sinceId == null) {\n            dataBase.notificationTimelineDAO().findNotifications(timelineHolder.timeline.id, limit)\n        } else {\n            dataBase.notificationTimelineDAO()\n                .findNotificationsSinceId(timelineHolder.timeline.id, sinceId, limit)\n        }.map {\n            it.toModel()\n        }\n        val lastInitialFetchTime = lastFetchTimeMap[accountId] ?: System.currentTimeMillis()\n        val now = System.currentTimeMillis()\n        val fetched = if (models.size < limit) {\n            fetch(\n                timelineHolder.timeline.id,\n                account,\n                null,\n                sinceId,\n                excludeTypes,\n                includeTypes\n            ).getOrThrow()\n        } else {\n            coroutineScope.launch {\n                if (now - lastInitialFetchTime > 1000 * 60 * 3) {\n                    fetch(\n                        timelineHolder.timeline.id,\n                        account,\n                        null,\n                        sinceId,\n                        excludeTypes,\n                        includeTypes\n                    )\n                }\n            }\n            models\n        }\n\n        if (sinceId == null) {\n            lastFetchTimeMap += accountId to now\n        }\n\n        fetched.filterNot {\n            it.id.notificationId == sinceId\n        }\n    }\n\n    private suspend fun fetch(\n        timelineId: Long,\n        account: Account,\n        untilId: String?,\n        sinceId: String?,\n        excludeTypes: List<String>?,\n        includeTypes: List<String>?,\n    ): Result<List<Notification>> =\n        runCancellableCatching {\n            when (account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    fetchMisskeyNotifications(\n                        account,\n                        untilId,\n                        sinceId,\n                        excludeTypes,\n                        includeTypes\n                    ).map {\n                        notificationAdder.addAndConvert(account, it).notification\n                    }\n                }\n\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    fetchMastodonNotifications(\n                        account,\n                        untilId,\n                        sinceId,\n                        excludeTypes,\n                        includeTypes\n                    ).map {\n                        notificationAdder.addConvert(account, it).notification\n                    }\n                }\n            }.also { notifications ->\n                dataBase.notificationTimelineDAO().insertNotificationItems(\n                    notifications.map {\n                        NotificationTimelineItemEntity(\n                            timelineId = timelineId,\n                            notificationId = NotificationEntity.makeId(\n                                it.id.accountId,\n                                it.id.notificationId\n                            ),\n                            cachedAt = System.currentTimeMillis(),\n                        )\n                    }\n                )\n            }\n        }\n\n    private suspend fun fetchMisskeyNotifications(\n        account: Account,\n        untilId: String?,\n        sinceId: String?,\n        excludeTypes: List<String>?,\n        includeTypes: List<String>?,\n    ): List<NotificationDTO> {\n        val res = misskeyAPIProvider.get(account).notification(\n            NotificationRequest(\n                i = account.token,\n                untilId = untilId,\n                sinceId = sinceId,\n                excludeTypes = excludeTypes,\n                includeTypes = includeTypes,\n            )\n        ).throwIfHasError()\n        return res.body() ?: emptyList()\n    }\n\n    private suspend fun fetchMastodonNotifications(\n        account: Account,\n        untilId: String?,\n        sinceId: String?,\n        excludeTypes: List<String>?,\n        includeTypes: List<String>?,\n    ): List<MstNotificationDTO> {\n        val res = mastodonAPIProvider.get(account).getNotifications(\n            maxId = untilId,\n            minId = sinceId,\n            excludeTypes = excludeTypes,\n            types = includeTypes,\n        )\n        return res.body() ?: emptyList()\n    }\n\n    private suspend fun makeNotificationTimelineHolder(\n        accountId: Long,\n        includeTypes: List<String>,\n        excludeTypes: List<String>,\n    ): NotificationTimelineRelation {\n        val dao = dataBase.notificationTimelineDAO()\n        return dataBase.withTransaction {\n            val exists = if (includeTypes.isEmpty() && excludeTypes.isEmpty()) {\n                dao.findEmpty(accountId).firstOrNull()\n            } else if (includeTypes.isEmpty()) {\n                dao.findByExcludeTypes(accountId, excludeTypes).firstOrNull()\n            } else if (excludeTypes.isEmpty()) {\n                dao.findByIncludeTypes(accountId, includeTypes).firstOrNull()\n            } else {\n                dao.findByExcludeTypesAndIncludeTypes(\n                    accountId = accountId,\n                    excludeTypes = excludeTypes,\n                    includeTypes = includeTypes\n                ).firstOrNull()\n            }\n            if (exists == null) {\n                val id = dao.insert(\n                    NotificationTimelineEntity(\n                        accountId = accountId,\n                    )\n                )\n                dao.insertExcludedTypes(\n                    excludeTypes.map {\n                        NotificationTimelineExcludedTypeEntity(\n                            timelineId = id,\n                            type = it\n                        )\n                    }\n                )\n                dao.insertIncludedTypes(\n                    includeTypes.map {\n                        NotificationTimelineIncludedTypeEntity(\n                            timelineId = id,\n                            type = it\n                        )\n                    }\n                )\n                dao.findById(id)!!\n            } else {\n                exists\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/report/ReportRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.report\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.mastodon.report.CreateReportRequest\nimport net.pantasystem.milktea.api.misskey.users.report.ReportDTO\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.user.report.Report\nimport net.pantasystem.milktea.model.user.report.ReportRepository\nimport javax.inject.Inject\n\ninternal class ReportRepositoryImpl @Inject constructor(\n    private val getAccount: GetAccount,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher,\n): ReportRepository {\n\n    override suspend fun create(report: Report): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val account = getAccount.get(report.userId.accountId)\n            when(account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val api = misskeyAPIProvider.get(account)\n\n                    val res = api.report(\n                        ReportDTO(\n                            i = account.token,\n                            comment = report.comment,\n                            userId = report.userId.id\n                        )\n                    )\n                    res.throwIfHasError()\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    mastodonAPIProvider.get(account).createReport(\n                        CreateReportRequest(\n                            accountId = report.userId.id,\n                            statusIds = report.noteIds.map {\n                                it.noteId\n                            }\n                        )\n                    ).throwIfHasError()\n                }\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/search/SearchHistoryDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.search\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface SearchHistoryDao {\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    suspend fun insert(record: SearchHistoryRecord): Long\n\n    @Delete\n    suspend fun delete(record: SearchHistoryRecord)\n\n    @Query(\"select * from search_histories where accountId = :accountId order by id desc limit :limit\")\n    fun observeByAccountId(accountId: Long, limit: Int): Flow<List<SearchHistoryRecord>>\n\n    @Query(\"select * from search_histories where id = :id\")\n    suspend fun findOne(id: Long): SearchHistoryRecord?\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/search/SearchHistoryRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.search\n\nimport androidx.room.*\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.model.search.SearchHistory\n\n@Entity(\n    tableName = \"search_histories\",\n    indices = [Index(\"keyword\", \"accountId\", unique = true), Index(\"accountId\")],\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"accountId\"],\n            entity = AccountRecord::class,\n            onDelete = ForeignKey.CASCADE,\n            onUpdate = ForeignKey.CASCADE,\n            childColumns = [\"accountId\"]\n        )\n    ]\n)\ndata class SearchHistoryRecord(\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"keyword\")\n    val keyword: String,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true)\n    val id: Long\n) {\n\n    @Ignore\n    fun toModel(): SearchHistory {\n        return SearchHistory(\n            accountId = accountId,\n            id = id,\n            keyword = keyword\n        )\n    }\n}\n\nfun SearchHistory.toRecord(): SearchHistoryRecord {\n    return SearchHistoryRecord(\n        accountId = accountId,\n        id = id,\n        keyword = keyword\n    )\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/search/SearchHistoryRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.search\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.search.SearchHistory\nimport net.pantasystem.milktea.model.search.SearchHistoryRepository\nimport javax.inject.Inject\n\nclass SearchHistoryRepositoryImpl @Inject constructor(\n    private val searchHistoryDao: SearchHistoryDao,\n    @IODispatcher val ioDispatcher: CoroutineDispatcher,\n) : SearchHistoryRepository {\n    override suspend fun add(history: SearchHistory): Result<SearchHistory> = runCancellableCatching{\n\n        withContext(ioDispatcher) {\n            val id = searchHistoryDao.insert(history.toRecord())\n            searchHistoryDao.findOne(id)?.toModel() ?: throw IllegalStateException()\n        }\n    }\n\n    override suspend fun delete(id: Long): Result<Unit> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            searchHistoryDao.delete(searchHistoryDao.findOne(id) ?: throw NoSuchElementException(\"search history not found:${id}\"))\n        }\n    }\n\n    override fun observeBy(accountId: Long, limit: Int): Flow<List<SearchHistory>> {\n        return searchHistoryDao.observeByAccountId(accountId, limit).map { records ->\n            records.map {\n                it.toModel()\n            }\n        }.flowOn(ioDispatcher)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/settings/Config.kt",
    "content": "@file:Suppress(\"UNCHECKED_CAST\")\n\npackage net.pantasystem.milktea.data.infrastructure.settings\n\nimport android.content.SharedPreferences\nimport net.pantasystem.milktea.model.setting.*\n\nfun RememberVisibility.Keys.str(): String {\n    return when (this) {\n        is RememberVisibility.Keys.IsLocalOnly -> \"accountId:${accountId}:IS_LOCAL_ONLY\"\n        is RememberVisibility.Keys.IsRememberNoteVisibility -> \"IS_LEARN_NOTE_VISIBILITY\"\n        is RememberVisibility.Keys.NoteVisibility -> \"accountId:${accountId}:NOTE_VISIBILITY\"\n    }\n}\n\nfun SharedPreferences.getPrefTypes(keys: Set<Keys> = Keys.allKeys): Map<Keys, PrefType?> {\n    val strKeys = keys.associateBy { it.str() }\n    return all.filter {\n        strKeys.contains(it.key)\n    }.map {\n        strKeys[it.key]?.let { key ->\n            key to it.value?.let { value ->\n                when (value::class) {\n                    Boolean::class -> {\n                        PrefType.BoolPref(value as Boolean)\n                    }\n\n                    String::class -> {\n                        PrefType.StrPref(value as String)\n                    }\n\n                    Int::class -> {\n                        PrefType.IntPref(value as Int)\n                    }\n\n                    Float::class -> {\n                        PrefType.FloatPref(value as Float)\n                    }\n\n                    else -> null\n                }\n            }\n        }\n    }.filterNotNull().toMap()\n}\n\nfun Config.Companion.from(map: Map<Keys, PrefType?>): Config {\n    return Config(\n        isSimpleEditorEnabled = map.getValue<PrefType.BoolPref>(Keys.IsSimpleEditorEnabled)?.value\n            ?: DefaultConfig.config.isSimpleEditorEnabled,\n        reactionPickerType = (map.getValue<PrefType.IntPref>(Keys.ReactionPickerType)?.value)\n            .let {\n                when (it) {\n                    0 -> {\n                        ReactionPickerType.LIST\n                    }\n\n                    1 -> {\n                        ReactionPickerType.SIMPLE\n                    }\n\n                    else -> {\n                        DefaultConfig.config.reactionPickerType\n                    }\n                }\n            },\n        backgroundImagePath = map.getValue<PrefType.StrPref>(Keys.BackgroundImage)?.value\n            ?: DefaultConfig.config.backgroundImagePath,\n        isClassicUI = map.getValue<PrefType.BoolPref>(Keys.ClassicUI)?.value\n            ?: DefaultConfig.config.isClassicUI,\n        isUserNameDefault = map.getValue<PrefType.BoolPref>(Keys.IsUserNameDefault)?.value\n            ?: DefaultConfig.config.isUserNameDefault,\n        isPostButtonAtTheBottom = map.getValue<PrefType.BoolPref>(Keys.IsPostButtonToBottom)?.value\n            ?: DefaultConfig.config.isPostButtonAtTheBottom,\n        noteExpandedHeightSize = map.getValue<PrefType.IntPref>(Keys.NoteLimitHeight)?.value\n            ?: DefaultConfig.config.noteExpandedHeightSize,\n        theme = Theme.from(map.getValue<PrefType.IntPref>(Keys.ThemeType)?.value ?: 0),\n        isIncludeRenotedMyNotes = map.getValue<PrefType.BoolPref>(Keys.IsIncludeRenotedMyNotes)?.value\n            ?: DefaultConfig.config.isIncludeMyRenotes,\n        isIncludeMyRenotes = map.getValue<PrefType.BoolPref>(Keys.IsIncludeMyRenotes)?.value\n            ?: DefaultConfig.config.isIncludeMyRenotes,\n        isIncludeLocalRenotes = map.getValue<PrefType.BoolPref>(Keys.IsIncludeLocalRenotes)?.value\n            ?: DefaultConfig.config.isIncludeLocalRenotes,\n        surfaceColorOpacity = map.getValue<PrefType.IntPref>(Keys.SurfaceColorOpacity)?.value\n            ?: DefaultConfig.config.surfaceColorOpacity,\n        isEnableTimelineScrollAnimation = map.getValue<PrefType.BoolPref>(Keys.IsEnableTimelineScrollAnimation)?.value\n            ?: DefaultConfig.config.isEnableTimelineScrollAnimation,\n        isCrashlyticsCollectionEnabled = IsCrashlyticsCollectionEnabled(\n            isEnable = map.getValue<PrefType.BoolPref>(Keys.IsCrashlyticsCollectionEnabled)?.value\n                ?: DefaultConfig.config.isCrashlyticsCollectionEnabled.isEnable,\n            isConfirmed = map.getValue<PrefType.BoolPref>(Keys.IsConfirmedCrashlyticsCollection)?.value\n                ?: DefaultConfig.config.isCrashlyticsCollectionEnabled.isConfirmed\n        ),\n        isAnalyticsCollectionEnabled = IsAnalyticsCollectionEnabled(\n            isEnabled = map.getValue<PrefType.BoolPref>(Keys.IsAnalyticsCollectionEnabled)?.value\n                ?: DefaultConfig.config.isAnalyticsCollectionEnabled.isEnabled,\n            isConfirmed = map.getValue<PrefType.BoolPref>(Keys.IsConfirmedAnalyticsCollection)?.value\n                ?: DefaultConfig.config.isAnalyticsCollectionEnabled.isConfirmed,\n        ),\n        isConfirmedPostNotification = map.getValue<PrefType.BoolPref>(\n            Keys.IsConfirmedPostNotification\n        )?.value ?: false,\n        isEnableInstanceTicker = map.getValue<PrefType.BoolPref>(\n            Keys.IsEnableInstanceTicker\n        )?.value ?: DefaultConfig.config.isEnableInstanceTicker,\n        isDriveUsingGridView = map.getValue<PrefType.BoolPref>(\n            Keys.IsDriveUsingGridView\n        )?.value ?: DefaultConfig.config.isDriveUsingGridView,\n        isEnableNotificationSound = map.getValue<PrefType.BoolPref>(\n            Keys.IsEnableNotificationSound\n        )?.value ?: DefaultConfig.config.isEnableNotificationSound,\n        isStopStreamingApiWhenBackground = map.getValue<PrefType.BoolPref>(\n            Keys.IsStopStreamingApiWhenBackground\n        )?.value ?: DefaultConfig.config.isStopStreamingApiWhenBackground,\n        isStopNoteCaptureWhenBackground = map.getValue<PrefType.BoolPref>(\n            Keys.IsStopNoteCaptureWhenBackground\n        )?.value ?: DefaultConfig.config.isStopNoteCaptureWhenBackground,\n        isEnableStreamingAPIAndNoteCapture = map.getValue<PrefType.BoolPref>(\n            Keys.IsEnableStreamingAPIAndNoteCapture\n        )?.value ?: DefaultConfig.config.isEnableStreamingAPIAndNoteCapture,\n        isEnableNoteDivider = map.getValue<PrefType.BoolPref>(\n            Keys.IsEnableNoteDivider\n        )?.value ?: DefaultConfig.config.isEnableNoteDivider,\n        isVisibleInstanceUrlInToolbar = map.getValue<PrefType.BoolPref>(\n            Keys.IsVisibleInstanceUrlInToolbar\n        )?.value ?: DefaultConfig.config.isVisibleInstanceUrlInToolbar,\n\n        noteHeaderFontSize = map.getValue<PrefType.FloatPref>(\n            Keys.NoteHeaderFontSize\n        )?.value ?: DefaultConfig.config.noteHeaderFontSize,\n        noteContentFontSize = map.getValue<PrefType.FloatPref>(\n            Keys.NoteContentFontSize\n        )?.value ?: DefaultConfig.config.noteContentFontSize,\n        isDisplayTimestampsAsAbsoluteDates = map.getValue<PrefType.BoolPref>(\n            Keys.IsDisplayTimestampsAsAbsoluteDates\n        )?.value ?: DefaultConfig.config.isDisplayTimestampsAsAbsoluteDates,\n        noteReactionCounterFontSize = map.getValue<PrefType.FloatPref>(\n            Keys.NoteReactionCounterFontSize\n        )?.value ?: DefaultConfig.config.noteReactionCounterFontSize,\n        noteCustomEmojiScaleSizeInText = map.getValue<PrefType.FloatPref>(\n            Keys.NoteCustomEmojiScaleSizeInText\n        )?.value ?: DefaultConfig.config.noteCustomEmojiScaleSizeInText,\n        emojiPickerEmojiDisplaySize = map.getValue<PrefType.IntPref>(\n            Keys.EmojiPickerEmojiDisplaySize\n        )?.value ?: DefaultConfig.config.emojiPickerEmojiDisplaySize,\n        avatarIconShapeType = map.getValue<PrefType.IntPref>(\n            Keys.AvatarIconShapeType\n        )?.value?.let { value ->\n            AvatarIconShapeType.values().find { it.value == value }\n        } ?: DefaultConfig.config.avatarIconShapeType,\n        mediaDisplayMode = map.getValue<PrefType.IntPref>(\n            Keys.MediaDisplayMode\n        )?.value?.let { value ->\n            MediaDisplayMode.values().find { it.value == value }\n        } ?: DefaultConfig.config.mediaDisplayMode,\n        isEnableSafeSearch = IsSafeSearchEnabled(\n            isEnabled = map.getValue<PrefType.BoolPref>(\n                Keys.IsSafeSearchEnabled\n            )?.value ?: DefaultConfig.config.isEnableSafeSearch.isEnabled,\n            isConfirmed = map.getValue<PrefType.BoolPref>(\n                Keys.IsConfirmedSafeSearchEnabled\n            )?.value ?: DefaultConfig.config.isEnableSafeSearch.isConfirmed\n        ),\n        isShowWarningDisplayingSensitiveMedia = map.getValue<PrefType.BoolPref>(\n            Keys.IsShowWarningDisplayingSensitiveMedia\n        )?.value ?: DefaultConfig.config.isShowWarningDisplayingSensitiveMedia,\n        isEnableHapticFeedbackOnNewPost = map.getValue<PrefType.BoolPref>(\n            Keys.IsEnableHapticFeedbackOnNewPost\n        )?.value ?: DefaultConfig.config.isEnableHapticFeedbackOnNewPost,\n    )\n}\n\nprivate fun <T : PrefType?> Map<Keys, PrefType?>.getValue(key: Keys): T? {\n    return this[key] as? T\n}\n\nfun Config.pref(key: Keys): PrefType {\n    return when (key) {\n        Keys.BackgroundImage -> {\n            PrefType.StrPref(backgroundImagePath)\n        }\n\n        Keys.ClassicUI -> {\n            PrefType.BoolPref(isClassicUI)\n        }\n\n        Keys.IsPostButtonToBottom -> {\n            PrefType.BoolPref(isPostButtonAtTheBottom)\n        }\n\n        Keys.IsSimpleEditorEnabled -> {\n            PrefType.BoolPref(isSimpleEditorEnabled)\n        }\n\n        Keys.IsUserNameDefault -> {\n            PrefType.BoolPref(isUserNameDefault)\n        }\n\n        Keys.NoteLimitHeight -> {\n            PrefType.IntPref(noteExpandedHeightSize)\n        }\n\n        Keys.ReactionPickerType -> {\n            PrefType.IntPref(\n                when (reactionPickerType) {\n                    ReactionPickerType.LIST -> 0\n                    ReactionPickerType.SIMPLE -> 1\n                }\n            )\n        }\n\n        Keys.ThemeType -> {\n            PrefType.IntPref(theme.toInt())\n        }\n\n        Keys.IsIncludeLocalRenotes -> {\n            PrefType.BoolPref(isIncludeLocalRenotes)\n        }\n\n        Keys.IsIncludeMyRenotes -> {\n            PrefType.BoolPref(isIncludeMyRenotes)\n        }\n\n        Keys.IsIncludeRenotedMyNotes -> {\n            PrefType.BoolPref(isIncludeRenotedMyNotes)\n        }\n\n        Keys.SurfaceColorOpacity -> {\n            PrefType.IntPref(surfaceColorOpacity)\n        }\n\n        Keys.IsEnableTimelineScrollAnimation -> {\n            PrefType.BoolPref(isEnableTimelineScrollAnimation)\n        }\n\n        Keys.IsCrashlyticsCollectionEnabled -> {\n            PrefType.BoolPref(isCrashlyticsCollectionEnabled.isEnable)\n        }\n\n        Keys.IsConfirmedCrashlyticsCollection -> {\n            PrefType.BoolPref(isCrashlyticsCollectionEnabled.isConfirmed)\n        }\n\n        Keys.IsAnalyticsCollectionEnabled -> {\n            PrefType.BoolPref(isAnalyticsCollectionEnabled.isEnabled)\n        }\n\n        Keys.IsConfirmedAnalyticsCollection -> {\n            PrefType.BoolPref(isAnalyticsCollectionEnabled.isConfirmed)\n        }\n\n        Keys.IsConfirmedPostNotification -> {\n            PrefType.BoolPref(isConfirmedPostNotification)\n        }\n\n        Keys.IsEnableInstanceTicker -> {\n            PrefType.BoolPref(isEnableInstanceTicker)\n        }\n\n        Keys.IsDriveUsingGridView -> {\n            PrefType.BoolPref(isDriveUsingGridView)\n        }\n\n        Keys.IsEnableNotificationSound -> {\n            PrefType.BoolPref(isEnableNotificationSound)\n        }\n\n        Keys.IsStopNoteCaptureWhenBackground -> {\n            PrefType.BoolPref(isStopNoteCaptureWhenBackground)\n        }\n\n        Keys.IsStopStreamingApiWhenBackground -> {\n            PrefType.BoolPref(isStopStreamingApiWhenBackground)\n        }\n\n        Keys.IsEnableStreamingAPIAndNoteCapture -> {\n            PrefType.BoolPref(isEnableStreamingAPIAndNoteCapture)\n        }\n\n        Keys.IsEnableNoteDivider -> {\n            PrefType.BoolPref(isEnableNoteDivider)\n        }\n\n        Keys.IsVisibleInstanceUrlInToolbar -> {\n            PrefType.BoolPref(isVisibleInstanceUrlInToolbar)\n        }\n\n        Keys.NoteContentFontSize -> {\n            PrefType.FloatPref(noteContentFontSize)\n        }\n\n        Keys.NoteHeaderFontSize -> {\n            PrefType.FloatPref(noteHeaderFontSize)\n        }\n\n        Keys.IsDisplayTimestampsAsAbsoluteDates -> {\n            PrefType.BoolPref(isDisplayTimestampsAsAbsoluteDates)\n        }\n\n        Keys.NoteReactionCounterFontSize -> {\n            PrefType.FloatPref(noteReactionCounterFontSize)\n        }\n\n        Keys.NoteCustomEmojiScaleSizeInText -> {\n            PrefType.FloatPref(noteCustomEmojiScaleSizeInText)\n        }\n\n        Keys.EmojiPickerEmojiDisplaySize -> {\n            PrefType.IntPref(emojiPickerEmojiDisplaySize)\n        }\n\n        Keys.AvatarIconShapeType -> {\n            PrefType.IntPref(avatarIconShapeType.value)\n        }\n\n        Keys.MediaDisplayMode -> {\n            PrefType.IntPref(mediaDisplayMode.value)\n        }\n        Keys.IsSafeSearchEnabled -> {\n            PrefType.BoolPref(isEnableSafeSearch.isEnabled)\n        }\n        Keys.IsConfirmedSafeSearchEnabled -> {\n            PrefType.BoolPref(isEnableSafeSearch.isConfirmed)\n        }\n        Keys.IsShowWarningDisplayingSensitiveMedia -> {\n            PrefType.BoolPref(isShowWarningDisplayingSensitiveMedia)\n        }\n        Keys.IsEnableHapticFeedbackOnNewPost -> {\n            PrefType.BoolPref(isEnableHapticFeedbackOnNewPost)\n        }\n    }\n}\n\nfun Config.prefs(): Map<Keys, PrefType> {\n    val map = mutableMapOf<Keys, PrefType>()\n    Keys.allKeys.forEach { key ->\n        pref(key).let {\n            map[key] = it\n        }\n    }\n    return map\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/settings/LocalConfigRepository.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.settings\n\nimport android.content.SharedPreferences\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener\nimport androidx.core.content.edit\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.note.CanLocalOnly\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.isLocalOnly\nimport net.pantasystem.milktea.model.setting.*\n\n\nclass LocalConfigRepositoryImpl(\n    private val sharedPreference: SharedPreferences\n) : LocalConfigRepository {\n\n    private val _configStateFlow = MutableStateFlow(DefaultConfig.config)\n    private var _config: Config? = null\n        set(value) {\n            field = value\n            if (value != null) {\n                _configStateFlow.value = value\n            }\n        }\n\n    override fun get(): Result<Config> {\n        when(val c = _config) {\n            null -> Unit\n            else -> return Result.success(c)\n        }\n        return runCancellableCatching {\n            Config.from(sharedPreference.getPrefTypes()).also {\n                _config = it\n            }\n        }\n    }\n\n    override suspend fun save(config: Config): Result<Unit> {\n        return runCancellableCatching {\n            val old = get().getOrThrow().prefs()\n            sharedPreference.edit {\n                config.prefs().filterNot {\n                    old[it.key] == it.value\n                }.map {\n                    when (val entry = it.value) {\n                        is PrefType.BoolPref -> putBoolean(it.key.str(), entry.value)\n                        is PrefType.IntPref -> putInt(it.key.str(), entry.value)\n                        is PrefType.StrPref -> putString(it.key.str(), entry.value)\n                        is PrefType.FloatPref -> putFloat(it.key.str(), entry.value)\n                    }\n                }\n            }\n            _config = config\n        }\n    }\n\n    override fun getRememberVisibility(accountId: Long): Result<RememberVisibility> {\n        return runCancellableCatching {\n            val isRemember = sharedPreference.getBoolean(\n                RememberVisibility.Keys.IsRememberNoteVisibility.str(),\n                true\n            )\n            if (isRemember) {\n                val localOnly = sharedPreference.getBoolean(\n                    RememberVisibility.Keys.IsLocalOnly(accountId).str(),\n                    DefaultConfig.getRememberVisibilityConfig(accountId).visibility.isLocalOnly()\n                )\n                val visibility = when (sharedPreference.getString(\n                    RememberVisibility.Keys.NoteVisibility(accountId).str(),\n                    \"public\"\n                )) {\n                    \"home\" -> Visibility.Home(localOnly)\n                    \"followers\" -> Visibility.Followers(localOnly)\n                    \"specified\" -> Visibility.Specified(emptyList())\n                    \"mutual\" -> Visibility.Mutual\n                    \"personal\" -> Visibility.Personal\n                    else -> Visibility.Public(localOnly)\n                }\n                RememberVisibility.Remember(\n                    accountId = accountId,\n                    visibility = visibility,\n                )\n            } else {\n                RememberVisibility.None\n            }\n        }\n    }\n\n    override suspend fun save(remember: RememberVisibility): Result<Unit> {\n        return runCancellableCatching {\n            when (remember) {\n                is RememberVisibility.Remember -> {\n                    val localOnly = (remember.visibility as? CanLocalOnly)?.isLocalOnly ?: false\n                    val str = when (remember.visibility) {\n                        is Visibility.Public -> \"public\"\n                        is Visibility.Home -> \"home\"\n                        is Visibility.Followers -> \"followers\"\n                        is Visibility.Specified -> \"specified\"\n                        is Visibility.Limited -> \"limited\"\n                        Visibility.Mutual -> \"mutual\"\n                        Visibility.Personal -> \"personal\"\n                    }\n                    sharedPreference.edit {\n                        putString(\n                            RememberVisibility.Keys.NoteVisibility(remember.accountId).str(),\n                            str\n                        )\n                        putBoolean(\n                            RememberVisibility.Keys.IsLocalOnly(remember.accountId).str(),\n                            localOnly\n                        )\n                        putBoolean(RememberVisibility.Keys.IsRememberNoteVisibility.str(), true)\n                    }\n                }\n                is RememberVisibility.None -> {\n                    sharedPreference.edit {\n                        putBoolean(RememberVisibility.Keys.IsRememberNoteVisibility.str(), false)\n                    }\n                }\n            }\n        }\n    }\n\n    override fun observe(): Flow<Config> {\n        when(_config) {\n            null -> _config = get().getOrNull()\n        }\n        return _configStateFlow\n    }\n\n    override fun observeRememberVisibility(accountId: Long): Flow<RememberVisibility> {\n        return sharedPreference.asFlow(\"\").map {\n            getRememberVisibility(accountId).getOrThrow()\n        }.distinctUntilChanged()\n    }\n\n}\n\n@Suppress(\"ObjectLiteralToLambda\")\nprivate fun SharedPreferences.asFlow(initialEvent: String? = null): Flow<String> {\n    return channelFlow {\n        // NOTE: SharedPreferenceは初期イベントを流してくれないので初期イベントを流したい場合困るので流している\n        if (initialEvent != null) {\n            trySend(initialEvent)\n        }\n        // NOTE: ラムダだとWeakReferenceが解放してしまうようなのでインスタンスにする必要がある。\n        val listener: OnSharedPreferenceChangeListener =\n            object : OnSharedPreferenceChangeListener {\n                override fun onSharedPreferenceChanged(\n                    sharedPreferences: SharedPreferences?,\n                    key: String?\n                ) {\n                    if (key != null) {\n                        trySend(key)\n                    }\n                }\n            }\n\n        registerOnSharedPreferenceChangeListener(listener)\n        awaitClose {\n            unregisterOnSharedPreferenceChangeListener(listener)\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/settings/Theme.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.settings\n\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.Theme\n\nfun Theme.toInt(): Int {\n    return when (this) {\n        is Theme.White -> 0\n        is Theme.Black -> 1\n        is Theme.Dark -> 2\n        is Theme.Bread -> 3\n        Theme.ElephantDark -> 4\n    }\n}\n\nfun Theme.Companion.from(n: Int): Theme {\n    return when (n) {\n        0 -> Theme.White\n        1 -> Theme.Black\n        2 -> Theme.Dark\n        3 -> Theme.Bread\n        4 -> Theme.ElephantDark\n        else -> DefaultConfig.config.theme\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/streaming/MediatorMainEventDispatcher.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.streaming\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.api_streaming.channel.ChannelAPI\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.messaging.MessageDataSource\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotificationDAO\nimport net.pantasystem.milktea.data.infrastructure.notification.impl.NotificationCacheAdder\nimport net.pantasystem.milktea.data.streaming.ChannelAPIWithAccountProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\nclass MediatorMainEventDispatcher(val logger: Logger) {\n\n    @Singleton\n    class Factory @Inject constructor(\n        val loggerFactory: Logger.Factory,\n        val messageDataSource: MessageDataSource,\n        val unreadNotificationDAO: UnreadNotificationDAO,\n        val userDataSource: UserDataSource,\n        val streamingMainMessageEventDispatcher: StreamingMainMessageEventDispatcher,\n        val notificationCacheAdder: NotificationCacheAdder,\n        val userDTOEntityConverter: UserDTOEntityConverter,\n    ) {\n\n        fun create(): MediatorMainEventDispatcher {\n            return MediatorMainEventDispatcher(loggerFactory.create(\"MediatorMainEventDispatcher\"))\n                .attach(\n                    streamingMainMessageEventDispatcher\n                )\n                .attach(\n                    StreamingMainNotificationEventDispatcher(\n                        unreadNotificationDAO,\n                        notificationCacheAdder,\n                    )\n                )\n                .attach(StreamingMainUserEventDispatcher(userDataSource, userDTOEntityConverter))\n        }\n    }\n\n    private var dispatchers = mutableSetOf<StreamingMainEventDispatcher>()\n\n    fun attach(dispatcher: StreamingMainEventDispatcher): MediatorMainEventDispatcher {\n        synchronized(dispatchers) {\n            dispatchers = dispatchers.toMutableSet().also {\n                it.add(dispatcher)\n            }\n        }\n        return this\n    }\n\n\n    suspend fun dispatch(account: Account, mainEvent: ChannelBody.Main) {\n        val iterator = dispatchers.iterator()\n        while (iterator.hasNext()) {\n            val result = runCancellableCatching {\n                iterator.next().dispatch(account, mainEvent)\n            }.getOrElse {\n                false\n            }\n            if (result) {\n                return\n            }\n        }\n    }\n\n\n}\n\nclass ChannelAPIMainEventDispatcherAdapter @Inject constructor(\n    private val channelAPIProvider: ChannelAPIWithAccountProvider,\n    private val accountStore: AccountStore,\n    loggerFactory: Logger.Factory\n) {\n    val logger = loggerFactory.create(\"MainEventDispatcher\")\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    suspend operator fun invoke(mainDispatcher: MediatorMainEventDispatcher) {\n        accountStore.state.map { it.currentAccount }.filterNotNull().filter {\n            it.instanceType == Account.InstanceType.MISSKEY || it.instanceType == Account.InstanceType.FIREFISH\n        }.flatMapLatest { ac ->\n            requireNotNull(channelAPIProvider.get(ac)).connect(ChannelAPI.Type.Main).map { body ->\n                ac to body\n            }\n        }.mapNotNull {\n            (it.second as? ChannelBody.Main)?.let { main ->\n                it.first to main\n            }\n        }.catch { e ->\n            logger.error(\"Dispatch時にエラー発生\", e = e)\n        }.collect {\n            mainDispatcher.dispatch(it.first, it.second)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/streaming/StreamingMainEventDispatcher.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.streaming\n\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.model.account.Account\n\n\ninterface StreamingMainEventDispatcher {\n\n    suspend fun dispatch(account: Account, mainEvent: ChannelBody.Main): Boolean\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/streaming/StreamingMainMessageEventDispatcher.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.streaming\n\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.data.infrastructure.messaging.MessageAdder\nimport net.pantasystem.milktea.data.infrastructure.messaging.MessageDataSource\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\n@Singleton\nclass StreamingMainMessageEventDispatcher @Inject constructor(\n    private val messageDataSource: MessageDataSource,\n    private val messageAdder: MessageAdder,\n) : StreamingMainEventDispatcher{\n\n    override suspend fun dispatch(account: Account, mainEvent: ChannelBody.Main): Boolean {\n        if(mainEvent is ChannelBody.Main.ReadAllMessagingMessages) {\n            messageDataSource.readAllMessages(account.accountId)\n        }\n        return (mainEvent as? ChannelBody.Main.HavingMessagingBody)?.let{\n            messageAdder.add(account, it.body)\n        } != null\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/streaming/StreamingMainNotificationEventDispatcher.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.streaming\n\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.data.infrastructure.notification.db.UnreadNotificationDAO\nimport net.pantasystem.milktea.data.infrastructure.notification.impl.NotificationCacheAdder\nimport net.pantasystem.milktea.model.account.Account\n\n\nclass StreamingMainNotificationEventDispatcher(\n    private val unreadNotificationDAO: UnreadNotificationDAO,\n    private val notificationCacheAdder: NotificationCacheAdder,\n) : StreamingMainEventDispatcher{\n\n    override suspend fun dispatch(account: Account, mainEvent: ChannelBody.Main): Boolean {\n        return (mainEvent as? ChannelBody.Main.Notification)?.let {\n            notificationCacheAdder.addAndConvert(account, it.body)\n        } != null || (mainEvent as? ChannelBody.Main.ReadAllNotifications)?.let {\n            unreadNotificationDAO.deleteWhereAccountId(account.accountId)\n        } != null\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/streaming/StreamingMainUserEventDispatcher.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.streaming\n\nimport net.pantasystem.milktea.api_streaming.ChannelBody\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.UserDataSource\n\n/**\n * StreamingAPIのMainイベントを各種DataSourceに適応します。\n */\nclass StreamingMainUserEventDispatcher(\n    private val userDataSource: UserDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n) : StreamingMainEventDispatcher{\n\n    override suspend fun dispatch(account: Account, mainEvent: ChannelBody.Main): Boolean {\n        return (mainEvent as? ChannelBody.Main.HavingUserBody)?.let {\n            userDataSource.add(userDTOEntityConverter.convert(account, mainEvent.body, true))\n        } != null\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/streaming/socket_state.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.streaming\n\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.channelFlow\nimport net.pantasystem.milktea.api_streaming.Socket\n\n\nfun Socket.stateEvent() : Flow<Socket.State>{\n    return channelFlow {\n        val listener: (Socket.State)->Unit = { state: Socket.State ->\n            trySend(state)\n        }\n        addStateEventListener(listener)\n        awaitClose {\n            removeStateEventListener(listener)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/sw/register/DeviceTokenRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.sw.register\n\nimport android.content.Context\nimport android.content.SharedPreferences\nimport androidx.core.content.edit\nimport com.google.android.gms.common.ConnectionResult\nimport com.google.android.gms.common.GoogleApiAvailability\nimport com.google.firebase.messaging.FirebaseMessaging\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.sw.register.DeviceTokenRepository\nimport javax.inject.Inject\nimport kotlin.time.Duration.Companion.days\n\nclass DeviceTokenRepositoryImpl @Inject constructor(\n    private val sharedPreferences: SharedPreferences,\n    private val context: Context,\n) : DeviceTokenRepository {\n\n    companion object {\n        const val TOKEN =\n            \"net.pantasystem.milktea.data.infrastructure.sw.register.DeviceTokenRepositoryImpl.TOKEN\"\n        const val GET_START_AT =\n            \"net.pantasystem.milktea.data.infrastructure.sw.register.DeviceTokenRepositoryImpl.GET_START_AT\"\n        const val FAILURE_COUNT = \"net.pantasystem.milktea.data.infrastructure.sw.register.DeviceTokenRepositoryImpl.FAILURE_COUNT\"\n    }\n\n    val lock = Mutex()\n\n    override fun clear(): Result<Unit> = runCancellableCatching{\n        sharedPreferences.edit {\n            putString(TOKEN, null)\n            putString(GET_START_AT, null)\n            putInt(FAILURE_COUNT, 0)\n        }\n    }\n\n    override suspend fun get(): Result<String?> = runCancellableCatching{\n        lock.withLock {\n            sharedPreferences.getString(TOKEN, null)\n        }\n    }\n\n    override suspend fun getOrCreate(): Result<String> = runCancellableCatching {\n        lock.withLock {\n            var token = sharedPreferences.getString(TOKEN, null)\n\n            // NOTE: 既にTokenが入っている場合はそれを返す\n            if (!token.isNullOrBlank()) {\n                return@runCancellableCatching token\n            }\n\n            val now = Clock.System.now()\n\n            // NOTE: 前回Tokenの取得を実施した日時を取得する\n            // NOTE: 成功時に必ずToken取得日の記録を削除するようにしているので、取得日が残っているということは、前回取得に失敗していると言える\n            val beforeGetStartAt = sharedPreferences.getString(GET_START_AT, null)?.let {\n                try {\n                    Instant.parse(it)\n                } catch (e: IllegalArgumentException) {\n                    null\n                }\n            }\n\n            // NOTE: 初期値は0なので+1しないと2回目失敗時のdelayが0時間になってしまう\n            val failureCount = sharedPreferences.getInt(FAILURE_COUNT, 0) + 1\n\n            // NOTE: 前回のTokenの取得に失敗していて、まだ失敗回数 * 24時間経過していない場合はエラー扱いにする\n            if (beforeGetStartAt != null) {\n                val diff = now - beforeGetStartAt\n                if (diff < failureCount.days) {\n                    throw IllegalArgumentException(\"Tokenの取得は24時間以内に失敗している可能性があります。前回失敗した場合は24時間以上時間を空けて取得する必要性があります。\")\n                }\n            }\n            sharedPreferences.edit {\n                putString(GET_START_AT, now.toString())\n\n                // NOTE: failureCountは既に+1しているのでここでインクリメントする必要性はない\n                putInt(FAILURE_COUNT, failureCount)\n            }\n\n            when (val state =\n                GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)) {\n                ConnectionResult.SUCCESS -> {\n                    token = FirebaseMessaging.getInstance().token.asSuspend()\n                    save(token)\n                }\n                else -> {\n                    throw IllegalStateException(\"Google Play Serviceが有効ではないあるいは接続に失敗しためキャンセルしました。state:${state}\")\n                }\n            }\n            token\n        }\n\n    }\n\n    override fun save(deviceToken: String): Result<Unit> = runCancellableCatching {\n        sharedPreferences.edit {\n            putString(TOKEN, deviceToken)\n            putString(GET_START_AT, null)\n            putInt(FAILURE_COUNT, 0)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/sw/register/EndpointBuilder.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.sw.register\n\nimport net.pantasystem.milktea.model.account.Account\n\n\ndata class EndpointBuilder(\n    var deviceToken: String,\n    var accountId: Long,\n    var lang: String,\n    val endpointBase: String,\n    val auth: String,\n    val publicKey: String,\n    val instanceType: Account.InstanceType,\n) {\n\n    fun build(): String {\n        return when(instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                \"$endpointBase/webpushcallback?deviceToken=${deviceToken}&accountId=${accountId}&lang=${lang}\"\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                \"$endpointBase/webpushcallback-4-mastodon?deviceToken=${deviceToken}&accountId=${accountId}&lang=${lang}\"\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/sw/register/SubscriptionRegistrationImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.sw.register\n\nimport android.content.Context\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.api.mastodon.subscription.SubscribePushNotification\nimport net.pantasystem.milktea.api.mastodon.subscription.WebPushSubscriptionAlerts\nimport net.pantasystem.milktea.api.misskey.register.Subscription\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.sw.register.DeviceTokenRepository\nimport net.pantasystem.milktea.model.sw.register.SubscriptionRegistration\nimport net.pantasystem.milktea.model.sw.register.SubscriptionState\n\nclass SubscriptionRegistrationImpl(\n    val accountRepository: AccountRepository,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val lang: String,\n    loggerFactory: Logger.Factory,\n    val auth: String,\n    val publicKey: String,\n    val endpointBase: String,\n    val context: Context,\n    val deviceTokenRepository: DeviceTokenRepository,\n    val mastodonAPIProvider: MastodonAPIProvider,\n) : SubscriptionRegistration {\n    val logger = loggerFactory.create(\"sw/register\")\n\n    /**\n     * 特定のアカウントをsw/registerに登録します。\n     */\n    override suspend fun register(accountId: Long): Result<Unit> = runCancellableCatching {\n        val token = deviceTokenRepository.get().getOrThrow() ?: return@runCancellableCatching\n        logger.debug { \"call register(accountId:$accountId)\" }\n        logger.debug { \"auth:$auth, publicKey:$publicKey\" }\n        val account = accountRepository.get(accountId).getOrThrow()\n        val endpoint = EndpointBuilder(\n            deviceToken = token,\n            accountId = accountId,\n            lang = lang,\n            auth = auth,\n            endpointBase = endpointBase,\n            publicKey = publicKey,\n            instanceType = account.instanceType\n        ).build()\n        logger.debug { \"endpoint:${endpoint}\" }\n\n        when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val api = misskeyAPIProvider.get(account.normalizedInstanceUri)\n                val res = api.swRegister(\n                    Subscription(\n                        i = account.token,\n                        endpoint = endpoint,\n                        auth = auth,\n                        publicKey = publicKey\n                    )\n                )\n                res.throwIfHasError()\n                logger.debug(\"res code:${res.code()}, body:${res.body()}\")\n                res.body()?.let {\n                    SubscriptionState(\n                        state = it.state,\n                        key = it.key\n                    )\n                }\n            }\n\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                mastodonAPIProvider.get(account).subscribePushNotification(\n                    SubscribePushNotification(\n                        SubscribePushNotification.Subscription(\n                            endpoint = endpoint,\n                            keys = SubscribePushNotification.Subscription.Keys(\n                                auth = auth,\n                                p256dh = publicKey\n                            ),\n\n                            ),\n                        data = SubscribePushNotification.Data(\n                            alerts = WebPushSubscriptionAlerts(\n                                mention = true,\n                                status = true,\n                                reblog = true,\n                                follow = true,\n                                followRequest = true,\n                                favourite = false,\n                                poll = true,\n                                update = false,\n                            )\n                        )\n                    )\n                ).throwIfHasError().body()\n            }\n        }\n\n\n    }\n\n    /**\n     * 全てのアカウントをsw/registerに登録します。\n     * @return 成功件数\n     */\n    override suspend fun registerAll(): Int {\n        val accounts = accountRepository.findAll().getOrThrow()\n        return coroutineScope {\n            accounts.map {\n                async {\n                    register(it.accountId).onFailure {\n                        logger.error(\"sw/registerに失敗しました\", it)\n                    }.onSuccess {\n                        logger.debug { \"subscription success}\" }\n                    }.fold(\n                        onSuccess = {\n                            1\n                        },\n                        onFailure = {\n                            0\n                        }\n                    )\n                }\n            }.awaitAll().sumOf { it }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/sw/register/SubscriptionUnRegistration.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.sw.register\n\nimport android.content.Context\nimport com.google.android.gms.common.ConnectionResult\nimport com.google.android.gms.common.GoogleApiAvailability\nimport com.google.android.gms.tasks.Task\nimport com.google.firebase.messaging.FirebaseMessaging\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.register.UnSubscription\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.sw.register.SubscriptionUnRegistration\nimport javax.inject.Inject\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\nclass SubscriptionUnRegistrationImpl @Inject constructor(\n    val accountRepository: AccountRepository,\n    val lang: String,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    private val publicKey: String,\n    private val auth: String,\n    private val endpointBase: String,\n    private val context: Context,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n) : SubscriptionUnRegistration {\n\n\n    override suspend fun unregister(accountId: Long) {\n        withContext(Dispatchers.IO) {\n            when(GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)) {\n                ConnectionResult.SUCCESS -> {\n                    val account = accountRepository.get(accountId).getOrThrow()\n                    when(account.instanceType) {\n                        Account.InstanceType.MISSKEY,Account.InstanceType.FIREFISH -> {\n                            val token = FirebaseMessaging.getInstance().token.asSuspend()\n                            val apiProvider = misskeyAPIProvider.get(account)\n                            val endpoint = EndpointBuilder(\n                                accountId = account.accountId,\n                                deviceToken = token,\n                                lang = lang,\n                                publicKey = publicKey,\n                                endpointBase = endpointBase,\n                                auth = auth,\n                                instanceType = account.instanceType\n                            ).build()\n                            try {\n                                apiProvider.swUnRegister(\n                                    UnSubscription(\n                                        i = account.token,\n                                        endpoint = endpoint\n                                    )\n                                ).throwIfHasError()\n                            } catch (e: APIError.ForbiddenException) {\n                                return@withContext\n                            }\n                            catch (e: APIError.AuthenticationException) {\n                                return@withContext\n                            } catch (e: APIError.SomethingException) {\n                                if (e.statusCode == 410) {\n                                    return@withContext\n                                }\n                                throw e\n                            }\n                        }\n                        Account.InstanceType.MASTODON,Account.InstanceType.PLEROMA -> {\n                            try {\n                                mastodonAPIProvider.get(account).unSubscribePushNotification()\n                                    .throwIfHasError()\n                            } catch (e: APIError.ForbiddenException) {\n                                return@withContext\n                            }\n                            catch (e: APIError.AuthenticationException) {\n                                return@withContext\n                            } catch (e: APIError.SomethingException) {\n                                if (e.statusCode == 410) {\n                                    return@withContext\n                                }\n                                throw e\n                            }\n                        }\n                    }\n\n\n                }\n                else -> {\n\n                }\n            }\n        }\n    }\n}\n\nsuspend fun<T> Task<T>.asSuspend() = suspendCoroutine<T> { continuation ->\n    addOnSuccessListener {\n        continuation.resume(it)\n    }\n    addOnFailureListener {\n        throw it\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/url/MisskeyUrlPreviewStore.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.url\n\nimport android.util.Log\nimport net.pantasystem.milktea.model.url.UrlPreview\nimport net.pantasystem.milktea.model.url.UrlPreviewStore\nimport java.lang.Exception\n\nclass MisskeyUrlPreviewStore(\n    private val retrofitMisskeyUrlPreview: RetrofitMisskeyUrlPreview\n) : UrlPreviewStore {\n\n    override fun get(url: String): UrlPreview? {\n        return try {\n            return retrofitMisskeyUrlPreview.getUrl(url).execute().body()\n        } catch (e: Exception){\n            Log.d(\"MisskeyUrlPreviewStore\", \"get url preview error\", e)\n            null\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/url/RetrofitMisskeyUrlPreview.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.url\n\nimport net.pantasystem.milktea.model.url.UrlPreview\nimport retrofit2.Call\nimport retrofit2.http.GET\nimport retrofit2.http.Query\n\ninterface RetrofitMisskeyUrlPreview {\n\n    //https://misskey.io/url?url=https%3A%2F%2Ftwitter.com%2F_namori_%2Fstatus%2F1270603288040230913%2Fphoto%2F1&lang=ja-JP\n    @GET(\"/url\")\n    fun getUrl(@Query(\"url\") url: String): Call<UrlPreview>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/url/UrlPreviewMediatorStore.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.url\n\nimport android.database.sqlite.SQLiteConstraintException\nimport android.util.Log\nimport net.pantasystem.milktea.data.infrastructure.url.db.UrlPreviewDAO\nimport net.pantasystem.milktea.model.url.UrlPreview\nimport net.pantasystem.milktea.data.infrastructure.url.db.UrlPreviewRecord\nimport net.pantasystem.milktea.model.url.UrlPreviewStore\n\nclass UrlPreviewMediatorStore(\n    private val urlPreviewDAO: UrlPreviewDAO,\n    private val remoteStore: UrlPreviewStore\n) : UrlPreviewStore {\n\n\n    override fun get(url: String): UrlPreview? {\n        var preview = urlPreviewDAO.findByUrl(url)?.toModel()\n        if(preview == null){\n            preview = remoteStore.get(url)?.apply{\n                try{\n                    urlPreviewDAO.insert(UrlPreviewRecord.from(this))\n                }catch(e: SQLiteConstraintException){\n                    Log.w(\"UrlPreviewMediatorStore\", \"不正なデータ\", e)\n                }\n            }\n        }\n        return preview\n\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/url/UrlPreviewStoreFactory.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.url\n\n\nimport com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory\nimport kotlinx.serialization.ExperimentalSerializationApi\nimport net.pantasystem.milktea.api.misskey.MisskeyAPIServiceBuilder\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.data.infrastructure.url.db.UrlPreviewDAO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.url.UrlPreviewStore\nimport okhttp3.MediaType.Companion.toMediaType\nimport retrofit2.Retrofit\n\nclass UrlPreviewStoreFactory(\n    private val urlPreviewDAO: UrlPreviewDAO,\n    private var summalyUrl: String? = null,\n    var account: Account? = null,\n    private val misskeyAPIServiceBuilder: MisskeyAPIServiceBuilder,\n    private val okHttpClient: OkHttpClientProvider,\n) {\n\n\n    fun create(): UrlPreviewStore {\n        val url = account?.normalizedInstanceUri\n            ?: summalyUrl\n        return UrlPreviewMediatorStore(urlPreviewDAO, createUrlPreviewStore(url))\n    }\n\n    @OptIn(ExperimentalSerializationApi::class)\n    private fun createUrlPreviewStore(url: String?): UrlPreviewStore {\n        return MisskeyUrlPreviewStore(\n            Retrofit.Builder()\n                .baseUrl(url!!)\n                .addConverterFactory(misskeyAPIServiceBuilder.json.asConverterFactory(\"application/json\".toMediaType()))\n                .client(okHttpClient.get())\n                .build()\n                .create(RetrofitMisskeyUrlPreview::class.java)\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/url/UrlPreviewStoreProvider.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.url\n\nimport net.pantasystem.milktea.api.misskey.MisskeyAPIServiceBuilder\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.data.infrastructure.url.db.UrlPreviewDAO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.url.UrlPreviewStore\nimport net.pantasystem.milktea.model.url.UrlPreviewStoreProvider\nimport java.util.concurrent.ConcurrentHashMap\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UrlPreviewStoreProviderImpl @Inject constructor(\n    val settingStore: SettingStore,\n    val urlPreviewDAO: UrlPreviewDAO,\n    val accountStore: AccountStore,\n    private val misskeyAPIServiceBuilder: MisskeyAPIServiceBuilder,\n    private val okHttpClientProvider: OkHttpClientProvider,\n    ) : UrlPreviewStoreProvider{\n\n    private val mUrlPreviewStoreInstanceBaseUrlMap = ConcurrentHashMap<String, UrlPreviewStore>()\n\n    override fun getUrlPreviewStore(account: Account): UrlPreviewStore {\n        return getUrlPreviewStore(account, false)\n    }\n\n    override fun getUrlPreviewStore(\n        account: Account,\n        isReplace: Boolean\n    ): UrlPreviewStore {\n        return account.normalizedInstanceUri.let { accountUrl ->\n\n            var store = mUrlPreviewStoreInstanceBaseUrlMap[accountUrl]\n            if (store == null || isReplace) {\n                store = UrlPreviewStoreFactory(\n                    urlPreviewDAO,\n                    accountUrl,\n                    accountStore.state.value.currentAccount,\n                    misskeyAPIServiceBuilder,\n                    okHttpClientProvider,\n                ).create()\n            }\n            mUrlPreviewStoreInstanceBaseUrlMap[accountUrl] = store\n            store\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/url/db/UrlPreviewDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.url.db\n\nimport androidx.room.Dao\nimport androidx.room.Insert\nimport androidx.room.OnConflictStrategy\nimport androidx.room.Query\n\n@Dao\ninterface UrlPreviewDAO {\n    @Query(\"select * from url_preview where url = :url and createdAt > datetime('now', '-7 day')\")\n    fun findByUrl(url: String): UrlPreviewRecord?\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    fun insert(urlPreview: UrlPreviewRecord)\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/url/db/UrlPreviewRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.url.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.PrimaryKey\nimport net.pantasystem.milktea.model.url.UrlPreview\nimport java.util.Date\n\n@Entity(tableName = \"url_preview\")\ndata class UrlPreviewRecord(\n    @PrimaryKey(autoGenerate = false)\n    @ColumnInfo(name = \"url\")\n    val url: String,\n\n    @ColumnInfo(name = \"title\")\n    val title: String,\n\n    @ColumnInfo(name = \"icon\")\n    val icon: String?,\n\n    @ColumnInfo(name = \"description\")\n    val description: String?,\n\n    @ColumnInfo(name = \"thumbnail\")\n    val thumbnail: String?,\n\n    @ColumnInfo(name = \"siteName\")\n    val siteName: String?, //val sensitive: Boolean\n\n    @ColumnInfo(name = \"createdAt\")\n    val createdAt: Date? = null,\n) {\n    companion object {\n        fun from(model: UrlPreview): UrlPreviewRecord {\n            return UrlPreviewRecord(\n                url = model.url,\n                title = model.title,\n                icon = model.icon,\n                description = model.description,\n                thumbnail = model.thumbnail,\n                siteName = model.siteName,\n\n            )\n        }\n    }\n\n    fun toModel(): UrlPreview {\n        return UrlPreview(\n            url = url,\n            title = title,\n            icon = icon,\n            description = description,\n            thumbnail = thumbnail,\n            siteName = siteName\n        )\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/FollowFollowerPagingModel.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountRelationshipDTO\nimport net.pantasystem.milktea.api.misskey.users.RequestUser\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.v10.RequestFollowFollower\nimport net.pantasystem.milktea.app_store.user.FollowFollowerPagingStore\nimport net.pantasystem.milktea.app_store.user.RequestType\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.common.paginator.*\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.data.infrastructure.toUserRelated\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\n\n\nclass FollowFollowerPagingStoreImpl(\n    override val type: RequestType,\n    val userDataSource: UserDataSource,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val getAccount: GetAccount,\n    val loggerFactory: Logger.Factory,\n    val noteDataSourceAdder: NoteDataSourceAdder,\n    val userDTOEntityConverter: UserDTOEntityConverter,\n    val nodeInfoRepository: NodeInfoRepository,\n    val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n) : FollowFollowerPagingStore {\n\n    class Factory @Inject constructor(\n        val userDataSource: UserDataSource,\n        val misskeyAPIProvider: MisskeyAPIProvider,\n        val mastodonAPIProvider: MastodonAPIProvider,\n        val loggerFactory: Logger.Factory,\n        val getAccount: GetAccount,\n        val noteDataSourceAdder: NoteDataSourceAdder,\n        val userDTOEntityConverter: UserDTOEntityConverter,\n        val nodeInfoRepository: NodeInfoRepository,\n        private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n    ) : FollowFollowerPagingStore.Factory {\n        override fun create(type: RequestType): FollowFollowerPagingStore {\n            return FollowFollowerPagingStoreImpl(\n                type,\n                misskeyAPIProvider = misskeyAPIProvider,\n                loggerFactory = loggerFactory,\n                getAccount = getAccount,\n                userDataSource = userDataSource,\n                noteDataSourceAdder = noteDataSourceAdder,\n                mastodonAPIProvider = mastodonAPIProvider,\n                userDTOEntityConverter = userDTOEntityConverter,\n                nodeInfoRepository = nodeInfoRepository,\n                mastodonAccountDTOEntityConverter = mastodonAccountDTOEntityConverter,\n            )\n        }\n    }\n\n    private val loader = FollowFollowerPagingModelImpl(\n        requestType = type,\n        getAccount = getAccount,\n        userDataSource = userDataSource,\n        misskeyAPIProvider = misskeyAPIProvider,\n        mastodonAPIProvider = mastodonAPIProvider,\n        userDTOEntityConverter = userDTOEntityConverter,\n        nodeInfoRepository = nodeInfoRepository,\n        mastodonAccountDTOEntityConverter = mastodonAccountDTOEntityConverter,\n    )\n\n    private val previousPagingController = PreviousPagingController.create(\n        loader,\n    )\n\n\n    override val state: Flow<PageableState<List<User.Id>>>\n        get() = loader.state.map { state ->\n            state.convert { list ->\n                list.map {\n                    it.userId\n                }\n            }\n        }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override val users: Flow<List<User.Detail>>\n        get() = state.map {\n            it.content\n        }.filter {\n            it is StateContent.Exist\n        }.flatMapLatest { stateContent ->\n            val ids = (stateContent as StateContent.Exist).rawContent\n            val accountId = type.userId.accountId\n            userDataSource.observeIn(accountId, ids.map { it.id }).map { list ->\n                list.mapNotNull { user ->\n                    user as User.Detail?\n                }\n            }.map {\n                val userMap = it.associateBy { it.id }\n                ids.mapNotNull { userId ->\n                    userMap[userId]\n                }\n            }\n        }.catch {\n            loggerFactory.create(\"FollowFollowerPagingModel\").error(\"error\", it)\n        }\n\n\n    override suspend fun loadPrevious() {\n        previousPagingController.loadPrevious().onFailure {\n            loggerFactory.create(\"FollowFollowerPagingModel\").error(\"フォロー・フォロワーの読み込みに失敗\", it)\n        }\n    }\n\n    override suspend fun clear() {\n        loader.mutex.withLock {\n            loader.setState(PageableState.Loading.Init())\n        }\n    }\n}\n\n\nclass FollowFollowerPagingModelImpl(\n    val requestType: RequestType,\n    val getAccount: GetAccount,\n    val userDataSource: UserDataSource,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val userDTOEntityConverter: UserDTOEntityConverter,\n    val nodeInfoRepository: NodeInfoRepository,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n) : StateLocker,\n    PreviousLoader<FollowFollowerResponseItemType>,\n    EntityConverter<FollowFollowerResponseItemType, UserIdAndNextId>,\n    PaginationState<UserIdAndNextId>,\n    IdGetter<String> {\n    override val mutex: Mutex = Mutex()\n\n    private val _state =\n        MutableStateFlow<PageableState<List<UserIdAndNextId>>>(PageableState.Loading.Init())\n    override val state: Flow<PageableState<List<UserIdAndNextId>>> = _state\n    override suspend fun convertAll(list: List<FollowFollowerResponseItemType>): List<UserIdAndNextId> {\n        val account = getAccount.get(requestType.userId.accountId)\n        val users = list.map {\n            when (it) {\n                is FollowFollowerResponseItemType.Default -> {\n                    userDTOEntityConverter.convert(account, it.userDTO, true)\n                }\n                is FollowFollowerResponseItemType.Mastodon -> {\n                    mastodonAccountDTOEntityConverter.convert(account, it.userDTO,  it.relationship?.toUserRelated())\n                }\n                is FollowFollowerResponseItemType.V10 -> {\n                    userDTOEntityConverter.convert(account, it.userDTO, true)\n                }\n            }\n        }\n        userDataSource.addAll(users).getOrThrow()\n        return list.map {\n            it.toUserIdAndNextId(account.accountId)\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<List<FollowFollowerResponseItemType>> =\n        runCancellableCatching {\n            val account = getAccount.get(requestType.userId.accountId)\n            when (account.instanceType) {\n                Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                    val nodeInfo = nodeInfoRepository.find(account.getHost()).getOrThrow()\n                    when (nodeInfo.type) {\n                        is NodeInfo.SoftwareType.Misskey.Meisskey -> {\n                            V10Loader(\n                                requestType,\n                                account,\n                                misskeyAPIProvider,\n                                this@FollowFollowerPagingModelImpl,\n                                this@FollowFollowerPagingModelImpl\n                            )\n                        }\n                         else -> {\n                             DefaultLoader(\n                                 requestType,\n                                 account,\n                                 misskeyAPIProvider,\n                                 this@FollowFollowerPagingModelImpl\n                             )\n                         }\n                    }\n                }\n                Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                    MastodonLoader(\n                        requestType,\n                        account,\n                        mastodonAPIProvider = mastodonAPIProvider,\n                        this@FollowFollowerPagingModelImpl,\n                        this@FollowFollowerPagingModelImpl\n                    )\n                }\n            }.loadPrevious().getOrThrow()\n        }\n\n    override fun getState(): PageableState<List<UserIdAndNextId>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<UserIdAndNextId>>) {\n        _state.value = state\n    }\n\n    override suspend fun getSinceId(): String? {\n        return null\n    }\n\n    override suspend fun getUntilId(): String? {\n        return (_state.value.content as? StateContent.Exist)?.rawContent?.lastOrNull()?.nextId\n    }\n\n}\n\nclass V10Loader(\n    val type: RequestType,\n    val account: Account,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val idGetter: IdGetter<String>,\n    val state: PaginationState<UserIdAndNextId>,\n) : PreviousLoader<FollowFollowerResponseItemType> {\n    override suspend fun loadPrevious(): Result<List<FollowFollowerResponseItemType>> = runCancellableCatching {\n        val isEmpty = (state.getState().content as? StateContent.Exist?)?.rawContent.isNullOrEmpty()\n        if (!isEmpty && idGetter.getUntilId() == null) {\n            return@runCancellableCatching emptyList()\n        }\n        val api = misskeyAPIProvider.get(account)\n        val func = when(type) {\n            is RequestType.Follower -> api::followers4V10\n            is RequestType.Following -> api::following4V10\n        }\n        val body = func(\n            RequestFollowFollower(\n                i = account.token,\n                cursor = idGetter.getUntilId(),\n                userId = type.userId.id\n            )\n        ).throwIfHasError().body()\n        val nextId = requireNotNull(body).next\n        body.users.map {\n            FollowFollowerResponseItemType.V10(\n                it,\n                nextId\n            )\n        }\n    }\n}\n\nclass DefaultLoader(\n    val type: RequestType,\n    val account: Account,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val idGetter: IdGetter<String>,\n) : PreviousLoader<FollowFollowerResponseItemType> {\n    override suspend fun loadPrevious(): Result<List<FollowFollowerResponseItemType>> = runCancellableCatching{\n        val api = misskeyAPIProvider.get(account)\n        val func = when(type) {\n            is RequestType.Follower -> api::followers\n            is RequestType.Following -> api::following\n        }\n        val body = func(RequestUser(\n            i = account.token,\n            userId = type.userId.id,\n            untilId = idGetter.getUntilId()\n        )).throwIfHasError().body()\n        requireNotNull(body).map {\n            FollowFollowerResponseItemType.Default(\n                userDTO = requireNotNull(it.followee ?: it.follower),\n                nextId = body.last().id\n            )\n        }\n    }\n}\n\nclass MastodonLoader(\n    val type: RequestType,\n    val account: Account,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val idGetter: IdGetter<String>,\n    val state: PaginationState<UserIdAndNextId>,\n) : PreviousLoader<FollowFollowerResponseItemType> {\n    override suspend fun loadPrevious(): Result<List<FollowFollowerResponseItemType>> =\n        runCancellableCatching {\n            val isEmpty = (state.getState().content as? StateContent.Exist?)?.rawContent.isNullOrEmpty()\n            if (!isEmpty && idGetter.getUntilId() == null) {\n                return@runCancellableCatching emptyList()\n            }\n            val api = mastodonAPIProvider.get(account)\n            val response = when (type) {\n                is RequestType.Follower -> {\n                    api.getFollowers(\n                        accountId = type.userId.id,\n                        maxId = idGetter.getUntilId()\n                    )\n                }\n                is RequestType.Following -> {\n                    api.getFollowing(\n                        accountId = type.userId.id,\n                        maxId = idGetter.getUntilId()\n                    )\n                }\n            }.throwIfHasError()\n            val linkHeader = response.headers()[\"link\"]\n            val body = requireNotNull(response.body())\n            val ids = body.map {\n                it.id\n            }\n            val idAndRelation = requireNotNull(\n                mastodonAPIProvider.get(account).getAccountRelationships(ids)\n                    .throwIfHasError().body()\n            ).associateBy {\n                it.id\n            }\n            val nextId = MastodonLinkHeaderDecoder(linkHeader).getMaxId()\n            body.map {\n                FollowFollowerResponseItemType.Mastodon(\n                    userDTO = it,\n                    nextId = nextId,\n                    relationship = idAndRelation[it.id]\n                )\n            }\n\n        }\n}\n\ndata class UserIdAndNextId(\n    val userId: User.Id,\n    val nextId: String?,\n)\n\nfun FollowFollowerResponseItemType.toUserIdAndNextId(accountId: Long): UserIdAndNextId {\n    return UserIdAndNextId(\n        userId = when (this) {\n            is FollowFollowerResponseItemType.Default -> User.Id(accountId, userDTO.id)\n            is FollowFollowerResponseItemType.Mastodon -> User.Id(accountId, userDTO.id)\n            is FollowFollowerResponseItemType.V10 -> User.Id(accountId, userDTO.id)\n        },\n        nextId = nextId\n    )\n}\n\nsealed interface FollowFollowerResponseItemType {\n    val nextId: String?\n\n    data class Default(val userDTO: UserDTO, override val nextId: String?) :\n        FollowFollowerResponseItemType\n\n    data class V10(val userDTO: UserDTO, override val nextId: String?) :\n        FollowFollowerResponseItemType\n\n    data class Mastodon(\n        val userDTO: MastodonAccountDTO,\n        val relationship: MastodonAccountRelationshipDTO?,\n        override val nextId: String?\n    ) :\n        FollowFollowerResponseItemType\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/FollowRequestApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountRelationshipDTO\nimport net.pantasystem.milktea.api.misskey.users.AcceptFollowRequest\nimport net.pantasystem.milktea.api.misskey.users.FollowRequestDTO\nimport net.pantasystem.milktea.api.misskey.users.GetFollowRequest\nimport net.pantasystem.milktea.api.misskey.users.RejectFollowRequest\nimport net.pantasystem.milktea.common.MastodonLinkHeaderDecoder\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass FollowRequestApiAdapter @Inject constructor(\n    val accountRepository: AccountRepository,\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n\n) {\n\n    suspend fun accept(userId: User.Id): FollowRequestResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account)\n                    .acceptFollowRequest(\n                        AcceptFollowRequest(\n                            i = account.token,\n                            userId = userId.id\n                        )\n                    ).throwIfHasError()\n                FollowRequestResult.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val body = mastodonAPIProvider.get(account).acceptFollowRequest(userId.id)\n                    .throwIfHasError()\n                    .body()\n                FollowRequestResult.Mastodon(requireNotNull(body))\n            }\n        }\n    }\n\n    suspend fun reject(userId: User.Id): FollowRequestResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).rejectFollowRequest(\n                    RejectFollowRequest(\n                        i = account.token,\n                        userId = userId.id\n                    )\n                ).throwIfHasError()\n                FollowRequestResult.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val body = mastodonAPIProvider.get(account).rejectFollowRequest(userId.id)\n                    .throwIfHasError()\n                    .body()\n                FollowRequestResult.Mastodon(requireNotNull(body))\n            }\n        }\n    }\n\n    suspend fun findFollowRequests(accountId: Long, sinceId: String? = null, untilId: String? = null): FindFollowRequestsResult {\n        val account = accountRepository.get(accountId).getOrThrow()\n        return when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val body = misskeyAPIProvider.get(account).getFollowRequestsList(\n                    GetFollowRequest(\n                        i = account.token,\n                        sinceId = sinceId,\n                        untilId = untilId,\n                    )\n                ).throwIfHasError().body()\n                FindFollowRequestsResult.Misskey(\n                    requireNotNull(body)\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val res = mastodonAPIProvider.get(account).getFollowRequests(\n                    maxId = untilId,\n                    minId = sinceId,\n                ).throwIfHasError()\n                FindFollowRequestsResult.Mastodon(\n                    accounts = requireNotNull(res.body()),\n                    maxId = MastodonLinkHeaderDecoder(res.headers()[\"link\"]).getMaxId(),\n                    minId = MastodonLinkHeaderDecoder(res.headers()[\"link\"]).getMinId(),\n                )\n            }\n        }\n    }\n}\n\nsealed interface FindFollowRequestsResult {\n    data class Mastodon(val accounts: List<MastodonAccountDTO>, val maxId: String?, val minId: String? = null) : FindFollowRequestsResult\n    data class Misskey(val userDTOs: List<FollowRequestDTO>) : FindFollowRequestsResult\n}\nsealed interface FollowRequestResult {\n    data class Mastodon(val relationshipDTO: MastodonAccountRelationshipDTO) : FollowRequestResult\n    object Misskey : FollowRequestResult\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/FollowRequestRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.toUserRelated\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.*\nimport javax.inject.Inject\n\nclass FollowRequestRepositoryImpl @Inject constructor(\n    private val userRepository: UserRepository,\n    private val userDataSource: UserDataSource,\n    private val followRequestApiAdapter: FollowRequestApiAdapter,\n    private val accountRepository: AccountRepository,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n): FollowRequestRepository {\n\n    override suspend fun accept(userId: User.Id): Boolean =\n        withContext(ioDispatcher) {\n            val user = userRepository.find(userId, true) as User.Detail\n            if (user.related?.hasPendingFollowRequestToYou != true) {\n                return@withContext false\n            }\n            when(val result = followRequestApiAdapter.accept(userId)) {\n                is FollowRequestResult.Mastodon -> {\n                    userDataSource.add(\n                        user.copy(\n                            related = result.relationshipDTO.toUserRelated()\n                        )\n                    )\n                }\n                FollowRequestResult.Misskey -> {\n                    userDataSource.add(\n                        user.copy(\n                            related = user.related?.copy(\n                                hasPendingFollowRequestToYou = false,\n                                isFollower = true\n                            )\n                        )\n                    )\n                }\n            }\n            true\n        }\n\n    override suspend fun reject(userId: User.Id): Boolean =\n        withContext(ioDispatcher) {\n            val user = userRepository.find(userId, true) as User.Detail\n            if (user.related?.hasPendingFollowRequestToYou != true) {\n                return@withContext false\n            }\n            when(val result = followRequestApiAdapter.reject(userId)) {\n                is FollowRequestResult.Mastodon -> {\n                    userDataSource.add(\n                        user.copy(\n                            related = result.relationshipDTO.toUserRelated()\n                        )\n                    )\n                }\n                FollowRequestResult.Misskey -> {\n                    userDataSource.add(\n                        user.copy(\n                            related = user.related?.copy(\n                                hasPendingFollowRequestToYou = false,\n                                isFollower = false\n                            )\n                        )\n                    )\n                }\n            }\n            true\n        }\n\n    override suspend fun find(\n        accountId: Long,\n        sinceId: String?,\n        untilId: String?\n    ): FollowRequestsResult {\n        return withContext(ioDispatcher) {\n            val account = accountRepository.get(accountId).getOrThrow()\n            when(val result = followRequestApiAdapter.findFollowRequests(\n                accountId = accountId,\n                sinceId = sinceId,\n                untilId = untilId\n            )) {\n                is FindFollowRequestsResult.Mastodon -> {\n                    val users = result.accounts.map {\n                        mastodonAccountDTOEntityConverter.convert(account, it)\n                    }\n                    userDataSource.addAll(users)\n                    FollowRequestsResult(\n                        users = users,\n                        sinceId = result.minId,\n                        untilId = result.maxId,\n                    )\n                }\n                is FindFollowRequestsResult.Misskey -> {\n                    val first = result.userDTOs.firstOrNull()\n                    val last = result.userDTOs.lastOrNull()\n                    val users = result.userDTOs.map {\n                        it.follower\n                    }.distinctBy {\n                        it.id\n                    }.map {\n                        userDTOEntityConverter.convert(account, it, false)\n                    }\n                    userDataSource.addAll(users)\n\n                    FollowRequestsResult(\n                        users = users,\n                        sinceId = if (sinceId == null) first?.id else last?.id,\n                        untilId = if (sinceId == null) last?.id else first?.id\n                    )\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/InMemoryUserDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.user.Acct\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserNotFoundException\nimport javax.inject.Inject\n\nclass InMemoryUserDataSource @Inject constructor(\n    memoryCacheCleaner: MemoryCacheCleaner,\n) : UserDataSource, MemoryCacheCleaner.Cleanable {\n\n    private var userMap = mapOf<User.Id, User>()\n\n    private val usersLock = Mutex()\n\n    private val _state = MutableStateFlow(UsersState())\n    val state: StateFlow<UsersState>\n        get() = _state\n\n    init {\n        memoryCacheCleaner.register(this)\n    }\n\n    override suspend fun add(user: User): Result<AddResult> = runCancellableCatching {\n        return@runCancellableCatching createOrUpdate(user).also {\n            publish()\n        }\n\n    }\n\n    override suspend fun addAll(users: List<User>): Result<Map<User.Id, AddResult>> =\n        runCancellableCatching {\n            users.associate {\n                it.id to add(it).getOrElse {\n                    AddResult.Canceled\n                }\n            }\n        }\n\n    override suspend fun get(userId: User.Id, isSimple: Boolean): Result<User> =\n        runCancellableCatching {\n            usersLock.withLock {\n                userMap[userId]\n            } ?: throw UserNotFoundException(userId)\n        }\n\n    override suspend fun getIn(\n        accountId: Long,\n        serverIds: List<String>,\n        keepInOrder: Boolean,\n        isSimple: Boolean\n    ): Result<List<User>> {\n        val userIds = serverIds.map {\n            User.Id(accountId, it)\n        }\n        return Result.success(usersLock.withLock {\n            userIds.mapNotNull {\n                userMap[it]\n            }\n        })\n    }\n\n    override suspend fun get(accountId: Long, userName: String, host: String?): Result<User> =\n        runCancellableCatching {\n            usersLock.withLock {\n                userMap.filterKeys {\n                    it.accountId == accountId\n                }.map {\n                    it.value\n                }.firstOrNull {\n                    it.userName == userName && (it.host == host || host.isNullOrBlank())\n                } ?: throw UserNotFoundException(null)\n            }\n        }\n\n    override suspend fun remove(user: User): Result<Boolean> = runCancellableCatching {\n        usersLock.withLock {\n            val map = userMap.toMutableMap()\n            val result = map.remove(user.id)\n            userMap = map\n            result\n        }?.also {\n            publish()\n        } != null\n\n\n    }\n\n    private suspend fun createOrUpdate(user: User): AddResult {\n        usersLock.withLock {\n            val u = userMap[user.id]\n            if (u == null) {\n                userMap = userMap.toMutableMap().also { map ->\n                    map[user.id] = user\n                }\n                return AddResult.Created\n            }\n            when {\n                user is User.Detail -> {\n                    userMap = userMap.toMutableMap().also { map ->\n                        map[user.id] = user\n                    }\n                }\n                u is User.Detail -> {\n                    // RepositoryのUserがDetailで与えられたUserがSimpleの時Simpleと一致する部分のみ更新する\n                    userMap = userMap.toMutableMap().also { map ->\n                        map[user.id] = u.copy(\n                            name = user.name,\n                            userName = user.userName,\n                            avatarUrl = user.avatarUrl,\n                            emojis = user.emojis,\n                            isCat = user.isCat,\n                            isBot = user.isBot,\n                            host = user.host\n                        )\n                    }\n                }\n                else -> {\n                    userMap = userMap.toMutableMap().also { map ->\n                        map[user.id] = user\n                    }\n                }\n            }\n\n            return AddResult.Updated\n        }\n    }\n\n    fun all(): List<User> {\n        return userMap.values.toList()\n    }\n\n    override fun observe(userId: User.Id): Flow<User> {\n        return _state.map {\n            it.get(userId)\n        }.filterNotNull()\n    }\n\n    override fun observeIn(accountId: Long, serverIds: List<String>): Flow<List<User>> {\n        val userIds = serverIds.map {\n            User.Id(accountId, it)\n        }\n        return _state.map { state ->\n            userIds.mapNotNull {\n                state.get(it)\n            }\n        }\n    }\n\n    override fun observe(accountId: Long, acct: String): Flow<User> {\n        return _state.mapNotNull {\n            it.get(accountId, acct)\n        }\n    }\n\n\n    override fun observe(userName: String, host: String?, accountId: Long): Flow<User?> {\n        return state.map { state ->\n            state.usersMap.values.filter { user ->\n                accountId == user.id.accountId\n            }.firstOrNull {\n                it.userName == userName && it.host == host\n            }\n        }\n    }\n\n    override suspend fun searchByNameOrUserName(\n        accountId: Long,\n        keyword: String,\n        limit: Int,\n        nextId: String?,\n        host: String?\n    ): Result<List<User>> = runCancellableCatching {\n        all().filter {\n            it.id.accountId == accountId\n        }.filter {\n            it.name?.startsWith(keyword) == true\n                    || it.userName.startsWith(keyword)\n        }.filter {\n            it.id.id > (nextId ?: \"\")\n        }.filter {\n            host == null || it.host == host\n        }\n    }\n\n    override suspend fun clean() {\n        usersLock.withLock {\n            userMap = emptyMap()\n        }\n        publish()\n    }\n\n    override suspend fun clear(limit: Int?): Result<Unit> {\n        usersLock.withLock {\n            userMap = userMap.toMutableMap().also { map ->\n                map.clear()\n            }\n        }\n        publish()\n        return Result.success(Unit)\n    }\n\n    override suspend fun count(): Result<Long> {\n        return Result.success(_state.value.usersMap.size.toLong())\n    }\n    private fun publish() {\n        _state.value = _state.value.copy(\n            usersMap = userMap\n        )\n    }\n}\n\ndata class UsersState(\n    val usersMap: Map<User.Id, User> = emptyMap()\n) {\n\n    fun get(userId: User.Id?): User? {\n        return usersMap[userId]\n    }\n\n    fun get(userName: String, host: String? = null, accountId: Long? = null): User? {\n        return usersMap.values.filter {\n            accountId == null || accountId == it.id.accountId\n        }.firstOrNull {\n            it.userName == userName && it.host == host\n        }\n    }\n\n    fun get(accountId: Long, fqdnUserName: String): User? {\n        val acct = Acct(fqdnUserName)\n        return get(acct.userName, acct.host, accountId)\n    }\n}\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/MediatorUserDataSource.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.flow.merge\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.collection.LRUCache\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.data.infrastructure.user.db.BadgeRoleRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.PinnedNoteIdRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserDao\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserEmojiRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserInfoStateRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserInstanceInfoRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserProfileFieldRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserRelated\nimport net.pantasystem.milktea.data.infrastructure.user.db.UserRelatedStateRecord\nimport net.pantasystem.milktea.data.infrastructure.user.db.isEqualToBadgeRoleModels\nimport net.pantasystem.milktea.data.infrastructure.user.db.isEqualToModel\nimport net.pantasystem.milktea.data.infrastructure.user.db.isEqualToModels\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.user.Acct\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserNotFoundException\nimport javax.inject.Inject\n\nclass MediatorUserDataSource @Inject constructor(\n    private val userDao: UserDao,\n//    private val inMem: InMemoryUserDataSource,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher,\n    memoryCacheCleaner: MemoryCacheCleaner,\n    loggerFactory: Logger.Factory\n) : UserDataSource, MemoryCacheCleaner.Cleanable {\n\n    private val memCache = LRUCache<User.Id, User>(50)\n\n    val logger = loggerFactory.create(\"MediatorUserDataSource\")\n\n    init {\n        memoryCacheCleaner.register(this)\n    }\n\n    override suspend fun get(userId: User.Id, isSimple: Boolean): Result<User> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                memCache.get(userId)\n                    ?: (if (isSimple) {\n                        userDao.getSimple(userId.accountId, userId.id)\n                    } else {\n                        userDao.get(userId.accountId, userId.id)\n                    }?.toModel()?.also {\n                        memCache.put(it.id, it)\n                    } ?: throw UserNotFoundException(userId))\n            }\n        }\n\n    override suspend fun get(accountId: Long, userName: String, host: String?): Result<User> =\n        runCancellableCatching {\n            withContext(ioDispatcher) {\n                (if (host == null) {\n                    userDao.getByUserName(accountId, userName)\n                } else {\n                    userDao.getByUserName(accountId, userName, host)\n                })?.toModel()?.also {\n                    memCache.put(it.id, it)\n                } ?: throw UserNotFoundException(\n                    userName = userName,\n                    host = host,\n                    userId = null\n                )\n            }\n        }\n\n    override suspend fun getIn(\n        accountId: Long,\n        serverIds: List<String>,\n        keepInOrder: Boolean,\n        isSimple: Boolean\n    ): Result<List<User>> = runCancellableCatching {\n        val inMemUsers = serverIds.mapNotNull {\n            memCache.get(User.Id(accountId, it))\n        }\n        val inMemUsersMap = inMemUsers.associateBy {\n            it.id.id\n        }\n        val notExistsServerIds = serverIds.filter {\n            inMemUsersMap[it] == null\n        }\n        val list = withContext(ioDispatcher) {\n            notExistsServerIds.distinct().chunked(100).map { chunkedIds ->\n                if (isSimple) {\n                    userDao.getSimplesInServerIds(accountId, chunkedIds)\n                } else {\n                    userDao.getInServerIds(accountId, chunkedIds)\n                }.map {\n                    it.toModel()\n                }\n            }.flatten().also { list ->\n                list.associateBy { it.id }.forEach {\n                    memCache.put(it.key, it.value)\n                }\n            }\n\n        }\n\n        if (!keepInOrder) {\n            list + inMemUsers\n        } else {\n            val hash = list.associateBy { it.id.id }\n            serverIds.mapNotNull {\n                inMemUsersMap[it] ?: hash[it]\n            }\n        }\n    }\n\n    override suspend fun add(user: User): Result<AddResult> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            val existsUserInMemory = memCache.get(user.id)\n            if (existsUserInMemory == user) {\n                return@withContext AddResult.Canceled\n            }\n\n            memCache.put(user.id, user)\n\n            val newRecord = UserRecord.from(user)\n            val record = userDao.get(user.id.accountId, user.id.id)\n            val recordToDetailed = (record?.toModel() as? User.Detail?)\n            val recordToSimpled = record?.toSimpleModel()\n            if (user == recordToDetailed) {\n                return@withContext AddResult.Canceled\n            }\n\n            if (user is User.Simple && recordToSimpled == user) {\n                return@withContext AddResult.Canceled\n            }\n\n            val result = if (record == null) AddResult.Created else AddResult.Updated\n            val dbId = if (record == null) {\n                userDao.insert(newRecord)\n            } else {\n                userDao.update(newRecord.copy(id = record.user.id))\n                record.user.id\n            }\n\n            // NOTE: 新たに追加される予定のオブジェクトと既にキャッシュしているオブジェクトの絵文字リストを比較している\n            // NOTE: 比較した上で同一でなければキャッシュの更新処理を行う\n            replaceEmojisIfNeed(dbId, user, record)\n            replaceUserRolesIfNeed(dbId, user, record)\n\n            if (user is User.Detail) {\n                userDao.insert(\n                    UserInfoStateRecord.from(dbId, user.info)\n                )\n                user.related?.let {\n                    userDao.insert(\n                        UserRelatedStateRecord.from(dbId, it)\n                    )\n                }\n\n                replacePinnedNoteIdsIfNeed(dbId, user, record, recordToDetailed)\n                replaceFieldsIfNeed(dbId, user, record, recordToDetailed)\n            }\n            user.instance?.let {\n                userDao.insertUserInstanceInfo(\n                    UserInstanceInfoRecord.from(dbId, it)\n                )\n            }\n            return@withContext result\n        }\n    }\n\n    override suspend fun addAll(\n        users: List<User>\n    ): Result<Map<User.Id, AddResult>> = runCancellableCatching {\n        val distinctUsers = users.distinctBy { it.id }\n        withContext(ioDispatcher) {\n            val existsUsersInMemory = distinctUsers.associate {\n                it.id to memCache.get(it.id)\n            }\n            val existsRecordIdMap = distinctUsers.groupBy {\n                it.id.accountId\n            }.flatMap { entry ->\n                userDao.getInServerIds(entry.key, entry.value.map { it.id.id })\n            }.associateBy {\n                User.Id(it.user.accountId, it.user.serverId)\n            }\n\n            val requireInserts = distinctUsers.filter {\n                existsUsersInMemory[it.id] == null && existsRecordIdMap[it.id] == null\n            }\n            val insertedDbIds = userDao.insertAll(requireInserts.map {\n                UserRecord.from(it)\n            })\n\n            // NOTE: User.idとDBのIDのマップ\n            // NOTE: insertされた時に生成されたIDとすでにDB上に存在しているレコードのIDを結合している\n            val userIdDbIdMap = requireInserts.mapIndexed { index, user ->\n                user.id to insertedDbIds[index]\n            }.toMap() + existsRecordIdMap.map {\n                it.key to it.value.user.id\n            }\n\n            replaceUsersEmojisIfNeeds(distinctUsers, userIdDbIdMap, existsRecordIdMap,)\n            replaceUsersRolesIfNeeds(distinctUsers, userIdDbIdMap, existsRecordIdMap)\n            replaceUsersInstanceInfo(distinctUsers, userIdDbIdMap, existsRecordIdMap)\n\n            // 更新処理\n            distinctUsers.forEach { user ->\n                val record = existsRecordIdMap[user.id]\n                val dbId = userIdDbIdMap[user.id] ?: return@forEach\n                if (record != null && record.toSimpleModel() != user) {\n                    userDao.update(\n                        UserRecord.from(user).copy(id = record.user.id)\n                    )\n                }\n                if (user is User.Detail) {\n                    userDao.insert(\n                        UserInfoStateRecord.from(dbId, user.info)\n                    )\n                    user.related?.let {\n                        userDao.insert(\n                            UserRelatedStateRecord.from(dbId, it)\n                        )\n                    }\n\n                    val detailModel = record?.toModel() as? User.Detail?\n                    replacePinnedNoteIdsIfNeed(dbId, user, record, detailModel)\n                    replaceFieldsIfNeed(dbId, user, record, detailModel)\n                }\n            }\n\n\n            distinctUsers.mapNotNull { user ->\n                existsUsersInMemory[user.id]?.let {\n                    it.id to AddResult.Canceled\n                } ?: userIdDbIdMap[user.id]?.let { dbId ->\n                    user.id to (if (dbId in insertedDbIds) AddResult.Created else AddResult.Updated)\n                }\n            }.toMap()\n        }\n\n    }\n\n    override suspend fun remove(user: User): Result<Boolean> = runCancellableCatching {\n        runCancellableCatching {\n            memCache.remove(user.id)\n            userDao.delete(user.id.accountId, user.id.id)\n            true\n        }.getOrElse {\n            false\n        }\n    }\n\n\n    override fun observeIn(accountId: Long, serverIds: List<String>): Flow<List<User>> {\n        if (serverIds.isEmpty()) {\n            return flowOf(emptyList())\n        }\n        return serverIds.distinct().chunked(500).map { chunkedIds ->\n            userDao.observeInServerIds(accountId, chunkedIds).distinctUntilChanged().map { list ->\n                list.map {\n                    it.toModel()\n                }\n            }.distinctUntilChanged()\n        }.merge().map { list ->\n            val hash = list.associateBy {\n                it.id.id\n            }\n            serverIds.mapNotNull {\n                hash[it]\n            }\n        }.distinctUntilChanged().flowOn(ioDispatcher).catch {\n            logger.error(\"observeIn error\", it)\n            throw it\n        }\n    }\n\n    override fun observe(userId: User.Id): Flow<User> {\n        return userDao.observe(userId.accountId, userId.id).mapNotNull {\n            it?.toModel()\n        }.onEach {\n            memCache.put(it.id, it)\n        }.flowOn(ioDispatcher).distinctUntilChanged().catch {\n            logger.error(\"observe by userId error\", it)\n            throw it\n        }\n    }\n\n    override fun observe(accountId: Long, acct: String): Flow<User> {\n        val (userName, host) = Acct(acct)\n        return userDao.let {\n            if (host == null) {\n                it.observeByUserName(accountId, userName).filterNotNull()\n            } else {\n                it.observeByUserName(accountId, userName, host).filterNotNull()\n            }\n        }.map {\n            it.toModel()\n        }.onEach {\n            memCache.put(it.id, it)\n        }.flowOn(ioDispatcher).distinctUntilChanged().catch {\n            logger.error(\"observe by acct error, acct:$acct\", it)\n            throw it\n        }\n    }\n\n    override fun observe(userName: String, host: String?, accountId: Long): Flow<User?> {\n        return if (host == null) {\n            userDao.observeByUserName(userName = userName, accountId = accountId)\n        } else {\n            userDao.observeByUserName(userName = userName, accountId = accountId, host = host)\n        }.map {\n            it?.toModel()\n        }.catch {\n            logger.error(\"observe error\", it)\n            throw it\n        }\n    }\n\n\n    override suspend fun searchByNameOrUserName(\n        accountId: Long,\n        keyword: String,\n        limit: Int,\n        nextId: String?,\n        host: String?,\n    ): Result<List<User>> = runCancellableCatching {\n        withContext(ioDispatcher) {\n            if (nextId == null) {\n                if (host.isNullOrBlank()) {\n                    userDao.searchByNameOrUserName(\n                        accountId = accountId,\n                        word = \"$keyword%\",\n                        limit = limit,\n                    )\n                } else {\n                    logger.debug(\"searchByNameOrUserName accountId:$accountId, keyword:$keyword, nextId:$nextId, host:$host\")\n                    userDao.searchByNameOrUserNameWithHost(\n                        accountId = accountId,\n                        word = \"$keyword%\",\n                        limit = limit,\n                        host = \"$host%\"\n                    )\n                }\n\n            } else {\n                if (host.isNullOrBlank()) {\n                    userDao.searchByNameOrUserName(\n                        accountId = accountId,\n                        word = \"$keyword%\",\n                        limit = limit,\n                        nextId = nextId\n                    )\n                } else {\n                    userDao.searchByNameOrUserNameWithHost(\n                        accountId = accountId,\n                        word = \"$keyword%\",\n                        limit = limit,\n                        nextId = nextId,\n                        host = \"$host%\"\n                    )\n                }\n\n            }.map {\n                it.toModel()\n            }.onEach {\n                memCache.put(it.id, it)\n            }\n\n        }\n    }\n\n    override suspend fun clear(limit: Int?): Result<Unit> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                if (limit == null) {\n                    userDao.clear()\n                } else {\n                    userDao.clear(limit)\n                }\n            }\n        }\n    }\n\n    override suspend fun count(): Result<Long> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                userDao.count()\n            }\n        }\n    }\n\n    private suspend fun replaceEmojisIfNeed(dbId: Long, user: User, record: UserRelated?) {\n        if (!record?.emojis.isEqualToModels(user.emojis)) {\n            // NOTE: 既にキャッシュに存在していた場合一度全て剥がす\n            if (record != null) {\n                userDao.detachAllUserEmojis(dbId)\n            }\n            userDao.insertEmojis(\n                user.emojis.map {\n                    UserEmojiRecord.from(dbId, it)\n                }\n            )\n        }\n    }\n\n    /**\n     * User.badgeRolesのinsertまたはupdateの必要性のあるものを抽出し、\n     * 更新の必要性がある場合は一度全て剥がしてからinsertする\n     * @param dbId 更新対象のUserに対応するDBのID\n     * @param user 更新対象のUser\n     * @param record すでにDB上に存在しているレコード\n     */\n    private suspend fun replaceUserRolesIfNeed(dbId: Long, user: User, record: UserRelated?) {\n        if (!record?.badgeRoles.isEqualToBadgeRoleModels(user.badgeRoles)) {\n            if (record != null) {\n                userDao.detachAllUserBadgeRoles(dbId)\n            }\n            userDao.insertUserBadgeRoles(\n                user.badgeRoles.map {\n                    BadgeRoleRecord(\n                        userId = dbId,\n                        name = it.name,\n                        iconUrl = it.iconUri,\n                        displayOrder = it.displayOrder,\n                    )\n                }\n            )\n        }\n    }\n\n    /**\n     * User.pinnedNoteIdsのinsertまたはupdateの必要性のあるものを抽出し、\n     * 更新の必要性がある場合は一度全て剥がしてからinsertする。\n     * @param dbId 更新対象のUserに対応するDBのID\n     * @param user 更新対象のUser\n     * @param record すでにDB上に存在しているレコード\n     * @param recordToDetailed すでにDB上に存在しているレコードをUser.Detailに変換したもの\n     */\n    private suspend fun replacePinnedNoteIdsIfNeed(\n        dbId: Long,\n        user: User.Detail,\n        record: UserRelated?,\n        recordToDetailed: User.Detail? = (record?.toModel() as? User.Detail?)\n    ) {\n        val recordDetail = recordToDetailed ?: (record?.toModel() as? User.Detail?)\n        if (recordDetail?.info?.pinnedNoteIds?.toSet() != user.info.pinnedNoteIds?.toSet()) {\n            // NOTE: 更新系の場合は一度削除する\n            if (record != null) {\n                userDao.detachAllPinnedNoteIds(dbId)\n            }\n\n            if (!user.info.pinnedNoteIds.isNullOrEmpty()) {\n                userDao.insertPinnedNoteIds(user.info.pinnedNoteIds!!.map {\n                    PinnedNoteIdRecord(it.noteId, userId = dbId, 0L)\n                })\n            }\n\n        }\n    }\n\n    /**\n     * User.info.fieldsのinsertまたはupdateの必要性のあるものを抽出し、\n     * 更新の必要性がある場合は一度全て剥がしてからinsertする\n     * @param dbId 更新対象のUserに対応するDBのID\n     * @param user 更新対象のUser\n     * @param record すでにDB上に存在しているレコード\n     */\n    private suspend fun replaceFieldsIfNeed(\n        dbId: Long,\n        user: User.Detail,\n        record: UserRelated?,\n        recordToDetailed: User.Detail? = (record?.toModel() as? User.Detail?)\n    ) {\n        val recordDetail = recordToDetailed ?: (record?.toModel() as? User.Detail?)\n        if (recordDetail?.info?.fields?.toSet() != user.info.fields.toSet()) {\n            if (record != null) {\n                userDao.detachUserFields(dbId)\n            }\n            if (user.info.fields.isNotEmpty()) {\n                userDao.insertUserProfileFields(user.info.fields.map {\n                    UserProfileFieldRecord(it.name, it.value, dbId)\n                })\n            }\n        }\n    }\n\n    /**\n     * User.emojisのinsertまたはupdateの必要性のあるものを抽出し、\n     * 更新の必要性がある場合は一度全て剥がしてからinsertする\n     * @param users 更新対象のUserリスト\n     * @param userIdDbIdMap User.IdとDBのIDのマップ\n     * @param existsRecordIdMap User.IdとすでにDB上に存在しているレコードのマップ\n     */\n    private suspend fun replaceUsersEmojisIfNeeds(\n        users: List<User>,\n        userIdDbIdMap: Map<User.Id, Long>,\n        existsRecordIdMap: Map<User.Id, UserRelated?>,\n    ) {\n        // User.emojisのinsertまたはupdateの必要性のあるものを抽出\n        val requireEmojisUpdateUsers = users.filter {\n            existsRecordIdMap[it.id] == null || !existsRecordIdMap[it.id]?.emojis.isEqualToModels(it.emojis)\n        }\n        // 一度全て剥がす\n        userDao.detachAllUserEmojis(\n            requireEmojisUpdateUsers.mapNotNull { userIdDbIdMap[it.id] }\n        )\n        userDao.insertEmojis(\n            requireEmojisUpdateUsers.flatMap { user ->\n                user.emojis.mapNotNull { emoji ->\n                    userIdDbIdMap[user.id]?.let { userId ->\n                        UserEmojiRecord.from(userId, emoji)\n                    }\n\n                }\n            }\n        )\n    }\n\n    /**\n     * User.badgeRolesのinsertまたはupdateの必要性のあるものを抽出し、\n     * 更新の必要性がある場合は一度全て剥がしてからinsertする\n     * @param users 更新対象のUserリスト\n     * @param userIdDbIdMap User.IdとDBのIDのマップ\n     * @param existsRecordIdMap User.IdとすでにDB上に存在しているレコードのマップ\n     */\n    private suspend fun replaceUsersRolesIfNeeds(\n        users: List<User>,\n        userIdDbIdMap: Map<User.Id, Long>,\n        existsRecordIdMap: Map<User.Id, UserRelated?>,\n    ) {\n        val requireUpdateUserRoleUsers = users.filter {\n            existsRecordIdMap[it.id] == null || !existsRecordIdMap[it.id]?.badgeRoles.isEqualToBadgeRoleModels(it.badgeRoles)\n        }\n        userDao.detachAllUserBadgeRoles(\n            requireUpdateUserRoleUsers.mapNotNull { userIdDbIdMap[it.id] }\n        )\n        userDao.insertUserBadgeRoles(\n            requireUpdateUserRoleUsers.flatMap { user ->\n                user.badgeRoles.mapNotNull { role ->\n                    userIdDbIdMap[user.id]?.let { userId ->\n                        BadgeRoleRecord(\n                            userId = userId,\n                            name = role.name,\n                            iconUrl = role.iconUri,\n                            displayOrder = role.displayOrder,\n                        )\n                    }\n\n                }\n            }\n        )\n    }\n\n    /**\n     * User.instanceのinsertまたはupdateの必要性のあるものを抽出し、\n     * 更新の必要性がある場合は一括でupInsertする\n     * @param users 更新対象のUserリスト\n     * @param userIdDbIdMap User.IdとDBのIDのマップ\n     * @param existsRecordIdMap User.IdとすでにDB上に存在しているレコードのマップ\n     */\n    private suspend fun replaceUsersInstanceInfo(\n        users: List<User>,\n        userIdDbIdMap: Map<User.Id, Long>,\n        existsRecordIdMap: Map<User.Id, UserRelated?>,\n    ) {\n        userDao.insertUserInstanceInfoList(\n            users.filter {\n                existsRecordIdMap[it.id] == null || !existsRecordIdMap[it.id]?.instance.isEqualToModel(it.instance)\n            }.mapNotNull {\n                userIdDbIdMap[it.id]?.let { dbId ->\n                    it.instance?.let { instance ->\n                        UserInstanceInfoRecord.from(dbId, instance)\n                    }\n                }\n            }\n        )\n\n    }\n\n    override suspend fun clean() {\n        memCache.clear()\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/UserActionResult.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountRelationshipDTO\nimport net.pantasystem.milktea.data.infrastructure.toUserRelated\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n\nsealed interface UserActionResult {\n    object Misskey : UserActionResult\n    data class Mastodon(val relationship: MastodonAccountRelationshipDTO) : UserActionResult\n}\n\ninternal interface UserCacheUpdaterFromUserActionResult {\n    suspend operator fun invoke(\n        userId: User.Id,\n        result: UserActionResult,\n        reducer: suspend (User.Detail) -> User.Detail,\n    )\n}\n\ninternal class UserCacheUpdaterFromUserActionResultImpl @Inject constructor(\n    private val userRepository: UserRepository,\n    private val userDataSource: UserDataSource,\n) : UserCacheUpdaterFromUserActionResult {\n    override suspend fun invoke(\n        userId: User.Id,\n        result: UserActionResult,\n        reducer: suspend (User.Detail) -> User.Detail,\n    ) {\n        val user = userRepository.find(userId, true) as User.Detail\n        val updated = when (result) {\n            is UserActionResult.Mastodon -> {\n                user.copy(\n                    related = result.relationship.toUserRelated()\n                )\n            }\n            UserActionResult.Misskey -> {\n                reducer(user)\n            }\n        }\n        userDataSource.add(updated)\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/UserApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.api.mastodon.accounts.MastodonAccountDTO\nimport net.pantasystem.milktea.api.misskey.users.RequestUser\nimport net.pantasystem.milktea.api.misskey.users.SearchByUserAndHost\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.users.from\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.history.ReactionHistoryDao\nimport net.pantasystem.milktea.data.infrastructure.toUserRelated\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserNotFoundException\nimport net.pantasystem.milktea.model.user.query.FindUsersFromFrequentlyReactionUsers\nimport net.pantasystem.milktea.model.user.query.FindUsersQuery\nimport net.pantasystem.milktea.model.user.query.FindUsersQuery4Mastodon\nimport net.pantasystem.milktea.model.user.query.FindUsersQuery4Misskey\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\ninternal interface UserApiAdapter {\n\n    suspend fun show(userId: User.Id, detail: Boolean): User\n\n    suspend fun search(\n        accountId: Long,\n        userName: String,\n        host: String?,\n    ): List<User>\n\n    suspend fun showUsers(\n        userIds: List<User.Id>,\n        detail: Boolean,\n    ): List<User>\n\n\n    suspend fun showByUserName(\n        accountId: Long,\n        userName: String,\n        host: String?,\n        detail: Boolean,\n    ): User\n\n}\n\n\n@Singleton\ninternal class UserApiAdapterImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n) : UserApiAdapter {\n\n    override suspend fun show(userId: User.Id, detail: Boolean): User {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val res = misskeyAPIProvider.get(account).showUser(\n                    RequestUser(\n                        i = account.token,\n                        userId = userId.id,\n                        detail = detail,\n                    )\n                )\n                userDTOEntityConverter.convert(\n                    account,\n                    requireNotNull(res.throwIfHasError().body()),\n                    detail\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val res = mastodonAPIProvider.get(account).getAccount(userId.id)\n                    .throwIfHasError()\n                    .body()\n                requireNotNull(res)\n                if (detail) {\n                    val relationship = mastodonAPIProvider.get(account).getAccountRelationships(\n                        listOf(res.id)\n                    ).throwIfHasError().body()\n                    val related = requireNotNull(relationship).first().toUserRelated()\n                    mastodonAccountDTOEntityConverter.convert(account, res, related)\n                } else {\n                    mastodonAccountDTOEntityConverter.convert(account, res)\n                }\n            }\n        }\n    }\n\n\n\n    override suspend fun search(\n        accountId: Long,\n        userName: String,\n        host: String?,\n    ): List<User> {\n        val account = accountRepository.get(accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val api = misskeyAPIProvider.get(account)\n                val body = requireNotNull(\n                    SearchByUserAndHost(api, nodeInfoRepository, account)\n                        .search(\n                            RequestUser(\n                                userName = userName,\n                                host = host,\n                                i = account.token\n                            )\n                        ).body()\n                )\n                body.map {\n                    userDTOEntityConverter.convert(account, it, true)\n                }\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                requireNotNull(\n                    mastodonAPIProvider.get(account).search(\n                        if (host == null) userName else \"$userName@$host\",\n                        type = \"accounts\"\n                    ).throwIfHasError().body()\n                ).accounts.map {\n                    mastodonAccountDTOEntityConverter.convert(account, it)\n                }\n\n            }\n        }\n    }\n\n    override suspend fun showUsers(userIds: List<User.Id>, detail: Boolean): List<User> {\n        val accountIds = userIds.map { it.accountId }.distinct()\n        return coroutineScope {\n            accountIds.map { accountId ->\n                async {\n                    val account = accountRepository.get(accountId).getOrThrow()\n                    when(account.instanceType) {\n                        Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                            misskeyAPIProvider.get(account)\n                                .showUsers(\n                                    RequestUser(\n                                        i = account.token,\n                                        userIds = userIds.filter { it.accountId == accountId }.map { it.id },\n                                        detail = true\n                                    )\n                                ).throwIfHasError()\n                                .body()!!.map {\n                                    userDTOEntityConverter.convert(account, it, true)\n                                }\n\n\n                        }\n                        Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                            userIds.filter { it.accountId == accountId }.map { it.id }.map {\n                                async {\n                                    requireNotNull(\n                                        mastodonAPIProvider.get(account)\n                                            .getAccount(it)\n                                            .throwIfHasError()\n                                            .body()\n                                    ).let {\n                                        mastodonAccountDTOEntityConverter.convert(account, it)\n                                    }\n                                }\n                            }.awaitAll()\n\n                        }\n                    }\n\n                }\n            }.awaitAll()\n        }.flatten()\n    }\n\n    override suspend fun showByUserName(\n        accountId: Long,\n        userName: String,\n        host: String?,\n        detail: Boolean\n    ): User {\n        val account = accountRepository.get(accountId).getOrThrow()\n        return when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val misskeyAPI = misskeyAPIProvider.get(account.normalizedInstanceUri)\n                val res = misskeyAPI.showUser(\n                    RequestUser(\n                        i = account.token,\n                        userName = userName,\n                        host = host,\n                        detail = detail\n                    )\n                )\n                res.throwIfHasError()\n                res.body()?.let {\n                    userDTOEntityConverter.convert(account, it, detail)\n                }\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val result = mastodonAPIProvider.get(account).search(\n                    if (host == null) \"@$userName\" else \"@$userName@$host\",\n                    resolve = true,\n                ).throwIfHasError().body()\n                val dto = requireNotNull(result).accounts.firstOrNull {\n                    it.username == userName && (host == null || it.acct.endsWith(\"@$host\"))\n                }\n                val relationships = if (detail) {\n                    mastodonAPIProvider.get(account).getAccountRelationships(\n                        listOf(dto!!.id)\n                    ).throwIfHasError().body()?.associate {\n                        it.id to it\n                    }\n                } else {\n                    emptyMap()\n                }\n                dto?.let {\n                    mastodonAccountDTOEntityConverter.convert(account, it, relationships?.get(it.id)?.toUserRelated())\n                }\n            }\n        } ?: throw UserNotFoundException(\n            null,\n            userName = userName,\n            host = host\n        )\n\n    }\n}\n\n\ninternal interface UserSuggestionsApiAdapter {\n\n    suspend fun showSuggestions(accountId: Long, query: FindUsersQuery): List<User>\n\n}\n\n\nclass UserSuggestionsApiAdapterImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val reactionHistoryDao: ReactionHistoryDao,\n    private val userDataSource: UserDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n): UserSuggestionsApiAdapter {\n    override suspend fun showSuggestions(accountId: Long, query: FindUsersQuery): List<User> {\n        val account = accountRepository.get(accountId).getOrThrow()\n        return when(query) {\n            is FindUsersQuery4Mastodon.SuggestUsers -> {\n                val api = mastodonAPIProvider.get(account)\n                val body = requireNotNull(api.getSuggestionUsers(\n                    limit = query.limit\n                ).throwIfHasError().body())\n                val accounts = body.map {\n                    it.account\n                }\n                val relationships = requireNotNull(\n                    api.getAccountRelationships(ids = accounts.map { it.id })\n                        .throwIfHasError()\n                        .body()\n                ).let { list ->\n                    list.associateBy {\n                        it.id\n                    }\n                }\n                val models = accounts.map {\n                    mastodonAccountDTOEntityConverter.convert(account, it, relationships[it.id]?.toUserRelated())\n                }\n                models\n            }\n            is FindUsersQuery4Misskey -> {\n                val request = RequestUser.from(query, account.token)\n                val res = misskeyAPIProvider.get(account).getUsers(request)\n                    .throwIfHasError()\n                res.body()?.map {\n                    userDTOEntityConverter.convert(account, it, true)\n                }?.onEach {\n                    userDataSource.add(it)\n                } ?: emptyList()\n            }\n            is FindUsersFromFrequentlyReactionUsers -> {\n                val userIds = reactionHistoryDao.findFrequentlyReactionUserAndUnFollowed(\n                    accountId = accountId,\n                    limit = 20,\n                ).map {\n                    it.targetUserId\n                }\n                userDataSource.getIn(accountId, userIds).getOrThrow()\n            }\n        }\n    }\n}\n\n\nsealed interface SearchResult {\n    data class Misskey(val users: List<UserDTO>) : SearchResult\n    data class Mastodon(val users: List<MastodonAccountDTO>) : SearchResult\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/UserNicknameDAO.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport androidx.room.*\nimport net.pantasystem.milktea.model.user.nickname.UserNickname\n\n@Entity(\n    tableName = \"nicknames\",\n    indices = [Index(value = arrayOf(\"username\", \"host\"), unique = true)]\n)\ndata class UserNicknameDTO(\n    @ColumnInfo(name = \"nickname\")\n    val nickname: String,\n\n    @ColumnInfo(name = \"username\")\n    val userName: String,\n\n    @ColumnInfo(name = \"host\")\n    val host: String,\n\n    @PrimaryKey(autoGenerate = true)\n    @ColumnInfo(name = \"id\")\n    val id: Long = 0L,\n)\n\n@Dao\nabstract class UserNicknameDAO {\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun create(dto: UserNicknameDTO)\n\n    @Update\n    abstract suspend fun update(dto: UserNicknameDTO)\n\n    @Query(\"select * from nicknames\")\n    abstract suspend fun findAll(): List<UserNicknameDTO>\n\n    @Query(\"select * from nicknames where username=:username and host=:host\")\n    abstract suspend fun findByUserNameAndHost(username: String, host: String): UserNicknameDTO?\n\n    @Query(\"select * from nicknames where id=:id\")\n    abstract suspend fun findOne(id: Long): UserNicknameDTO?\n\n    @Query(\"delete from nicknames where username=:username and host=:host\")\n    abstract suspend fun delete(username: String, host: String)\n\n}\n\nfun UserNicknameDTO.toUserNickname(): UserNickname {\n    return UserNickname(\n        UserNickname.Id(\n            userName = userName,\n            host = host\n        ),\n        name = nickname\n    )\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/UserNicknameRepositoryOnMemoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.model.user.nickname.UserNickname\nimport net.pantasystem.milktea.model.user.nickname.UserNicknameNotFoundException\nimport net.pantasystem.milktea.model.user.nickname.UserNicknameRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UserNicknameRepositoryOnMemoryImpl @Inject constructor() : UserNicknameRepository {\n\n    val lock = Mutex()\n    val map = mutableMapOf<UserNickname.Id, UserNickname>()\n\n\n    override suspend fun findOne(id: UserNickname.Id): UserNickname {\n        return map[id] ?: throw UserNicknameNotFoundException()\n    }\n\n    override suspend fun save(nickname: UserNickname) {\n        lock.withLock {\n            map[nickname.id] = nickname\n        }\n    }\n\n    override suspend fun delete(id: UserNickname.Id) {\n        lock.withLock {\n            map.remove(id)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/UserNicknameRepositorySQLiteImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.user.nickname.UserNickname\nimport net.pantasystem.milktea.model.user.nickname.UserNicknameNotFoundException\nimport net.pantasystem.milktea.model.user.nickname.UserNicknameRepository\nimport javax.inject.Inject\n\n\nclass UserNicknameRepositorySQLiteImpl @Inject constructor(\n    private val userNicknameDAO: UserNicknameDAO,\n    private val userNicknameRepositoryOnMemoryImpl: UserNicknameRepositoryOnMemoryImpl,\n    @IODispatcher private val ioDispatcher: CoroutineDispatcher\n) : UserNicknameRepository {\n\n    /**\n     * ニックネームは存在しない可能性が高い＆\n     * 存在しないものを毎回探索しに行くのはパフォーマンス的によろしくないので\n     * 存在しないものを記録するようにしている。\n     */\n    private val notExistsIds = mutableSetOf<UserNickname.Id>()\n    private val lock = Mutex()\n\n    override suspend fun findOne(id: UserNickname.Id): UserNickname {\n        return withContext(ioDispatcher) {\n            if (notExistsIds.contains(id)) {\n                throw UserNicknameNotFoundException()\n            }\n            val inMem = runCancellableCatching {\n                userNicknameRepositoryOnMemoryImpl.findOne(id)\n            }.getOrNull()\n            if (inMem != null) {\n                return@withContext inMem\n            }\n            val result = userNicknameDAO.findByUserNameAndHost(id.userName, id.host)\n            if (result != null) {\n                return@withContext result.toUserNickname()\n            }\n            lock.withLock {\n                notExistsIds.add(id)\n            }\n            throw UserNicknameNotFoundException()\n        }\n    }\n\n    override suspend fun save(nickname: UserNickname) {\n        withContext(ioDispatcher) {\n            val found =\n                userNicknameDAO.findByUserNameAndHost(nickname.id.userName, nickname.id.host)\n            val dto = UserNicknameDTO(\n                userName = nickname.id.userName,\n                host = nickname.id.host,\n                nickname = nickname.name,\n                id = found?.id ?: 0L,\n            )\n            lock.withLock {\n                notExistsIds.remove(nickname.id)\n            }\n            userNicknameRepositoryOnMemoryImpl.save(nickname)\n            if (found == null) {\n                userNicknameDAO.create(dto)\n            } else {\n                userNicknameDAO.update(dto)\n            }\n        }\n    }\n\n    override suspend fun delete(id: UserNickname.Id) {\n        withContext(ioDispatcher) {\n            lock.withLock {\n                notExistsIds.add(id)\n            }\n            userNicknameDAO.delete(id.userName, id.host)\n            userNicknameRepositoryOnMemoryImpl.delete(id)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/UserReactionPagingStoreImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReactionRequest\nimport net.pantasystem.milktea.app_store.user.UserReactionPagingStore\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.paginator.*\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.note.NoteDataSourceAdder\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.NoteRelationGetter\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.reaction.UserReaction\nimport net.pantasystem.milktea.model.user.reaction.UserReactionRelation\nimport javax.inject.Inject\nimport javax.inject.Singleton\nimport net.pantasystem.milktea.api.misskey.v12.user.reaction.UserReaction as UserReactionDTO\n\nclass UserReactionPagingStoreImpl(\n    private val pagingImpl: UserReactionPagingImpl,\n) : UserReactionPagingStore {\n\n    class Factory @Inject constructor(\n        val factory: UserReactionPagingImpl.Factory\n    ) : UserReactionPagingStore.Factory {\n        override fun create(userId: User.Id): UserReactionPagingStore {\n            return UserReactionPagingStoreImpl(factory.create(userId))\n        }\n    }\n\n    private val previousPagingController = PreviousPagingController.create(\n        pagingImpl,\n    )\n\n    override val state: Flow<PageableState<List<UserReactionRelation>>>\n        get() = pagingImpl.state\n\n    override suspend fun clear(): Result<Unit> = runCancellableCatching {\n        pagingImpl.mutex.withLock {\n            pagingImpl.setState(PageableState.Loading.Init())\n        }\n    }\n\n    override suspend fun loadPrevious(): Result<Unit> = runCancellableCatching {\n        previousPagingController.loadPrevious().getOrThrow()\n    }\n}\n\n\nclass UserReactionPagingImpl(\n    val userId: User.Id,\n    val accountRepository: AccountRepository,\n    val userDataSource: UserDataSource,\n    val noteDataSourceAdder: NoteDataSourceAdder,\n    val noteRelationGetter: NoteRelationGetter,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val userDTOEntityConverter: UserDTOEntityConverter,\n) : StateLocker, PreviousLoader<UserReactionDTO>,\n    PaginationState<UserReactionRelation>, EntityConverter<UserReactionDTO, UserReactionRelation>,\n    IdGetter<String> {\n\n    @Singleton\n    class Factory @Inject constructor(\n        val userDataSource: UserDataSource,\n        val noteDataSourceAdder: NoteDataSourceAdder,\n        val noteRelationGetter: NoteRelationGetter,\n        val misskeyAPIProvider: MisskeyAPIProvider,\n        val accountRepository: AccountRepository,\n        val userDTOEntityConverter: UserDTOEntityConverter,\n    ){\n        fun create(userId: User.Id): UserReactionPagingImpl {\n            return UserReactionPagingImpl(\n                userId,\n                userDataSource = userDataSource,\n                noteDataSourceAdder = noteDataSourceAdder,\n                misskeyAPIProvider = misskeyAPIProvider,\n                accountRepository = accountRepository,\n                noteRelationGetter = noteRelationGetter,\n                userDTOEntityConverter = userDTOEntityConverter,\n            )\n        }\n    }\n    override val mutex: Mutex = Mutex()\n\n    private val _state = MutableStateFlow<PageableState<List<UserReactionRelation>>>(\n        PageableState.Loading.Init()\n    )\n    override val state: Flow<PageableState<List<UserReactionRelation>>>\n        get() = _state\n\n\n    override suspend fun loadPrevious(): Result<List<UserReactionDTO>> = runCancellableCatching {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        (misskeyAPIProvider.get(account)).getUserReactions(\n            UserReactionRequest(\n                i = account.token,\n                untilId = getUntilId(),\n                limit = 20,\n                userId = userId.id\n            )\n        ).throwIfHasError().body()!!\n    }\n\n    override suspend fun getSinceId(): String? {\n        return null\n    }\n\n    override suspend fun getUntilId(): String? {\n        return (_state.value.content as? StateContent.Exist)?.rawContent?.lastOrNull()?.reaction?.id?.serverId\n\n    }\n\n    override fun getState(): PageableState<List<UserReactionRelation>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<UserReactionRelation>>) {\n        _state.value = state\n    }\n\n    override suspend fun convertAll(list: List<UserReactionDTO>): List<UserReactionRelation> {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return list.map { userReaction ->\n            val user = userDTOEntityConverter.convert(account, userReaction.user, false)\n            userDataSource.add(user)\n            val note = noteDataSourceAdder.addNoteDtoToDataSource(account, userReaction.note)\n            UserReactionRelation(\n                reaction = UserReaction(\n                    id = UserReaction.Id(accountId = account.accountId, serverId = userReaction.id),\n                    type = userReaction.type,\n                    noteId = note.id,\n                    userId = user.id,\n                    createdAt = userReaction.createdAt,\n                ),\n                note = noteRelationGetter.get(note).getOrThrow(),\n                user = user\n            )\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/UserRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user\n\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserNotFoundException\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.model.user.query.FindUsersQuery\nimport javax.inject.Inject\n\ninternal class UserRepositoryImpl @Inject constructor(\n    private val userDataSource: UserDataSource,\n    private val loggerFactory: Logger.Factory,\n    private val userApiAdapter: UserApiAdapter,\n    private val userSuggestionsApiAdapter: UserSuggestionsApiAdapter,\n    @IODispatcher val ioDispatcher: CoroutineDispatcher,\n) : UserRepository {\n    private val logger: Logger by lazy {\n        loggerFactory.create(\"UserRepositoryImpl\")\n    }\n\n    override suspend fun find(userId: User.Id, detail: Boolean): User =\n        withContext(ioDispatcher) {\n            val localResult = runCancellableCatching {\n                userDataSource.get(userId).let {\n                    if (detail) {\n                        it.getOrThrow() as? User.Detail\n                    } else it.getOrThrow()\n                }\n            }.onFailure {\n                logger.debug(\"ローカルにユーザーは存在しませんでした。:$userId\")\n            }\n            localResult.getOrNull()?.let {\n                return@withContext it\n            }\n\n            if (localResult.getOrNull() == null) {\n                val user = userApiAdapter.show(userId, detail)\n                val result = userDataSource.add(user).getOrThrow()\n                logger.debug(\"add result: $result\")\n                return@withContext userDataSource.get(userId).getOrThrow()\n            }\n\n            throw UserNotFoundException(userId)\n        }\n\n    override suspend fun findByUserName(\n        accountId: Long,\n        userName: String,\n        host: String?,\n        detail: Boolean\n    ): User = withContext(ioDispatcher) {\n        val local = runCancellableCatching {\n            userDataSource.get(accountId, userName, host).let {\n                if (detail) {\n                    it.getOrThrow() as? User.Detail\n                } else it.getOrThrow()\n            }\n        }.getOrNull()\n\n        logger.debug(\"local:$local\")\n        if (local != null) {\n            return@withContext local\n        }\n        val user = userApiAdapter.showByUserName(accountId, userName, host, detail).also {\n            userDataSource.add(it)\n\n        }\n        userDataSource.get(user.id).getOrThrow()\n    }\n\n\n    override suspend fun syncByUserName(\n        accountId: Long,\n        userName: String,\n        host: String?\n    ) = runCancellableCatching<Unit> {\n        withContext(ioDispatcher) {\n            val users = userApiAdapter.search(accountId, userName, host)\n            userDataSource.addAll(users).getOrThrow()\n        }\n    }\n\n    override suspend fun searchByNameOrUserName(\n        accountId: Long,\n        keyword: String,\n        limit: Int,\n        nextId: String?,\n        host: String?\n    ): List<User> {\n        return userDataSource.searchByNameOrUserName(accountId, keyword, limit, nextId, host = host)\n            .getOrThrow()\n    }\n\n\n    override suspend fun findUsers(accountId: Long, query: FindUsersQuery): List<User> {\n        return withContext(ioDispatcher) {\n            val result = userSuggestionsApiAdapter.showSuggestions(accountId, query)\n            userDataSource.addAll(result).getOrThrow()\n            result\n        }\n    }\n\n    override suspend fun sync(userId: User.Id): Result<Unit> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val user = userApiAdapter.show(userId, true)\n                userDataSource.add(user).getOrThrow()\n            }\n        }\n    }\n\n    override suspend fun syncIn(userIds: List<User.Id>): Result<List<User.Id>> {\n        return runCancellableCatching {\n            withContext(ioDispatcher) {\n                val users = userApiAdapter.showUsers(userIds, true)\n                userDataSource.addAll(users).getOrThrow()\n                users.map {\n                    it.id\n                }\n            }\n        }\n    }\n\n    override fun observe(userId: User.Id): Flow<User> {\n        return userDataSource.observe(userId)\n    }\n\n    override fun observe(accountId: Long, acct: String): Flow<User> {\n        return userDataSource.observe(accountId, acct)\n    }\n\n    override fun observe(userName: String, host: String?, accountId: Long): Flow<User?> {\n        return userDataSource.observe(userName, host, accountId)\n    }\n\n    override fun observeIn(accountId: Long, serverIds: List<String>): Flow<List<User>> {\n        return userDataSource.observeIn(accountId, serverIds)\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/block/BlockApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.block\n\nimport net.pantasystem.milktea.api.misskey.users.RequestUser\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.user.UserActionResult\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\ninternal interface BlockApiAdapter {\n\n    suspend fun blockUser(userId: User.Id): BlockUserResult\n    suspend fun unblockUser(userId: User.Id): UnBlockUserResult\n}\n\nclass BlockApiAdapterImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider\n) : BlockApiAdapter {\n    override suspend fun blockUser(userId: User.Id): BlockUserResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).blockUser(\n                    RequestUser(\n                        i = account.token,\n                        userId = userId.id,\n                    )\n                )\n                    .throwIfHasError()\n                UserActionResult.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val body = mastodonAPIProvider.get(account).blockAccount(userId.id)\n                    .throwIfHasError()\n                    .body()\n                UserActionResult.Mastodon(requireNotNull(body))\n            }\n        }\n    }\n\n    override suspend fun unblockUser(userId: User.Id): UnBlockUserResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).unblockUser(\n                    RequestUser(\n                        i = account.token,\n                        userId = userId.id,\n                    )\n                )\n                    .throwIfHasError()\n                UserActionResult.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val body = mastodonAPIProvider.get(account).unblockAccount(userId.id)\n                    .throwIfHasError()\n                    .body()\n                UserActionResult.Mastodon(requireNotNull(body))\n            }\n        }\n    }\n\n}\ntypealias BlockUserResult = UserActionResult\n\ntypealias UnBlockUserResult = UserActionResult"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/block/BlockRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.block\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.user.UserCacheUpdaterFromUserActionResult\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.block.BlockRepository\nimport javax.inject.Inject\n\ninternal class BlockRepositoryImpl @Inject constructor(\n    private val blockApiAdapter: BlockApiAdapter,\n    private val updateCacheFrom: UserCacheUpdaterFromUserActionResult,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher,\n    loggerFactory: Logger.Factory\n) : BlockRepository {\n\n    private val logger by lazy {\n        loggerFactory.create(\"BlockRepositoryImpl\")\n    }\n\n    override suspend fun create(userId: User.Id): Result<Unit> {\n        return runCancellableCatching {\n            withContext(coroutineDispatcher) {\n                updateCacheFrom(userId, blockApiAdapter.blockUser(userId)) { user ->\n                    user.copy(\n                        related = user.related?.copy(\n                            isBlocking = true\n                        )\n                    )\n                }\n            }\n        }.onFailure {\n            logger.error(\"block failed\", it)\n        }\n    }\n\n    override suspend fun delete(userId: User.Id): Result<Unit> {\n        return runCancellableCatching {\n            withContext(coroutineDispatcher) {\n                updateCacheFrom(userId, blockApiAdapter.unblockUser(userId)) { user ->\n                    user.copy(\n                        related = user.related?.copy(isBlocking = false)\n                    )\n                }\n            }\n        }.onFailure {\n            logger.error(\"unblock failed\", it)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/db/UserDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.db\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\nabstract class UserDao {\n\n    @Insert\n    abstract suspend fun insert(user: UserRecord): Long\n\n\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertPinnedNoteIds(ids: List<PinnedNoteIdRecord>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insert(info: UserInfoStateRecord): Long\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insert(related: UserRelatedStateRecord): Long\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertAll(users: List<UserRecord>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertEmojis(emojis: List<UserEmojiRecord>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertUserInstanceInfo(info: UserInstanceInfoRecord): Long\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertUserInstanceInfoList(info: List<UserInstanceInfoRecord>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertUserProfileFields(fields: List<UserProfileFieldRecord>): List<Long>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract suspend fun insertUserBadgeRoles(fields: List<BadgeRoleRecord>): List<Long>\n\n    @Query(\"delete from pinned_note_id where userId = :userId\")\n    abstract suspend fun detachAllPinnedNoteIds(userId: Long)\n\n    @Query(\"delete from user_emoji where userId = :userId\")\n    abstract suspend fun detachAllUserEmojis(userId: Long)\n\n    @Query(\"delete from user_emoji where userId in (:userIds)\")\n    abstract suspend fun detachAllUserEmojis(userIds: List<Long>)\n\n    @Query(\"delete from user_profile_field where userId = :userId\")\n    abstract suspend fun detachUserFields(userId: Long)\n\n    @Query(\"delete from user_badge_role where userId = :userId\")\n    abstract suspend fun detachAllUserBadgeRoles(userId: Long)\n\n    @Query(\"delete from user_badge_role where userId in (:userIds)\")\n    abstract suspend fun detachAllUserBadgeRoles(userIds: List<Long>)\n\n    @Update\n    abstract suspend fun update(user: UserRecord)\n\n\n    @Update\n    abstract suspend fun update(info: UserInfoStateRecord)\n\n    @Update\n    abstract suspend fun update(related: UserRelatedStateRecord)\n\n    @Query(\n        \"\"\"\n            select * from user_view where accountId = :accountId and serverId in (:serverIds)\n        \"\"\"\n    )\n    @Transaction\n    abstract fun observeInServerIds(accountId: Long, serverIds: List<String>): Flow<List<UserRelated>>\n\n    @Query(\n        \"\"\"\n            select * from user_view where id in (:ids)\n        \"\"\"\n    )\n    @Transaction\n    abstract fun observeInIds(ids: List<Long>): Flow<List<UserRelated>>\n\n    @Query(\"\"\"\n        select * from user_view where id = :id\n    \"\"\")\n    @Transaction\n    abstract suspend fun get(id: Long): UserRelated?\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and serverId = :serverId\n    \"\"\")\n    @Transaction\n    abstract suspend fun get(accountId: Long, serverId: String): UserRelated?\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and serverId = :serverId\n    \"\"\")\n    @Transaction\n    abstract suspend fun getSimple(accountId: Long, serverId: String): UserSimpleRelated?\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and serverId = :serverId\n    \"\"\")\n    @Transaction\n    abstract fun observe(accountId: Long, serverId: String): Flow<UserRelated?>\n\n    @Query(\"\"\"\n        select * from user_view where id = :id\n    \"\"\")\n    @Transaction\n    abstract fun observe(id: Long): Flow<UserRelated?>\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and userName = :userName and host = :host\n    \"\"\")\n    @Transaction\n    abstract suspend fun getByUserName(accountId: Long, userName: String, host: String): UserRelated?\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and userName = :userName\n    \"\"\")\n    @Transaction\n    abstract suspend fun getByUserName(accountId: Long, userName: String): UserRelated?\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and userName = :userName and host = :host\n    \"\"\")\n    @Transaction\n    abstract fun observeByUserName(accountId: Long, userName: String, host: String): Flow<UserRelated?>\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and userName = :userName\n    \"\"\")\n    @Transaction\n    abstract fun observeByUserName(accountId: Long, userName: String): Flow<UserRelated?>\n\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and serverId in (:serverIds)\n    \"\"\")\n    @Transaction\n    abstract suspend fun getInServerIds(accountId: Long, serverIds: List<String>): List<UserRelated>\n\n    @Query(\"\"\"\n        select * from user_view where accountId = :accountId and serverId in (:serverIds)\n    \"\"\")\n    @Transaction\n    abstract suspend fun getSimplesInServerIds(accountId: Long, serverIds: List<String>): List<UserSimpleRelated>\n\n    @Query(\"\"\"\n        delete from user where accountId = :accountId and serverId = :serverId\n    \"\"\")\n    abstract suspend fun delete(accountId: Long, serverId: String)\n\n\n    @Query(\"\"\"\n       select * from user_view\n            where accountId = :accountId\n            and serverId >= :nextId\n            and (name like :word or userName like :word)\n            order by serverId asc\n            limit :limit\n    \"\"\")\n    @Transaction\n    abstract suspend fun searchByNameOrUserName(accountId: Long, word: String, limit: Int, nextId: String): List<UserRelated>\n\n    @Query(\"\"\"\n       select * from user_view\n            where accountId = :accountId\n            and (name like :word or userName like :word)\n            order by serverId asc\n            limit :limit\n    \"\"\")\n    @Transaction\n    abstract suspend fun searchByNameOrUserName(accountId: Long, word: String, limit: Int): List<UserRelated>\n\n    @Query(\"\"\"\n       select * from user_view\n            where accountId = :accountId\n            and host like :host\n            and serverId >= :nextId\n            and (name like :word or userName like :word)\n            order by serverId asc\n            limit :limit\n    \"\"\")\n    @Transaction\n    abstract suspend fun searchByNameOrUserNameWithHost(accountId: Long, word: String, limit: Int, nextId: String, host: String): List<UserRelated>\n\n    @Query(\"\"\"\n       select * from user_view\n            where accountId = :accountId\n            and host like :host\n            and (name like :word or userName like :word)\n            order by serverId asc\n            limit :limit\n    \"\"\")\n    @Transaction\n    abstract suspend fun searchByNameOrUserNameWithHost(accountId: Long, word: String, limit: Int, host: String): List<UserRelated>\n\n    @Query(\"\"\"select count(*) from user\"\"\")\n    abstract suspend fun count(): Long\n\n    @Query(\"\"\"delete from user\"\"\")\n    abstract suspend fun clear()\n\n    @Query(\"\"\"delete from user where id in (select id from user order by id asc limit :limit)\"\"\")\n    abstract suspend fun clear(limit: Int)\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/db/UserRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.DatabaseView\nimport androidx.room.Embedded\nimport androidx.room.Entity\nimport androidx.room.ForeignKey\nimport androidx.room.Index\nimport androidx.room.PrimaryKey\nimport androidx.room.Relation\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.LocalDate\nimport net.pantasystem.milktea.data.infrastructure.account.db.AccountRecord\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.nickname.UserNickname\n\n@Entity(\n    tableName = \"user\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"accountId\"],\n            childColumns = [\"accountId\"],\n            entity = AccountRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        )\n    ],\n    indices = [\n        Index(\n            \"serverId\", \"accountId\", unique = true\n        ),\n        Index(\n            \"userName\"\n        ),\n        Index(\"accountId\"),\n        Index(\"host\")\n    ]\n)\ndata class UserRecord(\n    @ColumnInfo(name = \"serverId\")\n    val serverId: String,\n\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"userName\")\n    val userName: String,\n\n    @ColumnInfo(name = \"name\")\n    val name: String?,\n\n    @ColumnInfo(name = \"avatarUrl\")\n    val avatarUrl: String?,\n\n    @ColumnInfo(name = \"isCat\")\n    val isCat: Boolean?,\n\n    @ColumnInfo(name = \"isBot\")\n    val isBot: Boolean?,\n\n    @ColumnInfo(name = \"host\")\n    val host: String,\n\n    @ColumnInfo(name = \"isSameHost\")\n    val isSameHost: Boolean,\n\n    @ColumnInfo(name = \"avatarBlurhash\")\n    val avatarBlurhash: String?,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true) val id: Long = 0L,\n) {\n    companion object {\n        fun from(user: User): UserRecord {\n            return UserRecord(\n                accountId = user.id.accountId,\n                serverId = user.id.id,\n                avatarUrl = user.avatarUrl,\n                host = user.host,\n                isBot = user.isBot,\n                isCat = user.isCat,\n                isSameHost = user.isSameHost,\n                name = user.name,\n                userName = user.userName,\n                avatarBlurhash = user.avatarBlurhash,\n            )\n        }\n    }\n}\n\n@Entity(\n    tableName = \"user_info_state\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"userId\"],\n            entity = UserRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        )\n    ],\n    indices = [\n        Index(\"userId\", unique = true),\n    ]\n)\ndata class UserInfoStateRecord(\n    @ColumnInfo(name = \"description\")\n    val description: String?,\n\n    @ColumnInfo(name = \"followersCount\")\n    val followersCount: Int?,\n\n    @ColumnInfo(name = \"followingCount\")\n    val followingCount: Int?,\n\n    @ColumnInfo(name = \"hostLower\")\n    val hostLower: String?,\n\n    @ColumnInfo(name = \"notesCount\")\n    val notesCount: Int?,\n\n    @ColumnInfo(name = \"bannerUrl\")\n    val bannerUrl: String?,\n\n    @ColumnInfo(name = \"url\")\n    val url: String?,\n\n    @ColumnInfo(name = \"isLocked\")\n    val isLocked: Boolean,\n\n    @ColumnInfo(name = \"birthday\")\n    val birthday: LocalDate?,\n\n    @ColumnInfo(name = \"createdAt\")\n    val createdAt: Instant?,\n\n    @ColumnInfo(name = \"updatedAt\")\n    val updatedAt: Instant?,\n\n    @ColumnInfo(name = \"publicReactions\")\n    val publicReactions: Boolean?,\n\n    @ColumnInfo(name = \"userId\")\n    @PrimaryKey(autoGenerate = false)\n    val userId: Long,\n\n    @ColumnInfo(name = \"ffVisibility\")\n    val ffVisibility: String? = null,\n) {\n    companion object {\n        fun from(dbId: Long, info: User.Info): UserInfoStateRecord {\n            return UserInfoStateRecord(\n                bannerUrl = info.bannerUrl,\n                isLocked = info.isLocked,\n                description = info.description,\n                followersCount = info.followersCount,\n                followingCount = info.followingCount,\n                hostLower = info.hostLower,\n                notesCount = info.notesCount,\n                url = info.url,\n                userId = dbId,\n                birthday = info.birthday,\n                createdAt = info.createdAt,\n                updatedAt = info.updatedAt,\n                publicReactions = info.isPublicReactions,\n                ffVisibility = when (info.ffVisibility) {\n                    User.FollowerFollowerVisibility.Public -> \"public\"\n                    User.FollowerFollowerVisibility.Followers -> \"followers\"\n                    User.FollowerFollowerVisibility.Private -> \"private\"\n                    null -> null\n                }\n            )\n        }\n    }\n}\n\n@Entity(\n    tableName = \"user_related_state\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"userId\"],\n            entity = UserRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        )\n    ],\n    indices = [\n        Index(\"userId\", unique = true),\n    ]\n)\ndata class UserRelatedStateRecord(\n    @ColumnInfo(name = \"isFollowing\")\n    val isFollowing: Boolean,\n\n    @ColumnInfo(name = \"isFollower\")\n    val isFollower: Boolean,\n\n    @ColumnInfo(name = \"isBlocking\")\n    val isBlocking: Boolean,\n\n    @ColumnInfo(name = \"isMuting\")\n    val isMuting: Boolean,\n\n    @ColumnInfo(name = \"hasPendingFollowRequestFromYou\")\n    val hasPendingFollowRequestFromYou: Boolean,\n\n    @ColumnInfo(name = \"hasPendingFollowRequestToYou\")\n    val hasPendingFollowRequestToYou: Boolean,\n\n    @ColumnInfo(name = \"isNotify\")\n    val isNotify: Boolean? = null,\n\n    @ColumnInfo(name = \"userId\")\n    @PrimaryKey(autoGenerate = false) val userId: Long\n) {\n\n    companion object {\n        fun from(dbId: Long, related: User.Related): UserRelatedStateRecord {\n            return UserRelatedStateRecord(\n                isMuting = related.isMuting,\n                isBlocking = related.isBlocking,\n                isFollower = related.isFollower,\n                isFollowing = related.isFollowing,\n                hasPendingFollowRequestToYou = related.hasPendingFollowRequestToYou,\n                hasPendingFollowRequestFromYou = related.hasPendingFollowRequestFromYou,\n                isNotify = related.isNotify,\n                userId = dbId,\n            )\n        }\n    }\n}\n\n@Entity(\n    tableName = \"user_detailed_state\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"userId\"],\n            entity = UserRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        )\n    ],\n    indices = [\n        Index(\"userId\", unique = true),\n    ]\n)\ndata class UserDetailedStateRecord(\n    @ColumnInfo(name = \"description\")\n    val description: String?,\n\n    @ColumnInfo(name = \"followersCount\")\n    val followersCount: Int?,\n\n    @ColumnInfo(name = \"followingCount\")\n    val followingCount: Int?,\n\n    @ColumnInfo(name = \"hostLower\")\n    val hostLower: String?,\n\n    @ColumnInfo(name = \"notesCount\")\n    val notesCount: Int?,\n\n    @ColumnInfo(name = \"bannerUrl\")\n    val bannerUrl: String?,\n\n    @ColumnInfo(name = \"url\")\n    val url: String?,\n\n    @ColumnInfo(name = \"isFollowing\")\n    val isFollowing: Boolean,\n\n    @ColumnInfo(name = \"isFollower\")\n    val isFollower: Boolean,\n\n    @ColumnInfo(name = \"isBlocking\")\n    val isBlocking: Boolean,\n\n    @ColumnInfo(name = \"isMuting\")\n    val isMuting: Boolean,\n\n    @ColumnInfo(name = \"hasPendingFollowRequestFromYou\")\n    val hasPendingFollowRequestFromYou: Boolean,\n\n    @ColumnInfo(name = \"hasPendingFollowRequestToYou\")\n    val hasPendingFollowRequestToYou: Boolean,\n\n    @ColumnInfo(name = \"isLocked\")\n    val isLocked: Boolean,\n\n    @ColumnInfo(name = \"birthday\")\n    val birthday: LocalDate?,\n\n    @ColumnInfo(name = \"createdAt\")\n    val createdAt: Instant?,\n\n    @ColumnInfo(name = \"updatedAt\")\n    val updatedAt: Instant?,\n\n    @ColumnInfo(name = \"publicReactions\")\n    val publicReactions: Boolean?,\n\n    @ColumnInfo(name = \"userId\")\n    @PrimaryKey(autoGenerate = false) val userId: Long\n)\n\n@Entity(\n    tableName = \"user_emoji\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            entity = UserRecord::class,\n            childColumns = [\"userId\"],\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        ),\n    ],\n    indices = [\n        Index(\n            \"name\", \"userId\", unique = true\n        ),\n        Index(\"userId\")\n    ]\n)\ndata class UserEmojiRecord(\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    @ColumnInfo(name = \"url\")\n    val url: String?,\n\n    @ColumnInfo(name = \"uri\")\n    val uri: String?,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: Long,\n\n    @ColumnInfo(name = \"aspectRatio\")\n    val aspectRatio: Float? = null,\n\n    @ColumnInfo(name = \"cachePath\")\n    val cachePath: String? = null,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true) val id: Long = 0L,\n) {\n\n    companion object {\n        fun from(dbId: Long, mode: CustomEmoji): UserEmojiRecord {\n            return UserEmojiRecord(\n                name = mode.name,\n                url = mode.url,\n                uri = mode.uri,\n                aspectRatio = mode.aspectRatio,\n                cachePath = mode.cachePath,\n                userId = dbId,\n            )\n        }\n    }\n\n    fun toModel(): CustomEmoji {\n        return CustomEmoji(\n            name = name,\n            url = url,\n            uri = uri,\n            aspectRatio = aspectRatio,\n            cachePath = cachePath,\n        )\n    }\n\n    fun isEqualToModel(model: CustomEmoji): Boolean {\n        return name == model.name &&\n                url == model.url &&\n                uri == model.uri &&\n                aspectRatio == model.aspectRatio &&\n                cachePath == model.cachePath\n    }\n}\n\nfun List<UserEmojiRecord>?.isEqualToModels(models: List<CustomEmoji>): Boolean {\n    if (this == null && models.isEmpty()) return true\n    if (this == null) return false\n    if (size != models.size) return false\n    val records = this.toSet()\n    return models.all { model ->\n        records.any { record ->\n            record.isEqualToModel(model)\n        }\n    }\n}\n\nfun List<BadgeRoleRecord>?.isEqualToBadgeRoleModels(models: List<User.BadgeRole>): Boolean {\n    if (this == null && models.isEmpty()) return true\n    if (this == null) return false\n    if (size != models.size) return false\n    val records = this.toSet()\n    return models.all { model ->\n        records.any { record ->\n            record.isEqualToModel(model)\n        }\n    }\n}\n\n@Entity(\n    tableName = \"user_instance_info\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            entity = UserRecord::class,\n            childColumns = [\"userId\"],\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE\n        )\n    ],\n    indices = [\n        Index(\"userId\")\n    ]\n)\ndata class UserInstanceInfoRecord(\n    @ColumnInfo(name = \"faviconUrl\")\n    val faviconUrl: String?,\n\n    @ColumnInfo(name = \"iconUrl\")\n    val iconUrl: String?,\n\n    @ColumnInfo(name = \"name\")\n    val name: String?,\n\n    @ColumnInfo(name = \"softwareName\")\n    val softwareName: String?,\n\n    @ColumnInfo(name = \"softwareVersion\")\n    val softwareVersion: String?,\n\n    @ColumnInfo(name = \"themeColor\")\n    val themeColor: String?,\n\n    @ColumnInfo(name = \"userId\")\n    @PrimaryKey(autoGenerate = false) val userId: Long\n) {\n    companion object {\n        fun from(dbId: Long, instance: User.InstanceInfo): UserInstanceInfoRecord {\n            return UserInstanceInfoRecord(\n                faviconUrl = instance.faviconUrl,\n                iconUrl = instance.iconUrl,\n                name = instance.name,\n                softwareVersion = instance.softwareVersion,\n                softwareName = instance.softwareName,\n                themeColor = instance.themeColor,\n                userId = dbId\n            )\n        }\n    }\n}\n\nfun UserInstanceInfoRecord?.isEqualToModel(model: User.InstanceInfo?): Boolean {\n    if (model == null) return false\n    if (this == null) return false\n    return faviconUrl == model.faviconUrl &&\n            iconUrl == model.iconUrl &&\n            name == model.name &&\n            softwareName == model.softwareName &&\n            softwareVersion == model.softwareVersion &&\n            themeColor == model.themeColor\n}\n\n@Entity(\n    tableName = \"pinned_note_id\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"userId\"],\n            entity = UserRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE,\n        ),\n    ],\n    indices = [\n        Index(\"noteId\", \"userId\", unique = true),\n        Index(\"userId\")\n    ]\n)\ndata class PinnedNoteIdRecord(\n    @ColumnInfo(name = \"noteId\")\n    val noteId: String,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: Long,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true) val id: Long\n)\n\n@Entity(\n    tableName = \"user_profile_field\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"userId\"],\n            entity = UserRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"userId\")\n    ]\n)\ndata class UserProfileFieldRecord(\n    @ColumnInfo(name = \"name\")\n    val name: String,\n\n    @ColumnInfo(name = \"value\")\n    val value: String,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: Long,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true) val id: Long = 0L\n)\n\n@DatabaseView(\n    \"select user.*, nicknames.nickname from user left join nicknames on user.userName = nicknames.username and user.host = nicknames.host\",\n    viewName = \"user_view\"\n)\ndata class UserView(\n    @ColumnInfo(name = \"serverId\")\n    val serverId: String,\n\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"userName\")\n    val userName: String,\n\n    @ColumnInfo(name = \"name\")\n    val name: String?,\n\n    @ColumnInfo(name = \"avatarUrl\")\n    val avatarUrl: String?,\n\n    @ColumnInfo(name = \"isCat\")\n    val isCat: Boolean?,\n\n    @ColumnInfo(name = \"isBot\")\n    val isBot: Boolean?,\n\n    @ColumnInfo(name = \"host\")\n    val host: String,\n\n    @ColumnInfo(name = \"isSameHost\")\n    val isSameHost: Boolean,\n\n    @ColumnInfo(name = \"id\")\n    val id: Long,\n\n    @ColumnInfo(name = \"nickname\")\n    val nickname: String?,\n\n    @ColumnInfo(name = \"avatarBlurhash\")\n    val avatarBlurhash: String?\n)\n\n@Entity(\n    tableName = \"user_badge_role\",\n    foreignKeys = [\n        ForeignKey(\n            parentColumns = [\"id\"],\n            childColumns = [\"userId\"],\n            entity = UserRecord::class,\n            onUpdate = ForeignKey.CASCADE,\n            onDelete = ForeignKey.CASCADE,\n        )\n    ],\n    indices = [\n        Index(\"userId\")\n    ]\n)\ndata class BadgeRoleRecord(\n    @ColumnInfo(\"name\")\n    val name: String,\n\n    @ColumnInfo(\"iconUrl\")\n    val iconUrl: String?,\n\n    @ColumnInfo(\"displayOrder\")\n    val displayOrder: Int,\n\n    @ColumnInfo(\"userId\")\n    val userId: Long,\n\n    @ColumnInfo(name = \"id\")\n    @PrimaryKey(autoGenerate = true) val id: Long = 0,\n) {\n    fun isEqualToModel(model: User.BadgeRole): Boolean {\n        return name == model.name &&\n                iconUrl == model.iconUri &&\n                displayOrder == model.displayOrder\n    }\n}\n\ninterface HasUserModel {\n    fun toModel(): User\n}\n\ndata class UserSimpleRelated(\n    @Embedded val user: UserView,\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val emojis: List<UserEmojiRecord>,\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val instance: UserInstanceInfoRecord?,\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val badgeRoles: List<BadgeRoleRecord>,\n) : HasUserModel {\n    override fun toModel(): User.Simple {\n        val instanceInfo = instance?.let {\n            User.InstanceInfo(\n                faviconUrl = it.faviconUrl,\n                iconUrl = it.iconUrl,\n                name = it.name,\n                softwareName = it.softwareName,\n                softwareVersion = it.softwareVersion,\n                themeColor = it.themeColor\n            )\n        }\n        return User.Simple(\n            id = User.Id(\n                user.accountId,\n                user.serverId,\n            ),\n            userName = user.userName,\n            avatarUrl = user.avatarUrl,\n            emojis = emojis.map {\n                it.toModel()\n            },\n            host = user.host,\n            isBot = user.isBot,\n            isCat = user.isCat,\n            isSameHost = user.isSameHost,\n            name = user.name,\n            nickname = user.nickname?.let {\n                UserNickname(\n                    id = UserNickname.Id(user.userName, user.host),\n                    name = user.nickname\n                )\n            },\n            instance = instanceInfo,\n            avatarBlurhash = user.avatarBlurhash,\n            badgeRoles = badgeRoles.map {\n                User.BadgeRole(\n                    name = it.name,\n                    iconUri = it.iconUrl,\n                    displayOrder = it.displayOrder,\n                )\n            }\n        )\n    }\n}\n\ndata class UserRelated(\n    @Embedded val user: UserView,\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val emojis: List<UserEmojiRecord>,\n\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val info: UserInfoStateRecord?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val related: UserRelatedStateRecord?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val pinnedNoteIds: List<PinnedNoteIdRecord>,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val instance: UserInstanceInfoRecord?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\",\n    )\n    val fields: List<UserProfileFieldRecord>?,\n\n    @Relation(\n        parentColumn = \"id\",\n        entityColumn = \"userId\"\n    )\n    val badgeRoles: List<BadgeRoleRecord>,\n) : HasUserModel {\n    override fun toModel(): User {\n        val instanceInfo = instance?.let {\n            User.InstanceInfo(\n                faviconUrl = it.faviconUrl,\n                iconUrl = it.iconUrl,\n                name = it.name,\n                softwareName = it.softwareName,\n                softwareVersion = it.softwareVersion,\n                themeColor = it.themeColor\n            )\n        }\n        if (info == null) {\n            return User.Simple(\n                id = User.Id(\n                    user.accountId,\n                    user.serverId,\n                ),\n                userName = user.userName,\n                avatarUrl = user.avatarUrl,\n                emojis = emojis.map {\n                    it.toModel()\n                },\n                host = user.host,\n                isBot = user.isBot,\n                isCat = user.isCat,\n                isSameHost = user.isSameHost,\n                name = user.name,\n                nickname = user.nickname?.let {\n                    UserNickname(\n                        id = UserNickname.Id(user.userName, user.host),\n                        name = user.nickname\n                    )\n                },\n                instance = instanceInfo,\n                avatarBlurhash = user.avatarBlurhash,\n                badgeRoles = badgeRoles.map {\n                    User.BadgeRole(\n                        name = it.name,\n                        iconUri = it.iconUrl,\n                        displayOrder = it.displayOrder,\n                    )\n                }\n            )\n        } else {\n            return User.Detail(\n                id = User.Id(\n                    user.accountId,\n                    user.serverId,\n                ),\n                userName = user.userName,\n                avatarUrl = user.avatarUrl,\n                emojis = emojis.map {\n                    it.toModel()\n                },\n                host = user.host,\n                isBot = user.isBot,\n                isCat = user.isCat,\n                isSameHost = user.isSameHost,\n                name = user.name,\n                nickname = user.nickname?.let {\n                    UserNickname(\n                        id = UserNickname.Id(user.userName, user.host),\n                        name = user.nickname\n                    )\n                },\n                instance = instanceInfo,\n                avatarBlurhash = user.avatarBlurhash,\n                info = info.let { info ->\n                    User.Info(\n                        bannerUrl = info.bannerUrl,\n                        description = info.description,\n                        followingCount = info.followingCount,\n                        followersCount = info.followersCount,\n                        isLocked = info.isLocked,\n                        hostLower = info.hostLower,\n                        notesCount = info.notesCount,\n                        pinnedNoteIds = pinnedNoteIds.map {\n                            Note.Id(user.accountId, it.noteId)\n                        },\n                        url = info.url,\n                        birthday = info.birthday,\n                        createdAt = info.createdAt,\n                        updatedAt = info.updatedAt,\n                        fields = fields?.map {\n                            User.Field(it.name, it.value)\n                        } ?: emptyList(),\n                        isPublicReactions = info.publicReactions ?: false,\n                        ffVisibility = when (info.ffVisibility) {\n                            \"public\" -> User.FollowerFollowerVisibility.Public\n                            \"followers\" -> User.FollowerFollowerVisibility.Followers\n                            \"private\" -> User.FollowerFollowerVisibility.Private\n                            else -> null\n                        },\n                    )\n                },\n                related = related?.let { related ->\n                    User.Related(\n                        isFollowing = related.isFollowing,\n                        isFollower = related.isFollower,\n                        isBlocking = related.isBlocking,\n                        isMuting = related.isMuting,\n                        hasPendingFollowRequestFromYou = related.hasPendingFollowRequestFromYou,\n                        hasPendingFollowRequestToYou = related.hasPendingFollowRequestToYou,\n                        isNotify = related.isNotify ?: false,\n                    )\n                },\n                badgeRoles = badgeRoles.map {\n                    User.BadgeRole(\n                        name = it.name,\n                        iconUri = it.iconUrl,\n                        displayOrder = it.displayOrder,\n                    )\n                }\n            )\n        }\n    }\n\n    fun toSimpleModel(): User.Simple {\n        val instanceInfo = instance?.let {\n            User.InstanceInfo(\n                faviconUrl = it.faviconUrl,\n                iconUrl = it.iconUrl,\n                name = it.name,\n                softwareName = it.softwareName,\n                softwareVersion = it.softwareVersion,\n                themeColor = it.themeColor\n            )\n        }\n        return User.Simple(\n            id = User.Id(\n                user.accountId,\n                user.serverId,\n            ),\n            userName = user.userName,\n            avatarUrl = user.avatarUrl,\n            emojis = emojis.map {\n                it.toModel()\n            },\n            host = user.host,\n            isBot = user.isBot,\n            isCat = user.isCat,\n            isSameHost = user.isSameHost,\n            name = user.name,\n            nickname = user.nickname?.let {\n                UserNickname(\n                    id = UserNickname.Id(user.userName, user.host),\n                    name = user.nickname\n                )\n            },\n            instance = instanceInfo,\n            avatarBlurhash = user.avatarBlurhash,\n            badgeRoles = badgeRoles.map {\n                User.BadgeRole(\n                    name = it.name,\n                    iconUri = it.iconUrl,\n                    displayOrder = it.displayOrder,\n                )\n            },\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/follow/FollowApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.follow\n\nimport net.pantasystem.milktea.api.mastodon.accounts.FollowParamsRequest\nimport net.pantasystem.milktea.api.misskey.users.CancelFollow\nimport net.pantasystem.milktea.api.misskey.users.follow.FollowUserRequest\nimport net.pantasystem.milktea.api.misskey.users.follow.UnFollowUserRequest\nimport net.pantasystem.milktea.api.misskey.users.follow.UpdateUserFollowRequest\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.user.UserActionResult\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.follow.FollowUpdateParams\nimport javax.inject.Inject\n\ninternal interface FollowApiAdapter {\n\n    suspend fun follow(userId: User.Id): UserActionResult\n\n    suspend fun cancelFollowRequest(userId: User.Id): UserActionResult\n\n    suspend fun unfollow(userId: User.Id): UserActionResult\n\n    suspend fun update(userId: User.Id, params: FollowUpdateParams): UserActionResult\n\n}\n\ninternal class FollowApiAdapterImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n) : FollowApiAdapter {\n    override suspend fun follow(userId: User.Id): UserActionResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).followUser(\n                    FollowUserRequest(userId = userId.id, i = account.token)\n                ).throwIfHasError()\n                UserActionResult.Misskey\n            }\n\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                mastodonAPIProvider.get(account).follow(userId.id, FollowParamsRequest())\n                    .throwIfHasError().body().let {\n                        UserActionResult.Mastodon(requireNotNull(it))\n                    }\n            }\n        }\n    }\n\n    override suspend fun unfollow(userId: User.Id): UserActionResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account)\n                    .unFollowUser(UnFollowUserRequest(userId = userId.id, i = account.token))\n                    .throwIfHasError()\n                    .body()\n                UserActionResult.Misskey\n            }\n\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                mastodonAPIProvider.get(account).unfollow(userId.id)\n                    .throwIfHasError()\n                    .body().let {\n                        UserActionResult.Mastodon(requireNotNull(it))\n                    }\n\n            }\n        }\n    }\n\n    override suspend fun cancelFollowRequest(userId: User.Id): UserActionResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).cancelFollowRequest(\n                    CancelFollow(\n                        i = account.token,\n                        userId = userId.id\n                    )\n                ).throwIfHasError()\n                UserActionResult.Misskey\n            }\n\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                mastodonAPIProvider.get(account).unfollow(userId.id).throwIfHasError()\n                    .body().let {\n                        UserActionResult.Mastodon(requireNotNull(it))\n                    }\n            }\n        }\n    }\n\n    override suspend fun update(userId: User.Id, params: FollowUpdateParams): UserActionResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                mastodonAPIProvider.get(account).follow(\n                    userId.id, FollowParamsRequest(\n//                    reblogs = params.isReblog,\n                        notify = params.isNotify\n                    )\n                ).throwIfHasError()\n                    .body().let {\n                        UserActionResult.Mastodon(requireNotNull(it))\n                    }\n            }\n\n            Account.InstanceType.FIREFISH, Account.InstanceType.MISSKEY -> {\n                misskeyAPIProvider.get(account).updateFollowUser(\n                    UpdateUserFollowRequest(\n                        i = account.token,\n                        userId = userId.id,\n                        notify = params.isNotify?.let {\n                            if (it) \"normal\" else \"none\"\n                        },\n//                        withReplies = params.withReplies,\n                    )\n                ).throwIfHasError()\n                UserActionResult.Misskey\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/follow/FollowRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.follow\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.user.UserCacheUpdaterFromUserActionResult\nimport net.pantasystem.milktea.model.user.FollowState\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.model.user.follow.FollowRepository\nimport net.pantasystem.milktea.model.user.follow.FollowUpdateParams\nimport javax.inject.Inject\n\ninternal class FollowRepositoryImpl @Inject constructor(\n    private val userRepository: UserRepository,\n    private val followApiAdapter: FollowApiAdapter,\n    private val userCacheUpdaterFromUserActionResult: UserCacheUpdaterFromUserActionResult,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher,\n): FollowRepository {\n    override suspend fun create(userId: User.Id): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val user = userRepository.find(userId, true) as User.Detail\n            val result = followApiAdapter.follow(userId)\n            userCacheUpdaterFromUserActionResult(userId, result) { u ->\n                u.copy(\n                    related = (if (user.info.isLocked) user.related?.isFollowing else true)?.let {\n                        (if (user.info.isLocked) true else user.related?.hasPendingFollowRequestFromYou)?.let { it1 ->\n                            user.related?.copy(\n                                isFollowing = it,\n                                hasPendingFollowRequestFromYou = it1\n                            )\n                        }\n                    }\n                )\n            }\n        }\n    }\n\n    override suspend fun delete(userId: User.Id): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val user = userRepository.find(userId, true) as User.Detail\n            val result = if (user.info.isLocked) {\n                followApiAdapter.cancelFollowRequest(userId)\n            } else {\n                followApiAdapter.unfollow(userId)\n            }\n            userCacheUpdaterFromUserActionResult(userId, result) { u ->\n                u.copy(\n                    related = u.related?.let{\n                        it.copy(\n                            isFollowing = if (u.info.isLocked) it.isFollowing else false,\n                            hasPendingFollowRequestFromYou = if (u.info.isLocked) false else it.hasPendingFollowRequestFromYou\n                        )\n                    }\n                )\n            }\n        }\n    }\n\n    override suspend fun update(userId: User.Id, params: FollowUpdateParams): Result<Unit> = runCancellableCatching {\n        val user = userRepository.find(userId, true) as User.Detail\n        if (user.followState != FollowState.FOLLOWING) {\n            throw IllegalStateException(\"You can't update follow state of user who is not following.\")\n        }\n        withContext(coroutineDispatcher) {\n            val result = followApiAdapter.update(userId, params)\n            userCacheUpdaterFromUserActionResult(userId, result) { u ->\n                u.copy(\n                    related = u.related?.copy(\n                        isNotify = params.isNotify ?: false,\n                    )\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/mute/MuteApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.mute\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.mastodon.accounts.MuteAccountRequest\nimport net.pantasystem.milktea.api.misskey.users.CreateMuteUserRequest\nimport net.pantasystem.milktea.api.misskey.users.RequestUser\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.user.UserActionResult\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.mute.CreateMute\nimport javax.inject.Inject\n\ninternal interface MuteApiAdapter {\n    suspend fun muteUser(createMute: CreateMute): UserActionResult\n    suspend fun unmuteUser(userId: User.Id): UnMuteResult\n}\n\ninternal class MuteApiAdapterImpl @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val mastodonAPIProvider: MastodonAPIProvider,\n) : MuteApiAdapter {\n\n    override suspend fun muteUser(createMute: CreateMute): UserActionResult {\n        val account = accountRepository.get(createMute.userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                require(createMute.notifications == null) {\n                    \"Misskey does not support notifications mute account parameter\"\n                }\n                misskeyAPIProvider.get(account).muteUser(\n                    CreateMuteUserRequest(\n                        i = account.token,\n                        userId = createMute.userId.id,\n                        expiresAt = createMute.expiresAt?.toEpochMilliseconds()\n                    )\n                ).throwIfHasError()\n                UserActionResult.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val body = mastodonAPIProvider.get(account).muteAccount(\n                    createMute.userId.id,\n                    MuteAccountRequest(\n                        duration = createMute.expiresAt?.let {\n                            Clock.System.now().epochSeconds - it.epochSeconds\n                        } ?: 0,\n                        notifications = createMute.notifications ?: true\n                    )\n                ).throwIfHasError().body()\n                UserActionResult.Mastodon(requireNotNull(body))\n            }\n        }\n    }\n\n    override suspend fun unmuteUser(userId: User.Id): UnMuteResult {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                misskeyAPIProvider.get(account).unmuteUser(\n                    RequestUser(\n                        i = account.token,\n                        userId = userId.id,\n                    )\n                ).throwIfHasError()\n                UserActionResult.Misskey\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                val body = mastodonAPIProvider.get(account).unmuteAccount(userId.id)\n                    .throwIfHasError()\n                    .body()\n                UserActionResult.Mastodon(requireNotNull(body))\n            }\n        }\n    }\n}\n\ntypealias UnMuteResult = UserActionResult"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/mute/MuteRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.mute\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.user.UserCacheUpdaterFromUserActionResult\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.mute.CreateMute\nimport net.pantasystem.milktea.model.user.mute.MuteRepository\nimport javax.inject.Inject\n\ninternal class MuteRepositoryImpl @Inject constructor(\n    private val muteApiAdapter: MuteApiAdapter,\n    private val updateCacheFrom: UserCacheUpdaterFromUserActionResult,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher,\n    loggerFactory: Logger.Factory,\n) : MuteRepository {\n\n    private val logger by lazy {\n        loggerFactory.create(\"MuteRepositoryImpl\")\n    }\n\n    override suspend fun create(createMute: CreateMute): Result<Unit> {\n        return runCancellableCatching {\n            withContext(coroutineDispatcher) {\n                updateCacheFrom(createMute.userId, muteApiAdapter.muteUser(createMute)) {\n                    it.copy(\n                        related = it.related?.copy(\n                            isMuting = true\n                        )\n                    )\n                }\n            }\n        }.onFailure {\n            logger.error(\"ユーザーのミュートに失敗\", it)\n        }\n    }\n\n    override suspend fun delete(userId: User.Id): Result<Unit> {\n        return runCancellableCatching {\n            withContext(coroutineDispatcher) {\n                updateCacheFrom(userId, muteApiAdapter.unmuteUser(userId)) {\n                    it.copy(\n                        related = it.related?.copy(\n                            isMuting = false\n                        )\n                    )\n                }\n            }\n        }.onFailure {\n            logger.error(\"unmute failed\", it)\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/FindAllRemoteRenoteMutes.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\n\ninternal interface FindAllRemoteRenoteMutesDelegate {\n    suspend operator fun invoke(account: Account): List<RenoteMuteDTO>\n}\ninternal class FindAllRemoteRenoteMutesDelegateImpl @Inject constructor(\n    private val renoteMuteApiAdapter: RenoteMuteApiAdapter,\n) : FindAllRemoteRenoteMutesDelegate {\n\n    override suspend operator fun invoke(account: Account): List<RenoteMuteDTO> {\n        var mutes: List<RenoteMuteDTO> = emptyList()\n        while (true) {\n            val res = renoteMuteApiAdapter.findBy(\n                account.accountId,\n                untilId = mutes.lastOrNull()?.id\n            )\n\n            mutes = mutes + res\n            if (res.isEmpty() || res.size < 11) {\n                break\n            }\n        }\n        return mutes\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/IsSupportRenoteMuteInstance.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.instance.Version\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.nodeinfo.getVersion\nimport javax.inject.Inject\n\ninterface IsSupportRenoteMuteInstance {\n    suspend operator fun invoke(accountId: Long): Boolean\n}\n\nclass IsSupportRenoteMuteInstanceImpl @Inject constructor(\n    private val getAccount: GetAccount,\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val loggerFactory: Logger.Factory,\n): IsSupportRenoteMuteInstance {\n\n    private val logger by lazy {\n        loggerFactory.create(\"IsSupportRenoteMuteInstance\")\n    }\n    override suspend fun invoke(accountId: Long): Boolean {\n        return runCancellableCatching {\n            val account = getAccount.get(accountId)\n            val nodeInfo = nodeInfoRepository.find(account.getHost()).getOrThrow()\n            nodeInfo.type is NodeInfo.SoftwareType.Misskey.Normal\n                    && nodeInfo.type.getVersion() >= Version(\"13.10.0\")\n        }.onFailure {\n            logger.error(\"Failed to check support renote mute instance\", it)\n        }.getOrElse {\n            false\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/RenoteMuteApiAdapter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.CreateRenoteMuteRequest\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.DeleteRenoteMuteRequest\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMutesRequest\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\ninterface RenoteMuteApiAdapter {\n    suspend fun create(userId: User.Id)\n    suspend fun delete(userId: User.Id)\n    suspend fun findBy(\n        accountId: Long,\n        sinceId: String? = null,\n        untilId: String? = null,\n    ): List<RenoteMuteDTO>\n}\n\nclass RenoteMuteApiAdapterImpl @Inject constructor(\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val accountRepository: AccountRepository,\n): RenoteMuteApiAdapter {\n\n    override suspend fun create(userId: User.Id) {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        misskeyAPIProvider.get(account).createRenoteMute(\n            CreateRenoteMuteRequest(\n                i = account.token,\n                userId = userId.id\n            )\n        ).throwIfHasError()\n    }\n\n    override suspend fun delete(userId: User.Id) {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        misskeyAPIProvider.get(account).deleteRenoteMute(\n            DeleteRenoteMuteRequest(\n                i = account.token,\n                userId = userId.id\n            )\n        ).throwIfHasError()\n    }\n\n    override suspend fun findBy(\n        accountId: Long,\n        sinceId: String?,\n        untilId: String?,\n    ): List<RenoteMuteDTO> {\n        val account = accountRepository.get(accountId).getOrThrow()\n        return requireNotNull(\n            misskeyAPIProvider.get(account).getRenoteMutes(\n                RenoteMutesRequest(\n                    i = account.token,\n                    untilId = untilId,\n                    sinceId = sinceId\n                )\n            ).throwIfHasError().body()\n        )\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/RenoteMuteCache.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass RenoteMuteCache @Inject constructor() {\n\n    private var map = mapOf<User.Id, RenoteMute>()\n    private var notFounds = setOf<User.Id>()\n    private var latestStateAccountIds = setOf<Long>()\n\n    fun clearBy(accountId: Long) {\n        synchronized(this) {\n            val newMap = map.filterNot {\n                it.key.accountId == accountId\n            }\n            notFounds = notFounds + map.map {\n                it.key\n            }.filter {\n                it.accountId == accountId\n            }\n            map = newMap\n        }\n    }\n\n    fun add(renoteMute: RenoteMute) {\n        synchronized(this) {\n            notFounds = notFounds.toMutableSet().also {\n                it.remove(renoteMute.userId)\n            }\n            map = map.toMutableMap().also {\n                it[renoteMute.userId] = renoteMute\n            }\n        }\n    }\n\n    fun addAll(list: List<RenoteMute>, isAll: Boolean = false) {\n        synchronized(this) {\n            val mutableNotFounds = notFounds.toMutableSet()\n            val cache = map.toMutableMap()\n            for (el in list) {\n                mutableNotFounds.remove(el.userId)\n                cache[el.userId] = el\n            }\n            map = cache\n            notFounds = mutableNotFounds\n\n            if (isAll) {\n                val accountIds = list.map {\n                    it.userId.accountId\n                }\n                latestStateAccountIds = accountIds.toSet()\n                notFounds = notFounds.filterNot {\n                    latestStateAccountIds.contains(it.accountId)\n                }.toSet()\n            } else {\n                val accountIds = list.map {\n                    it.userId.accountId\n                }\n                latestStateAccountIds = latestStateAccountIds.filterNot {\n                    accountIds.contains(it)\n                }.toSet()\n            }\n        }\n    }\n\n    fun exists(userId: User.Id): Boolean {\n        if (notFounds.contains(userId)) {\n            return false\n        }\n        return map[userId] != null\n    }\n\n    fun isNotFound(userId: User.Id): Boolean {\n        if (latestStateAccountIds.contains(userId.accountId)) {\n            return !exists(userId)\n        }\n        return notFounds.contains(userId)\n    }\n\n    fun remove(userId: User.Id) {\n        synchronized(this) {\n            if (!latestStateAccountIds.contains(userId.accountId)) {\n                notFounds = notFounds.toMutableSet().also {\n                    it.add(userId)\n                }\n            }\n            map = map.toMutableMap().also {\n                it.remove(userId)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/RenoteMuteRepositoryImpl.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate.CreateRenoteMuteAndPushToRemoteDelegate\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate.FindRenoteMuteAndUpdateMemCacheDelegate\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate.SyncRenoteMuteDelegate\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMuteRepository\nimport javax.inject.Inject\n\ninternal class RenoteMuteRepositoryImpl @Inject constructor(\n    private val renoteMuteDao: RenoteMuteDao,\n    private val renoteMuteApiAdapter: RenoteMuteApiAdapter,\n    private val isSupportRenoteMuteInstance: IsSupportRenoteMuteInstance,\n    private val cache: RenoteMuteCache,\n    private val findRenoteMuteAndUpdateMemCache: FindRenoteMuteAndUpdateMemCacheDelegate,\n    private val createAndPushToRemote: CreateRenoteMuteAndPushToRemoteDelegate,\n    private val syncRenoteMuteDelegate: SyncRenoteMuteDelegate,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher,\n) : RenoteMuteRepository {\n\n    override suspend fun syncBy(accountId: Long): Result<Unit> = syncRenoteMuteDelegate(accountId)\n\n    override suspend fun syncBy(userId: User.Id): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            if (!isSupportRenoteMuteInstance(userId.accountId)) {\n                return@withContext\n            }\n        }\n    }\n\n    override suspend fun findBy(accountId: Long): Result<List<RenoteMute>> =\n        runCancellableCatching {\n            withContext(coroutineDispatcher) {\n                renoteMuteDao.findByAccount(accountId).map {\n                    it.toModel()\n                }.also {\n                    cache.clearBy(accountId)\n                    cache.addAll(it, true)\n                }\n            }\n        }\n\n    override suspend fun delete(userId: User.Id): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val existing = findRenoteMuteAndUpdateMemCache(userId).getOrNull()\n\n            if (existing != null) {\n                renoteMuteDao.delete(userId.accountId, userId.id)\n                cache.remove(userId)\n            }\n\n            try {\n                renoteMuteApiAdapter.delete(userId)\n            } catch (_: APIError.NotFoundException) {\n            }\n        }\n    }\n\n    override suspend fun findOne(userId: User.Id): Result<RenoteMute> = findRenoteMuteAndUpdateMemCache(userId)\n\n    override suspend fun create(userId: User.Id): Result<RenoteMute> = createAndPushToRemote(userId)\n\n    override suspend fun exists(userId: User.Id): Result<Boolean> = runCancellableCatching {\n        (cache.exists(userId)\n                && !cache.isNotFound(userId))\n                || findRenoteMuteAndUpdateMemCache(userId).getOrNull() != null\n    }\n\n    override fun observeBy(accountId: Long): Flow<List<RenoteMute>> {\n        return renoteMuteDao.observeBy(accountId).map { list ->\n            list.map {\n                it.toModel()\n            }\n        }.onEach {\n            cache.clearBy(accountId)\n            cache.addAll(it, true)\n        }.flowOn(coroutineDispatcher)\n    }\n\n    override fun observeOne(userId: User.Id): Flow<RenoteMute?> {\n        return renoteMuteDao.observeByUser(userId.accountId, userId.id).map {\n            it?.toModel()\n        }.onEach {\n            if (it == null) {\n                cache.remove(userId)\n            } else {\n                cache.add(it)\n            }\n        }.flowOn(coroutineDispatcher)\n    }\n\n}\n\ninternal fun RenoteMuteDTO.toModel(accountId: Long): RenoteMute {\n    return RenoteMute(\n        User.Id(accountId, muteeId),\n        createdAt = createdAt,\n        postedAt = createdAt,\n    )\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/UnPushedRenoteMutesDiffFilter.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport javax.inject.Inject\n\n/**\n * リモートのミュートの追加状態とローカルの未同期状態のRenoteMuteを比較して\n * ローカルでも未同期状態かつリモートにも存在しないリソースを洗い出す\n */\nclass UnPushedRenoteMutesDiffFilter @Inject constructor() {\n\n    operator fun invoke(mutes: List<RenoteMuteDTO>, locals: List<RenoteMute>): List<RenoteMute> {\n        return locals.filter {\n            it.postedAt == null\n        }.filterNot { mute ->\n            mutes.any { dto ->\n                mute.userId.id == dto.muteeId\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/db/RenoteMuteDao.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.db\n\nimport androidx.room.*\nimport kotlinx.coroutines.flow.Flow\n\n@Dao\ninterface RenoteMuteDao {\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long\n\n    @Insert(onConflict = OnConflictStrategy.IGNORE)\n    suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long>\n\n    @Update\n    suspend fun update(renoteMuteRecord: RenoteMuteRecord)\n\n    @Query(\"\"\"\n        select * from renote_mute_users where accountId = :accountId\n    \"\"\")\n    suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord>\n\n    @Query(\"\"\"\n        select * from renote_mute_users where accountId = :accountId\n            and userId = :userId\n    \"\"\")\n    suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord?\n\n    @Query(\"\"\"\n        select * from renote_mute_users where accountId = :accountId\n            and userId = :userId\n    \"\"\")\n    fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?>\n\n    @Query(\"\"\"\n        delete from renote_mute_users where accountId = :accountId\n            and userId = :userId\n    \"\"\")\n    suspend fun delete(accountId: Long, userId: String)\n\n    @Query(\"\"\"\n        delete from renote_mute_users where accountId = :accountId\n    \"\"\")\n    suspend fun deleteBy(accountId: Long)\n\n    @Query(\"\"\"\n        select * from renote_mute_users where accountId = :accountId\n    \"\"\")\n    fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>>\n\n    @Query(\"\"\"\n        select * from renote_mute_users where accountId = :accountId\n            and postedAt is null\n    \"\"\")\n    suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord>\n\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/db/RenoteMuteRecord.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.db\n\nimport androidx.room.ColumnInfo\nimport androidx.room.Entity\nimport androidx.room.Index\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\n\n@Entity(\n    tableName = \"renote_mute_users\",\n    primaryKeys = [\n        \"userId\", \"accountId\"\n    ],\n    indices = [\n        Index(\"postedAt\"),\n        Index(\"accountId\")\n    ]\n)\ndata class RenoteMuteRecord(\n    @ColumnInfo(name = \"accountId\")\n    val accountId: Long,\n\n    @ColumnInfo(name = \"userId\")\n    val userId: String,\n\n    @ColumnInfo(name = \"createdAt\")\n    val createdAt: Instant,\n\n    @ColumnInfo(name = \"postedAt\")\n    val postedAt: Instant?,\n) {\n\n    fun toModel(): RenoteMute {\n        return RenoteMute(\n            User.Id(accountId, userId),\n            createdAt = createdAt,\n            postedAt = postedAt,\n        )\n    }\n\n    companion object {\n        fun from(model: RenoteMute): RenoteMuteRecord {\n            return RenoteMuteRecord(\n                accountId = model.userId.accountId,\n                userId = model.userId.id,\n                createdAt = model.createdAt,\n                postedAt = model.postedAt,\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/delegate/CreateRenoteMuteAndPushToRemoteDelegate.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.IsSupportRenoteMuteInstance\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.RenoteMuteApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteRecord\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport javax.inject.Inject\n\ninterface CreateRenoteMuteAndPushToRemoteDelegate {\n    suspend operator fun invoke(userId: User.Id): Result<RenoteMute>\n}\n\ninternal class CreateRenoteMuteAndPushToRemoteDelegateImpl @Inject constructor(\n    private val getAccount: GetAccount,\n    private val renoteMuteDao: RenoteMuteDao,\n    private val findRenoteMuteAndUpdateMemCache: FindRenoteMuteAndUpdateMemCacheDelegate,\n    private val isSupportRenoteMuteInstance: IsSupportRenoteMuteInstance,\n    private val renoteMuteApiAdapter: RenoteMuteApiAdapter,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher\n) : CreateRenoteMuteAndPushToRemoteDelegate {\n    override suspend operator fun invoke(userId: User.Id) = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            val account = getAccount.get(userId.accountId)\n            val isNeedPush = when (val exists = findRenoteMuteAndUpdateMemCache(userId).getOrNull()) {\n                null -> {\n                    renoteMuteDao.insert(\n                        RenoteMuteRecord.from(\n                            RenoteMute(\n                                userId,\n                                createdAt = Clock.System.now(),\n                                postedAt = null,\n                            )\n                        )\n                    )\n                    true\n                }\n                else -> {\n                    exists.postedAt == null\n                }\n            }\n            val created = findRenoteMuteAndUpdateMemCache(userId).getOrThrow()\n            if (isNeedPush && isSupportRenoteMuteInstance(account.accountId)) {\n                renoteMuteApiAdapter.create(\n                    userId\n                )\n                // APIへの送信に成功したのでpostedAtに成功した日時を記録する\n                renoteMuteDao.update(\n                    RenoteMuteRecord.from(\n                        created.copy(\n                            postedAt = Clock.System.now()\n                        )\n                    )\n                )\n            }\n\n            findRenoteMuteAndUpdateMemCache(userId).getOrThrow()\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/delegate/FindRenoteMuteAndUpdateMemCacheDelegate.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate\n\nimport kotlinx.coroutines.CoroutineDispatcher\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.RenoteMuteCache\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport javax.inject.Inject\n\ninternal interface FindRenoteMuteAndUpdateMemCacheDelegate {\n    suspend operator fun invoke(userId: User.Id): Result<RenoteMute>\n}\n\ninternal class FindRenoteMuteAndUpdateMemCacheDelegateImpl @Inject constructor(\n    private val renoteMuteDao: RenoteMuteDao,\n    private val cache: RenoteMuteCache,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher,\n) : FindRenoteMuteAndUpdateMemCacheDelegate {\n    override suspend operator fun invoke(userId: User.Id): Result<RenoteMute> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            // NOTE: APIにIdを指定して取得する仕組みがないのでローカルのみから取得する\n            val result = renoteMuteDao.findByUser(userId.accountId, userId.id)?.toModel()\n            if (result == null) {\n                cache.remove(userId)\n            } else {\n                cache.add(result)\n            }\n            result?: throw NoSuchElementException(\"RenoteMuteは存在しません:$userId\")\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/delegate/SyncRenoteMuteDelegate.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate\n\nimport kotlinx.coroutines.*\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.hilt.IODispatcher\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.*\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteRecord\nimport net.pantasystem.milktea.model.account.GetAccount\nimport javax.inject.Inject\n\ninternal interface SyncRenoteMuteDelegate {\n    suspend operator fun invoke(accountId: Long): Result<Unit>\n}\n\ninternal class SyncRenoteMuteDelegateImpl @Inject constructor(\n    private val getAccount: GetAccount,\n    private val cache: RenoteMuteCache,\n    private val renoteMuteDao: RenoteMuteDao,\n    private val createAndPushToRemote: CreateRenoteMuteAndPushToRemoteDelegate,\n    private val unPushedRenoteMutesDiffFilter: UnPushedRenoteMutesDiffFilter,\n    private val isSupportRenoteMuteInstance: IsSupportRenoteMuteInstance,\n    private val findAllRemoteRenoteMutesDelegate: FindAllRemoteRenoteMutesDelegate,\n    @IODispatcher private val coroutineDispatcher: CoroutineDispatcher\n) : SyncRenoteMuteDelegate {\n    override suspend fun invoke(accountId: Long): Result<Unit> = runCancellableCatching {\n        withContext(coroutineDispatcher) {\n            // NOTE: キャッシュを更新しておく\n            renoteMuteDao.findByAccount(accountId).map {\n                it.toModel()\n            }.also {\n                cache.clearBy(accountId)\n                cache.addAll(it, true)\n            }\n\n            if (!isSupportRenoteMuteInstance(accountId)) {\n                return@withContext\n            }\n\n            val account = getAccount.get(accountId)\n\n            val mutes: List<RenoteMuteDTO> = findAllRemoteRenoteMutesDelegate(\n                account,\n            )\n\n            val unPushedRenoteMutes = unPushedRenoteMutesDiffFilter(\n                mutes,\n                renoteMuteDao.findByUnPushed(account.accountId)\n                    .map {\n                        it.toModel()\n                    }\n            )\n\n            val pushed = coroutineScope {\n                unPushedRenoteMutes.map {\n                    async {\n                        createAndPushToRemote(it.userId)\n                    }\n                }\n            }.awaitAll().map {\n                it.getOrThrow()\n            }\n\n            renoteMuteDao.deleteBy(account.accountId)\n            cache.clearBy(account.accountId)\n\n            // FIXME: remote < localの場合データの不整合が発生してしまう可能性がある\n            val newModels = mutes.map {\n                it.toModel(account.accountId)\n            } + pushed\n            renoteMuteDao.insertAll(\n                newModels.map {\n                    RenoteMuteRecord.from(it)\n                }\n            )\n            cache.addAll(newModels, true)\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/streaming/ChannelAPIWithAccountProvider.kt",
    "content": "package net.pantasystem.milktea.data.streaming\n\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api_streaming.channel.ChannelAPI\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\n\n\nclass ChannelAPIWithAccountProvider @Inject constructor(\n    private val socketWithAccountProvider: SocketWithAccountProvider,\n    private val loggerFactory: Logger.Factory\n) {\n\n    private val accountWithChannelAPI = mutableMapOf<Long, ChannelAPI>()\n    private val logger = loggerFactory.create(\"ChannelAPIWithAccountProvider\")\n    private val mutex = Mutex()\n\n    suspend fun get(account: Account): ChannelAPI? {\n        mutex.withLock {\n            logger.debug { \"ChannelAPIWithAccountProvider get accountId=${account.accountId} hash=${hashCode()}\" }\n            var channelAPI = accountWithChannelAPI[account.accountId]\n            val socketAPI = socketWithAccountProvider.get(account)\n                ?: return null\n\n            // Socketのインスタンスが変わっていた場合、Tokenなどに更新があった可能性があるので再生成する\n            if (channelAPI != null && channelAPI.socket == socketAPI) {\n                return channelAPI\n            }\n            channelAPI = ChannelAPI(socketAPI, loggerFactory)\n            require(accountWithChannelAPI.put(account.accountId, channelAPI) == null)\n            return channelAPI\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/streaming/SocketWithAccountProvider.kt",
    "content": "package net.pantasystem.milktea.data.streaming\n\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.model.account.Account\n\ninterface SocketWithAccountProvider {\n\n    fun get(account: Account) : Socket?\n\n    fun get(accountId: Long) : Socket?\n\n    fun all(): List<Socket>\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/streaming/StreamingAPIProvider.kt",
    "content": "package net.pantasystem.milktea.data.streaming\n\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.api_streaming.mastodon.StreamingAPI\nimport net.pantasystem.milktea.api_streaming.mastodon.StreamingAPIImpl\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.Account\nimport okhttp3.OkHttpClient\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass StreamingAPIProvider @Inject constructor(\n    val okHttpClientProvider: OkHttpClientProvider,\n    val loggerFactory: Logger.Factory,\n) {\n\n    private var accountAndStreamingAPIs = mutableMapOf<Long, StreamingAPI>()\n\n    fun get(account: Account): StreamingAPI? {\n        synchronized(this) {\n            if (account.instanceType == Account.InstanceType.MISSKEY) {\n                return null\n            }\n            var streaming = accountAndStreamingAPIs[account.accountId]\n            if (streaming != null) {\n                return streaming\n            }\n\n            streaming = StreamingAPIImpl(\n                host = account.getHost(),\n                token = account.token,\n                okHttpClient = OkHttpClient.Builder().readTimeout(1, TimeUnit.HOURS).addInterceptor {\n                    val request = it.request()\n                    val newReq = request.newBuilder()\n                        .header(\"Authorization\", \"Bearer ${account.token}\")\n                        .build()\n                    it.proceed(newReq)\n                }.build(),\n                loggerFactory\n            )\n            accountAndStreamingAPIs[account.accountId] = streaming\n            return streaming\n        }\n\n    }\n}"
  },
  {
    "path": "modules/data/src/main/java/net/pantasystem/milktea/data/streaming/impl/SocketWithAccountProviderImpl.kt",
    "content": "package net.pantasystem.milktea.data.streaming.impl\n\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport net.pantasystem.milktea.api_streaming.Socket\nimport net.pantasystem.milktea.api_streaming.network.SocketImpl\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.model.instance.Version\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.nodeinfo.getVersion\nimport javax.inject.Inject\nimport net.pantasystem.milktea.data.streaming.SocketWithAccountProvider as ISocketWithAccountProvider\n\n/**\n * SocketをAccountに基づきいい感じにリソースを取得できるようにする\n */\nclass SocketWithAccountProviderImpl @Inject constructor(\n    val loggerFactory: Logger.Factory,\n    val okHttpClientProvider: OkHttpClientProvider,\n    val nodeInfoRepository: NodeInfoRepository,\n) : ISocketWithAccountProvider{\n\n    private val logger = loggerFactory.create(\"SocketProvider\")\n\n    private val accountIdWithSocket = mutableMapOf<Long, SocketImpl>()\n\n    /**\n     * accountIdとそのTokenを管理している。\n     * ここにTokenを入れておいてTokenが更新されていないかをチェックする\n     */\n    private val accountIdWithToken = mutableMapOf<Long, String>()\n\n    override fun get(accountId: Long): Socket? {\n        synchronized(accountIdWithSocket) {\n            return accountIdWithSocket[accountId]\n        }\n    }\n\n    override fun get(account: Account): Socket? {\n        if (account.instanceType == Account.InstanceType.MASTODON) {\n            return null\n        }\n        synchronized(accountIdWithSocket) {\n            var socket = accountIdWithSocket[account.accountId]\n            if (socket != null) {\n                // NOTE: tokenが異なる場合は再認証された可能性があるので、再生成を行う\n                if (account.token == accountIdWithToken[account.accountId]) {\n                    logger.debug { \"すでにインスタンス化済み\" }\n                    return socket\n                } else {\n                    socket.destroy()\n                }\n            }\n\n            var uri = \"wss://\" + account.getHost() + \"/streaming\"\n            try {\n                val i = account.token\n                uri = \"${uri}?i=$i\"\n\n            }catch (e: UnauthorizedException) {\n                logger.debug { \"未認証アカウント:id=${account.accountId}, baseURL=${account.instanceDomain}\" }\n            }\n            //logger.debug(\"url:$uri\")\n\n            socket = SocketImpl(\n                url = uri,\n                isRequirePingPong = {\n                    nodeInfoRepository.get(account.getHost())?.let {\n                        !(it.type is NodeInfo.SoftwareType.Misskey.Normal && it.type.getVersion() >= Version(\"13.13.2\"))\n                    } ?: true\n                },\n                okHttpClientProvider = okHttpClientProvider,\n                loggerFactory = loggerFactory,\n            )\n            accountIdWithSocket[account.accountId] = socket\n            accountIdWithToken[account.accountId] = account.token\n\n            return socket\n        }\n\n\n\n    }\n\n    override fun all(): List<Socket> {\n        synchronized(accountIdWithSocket) {\n            return accountIdWithSocket.values.toList()\n        }\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/api/milktea/InstanceInfoResponseTest.kt",
    "content": "package net.pantasystem.milktea.api.milktea\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass InstanceInfoResponseTest {\n\n    @Test\n    fun decode() {\n        val json = \"\"\"[\n    {\n        \"id\": \"80b426ba-be2d-4c9c-90c0-c34f9b77610c\",\n        \"host\": \"misskey.io\",\n        \"name\": \"Misskey.io\",\n        \"description\": \"Misskey.io は、地球で生まれた分散マイクロブログSNSです。Fediverse（様々なSNSで構成される宇宙）の中に存在するため、他のSNSと相互に繋がっています。\\n<br>\\n暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。<br>\\n<br>\\n<a href=\\\"https://go.misskey.io/support\\\" target=\\\"_blank\\\">お問い合わせはこちら<br>https://go.misskey.io/support</a><br>\\n<br>\\n<br>\\nPowered  by Misskey\",\n        \"clientMaxBodyByteSize\": null,\n        \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n        \"themeColor\": \"#86b300\"\n    },\n    {\n        \"id\": \"43a16327-d571-44e8-8231-add1962650e2\",\n        \"host\": \"misskey.pantasystem.com\",\n        \"name\": \"パン太は人間\",\n        \"description\": \"パン太が実験的に構築したMisskeyの鯖だよ\\n落ちてたらごめんね・・\\n\",\n        \"clientMaxBodyByteSize\": null,\n        \"iconUrl\": \"https://misskey.pantasystem.com/files/20ab4e6b-0ff3-4ce2-ac0d-dcb9efab0d0e\",\n        \"themeColor\": null\n    },\n    {\n        \"id\": \"a556cdfc-74d9-457c-bb9b-1ca3d6630f69\",\n        \"host\": \"misskey.dev\",\n        \"name\": \"misskey.dev\",\n        \"description\": \"<h3>Misskey for Developers and any people!</h3>\\n<div style=\\\"margin:-8px 0;\\\">開発者じゃなくても大丈夫！社畜でも大丈夫！開発者じゃなくても社畜じゃなくても大丈夫！なMisskey(ミスキー)インスタンスです。当インスタンスでは現在、Misskey めいv11が稼働しております。\\n<span class=\\\"h4\\\" style=\\\"font-size:1.2em;\\\"><a href=\\\"https://misskey.dev/notes/5c79e2a0fe0a36003970239f\\\">How to Use</a> \\n   |   <a href=\\\"https://misskey.dev/notes/5c79e505c9c298003288f8c8\\\">使い方</a>\\n   |   <a href=\\\"https://misskey.dev/@cv_k/pages/info\\\">Info・情報</a>\\n   \\n<small style=\\\"opacity:40%;font-size:70%;\\\">powered by <a href=\\\"https://misskey.online\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\" style=\\\"color:#ccfefd;\\\">MisskeyHost</a></small>\",\n        \"clientMaxBodyByteSize\": null,\n        \"iconUrl\": \"https://s3.arkjp.net/dev/16383030-9d8c-4988-813e-31cf7fa3cbd6.ico\",\n        \"themeColor\": null\n    },\n    {\n        \"id\": \"8e3928c5-f9f2-416d-9b1b-12ef8e73788a\",\n        \"host\": \"misskey.m544.net\",\n        \"name\": \"めいすきー\",\n        \"description\": \"お淑やかなめいめいさん推しのためのめいめい邸ガレージなのだわ。ローカルタイムラインのない <a href=\\\"https://meisskey.one\\\"  target=\\\"_blank\\\" rel=\\\"noopener\\\">meisskey.one</a> もあるのだわ。\",\n        \"clientMaxBodyByteSize\": 100000000,\n        \"iconUrl\": \"https://misskey-drive.m544.net/files/969b8097-464a-467d-bd88-530058aa9c84.ico\",\n        \"themeColor\": null\n    }\n]\"\"\"\n\n        val decoder = Json {\n            ignoreUnknownKeys = true\n        }\n        val result: List<InstanceInfoResponse> = decoder.decodeFromString(json)\n        Assertions.assertEquals(4, result.size)\n        Assertions.assertEquals(\"めいすきー\", result[3].name)\n        Assertions.assertEquals(\"https://misskey-drive.m544.net/files/969b8097-464a-467d-bd88-530058aa9c84.ico\", result[3].iconUrl)\n        Assertions.assertEquals(100000000L, result[3].clientMaxBodyByteSize)\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/api/misskey/notes/CreateNoteTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.encodeToString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass CreateNoteTest {\n\n    @Test\n    fun parseTest() {\n        val json = Json {\n            ignoreUnknownKeys = true\n        }\n        val createNote = CreateNote(\n            i = \"test\",\n            text = \"hogehoge\",\n            visibility = \"specified\",\n            renoteId = \"renote-id\"\n        )\n        val str = json.encodeToString(createNote)\n        Assertions.assertEquals(\n            \"\"\"{\"i\":\"test\",\"visibility\":\"specified\",\"text\":\"hogehoge\",\"renoteId\":\"renote-id\"}\"\"\",\n            str\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/api/misskey/notes/PollDTOTest.kt",
    "content": "package net.pantasystem.milktea.api.misskey.notes\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass PollDTOTest {\n\n    private val decoder by lazy {\n        Json {\n            ignoreUnknownKeys = true\n        }\n    }\n\n    @Test\n    fun decodeJsonTestGiveV10() {\n        val text = \"\"\"{\n            \"choices\": [\n                {\n                    \"id\": 0,\n                    \"text\": \"ジューシーな高田馬場\",\n                    \"votes\": 1,\n                    \"isVoted\": true\n                },\n                {\n                    \"id\": 1,\n                    \"text\": \"偽のノーパソ\",\n                    \"votes\": 0\n                },\n                {\n                    \"id\": 2,\n                    \"text\": \"謎のプラグイン\",\n                    \"votes\": 1\n                },\n                {\n                    \"id\": 3,\n                    \"text\": \"パンドラの箱\",\n                    \"votes\": 0\n                },\n                {\n                    \"id\": 4,\n                    \"text\": \"デザイナーズhub\",\n                    \"votes\": 0\n                }\n            ],\n            \"multiple\": false,\n            \"expiresAt\": \"2022-07-20T07:02:17.113Z\"\n        }\"\"\"\n\n        val pollDTO: PollDTO = decoder.decodeFromString(text)\n        Assertions.assertEquals(false, pollDTO.multiple)\n\n        Assertions.assertEquals(\"ジューシーな高田馬場\", pollDTO.choices[0].text)\n        Assertions.assertEquals(true, pollDTO.choices[0].isVoted)\n\n        Assertions.assertEquals(\"偽のノーパソ\", pollDTO.choices[1].text)\n        Assertions.assertEquals(false, pollDTO.choices[1].isVoted)\n\n    }\n\n    @Test\n    fun decodeJsonTextGiveV12() {\n\n        val text = \"\"\"\n            {\n            \"multiple\": false,\n            \"expiresAt\": null,\n            \"choices\": [\n                {\n                    \"text\": \"a\",\n                    \"votes\": 0,\n                    \"isVoted\": false\n                },\n                {\n                    \"text\": \"b\",\n                    \"votes\": 0,\n                    \"isVoted\": false\n                }\n            ]\n        }\n        \"\"\".trimIndent()\n\n        val dto = decoder.decodeFromString<PollDTO>(text)\n        Assertions.assertEquals(false, dto.choices[0].isVoted)\n        Assertions.assertEquals(false, dto.choices[1].isVoted)\n\n        Assertions.assertEquals(\"a\", dto.choices[0].text)\n        Assertions.assertEquals(\"b\", dto.choices[1].text)\n\n    }\n\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/converters/NoteDTOEntityConverterTest.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.notes.NoteDTO\nimport net.pantasystem.milktea.api.misskey.notes.NoteVisibilityType\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\n\nclass NoteDTOEntityConverterTest {\n\n    @Test\n    fun convert() = runTest {\n\n        val converter = NoteDTOEntityConverter(\n            mock() {\n                onBlocking {\n                    findIn(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    findBySourceUrls(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"\", \"\")),\n                        Meta(\n                            uri = \"https://misskey.pantasystem.com\",\n                        )\n                    )\n                )\n            },\n            mock() {\n                onBlocking {\n                    findAndConvertToMap(any())\n                } doReturn Result.success(emptyMap())\n                onBlocking {\n                    findByNames(any(), any())\n                } doReturn Result.success(emptyList())\n            }\n        )\n\n        val account = Account(\n            remoteId = \"test-id\",\n            instanceDomain = \"https://misskey.pantasystem.com\",\n            userName = \"Panta\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\",\n        ).copy(accountId = 1L)\n\n        val noteDTO = NoteDTO(\n            id = \"noteId\",\n            createdAt = Clock.System.now(),\n            text = \"test\",\n            cw = \"cw\",\n            userId = \"user-1\",\n            replyId = \"reply-id\",\n            renoteId = \"renote-id\",\n            viaMobile = false,\n            visibility = NoteVisibilityType.Public,\n            localOnly = false,\n            visibleUserIds = listOf(),\n            rawReactionEmojis = net.pantasystem.milktea.api.misskey.emoji.EmojisType.None,\n            url = null,\n            uri = null,\n            renoteCount = 0,\n            reactionCounts = null,\n            rawEmojis = null,\n            replyCount = 0,\n            user = UserDTO(\n                id = \"idididi\",\n                userName = \"test\",\n            ),\n            files = listOf(),\n            fileIds = listOf(),\n            poll = null,\n            reNote = null,\n            reply = null,\n            myReaction = \"😇\",\n            tmpFeaturedId = null,\n            promotionId = null,\n            channelId = null,\n            app = null,\n            channel = null\n        )\n\n        val result = converter.convert(\n            account, noteDTO\n        )\n        Assertions.assertEquals(Note.Id(account.accountId, noteDTO.id), result.id)\n        Assertions.assertEquals(noteDTO.cw, result.cw)\n        Assertions.assertEquals(noteDTO.text, result.text)\n        Assertions.assertEquals(User.Id(account.accountId, noteDTO.userId), result.userId)\n        Assertions.assertEquals(noteDTO.replyId?.let {\n            Note.Id(account.accountId, it)\n        }, result.replyId)\n        Assertions.assertEquals(noteDTO.renoteId?.let {\n            Note.Id(account.accountId, it)\n        }, result.renoteId)\n        Assertions.assertEquals(noteDTO.cw, result.cw)\n        Assertions.assertEquals(noteDTO.text, result.text)\n\n    }\n\n    @Test\n    fun convert_WhenRequireNyaize() = runTest {\n\n        val converter = NoteDTOEntityConverter(\n            mock() {\n                onBlocking {\n                    findIn(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    findBySourceUrls(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"\", \"\")),\n                        Meta(\n                            uri = \"https://misskey.pantasystem.com\",\n                            version = \"2023.10.2\"\n                        )\n                    )\n                )\n            },\n            mock() {\n                onBlocking {\n                    findAndConvertToMap(any())\n                } doReturn Result.success(emptyMap())\n                onBlocking {\n                    findByNames(any(), any())\n                } doReturn Result.success(emptyList())\n            }\n        )\n\n        val account = Account(\n            remoteId = \"test-id\",\n            instanceDomain = \"https://misskey.pantasystem.com\",\n            userName = \"Panta\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\",\n        ).copy(accountId = 1L)\n\n        val noteDTO = NoteDTO(\n            id = \"noteId\",\n            createdAt = Clock.System.now(),\n            text = \"test\",\n            cw = \"cw\",\n            userId = \"user-1\",\n            replyId = \"reply-id\",\n            renoteId = \"renote-id\",\n            viaMobile = false,\n            visibility = NoteVisibilityType.Public,\n            localOnly = false,\n            visibleUserIds = listOf(),\n            rawReactionEmojis = net.pantasystem.milktea.api.misskey.emoji.EmojisType.None,\n            url = null,\n            uri = null,\n            renoteCount = 0,\n            reactionCounts = null,\n            rawEmojis = null,\n            replyCount = 0,\n            user = UserDTO(\n                id = \"idididi\",\n                userName = \"test\",\n                isCat = true,\n            ),\n            files = listOf(),\n            fileIds = listOf(),\n            poll = null,\n            reNote = null,\n            reply = null,\n            myReaction = \"😇\",\n            tmpFeaturedId = null,\n            promotionId = null,\n            channelId = null,\n            app = null,\n            channel = null\n        )\n\n        val result = converter.convert(\n            account, noteDTO\n        )\n        Assertions.assertEquals(Note.Id(account.accountId, noteDTO.id), result.id)\n        Assertions.assertEquals(noteDTO.cw, result.cw)\n        Assertions.assertEquals(noteDTO.text, result.text)\n        Assertions.assertEquals(User.Id(account.accountId, noteDTO.userId), result.userId)\n        Assertions.assertEquals(noteDTO.replyId?.let {\n            Note.Id(account.accountId, it)\n        }, result.replyId)\n        Assertions.assertEquals(noteDTO.renoteId?.let {\n            Note.Id(account.accountId, it)\n        }, result.renoteId)\n        Assertions.assertEquals(noteDTO.cw, result.cw)\n        Assertions.assertEquals(noteDTO.text, result.text)\n        Assertions.assertEquals(true, (result.type as Note.Type.Misskey).isRequireNyaize)\n    }\n\n\n    @Test\n    fun convert_WhenRequireNyaizeAndGiveNotCat() = runTest {\n\n        val converter = NoteDTOEntityConverter(\n            mock() {\n                onBlocking {\n                    findIn(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    findBySourceUrls(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"\", \"\")),\n                        Meta(\n                            uri = \"https://misskey.pantasystem.com\",\n                            version = \"2023.10.2\"\n                        )\n                    )\n                )\n            },\n            mock() {\n                onBlocking {\n                    findAndConvertToMap(any())\n                } doReturn Result.success(emptyMap())\n                onBlocking {\n                    findByNames(any(), any())\n                } doReturn Result.success(emptyList())\n            }\n        )\n\n        val account = Account(\n            remoteId = \"test-id\",\n            instanceDomain = \"https://misskey.pantasystem.com\",\n            userName = \"Panta\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\",\n        ).copy(accountId = 1L)\n\n        val noteDTO = NoteDTO(\n            id = \"noteId\",\n            createdAt = Clock.System.now(),\n            text = \"test\",\n            cw = \"cw\",\n            userId = \"user-1\",\n            replyId = \"reply-id\",\n            renoteId = \"renote-id\",\n            viaMobile = false,\n            visibility = NoteVisibilityType.Public,\n            localOnly = false,\n            visibleUserIds = listOf(),\n            rawReactionEmojis = net.pantasystem.milktea.api.misskey.emoji.EmojisType.None,\n            url = null,\n            uri = null,\n            renoteCount = 0,\n            reactionCounts = null,\n            rawEmojis = null,\n            replyCount = 0,\n            user = UserDTO(\n                id = \"idididi\",\n                userName = \"test\",\n                isCat = false,\n            ),\n            files = listOf(),\n            fileIds = listOf(),\n            poll = null,\n            reNote = null,\n            reply = null,\n            myReaction = \"😇\",\n            tmpFeaturedId = null,\n            promotionId = null,\n            channelId = null,\n            app = null,\n            channel = null\n        )\n\n        val result = converter.convert(\n            account, noteDTO\n        )\n        Assertions.assertEquals(Note.Id(account.accountId, noteDTO.id), result.id)\n        Assertions.assertEquals(noteDTO.cw, result.cw)\n        Assertions.assertEquals(noteDTO.text, result.text)\n        Assertions.assertEquals(User.Id(account.accountId, noteDTO.userId), result.userId)\n        Assertions.assertEquals(noteDTO.replyId?.let {\n            Note.Id(account.accountId, it)\n        }, result.replyId)\n        Assertions.assertEquals(noteDTO.renoteId?.let {\n            Note.Id(account.accountId, it)\n        }, result.renoteId)\n        Assertions.assertEquals(noteDTO.cw, result.cw)\n        Assertions.assertEquals(noteDTO.text, result.text)\n        Assertions.assertEquals(false, (result.type as Note.Type.Misskey).isRequireNyaize)\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/converters/UserDTOEntityConverterTest.kt",
    "content": "package net.pantasystem.milktea.data.converters\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport kotlin.time.Duration.Companion.days\n\nclass UserDTOEntityConverterTest {\n\n    @Test\n    fun converter_GiveDetailedData() = runTest {\n        val converter = UserDTOEntityConverter(\n            mock() {\n                onBlocking {\n                    getAndConvertToMap(any())\n                } doReturn mapOf()\n                onBlocking {\n                    findAndConvertToMap(any())\n                } doReturn Result.success(emptyMap())\n                onBlocking {\n                    findByNames(any(), any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    findIn(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    findBySourceUrls(any())\n                } doReturn Result.success(emptyList())\n            }\n        )\n\n        val userDTO = UserDTO(\n            id = \"test-id\",\n            userName = \"test-user-name1\",\n            name = \"name-1\",\n            host = \"misskey.io\",\n            description = \"hogehoge\",\n            followersCount = 10,\n            followingCount = 20,\n            hostLower = null,\n            notesCount = 128,\n            email = null,\n            isBot = false,\n            isCat = true,\n            pinnedNoteIds = listOf(),\n            pinnedNotes = listOf(),\n            twoFactorEnabled = null,\n            isAdmin = null,\n            avatarUrl = \"avatarUrl\",\n            bannerUrl = \"bannerUrl\",\n            rawEmojis = null,\n            isFollowing = true,\n            isFollowed = false,\n            isBlocking = false,\n            isMuted = false,\n            url = \"https://url\",\n            hasPendingFollowRequestFromYou = false,\n            hasPendingFollowRequestToYou = false,\n            isLocked = false,\n            instance = null,\n            fields = listOf(),\n            birthday = Clock.System.now().toLocalDateTime(TimeZone.UTC).date,\n            createdAt = Clock.System.now(),\n            updatedAt = Clock.System.now().plus(1.days),\n            publicReactions = null,\n            avatarBlurhash = \"aowfjioa0392\"\n        )\n        val account = Account(\n            remoteId = \"test-id\",\n            instanceDomain = \"https://misskey.pantasystem.com\",\n            userName = \"Panta\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\",\n        ).copy(accountId = 1L)\n\n        val result = converter.convert(account, userDTO, true) as User.Detail\n        Assertions.assertEquals(userDTO.userName, result.userName)\n        Assertions.assertEquals(userDTO.name, result.name)\n        Assertions.assertEquals(userDTO.host, result.host)\n        Assertions.assertEquals(userDTO.description, result.info.description)\n        Assertions.assertEquals(userDTO.hostLower, result.info.hostLower)\n        Assertions.assertEquals(userDTO.followersCount, result.info.followersCount)\n        Assertions.assertEquals(userDTO.followingCount, result.info.followingCount)\n        Assertions.assertEquals(userDTO.notesCount, result.info.notesCount)\n        Assertions.assertEquals(userDTO.isBot, result.isBot)\n        Assertions.assertEquals(userDTO.isCat, result.isCat)\n        Assertions.assertEquals(userDTO.isFollowed, result.related?.isFollower)\n        Assertions.assertEquals(userDTO.isFollowing, result.related?.isFollowing)\n        Assertions.assertEquals(userDTO.isBlocking, result.related?.isBlocking)\n        Assertions.assertEquals(userDTO.isMuted, result.related?.isMuting)\n        Assertions.assertEquals(userDTO.url, result.info.url)\n        Assertions.assertEquals(userDTO.hasPendingFollowRequestFromYou, result.related?.hasPendingFollowRequestFromYou)\n        Assertions.assertEquals(userDTO.hasPendingFollowRequestToYou, result.related?.hasPendingFollowRequestToYou)\n        Assertions.assertEquals(userDTO.avatarUrl, result.avatarUrl)\n        Assertions.assertEquals(userDTO.bannerUrl, result.info.bannerUrl)\n        Assertions.assertEquals(userDTO.avatarBlurhash, result.avatarBlurhash)\n    }\n\n    @Test\n    @OptIn(ExperimentalCoroutinesApi::class)\n    fun convert_GiveSimpleUser() = runTest {\n        val converter = UserDTOEntityConverter(\n            mock() {\n                onBlocking {\n                    getAndConvertToMap(any())\n                } doReturn mapOf()\n                onBlocking {\n                    findByNames(any(), any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    findIn(any())\n                } doReturn Result.success(emptyList())\n            },\n            mock() {\n                onBlocking {\n                    findBySourceUrls(any())\n                } doReturn Result.success(emptyList())\n            }\n        )\n\n        val userDTO = UserDTO(\n            id = \"test-id\",\n            userName = \"test-user-name2\",\n            name = \"name-2\",\n            host = \"misskey.io\",\n            description = \"hogehogewefaw\",\n            followersCount = 10,\n            followingCount = 20,\n            hostLower = null,\n            notesCount = 128,\n            email = null,\n            isBot = false,\n            isCat = true,\n            pinnedNoteIds = listOf(),\n            pinnedNotes = listOf(),\n            twoFactorEnabled = null,\n            isAdmin = null,\n            avatarUrl = \"avatarUrl\",\n            bannerUrl = \"bannerUrl\",\n            rawEmojis = null,\n            isFollowing = true,\n            isFollowed = false,\n            isBlocking = false,\n            isMuted = false,\n            url = \"https://url\",\n            hasPendingFollowRequestFromYou = false,\n            hasPendingFollowRequestToYou = false,\n            isLocked = false,\n            instance = null,\n            fields = listOf(),\n            birthday = Clock.System.now().toLocalDateTime(TimeZone.UTC).date,\n            createdAt = Clock.System.now(),\n            updatedAt = Clock.System.now().plus(1.days),\n            publicReactions = null,\n            avatarBlurhash = \"aowfjioa0392\"\n        )\n        val account = Account(\n            remoteId = \"test-id\",\n            instanceDomain = \"https://misskey.pantasystem.com\",\n            userName = \"Panta\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\",\n        ).copy(accountId = 1L)\n\n        val result = converter.convert(account, userDTO, true)\n        Assertions.assertEquals(userDTO.userName, result.userName)\n        Assertions.assertEquals(userDTO.name, result.name)\n        Assertions.assertEquals(userDTO.host, result.host)\n\n        Assertions.assertEquals(userDTO.isBot, result.isBot)\n        Assertions.assertEquals(userDTO.isCat, result.isCat)\n\n        Assertions.assertEquals(userDTO.avatarUrl, result.avatarUrl)\n        Assertions.assertEquals(userDTO.avatarBlurhash, result.avatarBlurhash)\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/account/db/AccountInstanceTypeConverterTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.db\n\nimport net.pantasystem.milktea.model.account.Account\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\ninternal class AccountInstanceTypeConverterTest {\n    @Test\n    fun convert_GiveMisskey() {\n\n        Assertions.assertEquals(\n            Account.InstanceType.MISSKEY,\n            AccountInstanceTypeConverter().convert(\"misskey\")\n        )\n    }\n\n    @Test\n    fun convert_GiveMastodon() {\n        Assertions.assertEquals(\n            Account.InstanceType.MASTODON,\n            AccountInstanceTypeConverter().convert(\"mastodon\")\n        )\n    }\n\n    @Test\n    fun convert_GivePleroma() {\n        Assertions.assertEquals(\n            Account.InstanceType.PLEROMA,\n            AccountInstanceTypeConverter().convert(\"pleroma\")\n        )\n    }\n\n    @Test\n    fun convert_GiveFirefish() {\n        Assertions.assertEquals(\n            Account.InstanceType.FIREFISH,\n            AccountInstanceTypeConverter().convert(\"firefish\")\n        )\n    }\n\n    @Test\n    fun convert_GiveInstanceTypeMisskey() {\n        Assertions.assertEquals(\n            \"misskey\",\n            AccountInstanceTypeConverter().convert(Account.InstanceType.MISSKEY)\n        )\n    }\n\n    @Test\n    fun convert_GiveInstanceTypeMastodon() {\n        Assertions.assertEquals(\n            \"mastodon\",\n            AccountInstanceTypeConverter().convert(Account.InstanceType.MASTODON)\n        )\n    }\n\n    @Test\n    fun convert_GiveInstanceTypePleroma() {\n        Assertions.assertEquals(\n            \"pleroma\",\n            AccountInstanceTypeConverter().convert(Account.InstanceType.PLEROMA)\n        )\n    }\n\n    @Test\n    fun convert_GiveInstanceTypeFirefish() {\n        Assertions.assertEquals(\n            \"firefish\",\n            AccountInstanceTypeConverter().convert(Account.InstanceType.FIREFISH)\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/account/page/db/PageRecordParamsTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.account.page.db\n\nimport net.pantasystem.milktea.model.account.page.PageParams\nimport net.pantasystem.milktea.model.account.page.PageType\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\ninternal class PageRecordParamsTest {\n\n    @Test\n    fun convertFromPageParams() {\n        val params = PageParams(\n            type = PageType.ANTENNA,\n            withFiles = false,\n            excludeNsfw = true,\n            includeLocalRenotes = false,\n            includeMyRenotes = true,\n            includeRenotedMyRenotes = false,\n            listId = \"listId\",\n            following = true,\n            visibility = \"visibility\",\n            noteId = \"noteId\",\n            tag = \"tag\",\n            reply = false,\n            renote = true,\n            poll = false,\n            offset = 1,\n            markAsRead = true,\n            userId = \"userId\",\n            includeReplies = false,\n            query = \"query\",\n            host = \"host\",\n            antennaId = \"antennaId\",\n            channelId = \"channelId\",\n            clipId = \"clipId\",\n        )\n\n        val record = PageRecordParams.from(params)\n        Assertions.assertEquals(params.type, record.type)\n        Assertions.assertEquals(params.withFiles, record.withFiles)\n        Assertions.assertEquals(params.excludeNsfw, record.excludeNsfw)\n        Assertions.assertEquals(params.includeLocalRenotes, record.includeLocalRenotes)\n        Assertions.assertEquals(params.includeMyRenotes, record.includeMyRenotes)\n        Assertions.assertEquals(params.includeRenotedMyRenotes, record.includeRenotedMyRenotes)\n        Assertions.assertEquals(params.listId, record.listId)\n        Assertions.assertEquals(params.following, record.following)\n        Assertions.assertEquals(params.visibility, record.visibility)\n        Assertions.assertEquals(params.noteId, record.noteId)\n        Assertions.assertEquals(params.tag, record.tag)\n        Assertions.assertEquals(params.reply, record.reply)\n        Assertions.assertEquals(params.renote, record.renote)\n        Assertions.assertEquals(params.poll, record.poll)\n        Assertions.assertEquals(params.offset, record.offset)\n        Assertions.assertEquals(params.markAsRead, record.markAsRead)\n        Assertions.assertEquals(params.userId, record.userId)\n        Assertions.assertEquals(params.includeReplies, record.includeReplies)\n        Assertions.assertEquals(params.query, record.query)\n        Assertions.assertEquals(params.host, record.host)\n        Assertions.assertEquals(params.antennaId, record.antennaId)\n        Assertions.assertEquals(params.channelId, record.channelId)\n        Assertions.assertEquals(params.clipId, record.clipId)\n    }\n\n\n    @Test\n    fun convertFromPageRecordParams() {\n        val recordParams = PageRecordParams(\n            type = PageType.ANTENNA,\n            withFiles = true,\n            excludeNsfw = false,\n            includeLocalRenotes = true,\n            includeMyRenotes = false,\n            includeRenotedMyRenotes = true,\n            listId = \"listId\",\n            following = false,\n            visibility = \"visibility\",\n            noteId = \"noteId\",\n            tag = \"tag\",\n            reply = true,\n            renote = false,\n            poll = true,\n            offset = 1,\n            markAsRead = false,\n            userId = \"userId\",\n            includeReplies = true,\n            query = \"query\",\n            host = \"host\",\n            antennaId = \"antennaId\",\n            channelId = \"channelId\",\n            clipId = \"clipId\",\n        )\n\n        val model = recordParams.toParams()\n\n        Assertions.assertEquals(recordParams.type, model.type)\n        Assertions.assertEquals(recordParams.withFiles, model.withFiles)\n        Assertions.assertEquals(recordParams.excludeNsfw, model.excludeNsfw)\n        Assertions.assertEquals(recordParams.includeLocalRenotes, model.includeLocalRenotes)\n        Assertions.assertEquals(recordParams.includeMyRenotes, model.includeMyRenotes)\n        Assertions.assertEquals(recordParams.includeRenotedMyRenotes, model.includeRenotedMyRenotes)\n        Assertions.assertEquals(recordParams.listId, model.listId)\n        Assertions.assertEquals(recordParams.following, model.following)\n        Assertions.assertEquals(recordParams.visibility, model.visibility)\n        Assertions.assertEquals(recordParams.noteId, model.noteId)\n        Assertions.assertEquals(recordParams.tag, model.tag)\n        Assertions.assertEquals(recordParams.reply, model.reply)\n        Assertions.assertEquals(recordParams.renote, model.renote)\n        Assertions.assertEquals(recordParams.poll, model.poll)\n        Assertions.assertEquals(recordParams.offset, model.offset)\n        Assertions.assertEquals(recordParams.markAsRead, model.markAsRead)\n        Assertions.assertEquals(recordParams.userId, model.userId)\n        Assertions.assertEquals(recordParams.includeReplies, model.includeReplies)\n        Assertions.assertEquals(recordParams.query, model.query)\n        Assertions.assertEquals(recordParams.host, model.host)\n        Assertions.assertEquals(recordParams.channelId, model.channelId)\n        Assertions.assertEquals(recordParams.antennaId, model.antennaId)\n        Assertions.assertEquals(recordParams.clipId, model.clipId)\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/instance/FeatureEnablesImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.instance\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfo\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\n\nclass FeatureEnablesImplTest {\n\n    private val v11Meta = Meta(\n        uri = \"https://misskey.dev\",\n        version = \"11.37.1-20230209223723\"\n    )\n\n    private val v12Meta = Meta(\n        uri = \"https://example.com\",\n        version = \"12\"\n    )\n\n    private val v1274Meta = Meta(\n        uri = \"https://example.com\",\n        version = \"12.74.9\"\n    )\n\n    private val v1275Meta = Meta(\n        uri = \"https://example.com\",\n        version = \"12.75.0\"\n    )\n\n    private val v1361Meta = Meta(\n        uri = \"https://example.com\",\n        version = \"13.6.1\"\n    )\n\n    private val v1362Meta = Meta(\n        uri = \"https://example.com\",\n        version = \"13.6.2\"\n    )\n\n    private val calckeyV13Meta = Meta(\n        uri = \"https://example.com\",\n        version = \"13.6.2\"\n    )\n\n    @Test\n    fun enableFeatures_GiveMisskeyAndV11(): Unit = runBlocking {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n                        v11Meta\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"misskey.dev\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"misskey\",\n                            version = \"11.37.1-20230209223723\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://misskey.dev\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Messaging,\n                FeatureType.Drive,\n                FeatureType.Group,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveMisskeyV12() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n                        v12Meta\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"misskey\",\n                            version = \"12\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Channel,\n                FeatureType.UserReactionHistory,\n                FeatureType.Clip,\n                FeatureType.Group,\n                FeatureType.Drive,\n                FeatureType.Messaging,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveMisskeyV12_74_0() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n                        v1274Meta\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"misskey\",\n                            version = \"12.74.9\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Channel,\n                FeatureType.UserReactionHistory,\n                FeatureType.Clip,\n                FeatureType.Group,\n                FeatureType.Drive,\n                FeatureType.Messaging,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveMisskeyV12_75_0() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n                        v1275Meta\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"misskey\",\n                            version = \"12.75.0\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Channel,\n                FeatureType.UserReactionHistory,\n                FeatureType.Clip,\n                FeatureType.Group,\n                FeatureType.Drive,\n                FeatureType.Messaging,\n                FeatureType.Gallery,\n                FeatureType.Antenna,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveMisskeyV13_6_1() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n                        v1361Meta\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"misskey\",\n                            version = \"13.6.1\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Channel,\n                FeatureType.UserReactionHistory,\n                FeatureType.Clip,\n                FeatureType.Group,\n                FeatureType.Drive,\n                FeatureType.Messaging,\n                FeatureType.Gallery,\n                FeatureType.Antenna,\n                FeatureType.ReactionAcceptance,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveMisskeyV13_6_2() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n                        v1362Meta\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"misskey\",\n                            version = \"13.6.2\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Channel,\n                FeatureType.UserReactionHistory,\n                FeatureType.Clip,\n                FeatureType.Drive,\n                FeatureType.Gallery,\n                FeatureType.Antenna,\n                FeatureType.ReactionAcceptance,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveCalckeyV13() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n                        calckeyV13Meta\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"calckey\",\n                            version = \"13.8.0\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Channel,\n                FeatureType.UserReactionHistory,\n                FeatureType.Clip,\n                FeatureType.Drive,\n                FeatureType.Gallery,\n                FeatureType.Antenna,\n                FeatureType.Group,\n                FeatureType.Messaging,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveMastodon() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Mastodon(\n                        NodeInfo(\n                            host = \"example.com\",\n                            version = \"2.0\",\n                            software = NodeInfo.Software(\n                                name = \"mastodon\",\n                                version = \"3.0.0\"\n                            )\n                        ),\n                        MastodonInstanceInfo(\n                            \"\",\n                            \"\",\n                            \"\",\n                            \"\",\n                            \"\",\n                            MastodonInstanceInfo.Urls(\"\"),\n                            null,\n                            null,\n                            null\n                        )\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"mastodon\",\n                            version = \"3.0.0\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Bookmark\n            ),\n            result,\n        )\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun enableFeatures_GiveFirefish() = runTest {\n        val impl = FeatureEnablesImpl(\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Firefish(\n                        NodeInfo(\n                            host = \"example.com\",\n                            version = \"2.0\",\n                            software = NodeInfo.Software(\n                                name = \"firefish\",\n                                version = \"1.0.0\"\n                            )\n                        ), Meta(\"https://example.com\", \"1.0.0\")\n                    )\n                )\n            },\n            nodeInfoRepository = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    NodeInfo(\n                        host = \"example.com\",\n                        version = \"2.0\",\n                        software = NodeInfo.Software(\n                            name = \"firefish\",\n                            version = \"1.0.0\"\n                        )\n                    )\n                )\n            },\n            ioDispatcher = Dispatchers.Default\n        )\n        val result = impl.enableFeatures(\"https://example.com\")\n        Assertions.assertEquals(\n            setOf(\n                FeatureType.Channel,\n                FeatureType.UserReactionHistory,\n                FeatureType.Clip,\n                FeatureType.Drive,\n                FeatureType.Gallery,\n                FeatureType.Antenna,\n                FeatureType.Group,\n                FeatureType.Messaging,\n                FeatureType.PostReactionUsers,\n                FeatureType.PostLocalOnlyVisibility,\n            ),\n            result,\n        )\n    }\n\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/nodeinfo/NodeInfoFetcherImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.nodeinfo\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.api.misskey.DefaultOkHttpClientProvider\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.data.api.NodeInfoAPIBuilderImpl\nimport org.junit.jupiter.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\ninternal class NodeInfoFetcherImplTest {\n\n    private val loggerFactory = object : Logger.Factory {\n        override fun create(tag: String): Logger {\n            return object : Logger {\n                override val defaultTag: String\n                    get() = tag\n\n                override fun debug(msg: String, tag: String, e: Throwable?) = Unit\n                override fun debug(tag: String, e: Throwable?, message: () -> String) = Unit\n                override fun error(msg: String, e: Throwable?, tag: String) = Unit\n                override fun info(msg: String, tag: String, e: Throwable?) = Unit\n                override fun warning(msg: String, tag: String, e: Throwable?) = Unit\n            }\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun fetch_GiveMisskeyIO() = runTest {\n        val impl = NodeInfoFetcherImpl(NodeInfoAPIBuilderImpl(DefaultOkHttpClientProvider()), loggerFactory)\n        assertNotNull(impl.fetch(\"misskey.io\"))\n    }\n\n//    @OptIn(ExperimentalCoroutinesApi::class)\n//    @Test\n//    fun fetch_GiveMisskeyDev() = runTest {\n//        val impl = NodeInfoFetcherImpl(NodeInfoAPIBuilderImpl(DefaultOkHttpClientProvider()), loggerFactory)\n//        assertNotNull(impl.fetch(\"misskey.dev\"))\n//    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun fetch_GiveMastodonSocial() = runTest {\n        val impl = NodeInfoFetcherImpl(NodeInfoAPIBuilderImpl(DefaultOkHttpClientProvider()), loggerFactory)\n        assertNotNull(impl.fetch(\"mastodon.social\"))\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/nodeinfo/NodeInfoRepositoryImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.nodeinfo\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.api.activitypub.NodeInfoDTO\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.db.NodeInfoDao\nimport net.pantasystem.milktea.data.infrastructure.nodeinfo.db.NodeInfoRecord\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport org.junit.jupiter.api.Assertions.*\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\n\ninternal class NodeInfoRepositoryImplTest {\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun find_WhenHasCache() = runTest {\n        val cache = NodeInfoCache()\n        val nodeInfo = NodeInfo(\"misskey.io\", \"\", NodeInfo.Software(\"\", \"\"))\n        cache.put(\"misskey.io\", nodeInfo)\n        val impl = NodeInfoRepositoryImpl(\n            fetcher = mock(),\n            cache = cache,\n            nodeInfoDao = mock(),\n            ioDispatcher = Dispatchers.Default\n        )\n        assertEquals(nodeInfo, impl.find(\"misskey.io\").getOrThrow())\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun find_WhenHasDiskCache() = runTest {\n        val nodeInfo = NodeInfo(\"misskey.io\", \"\", NodeInfo.Software(\"\", \"\"))\n        val cache = NodeInfoCache()\n        val nodeInfoDao: NodeInfoDao = object : NodeInfoDao {\n            override suspend fun insert(nodeInfo: NodeInfoRecord): Long = -1\n            override suspend fun update(nodeInfo: NodeInfoRecord) = Unit\n            override suspend fun delete(nodeInfo: NodeInfoRecord) = Unit\n            override fun observe(host: String): Flow<NodeInfoRecord?> = emptyFlow()\n            override suspend fun find(host: String): NodeInfoRecord {\n                return NodeInfoRecord(\"misskey.io\", \"\", \"\", \"\")\n            }\n            override suspend fun findAll(): List<NodeInfoRecord> = emptyList()\n        }\n        assertNull(cache.get(\"misskey.io\"))\n        val impl = NodeInfoRepositoryImpl(\n            fetcher = mock(),\n            cache = cache,\n            nodeInfoDao = nodeInfoDao,\n            ioDispatcher = Dispatchers.Default\n        )\n        assertEquals(nodeInfo, impl.find(\"misskey.io\").getOrThrow())\n        assertEquals(nodeInfo, cache.get(\"misskey.io\"))\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun find_WhenNoCache() = runTest {\n        val nodeInfo = NodeInfo(\"misskey.io\", \"\", NodeInfo.Software(\"\", \"\"))\n        val cache = NodeInfoCache()\n        assertNull(cache.get(\"misskey.io\"))\n\n        val nodeInfoDao: NodeInfoDao = mock() {\n            onBlocking {\n                find(any())\n            } doReturn null\n\n            onBlocking {\n                upInsert(any())\n            }\n        }\n        val impl = NodeInfoRepositoryImpl(\n            fetcher = object : NodeInfoFetcher {\n                override suspend fun fetch(host: String): NodeInfoDTO {\n                    return NodeInfoDTO(\"\", NodeInfoDTO.SoftwareDTO(\"\", \"\"))\n                }\n            },\n            cache = cache,\n            nodeInfoDao = nodeInfoDao,\n            ioDispatcher = Dispatchers.Default\n        )\n        assertEquals(nodeInfo, impl.find(\"misskey.io\").getOrThrow())\n        assertEquals(nodeInfo, cache.get(\"misskey.io\"))\n\n    }\n\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/note/NoteEventReducerKtTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport net.pantasystem.milktea.api.misskey.emoji.CustomEmojiNetworkDTO\nimport net.pantasystem.milktea.api_streaming.NoteUpdated\nimport net.pantasystem.milktea.api_streaming.mastodon.EmojiReaction\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.make\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass NoteEventReducerKtTest {\n    private val account = Account(\"test\", \"misskey.io\", \"Panta\", Account.InstanceType.MISSKEY, \"\")\n\n    @Test\n    fun onReacted_GiveOtherUserReaction() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\")\n        )\n\n        val result = note.onReacted(\n            account,\n            NoteUpdated.Body.Reacted(\n                id = \"1\",\n                body = NoteUpdated.Body.Reacted.Body(\n                    reaction = \":kawaii:\",\n                    userId = \"other\"\n                )\n            ),\n            null,\n            null\n        )\n\n        Assertions.assertEquals(listOf(ReactionCount(\":kawaii:\", 1, false)), result.reactionCounts)\n        Assertions.assertNull(result.myReaction)\n    }\n\n    @Test\n    fun onReacted_GiveMyReaction() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\")\n        )\n\n        val result = note.onReacted(\n            account,\n            NoteUpdated.Body.Reacted(\n                id = \"1\",\n                body = NoteUpdated.Body.Reacted.Body(\n                    reaction = \":kawaii:\",\n                    userId = account.remoteId\n                )\n            ),\n            null,\n            null\n        )\n\n        Assertions.assertEquals(listOf(ReactionCount(\":kawaii:\", 1, true)), result.reactionCounts)\n        Assertions.assertEquals(\":kawaii:\", result.myReaction)\n    }\n\n    @Test\n    fun onReacted_GiveMyReactionAndHasReactions() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\":watasimo:\", 1, false),\n                ReactionCount(\":kawaii:\", 1, false)\n            )\n        )\n\n        val result = note.onReacted(\n            account, NoteUpdated.Body.Reacted(\n                id = \"1\",\n                body = NoteUpdated.Body.Reacted.Body(\n                    reaction = \":kawaii:\",\n                    userId = account.remoteId\n                )\n            ),\n            null,\n            null\n\n        )\n\n        Assertions.assertEquals(\n            listOf(ReactionCount(\":watasimo:\", 1, false), ReactionCount(\":kawaii:\", 2, true)),\n            result.reactionCounts\n        )\n        Assertions.assertEquals(\":kawaii:\", result.myReaction)\n    }\n\n    @Test\n    fun onReacted_GiveMyReactionAndHasOtherReactions() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\":watasimo:\", 1, false),\n            )\n        )\n\n        val result = note.onReacted(\n            account, NoteUpdated.Body.Reacted(\n                id = \"1\",\n                body = NoteUpdated.Body.Reacted.Body(\n                    reaction = \":kawaii:\",\n                    userId = account.remoteId\n                )\n            ),\n            null,\n            null\n        )\n\n        Assertions.assertEquals(\n            listOf(ReactionCount(\":watasimo:\", 1, false), ReactionCount(\":kawaii:\", 1, true)),\n            result.reactionCounts\n        )\n        Assertions.assertEquals(\":kawaii:\", result.myReaction)\n    }\n\n    @Test\n    fun onUnReacted() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\":watasimo:\", 1, false),\n            )\n        )\n        val result = note.onUnReacted(\n            account, NoteUpdated.Body.Unreacted(\n                note.id.noteId, NoteUpdated.Body.Unreacted.Body(\n                    \":watasimo:\",\n                    userId = \"other\"\n                )\n            )\n        )\n        Assertions.assertNull(result.myReaction)\n        Assertions.assertEquals(emptyList<ReactionCount>(), result.reactionCounts)\n    }\n\n    @Test\n    fun onUnReacted_GiveMyEvent() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\":watasimo:\", 1, true),\n            ),\n            myReaction = \":watasimo:\"\n        )\n        val result = note.onUnReacted(\n            account, NoteUpdated.Body.Unreacted(\n                note.id.noteId, NoteUpdated.Body.Unreacted.Body(\n                    \":watasimo:\",\n                    userId = account.remoteId\n                )\n            )\n        )\n        Assertions.assertNull(result.myReaction)\n        Assertions.assertEquals(emptyList<ReactionCount>(), result.reactionCounts)\n    }\n\n    @Test\n    fun onUnReacted_GiveOtherUserEvent() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\":watasimo:\", 2, true),\n            ),\n            myReaction = \":watasimo:\"\n        )\n        val result = note.onUnReacted(\n            account, NoteUpdated.Body.Unreacted(\n                note.id.noteId, NoteUpdated.Body.Unreacted.Body(\n                    \":watasimo:\",\n                    userId = \"other\"\n                )\n            )\n        )\n        Assertions.assertEquals(\":watasimo:\", result.myReaction)\n        Assertions.assertEquals(\n            listOf(\n                ReactionCount(\":watasimo:\", 1, true),\n            ), result.reactionCounts\n        )\n    }\n\n    @Test\n    fun onReacted_GiveNewEmoji() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\":watasimo:\", 2, true),\n            ),\n            myReaction = \":watasimo:\"\n        )\n        val result = note.onReacted(\n            account,\n            NoteUpdated.Body.Reacted(\n                id = \"1\",\n                body = NoteUpdated.Body.Reacted.Body(\n                    reaction = \":kawaii:\",\n                    userId = account.remoteId,\n                    emoji = CustomEmojiNetworkDTO(\n                        name = \":kawaii:\"\n                    )\n                )\n            ),\n            null,\n            null\n        )\n        Assertions.assertEquals(\n            listOf(\n                CustomEmoji(\n                    name = \":kawaii:\"\n                )\n            ), result.emojis\n        )\n    }\n\n\n    @Test\n    fun onEmojiReacted_GiveAddMyReaction() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\"watasimo\", 1, false),\n            ),\n            myReaction = null\n        )\n        val updated = note.onEmojiReacted(\n            account, EmojiReaction(\n                name = \"watasimo\",\n                count = 2,\n                url = null,\n                staticUrl = null,\n                domain = null,\n                accountIds = listOf(\"test\"),\n                statusId = \"1\"\n            ),\n            null\n        )\n        Assertions.assertEquals(\"watasimo\", updated.myReaction)\n        Assertions.assertEquals(updated.reactionCounts, listOf(\n            ReactionCount(\"watasimo\", 2, true)\n        ))\n    }\n\n    @Test\n    fun onEmojiReacted_Unreacted() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\"watasimo\", 2, true),\n            ),\n            myReaction = \"watasimo\"\n        )\n        val updated = note.onEmojiReacted(\n            account, EmojiReaction(\n                name = \"watasimo\",\n                count = 1,\n                url = null,\n                staticUrl = null,\n                domain = null,\n                accountIds = listOf(),\n                statusId = \"1\"\n            ),\n            null\n        )\n        Assertions.assertEquals(null, updated.myReaction)\n        Assertions.assertEquals(updated.reactionCounts, listOf(\n            ReactionCount(\"watasimo\", 1, false)\n        ))\n    }\n\n    @Test\n    fun onEmojiReacted_WhenApplied() {\n        val note = Note.make(\n            id = Note.Id(0L, \"1\"),\n            text = \"\",\n            userId = User.Id(0L, \"2\"),\n            reactionCounts = listOf(\n                ReactionCount(\"watasimo\", 2, true),\n            ),\n            myReaction = \"watasimo\"\n        )\n        val updated = note.onEmojiReacted(\n            account, EmojiReaction(\n                name = \"watasimo\",\n                count = 2,\n                url = null,\n                staticUrl = null,\n                domain = null,\n                accountIds = listOf(\"test\"),\n                statusId = \"1\"\n            ),\n            null\n        )\n        Assertions.assertEquals(\"watasimo\", updated.myReaction)\n        Assertions.assertEquals(updated.reactionCounts, listOf(\n            ReactionCount(\"watasimo\", 2, true)\n        ))\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/note/UnusedPageReleaserTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note\n\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass UnusedPageReleaserTest {\n\n    @Test\n    fun testReleaseUnusedPageWithExistContent() {\n        val items = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n        val state = PageableState.Fixed(StateContent.Exist(items))\n        val position = 5\n        val offset = 3\n\n        val result = releaseUnusedPage(state, position, offset, 3)\n\n        Assertions.assertNotNull(result)\n        Assertions.assertEquals(listOf(3, 4, 5, 6, 7, 8), (result?.content as StateContent.Exist).rawContent)\n    }\n\n    @Test\n    fun testReleaseUnusedPageWithExistContentPositionFirst() {\n        val items = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n        val state = PageableState.Fixed(StateContent.Exist(items))\n        val position = 0\n        val offset = 7\n\n        val result = releaseUnusedPage(state, position, offset, 3)\n\n        Assertions.assertNotNull(result)\n        Assertions.assertEquals(listOf(1, 2, 3, 4, 5, 6, 7), (result?.content as StateContent.Exist).rawContent)\n    }\n\n    @Test\n    fun testReleaseUnusedPageWithExistContentPositionLast() {\n        val items = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n        val state = PageableState.Fixed(StateContent.Exist(items))\n        val position = 7\n        val offset = 3\n\n        val result = releaseUnusedPage(state, position, offset, 3)\n\n        Assertions.assertNotNull(result)\n        Assertions.assertEquals(listOf(5, 6, 7, 8, 9, 10), (result?.content as StateContent.Exist).rawContent)\n    }\n    @Test\n    fun testReleaseUnusedPageWithExistContentPositionLastOffset4() {\n        val items = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n        val state = PageableState.Fixed(StateContent.Exist(items))\n        val position = 7\n        val offset = 4\n\n        val result = releaseUnusedPage(state, position, offset, 3)\n\n        Assertions.assertNotNull(result)\n        Assertions.assertEquals(listOf(4, 5, 6, 7, 8, 9, 10), (result?.content as StateContent.Exist).rawContent)\n    }\n\n    @Test\n    fun testReleaseUnusedPageWithNotExistContent() {\n        val state = PageableState.Fixed(StateContent.NotExist<List<Int>>())\n        val position = 5\n        val offset = 3\n\n        val result = releaseUnusedPage(state, position, offset, 3)\n\n        Assertions.assertNull(result)\n    }\n\n    @Test\n    fun testReleaseUnusedPageWithSmallDiffCount() {\n        val items = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n        val state = PageableState.Fixed(StateContent.Exist(items))\n        val position = 5\n        val offset = 1\n\n        val result = releaseUnusedPage(state, position, offset, 20)\n\n        Assertions.assertNull(result)\n    }\n\n    @Test\n    fun testReleaseUnusedPageWithNegativePosition() {\n        val items = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n        val state = PageableState.Fixed(StateContent.Exist(items))\n        val position = -5\n        val offset = 3\n\n        val result = releaseUnusedPage(state, position, offset, 3)\n\n        Assertions.assertNull(result)\n    }\n\n    @Test\n    fun testReleaseUnusedPageWithPositionGreaterThanSize() {\n        val items = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n        val state = PageableState.Fixed(StateContent.Exist(items))\n        val position = 15\n        val offset = 3\n\n        val result = releaseUnusedPage(state, position, offset, 3)\n\n        Assertions.assertNull(result)\n    }\n\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/note/impl/InMemoryNoteDataSourceTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.note.impl\n\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.data.infrastructure.MemoryCacheCleaner\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDeletedException\nimport net.pantasystem.milktea.model.note.NoteNotFoundException\nimport net.pantasystem.milktea.model.note.make\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass InMemoryNoteDataSourceTest {\n\n    @Test\n    fun get_ThrowsNoteDeletedExceptionGiveDeletedNote(): Unit = runBlocking {\n        val noteDataSource = InMemoryNoteDataSource(MemoryCacheCleaner())\n        val id = Note.Id(0L, \"testId\")\n        noteDataSource.delete(id)\n        val result = noteDataSource.get(id)\n        Assertions.assertNotNull(result.exceptionOrNull())\n        Assertions.assertThrows(NoteDeletedException::class.java) {\n            result.getOrThrow()\n        }\n    }\n\n//    @Test\n//    fun get_ThrowsNoteRemovedExceptionGiveRemovedNote(): Unit = runBlocking {\n//        val noteDataSource = InMemoryNoteDataSource(MemoryCacheCleaner())\n//        val id = Note.Id(0L, \"testId\")\n//        noteDataSource.remove(id)\n//        val result = noteDataSource.get(id)\n//        Assertions.assertNotNull(result.exceptionOrNull())\n//        Assertions.assertThrows(NoteRemovedException::class.java) {\n//            result.getOrThrow()\n//        }\n//    }\n\n    @Test\n    fun get_ThrowsNoteNotFoundExceptionGiveNotExistsNote(): Unit = runBlocking {\n        val noteDataSource = InMemoryNoteDataSource(MemoryCacheCleaner())\n        val id = Note.Id(0L, \"testId\")\n        val result = noteDataSource.get(id)\n        Assertions.assertThrows(NoteNotFoundException::class.java) {\n            result.getOrThrow()\n        }\n    }\n\n    @Test\n    fun get_ReturnsNoteGiveExistsNote(): Unit = runBlocking {\n        val noteDataSource = InMemoryNoteDataSource(MemoryCacheCleaner())\n        val id = Note.Id(0L, \"testId\")\n        val testNote = Note.make(id, User.Id(0L, \"testUserId\"))\n        noteDataSource.add(testNote)\n        val result = noteDataSource.get(id)\n        Assertions.assertEquals(testNote, result.getOrThrow())\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/ConfigKtTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.settings\n\nimport net.pantasystem.milktea.model.setting.Config\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.Keys\nimport net.pantasystem.milktea.model.setting.PrefType\nimport net.pantasystem.milktea.model.setting.Theme\nimport net.pantasystem.milktea.model.setting.allKeys\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass ConfigKtTest {\n\n\n    @Test\n    fun allKeys() {\n        Assertions.assertEquals(\n            Keys::class.nestedClasses.map { it.simpleName }.filterNot { it == \"Companion\" }.toSet(),\n            Keys.allKeys.map { it::class }.map { it.simpleName }.toSet()\n        )\n    }\n\n    @Test\n    fun prefs() {\n        val config = DefaultConfig.config.copy(\n            theme = Theme.Bread,\n            surfaceColorOpacity = 250,\n            isClassicUI = true,\n            isPostButtonAtTheBottom = false,\n            isUserNameDefault = false,\n            isSimpleEditorEnabled = true,\n            isIncludeMyRenotes = false,\n            isIncludeRenotedMyNotes = false,\n            isIncludeLocalRenotes = false,\n        )\n        Assertions.assertNotNull(config.prefs()[Keys.ThemeType])\n        config.prefs().forEach { (k, u) ->\n            when (k) {\n                Keys.BackgroundImage -> Assertions.assertEquals(\n                    config.backgroundImagePath,\n                    (u as PrefType.StrPref).value\n                )\n                Keys.ClassicUI -> Assertions.assertEquals(\n                    config.isClassicUI,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsPostButtonToBottom -> Assertions.assertEquals(\n                    config.isPostButtonAtTheBottom,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsSimpleEditorEnabled -> Assertions.assertEquals(\n                    config.isSimpleEditorEnabled,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsUserNameDefault -> Assertions.assertEquals(\n                    config.isUserNameDefault,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.NoteLimitHeight -> Assertions.assertEquals(\n                    config.noteExpandedHeightSize,\n                    (u as PrefType.IntPref).value\n                )\n                Keys.ReactionPickerType -> Assertions.assertEquals(\n                    config.reactionPickerType.ordinal,\n                    (u as PrefType.IntPref).value\n                )\n                Keys.ThemeType -> Assertions.assertEquals(\n                    (config.theme.toInt()),\n                    (u as PrefType.IntPref).value\n                )\n                Keys.IsIncludeLocalRenotes -> Assertions.assertEquals(\n                    config.isIncludeLocalRenotes,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsIncludeMyRenotes -> Assertions.assertEquals(\n                    config.isIncludeMyRenotes,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsIncludeRenotedMyNotes -> Assertions.assertEquals(\n                    config.isIncludeRenotedMyNotes,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.SurfaceColorOpacity -> Assertions.assertEquals(\n                    config.surfaceColorOpacity,\n                    (u as PrefType.IntPref).value\n                )\n                Keys.IsEnableTimelineScrollAnimation -> Assertions.assertEquals(\n                    config.isEnableTimelineScrollAnimation,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsCrashlyticsCollectionEnabled -> Assertions.assertEquals(\n                    config.isCrashlyticsCollectionEnabled.isEnable,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsConfirmedCrashlyticsCollection -> Assertions.assertEquals(\n                    config.isCrashlyticsCollectionEnabled.isConfirmed,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsAnalyticsCollectionEnabled -> Assertions.assertEquals(\n                    config.isAnalyticsCollectionEnabled.isEnabled,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsConfirmedAnalyticsCollection -> Assertions.assertEquals(\n                    config.isCrashlyticsCollectionEnabled.isConfirmed,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsConfirmedPostNotification -> Assertions.assertEquals(\n                    config.isConfirmedPostNotification,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsEnableInstanceTicker -> Assertions.assertEquals(\n                    config.isEnableInstanceTicker,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsDriveUsingGridView -> Assertions.assertEquals(\n                    config.isDriveUsingGridView,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsEnableNotificationSound -> Assertions.assertEquals(\n                    config.isEnableNotificationSound,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsStopNoteCaptureWhenBackground -> Assertions.assertEquals(\n                    config.isStopNoteCaptureWhenBackground,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsStopStreamingApiWhenBackground -> Assertions.assertEquals(\n                    config.isStopStreamingApiWhenBackground,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsEnableStreamingAPIAndNoteCapture -> Assertions.assertEquals(\n                    config.isEnableStreamingAPIAndNoteCapture,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsEnableNoteDivider -> Assertions.assertEquals(\n                    config.isEnableNoteDivider,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsVisibleInstanceUrlInToolbar -> Assertions.assertEquals(\n                    config.isVisibleInstanceUrlInToolbar,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.NoteContentFontSize -> Assertions.assertEquals(\n                    config.noteContentFontSize,\n                    (u as PrefType.FloatPref).value\n                )\n                Keys.NoteHeaderFontSize -> Assertions.assertEquals(\n                    config.noteHeaderFontSize,\n                    (u as PrefType.FloatPref).value\n                )\n                Keys.IsDisplayTimestampsAsAbsoluteDates -> Assertions.assertEquals(\n                    config.isDisplayTimestampsAsAbsoluteDates,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.NoteReactionCounterFontSize -> Assertions.assertEquals(\n                    config.noteReactionCounterFontSize,\n                    (u as PrefType.FloatPref).value\n                )\n                Keys.NoteCustomEmojiScaleSizeInText -> Assertions.assertEquals(\n                    config.noteCustomEmojiScaleSizeInText,\n                    (u as PrefType.FloatPref).value\n                )\n                Keys.EmojiPickerEmojiDisplaySize -> Assertions.assertEquals(\n                    config.emojiPickerEmojiDisplaySize,\n                    (u as PrefType.IntPref).value\n                )\n                Keys.AvatarIconShapeType -> Assertions.assertEquals(\n                    config.avatarIconShapeType.value,\n                    (u as PrefType.IntPref).value\n                )\n                Keys.MediaDisplayMode -> Assertions.assertEquals(\n                    config.mediaDisplayMode.value,\n                    (u as PrefType.IntPref).value\n                )\n                Keys.IsSafeSearchEnabled -> Assertions.assertEquals(\n                    config.isEnableSafeSearch.isEnabled,\n                    (u as PrefType.BoolPref).value\n                )\n\n                Keys.IsConfirmedSafeSearchEnabled -> Assertions.assertEquals(\n                    config.isEnableSafeSearch.isConfirmed,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsShowWarningDisplayingSensitiveMedia -> Assertions.assertEquals(\n                    config.isShowWarningDisplayingSensitiveMedia,\n                    (u as PrefType.BoolPref).value\n                )\n                Keys.IsEnableHapticFeedbackOnNewPost -> Assertions.assertEquals(\n                    config.isEnableHapticFeedbackOnNewPost,\n                    (u as PrefType.BoolPref).value\n                )\n            }\n        }\n    }\n\n    @Test\n    fun from() {\n        Assertions.assertEquals(\n            Theme.Bread, Config.from(\n                mapOf(\n                    Keys.ThemeType to PrefType.IntPref(Theme.Bread.toInt())\n                )\n            ).theme\n        )\n\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/KeysKtTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.settings\n\nimport net.pantasystem.milktea.model.setting.Keys\nimport net.pantasystem.milktea.model.setting.allKeys\nimport net.pantasystem.milktea.model.setting.str\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass KeysKtTest {\n\n    @Test\n    fun str() {\n        Keys.allKeys.forEach { key ->\n            when (key) {\n                Keys.BackgroundImage -> Assertions.assertEquals(\"BackgroundImage\", key.str())\n                Keys.ClassicUI -> Assertions.assertEquals(\"HIDE_BOTTOM_NAVIGATION\", key.str())\n                Keys.IsPostButtonToBottom -> Assertions.assertEquals(\n                    \"IS_POST_BUTTON_TO_BOTTOM\",\n                    key.str()\n                )\n                Keys.IsSimpleEditorEnabled -> Assertions.assertEquals(\n                    \"IS_SIMPLE_EDITOR_ENABLED\",\n                    key.str()\n                )\n                Keys.IsUserNameDefault -> Assertions.assertEquals(\"IS_USER_NAME_DEFAULT\", key.str())\n                Keys.NoteLimitHeight -> Assertions.assertEquals(\"HEIGHT\", key.str())\n                Keys.ReactionPickerType -> Assertions.assertEquals(\"ReactionPickerType\", key.str())\n                Keys.ThemeType -> Assertions.assertEquals(\"THEME\", key.str())\n\n                Keys.IsIncludeLocalRenotes -> Assertions.assertEquals(\n                    \"INCLUDE_LOCAL_RENOTES\",\n                    key.str()\n                )\n                Keys.IsIncludeMyRenotes -> Assertions.assertEquals(\"INCLUDE_MY_RENOTES\", key.str())\n                Keys.IsIncludeRenotedMyNotes -> Assertions.assertEquals(\n                    \"INCLUDE_RENOTED_MY_NOTES\",\n                    key.str()\n                )\n                Keys.SurfaceColorOpacity -> Assertions.assertEquals(\n                    \"jp.panta.misskeyandroidclient.model.settings.SURFACE_COLOR_OPAQUE_KEY\",\n                    key.str()\n                )\n                Keys.IsEnableTimelineScrollAnimation -> Assertions.assertEquals(\n                    \"IS_ENABLE_TIMELINE_SCROLL_ANIMATION\",\n                    key.str()\n                )\n                Keys.IsCrashlyticsCollectionEnabled -> Assertions.assertEquals(\n                    \"IsCrashlyticsCollectionEnabled\",\n                    key.str()\n                )\n                Keys.IsConfirmedCrashlyticsCollection -> Assertions.assertEquals(\n                    \"IsConfirmedCrashlyticsCollection\",\n                    key.str()\n                )\n                Keys.IsAnalyticsCollectionEnabled -> Assertions.assertEquals(\n                    \"IsAnalyticsCollectionEnabled\",\n                    key.str()\n                )\n                Keys.IsConfirmedAnalyticsCollection -> Assertions.assertEquals(\n                    \"IsConfirmedAnalyticsCollection\",\n                    key.str()\n                )\n                Keys.IsConfirmedPostNotification -> Assertions.assertEquals(\n                    \"IsConfirmedPostNotification\",\n                    key.str()\n                )\n                Keys.IsEnableInstanceTicker -> Assertions.assertEquals(\n                    \"IsEnableInstanceTicker\",\n                    key.str()\n                )\n                Keys.IsDriveUsingGridView -> Assertions.assertEquals(\n                    \"IsDriveUsingGridView\",\n                    key.str()\n                )\n                Keys.IsEnableNotificationSound -> Assertions.assertEquals(\n                    \"IsEnableNotificationSound\",\n                    key.str()\n                )\n                Keys.IsStopNoteCaptureWhenBackground -> Assertions.assertEquals(\n                    \"IsStopNoteCaptureWhenBackground\",\n                    key.str()\n                )\n                Keys.IsStopStreamingApiWhenBackground -> Assertions.assertEquals(\n                    \"IsStopStreamingApiWhenBackground\",\n                    key.str()\n                )\n                Keys.IsEnableStreamingAPIAndNoteCapture -> Assertions.assertEquals(\n                    \"IsEnableStreamingAPIAndNoteCapture\",\n                    key.str()\n                )\n                Keys.IsEnableNoteDivider -> Assertions.assertEquals(\n                    \"IsEnableNoteDivider\",\n                    key.str()\n                )\n                Keys.IsVisibleInstanceUrlInToolbar -> Assertions.assertEquals(\n                    \"IsVisibleInstanceUrlInToolbar\",\n                    key.str()\n                )\n                Keys.NoteContentFontSize -> Assertions.assertEquals(\n                    \"NoteContentFontSize\",\n                    key.str()\n                )\n                Keys.NoteHeaderFontSize -> Assertions.assertEquals(\n                    \"NoteHeaderFontSize\",\n                    key.str()\n                )\n                Keys.IsDisplayTimestampsAsAbsoluteDates -> Assertions.assertEquals(\n                    \"IsDisplayTimestampsAsAbsoluteDates\",\n                    key.str()\n                )\n                Keys.NoteReactionCounterFontSize -> Assertions.assertEquals(\n                    \"NoteReactionCounterFontSize\",\n                    key.str()\n                )\n                Keys.NoteCustomEmojiScaleSizeInText -> Assertions.assertEquals(\n                    \"NoteCustomEmojiScaleSizeInText\",\n                    key.str()\n                )\n                Keys.EmojiPickerEmojiDisplaySize -> Assertions.assertEquals(\n                    \"EmojiPickerEmojiDisplaySize\",\n                    key.str()\n                )\n\n                Keys.AvatarIconShapeType -> Assertions.assertEquals(\n                    \"AvatarIconShapeType\",\n                    key.str()\n                )\n                Keys.MediaDisplayMode -> Assertions.assertEquals(\n                    \"MediaDisplayMode\",\n                    key.str()\n                )\n                Keys.IsSafeSearchEnabled -> Assertions.assertEquals(\n                    \"ExcludeIfExistsSensitiveMedia\",\n                    key.str()\n                )\n                Keys.IsSafeSearchEnabled -> Assertions.assertEquals(\n                    \"ExcludeIfExistsSensitiveMedia\",\n                    key.str()\n                )\n                Keys.IsConfirmedSafeSearchEnabled -> Assertions.assertEquals(\n                    \"IsConfirmedSafeSearchEnabled\",\n                    key.str()\n                )\n                Keys.IsShowWarningDisplayingSensitiveMedia -> Assertions.assertEquals(\n                    \"IsShowWarningDisplayingSensitiveMedia\",\n                    key.str()\n                )\n                Keys.IsEnableHapticFeedbackOnNewPost -> Assertions.assertEquals(\n                    \"IsEnableHapticFeedbackOnNewPost\",\n                    key.str()\n                )\n            }\n        }\n    }\n\n\n    @Test\n    fun checkAllKeysCount() {\n        Assertions.assertEquals(38, Keys.allKeys.size)\n        Assertions.assertEquals(38, Keys.allKeys.map { it.str() }.toSet().size)\n    }\n\n\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/settings/ThemeKtTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.settings\n\nimport net.pantasystem.milktea.model.setting.Theme\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass ThemeKtTest {\n\n    @Test\n    fun toInt() {\n        Assertions.assertEquals(0, Theme.White.toInt())\n        Assertions.assertEquals(1, Theme.Black.toInt())\n        Assertions.assertEquals(2, Theme.Dark.toInt())\n        Assertions.assertEquals(3, Theme.Bread.toInt())\n\n    }\n\n    @Test\n    fun from() {\n        Assertions.assertEquals(Theme.White, Theme.from(Theme.White.toInt()))\n        Assertions.assertEquals(Theme.Black, Theme.from(Theme.Black.toInt()))\n        Assertions.assertEquals(Theme.Dark, Theme.from(Theme.Dark.toInt()))\n        Assertions.assertEquals(Theme.Bread, Theme.from(Theme.Bread.toInt()))\n        Assertions.assertEquals(Theme.White, Theme.from(206))\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/FindAllRemoteRenoteMutesTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass FindAllRemoteRenoteMutesTest {\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun give3Page() = runTest {\n        val page1 = (0 until 11).map {\n            RenoteMuteDTO(\n                id = \"1+$it\",\n                createdAt = Clock.System.now(),\n                mutee = UserDTO(\"\", \"\"),\n                muteeId = \"test\"\n            )\n        }\n        Assertions.assertEquals(11, page1.size)\n        val page2 = (0 until 11).map {\n            RenoteMuteDTO(\n                id = \"2+$it\",\n                createdAt = Clock.System.now(),\n                mutee = UserDTO(\"\", \"\"),\n                muteeId = \"test\"\n            )\n        }\n        Assertions.assertEquals(11, page2.size)\n        val page3 = (0 until 11).map {\n            RenoteMuteDTO(\n                id = \"3+$it\",\n                createdAt = Clock.System.now(),\n                mutee = UserDTO(\"\", \"\"),\n                muteeId = \"test\"\n            )\n        }\n        Assertions.assertEquals(11, page3.size)\n        val pageMap = mapOf(\n            page1.last().id to page2,\n            page2.last().id to page3,\n        )\n        val target = FindAllRemoteRenoteMutesDelegateImpl(\n            renoteMuteApiAdapter = object : RenoteMuteApiAdapter {\n                override suspend fun create(userId: User.Id) = Unit\n                override suspend fun delete(userId: User.Id) = Unit\n                override suspend fun findBy(\n                    accountId: Long,\n                    sinceId: String?,\n                    untilId: String?\n                ): List<RenoteMuteDTO> {\n                    return if (untilId == null) {\n                        page1\n                    } else {\n                        pageMap[untilId] ?: emptyList()\n                    }\n                }\n            }\n        )\n        val account = Account(\n            remoteId = \"\",\n            instanceDomain = \"\",\n            userName = \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        )\n        val actual = target.invoke(account)\n        val expect = page1 + page2 + page3\n\n        Assertions.assertEquals(expect, actual)\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/RenoteMuteCacheTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\ninternal class RenoteMuteCacheTest {\n\n    @Test\n    fun add() {\n        val cache = RenoteMuteCache()\n        cache.add(RenoteMute(User.Id(0L, \"user1\"), Clock.System.now(), null))\n        Assertions.assertTrue(cache.exists(User.Id(0L, \"user1\")))\n        Assertions.assertFalse(cache.isNotFound(User.Id(0L, \"user1\")))\n    }\n\n    @Test\n    fun remove() {\n        val cache = RenoteMuteCache()\n        cache.remove(User.Id(0L, \"user1\"))\n        Assertions.assertFalse(cache.exists(User.Id(0L, \"user1\")))\n        Assertions.assertTrue(cache.isNotFound(User.Id(0L, \"user1\")))\n    }\n\n    @Test\n    fun addAndRemove() {\n        val cache = RenoteMuteCache()\n        cache.add(RenoteMute(User.Id(0L, \"user1\"), Clock.System.now(), null))\n        cache.remove(User.Id(0L, \"user1\"))\n\n        Assertions.assertFalse(cache.exists(User.Id(0L, \"user1\")))\n        Assertions.assertTrue(cache.isNotFound(User.Id(0L, \"user1\")))\n    }\n\n    @Test\n    fun doNothing() {\n        val cache = RenoteMuteCache()\n        Assertions.assertFalse(cache.isNotFound(User.Id(0L, \"user1\")))\n        Assertions.assertFalse(cache.exists(User.Id(0L, \"user1\")))\n    }\n\n    @Test\n    fun addAll() {\n        val cache = RenoteMuteCache()\n        val d1 = RenoteMute(User.Id(0L, \"user1\"), Clock.System.now(), null)\n        val d2 = RenoteMute(User.Id(0L, \"user2\"), Clock.System.now(), null)\n        val d3 = RenoteMute(User.Id(0L, \"user3\"), Clock.System.now(), null)\n        val d4 = RenoteMute(User.Id(0L, \"user4\"), Clock.System.now(), null)\n        val data = listOf(d1, d2, d3, d4)\n        cache.addAll(data)\n        Assertions.assertTrue(cache.exists(d1.userId))\n        Assertions.assertTrue(cache.exists(d2.userId))\n        Assertions.assertTrue(cache.exists(d3.userId))\n        Assertions.assertTrue(cache.exists(d4.userId))\n\n        Assertions.assertFalse(cache.isNotFound(d1.userId))\n        Assertions.assertFalse(cache.isNotFound(d2.userId))\n        Assertions.assertFalse(cache.isNotFound(d3.userId))\n        Assertions.assertFalse(cache.isNotFound(d4.userId))\n    }\n\n    @Test\n    fun addAll_GiveIsAllArgs() {\n        val cache = RenoteMuteCache()\n        val d1 = RenoteMute(User.Id(0L, \"user1\"), Clock.System.now(), null)\n        val d2 = RenoteMute(User.Id(0L, \"user2\"), Clock.System.now(), null)\n        val d3 = RenoteMute(User.Id(0L, \"user3\"), Clock.System.now(), null)\n        val d4 = RenoteMute(User.Id(0L, \"user4\"), Clock.System.now(), null)\n        val data = listOf(d1, d2, d3, d4)\n        cache.addAll(data, true)\n        Assertions.assertTrue(cache.exists(d1.userId))\n        Assertions.assertTrue(cache.exists(d2.userId))\n        Assertions.assertTrue(cache.exists(d3.userId))\n        Assertions.assertTrue(cache.exists(d4.userId))\n\n        Assertions.assertFalse(cache.isNotFound(d1.userId))\n        Assertions.assertFalse(cache.isNotFound(d2.userId))\n        Assertions.assertFalse(cache.isNotFound(d3.userId))\n        Assertions.assertFalse(cache.isNotFound(d4.userId))\n    }\n\n    @Test\n    fun clearByAccount() {\n        val cache = RenoteMuteCache()\n        val d1 = RenoteMute(User.Id(0L, \"user1\"), Clock.System.now(), null)\n        val d2 = RenoteMute(User.Id(0L, \"user2\"), Clock.System.now(), null)\n        val d3 = RenoteMute(User.Id(1L, \"user3\"), Clock.System.now(), null)\n        val d4 = RenoteMute(User.Id(1L, \"user4\"), Clock.System.now(), null)\n        val data = listOf(d1, d2, d3, d4)\n        cache.addAll(data)\n        cache.clearBy(1L)\n        Assertions.assertTrue(cache.exists(d1.userId))\n        Assertions.assertTrue(cache.exists(d2.userId))\n        Assertions.assertFalse(cache.exists(d3.userId))\n        Assertions.assertFalse(cache.exists(d4.userId))\n\n        Assertions.assertFalse(cache.isNotFound(d1.userId))\n        Assertions.assertFalse(cache.isNotFound(d2.userId))\n        Assertions.assertTrue(cache.isNotFound(d3.userId))\n        Assertions.assertTrue(cache.isNotFound(d4.userId))\n    }\n\n    @Test\n    fun addAll_GiveIsAllArgsAndNotIsAll() {\n        val cache = RenoteMuteCache()\n        val d1 = RenoteMute(User.Id(0L, \"user1\"), Clock.System.now(), null)\n        val d2 = RenoteMute(User.Id(0L, \"user2\"), Clock.System.now(), null)\n        val d3 = RenoteMute(User.Id(0L, \"user3\"), Clock.System.now(), null)\n        val d4 = RenoteMute(User.Id(0L, \"user4\"), Clock.System.now(), null)\n        val data = listOf(d1, d2, d3, d4)\n        cache.addAll(data, true)\n        Assertions.assertTrue(cache.exists(d1.userId))\n        Assertions.assertTrue(cache.exists(d2.userId))\n        Assertions.assertTrue(cache.exists(d3.userId))\n        Assertions.assertTrue(cache.exists(d4.userId))\n\n        Assertions.assertFalse(cache.isNotFound(d1.userId))\n        Assertions.assertFalse(cache.isNotFound(d2.userId))\n        Assertions.assertFalse(cache.isNotFound(d3.userId))\n        Assertions.assertFalse(cache.isNotFound(d4.userId))\n\n        val d5 = RenoteMute(User.Id(0L, \"user5\"), Clock.System.now(), null)\n        val d6 = RenoteMute(User.Id(0L, \"user6\"), Clock.System.now(), null)\n        val data2 = listOf(d5, d6)\n        cache.addAll(data2, false)\n        Assertions.assertTrue(cache.exists(d1.userId))\n        Assertions.assertTrue(cache.exists(d2.userId))\n        Assertions.assertTrue(cache.exists(d3.userId))\n        Assertions.assertTrue(cache.exists(d4.userId))\n        Assertions.assertTrue(cache.exists(d5.userId))\n        Assertions.assertTrue(cache.exists(d6.userId))\n\n        Assertions.assertFalse(cache.isNotFound(d1.userId))\n        Assertions.assertFalse(cache.isNotFound(d2.userId))\n        Assertions.assertFalse(cache.isNotFound(d3.userId))\n        Assertions.assertFalse(cache.isNotFound(d4.userId))\n        Assertions.assertFalse(cache.isNotFound(d5.userId))\n        Assertions.assertFalse(cache.isNotFound(d6.userId))\n\n        Assertions.assertFalse(cache.exists(User.Id(0L, \"user-not-found1\")))\n        Assertions.assertFalse(cache.isNotFound(User.Id(0L, \"user-not-found1\")))\n\n        Assertions.assertFalse(cache.exists(User.Id(1L, \"user-not-found1\")))\n        Assertions.assertFalse(cache.isNotFound(User.Id(1L, \"user-not-found1\")))\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/RenoteMuteRepositoryImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\ninternal class RenoteMuteRepositoryImplTest {\n\n    @Test\n    fun renoteMuteDTO_toModel() {\n        val now = Clock.System.now()\n        val result = RenoteMuteDTO(\n            id = \"mute-id\",\n            muteeId = \"user-id\",\n            mutee = UserDTO(\"user-id\", \"\"),\n            createdAt = now\n        ).toModel(0L)\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-id\"),\n            createdAt = now,\n            postedAt = now,\n        )\n        Assertions.assertEquals(expect, result)\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/UnPushedRenoteMutesDiffFilterTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass UnPushedRenoteMutesDiffFilterTest {\n\n    @Test\n    fun whenAlreadyExistsRemotely() {\n        val target = UnPushedRenoteMutesDiffFilter()\n        val createdAt = Clock.System.now()\n        val result = target(\n            mutes = listOf(\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user1\", \"\"),\n                    muteeId = \"user1\"\n                ),\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user2\", \"\"),\n                    muteeId = \"user2\"\n                ),\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user3\", \"\"),\n                    muteeId = \"user3\"\n                ),\n            ),\n            locals = listOf(\n                RenoteMute(\n                    User.Id(0L, \"user1\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n                RenoteMute(\n                    User.Id(0L, \"user2\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n                RenoteMute(\n                    User.Id(0L, \"user3\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n            )\n        )\n        Assertions.assertEquals(listOf<RenoteMute>(), result)\n    }\n\n    @Test\n    fun whenMoreLocalThanRemote() {\n        val target = UnPushedRenoteMutesDiffFilter()\n        val createdAt = Clock.System.now()\n        val result = target(\n            mutes = listOf(\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user1\", \"\"),\n                    muteeId = \"user1\"\n                ),\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user2\", \"\"),\n                    muteeId = \"user2\"\n                ),\n            ),\n            locals = listOf(\n                RenoteMute(\n                    User.Id(0L, \"user1\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n                RenoteMute(\n                    User.Id(0L, \"user2\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n                RenoteMute(\n                    User.Id(0L, \"user3\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n            )\n        )\n        Assertions.assertEquals(\n            listOf(\n                RenoteMute(\n                    User.Id(0L, \"user3\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n            ), result\n        )\n    }\n\n    @Test\n    fun whenMoreRemoteThanLocal() {\n        val target = UnPushedRenoteMutesDiffFilter()\n        val createdAt = Clock.System.now()\n        val result = target(\n            mutes = listOf(\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user1\", \"\"),\n                    muteeId = \"user1\"\n                ),\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user2\", \"\"),\n                    muteeId = \"user2\"\n                ),\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user3\", \"\"),\n                    muteeId = \"user3\"\n                ),\n            ),\n            locals = listOf(\n                RenoteMute(\n                    User.Id(0L, \"user1\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n                RenoteMute(\n                    User.Id(0L, \"user2\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n            )\n        )\n        Assertions.assertEquals(listOf<RenoteMute>(), result)\n    }\n\n    @Test\n    fun hasPushed() {\n        val target = UnPushedRenoteMutesDiffFilter()\n        val createdAt = Clock.System.now()\n        val result = target(\n            mutes = listOf(\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user1\", \"\"),\n                    muteeId = \"user1\"\n                ),\n                RenoteMuteDTO(\n                    id = \"\",\n                    createdAt = createdAt,\n                    mutee = UserDTO(\"user2\", \"\"),\n                    muteeId = \"user2\"\n                ),\n            ),\n            locals = listOf(\n                RenoteMute(\n                    User.Id(0L, \"user1\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n                RenoteMute(\n                    User.Id(0L, \"user2\"),\n                    createdAt = createdAt,\n                    postedAt = null,\n                ),\n                RenoteMute(\n                    User.Id(0L, \"user3\"),\n                    createdAt = createdAt,\n                    postedAt = createdAt,\n                ),\n            )\n        )\n        Assertions.assertEquals(\n            listOf<RenoteMute>(),\n            result\n        )\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/db/RenoteMuteRecordTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.db\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport kotlin.time.Duration.Companion.days\n\ninternal class RenoteMuteRecordTest {\n\n    @Test\n    fun toModel() {\n        val createdAt = Clock.System.now()\n        val postedAt = Clock.System.now() + 1.days\n        val record = RenoteMuteRecord(\n            accountId = 0, userId = \"user-id-1\", createdAt = createdAt, postedAt = postedAt\n        )\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-id-1\"),\n            createdAt = createdAt,\n            postedAt = postedAt,\n        )\n        Assertions.assertEquals(expect, record.toModel())\n    }\n\n    @Test\n    fun toModel_GiveNullPostedAt() {\n        val createdAt = Clock.System.now()\n        val record = RenoteMuteRecord(\n            accountId = 0, userId = \"user-id-1\", createdAt = createdAt, postedAt = null\n        )\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-id-1\"),\n            createdAt = createdAt,\n            postedAt = null\n        )\n        Assertions.assertEquals(expect, record.toModel())\n    }\n\n    @Test\n    fun from() {\n        val createdAt = Clock.System.now()\n        val postedAt = Clock.System.now() + 1.days\n\n        val model = RenoteMute(\n            User.Id(0L, \"user-id-1\"),\n            createdAt = createdAt,\n            postedAt = postedAt\n        )\n\n        val expect = RenoteMuteRecord(\n            accountId = 0L,\n            userId = \"user-id-1\",\n            createdAt = createdAt,\n            postedAt = postedAt\n        )\n\n        Assertions.assertEquals(expect, RenoteMuteRecord.from(model))\n    }\n\n    @Test\n    fun from_GiveNullPostedAt() {\n        val createdAt = Clock.System.now()\n\n        val model = RenoteMute(\n            User.Id(0L, \"user-id-1\"),\n            createdAt = createdAt,\n            postedAt = null\n        )\n\n        val expect = RenoteMuteRecord(\n            accountId = 0L,\n            userId = \"user-id-1\",\n            createdAt = createdAt,\n            postedAt = null\n        )\n\n        Assertions.assertEquals(expect, RenoteMuteRecord.from(model))\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/delegate/CreateRenoteMuteAndPushToRemoteDelegateTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.IsSupportRenoteMuteInstance\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.RenoteMuteApiAdapter\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteRecord\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport kotlin.time.Duration.Companion.days\n\ninternal class CreateRenoteMuteAndPushToRemoteDelegateTest {\n\n    // キャッシュに存在しない\n    // APIがRenoteMuteをサポートしている場合\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun notExistsCacheAndSupportRenoteMute() = runTest {\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-1\"),\n            createdAt = Clock.System.now(),\n            postedAt = null,\n        )\n\n        var actualByUpdated: RenoteMuteRecord? = null\n        var actualByInserted: RenoteMuteRecord? = null\n        val dao: RenoteMuteDao = object : RenoteMuteDao {\n            override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long {\n                actualByInserted = renoteMuteRecord\n                return 1\n            }\n\n            override suspend fun update(renoteMuteRecord: RenoteMuteRecord) {\n                actualByUpdated = renoteMuteRecord\n            }\n\n            override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> = emptyList()\n            override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> = emptyList()\n            override suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord? = null\n            override fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?> = emptyFlow()\n            override suspend fun delete(accountId: Long, userId: String) = Unit\n            override suspend fun deleteBy(accountId: Long) = Unit\n            override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n            override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> = emptyList()\n\n        }\n\n\n\n        val delegate = CreateRenoteMuteAndPushToRemoteDelegateImpl(\n            getAccount = {\n                Account(\n                    remoteId = \"\",\n                    instanceDomain = \"\",\n                    userName = \"\",\n                    instanceType = Account.InstanceType.MISSKEY,\n                    token = \"\"\n                )\n            },\n            renoteMuteApiAdapter = object : RenoteMuteApiAdapter {\n                override suspend fun create(userId: User.Id) = Unit\n                override suspend fun delete(userId: User.Id) = Unit\n                override suspend fun findBy(\n                    accountId: Long,\n                    sinceId: String?,\n                    untilId: String?,\n                ): List<RenoteMuteDTO> = emptyList()\n            },\n            findRenoteMuteAndUpdateMemCache = object : FindRenoteMuteAndUpdateMemCacheDelegate {\n                var isFirst = true\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    if (isFirst) {\n                        isFirst = false\n                        return Result.failure(NoSuchElementException())\n                    }\n                    return Result.success(\n                        expect\n                    )\n                }\n            },\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return true\n                }\n            },\n            renoteMuteDao = dao,\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        val result = delegate.invoke(User.Id(0L, \"user-1\"))\n            .getOrThrow()\n\n        Assertions.assertEquals(\n            expect,\n            result\n        )\n\n        Assertions.assertNotNull(actualByInserted)\n        Assertions.assertNotNull(actualByUpdated)\n        Assertions.assertNotNull(actualByUpdated?.postedAt)\n    }\n\n\n    // キャッシュに存在しない\n    // APIがRenoteMuteをサポートしていない場合\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun notExistsInCacheAndNotSupportApi() = runTest {\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-1\"),\n            createdAt = Clock.System.now(),\n            postedAt = null,\n        )\n\n        var actualByUpdated: RenoteMuteRecord? = null\n        var actualByInserted: RenoteMuteRecord? = null\n        val dao: RenoteMuteDao = object : RenoteMuteDao {\n            override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long {\n                actualByInserted = renoteMuteRecord\n                return 1\n            }\n\n            override suspend fun update(renoteMuteRecord: RenoteMuteRecord) {\n                actualByUpdated = renoteMuteRecord\n            }\n\n            override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> = emptyList()\n            override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> = emptyList()\n            override suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord? = null\n            override fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?> = emptyFlow()\n            override suspend fun delete(accountId: Long, userId: String) = Unit\n            override suspend fun deleteBy(accountId: Long) = Unit\n            override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n            override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> = emptyList()\n        }\n\n\n\n        val delegate = CreateRenoteMuteAndPushToRemoteDelegateImpl(\n            getAccount = {\n                Account(\n                    remoteId = \"\",\n                    instanceDomain = \"\",\n                    userName = \"\",\n                    instanceType = Account.InstanceType.MISSKEY,\n                    token = \"\"\n                )\n            },\n            renoteMuteApiAdapter = object : RenoteMuteApiAdapter {\n                override suspend fun create(userId: User.Id) = Unit\n                override suspend fun delete(userId: User.Id) = Unit\n                override suspend fun findBy(\n                    accountId: Long,\n                    sinceId: String?,\n                    untilId: String?,\n                ): List<RenoteMuteDTO> = emptyList()\n            },\n            findRenoteMuteAndUpdateMemCache = object : FindRenoteMuteAndUpdateMemCacheDelegate {\n                var isFirst = true\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    if (isFirst) {\n                        isFirst = false\n                        return Result.failure(NoSuchElementException())\n                    }\n                    return Result.success(\n                        expect\n                    )\n                }\n            },\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return false\n                }\n            },\n            renoteMuteDao = dao,\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        val result = delegate.invoke(User.Id(0L, \"user-1\"))\n            .getOrThrow()\n\n        Assertions.assertEquals(\n            expect,\n            result\n        )\n\n        Assertions.assertNotNull(actualByInserted)\n        Assertions.assertNull(actualByUpdated)\n        Assertions.assertNull(actualByUpdated?.postedAt)\n    }\n\n    // キャッシュに存在する\n    // まだ未送信である\n    // APIがRenoteMuteをサポートしている場合\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun existsInCacheAndNotPushedAndSupportApi() = runTest {\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-1\"),\n            createdAt = Clock.System.now(),\n            postedAt = null,\n        )\n\n        var actualByUpdated: RenoteMuteRecord? = null\n        var actualByInserted: RenoteMuteRecord? = null\n        val dao: RenoteMuteDao = object : RenoteMuteDao {\n            override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long {\n                actualByInserted = renoteMuteRecord\n                return 1\n            }\n\n            override suspend fun update(renoteMuteRecord: RenoteMuteRecord) {\n                actualByUpdated = renoteMuteRecord\n            }\n\n            override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> = emptyList()\n            override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> = emptyList()\n            override suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord? = null\n            override fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?> = emptyFlow()\n            override suspend fun delete(accountId: Long, userId: String) = Unit\n            override suspend fun deleteBy(accountId: Long) = Unit\n            override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n            override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> = emptyList()\n        }\n\n\n\n        val delegate = CreateRenoteMuteAndPushToRemoteDelegateImpl(\n            getAccount = {\n                Account(\n                    remoteId = \"\",\n                    instanceDomain = \"\",\n                    userName = \"\",\n                    instanceType = Account.InstanceType.MISSKEY,\n                    token = \"\"\n                )\n            },\n            renoteMuteApiAdapter = object : RenoteMuteApiAdapter {\n                override suspend fun create(userId: User.Id) = Unit\n                override suspend fun delete(userId: User.Id) = Unit\n                override suspend fun findBy(\n                    accountId: Long,\n                    sinceId: String?,\n                    untilId: String?,\n                ): List<RenoteMuteDTO> = emptyList()\n            },\n            findRenoteMuteAndUpdateMemCache = object : FindRenoteMuteAndUpdateMemCacheDelegate {\n                var isFirst = true\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    if (isFirst) {\n                        isFirst = false\n                        return Result.success(RenoteMute(\n                            User.Id(0L, \"user-1\"),\n                            createdAt = Clock.System.now(),\n                            postedAt = null,\n                        ))\n                    }\n                    return Result.success(\n                        expect\n                    )\n                }\n            },\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return true\n                }\n            },\n            renoteMuteDao = dao,\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        val result = delegate.invoke(User.Id(0L, \"user-1\"))\n            .getOrThrow()\n\n        Assertions.assertEquals(\n            expect,\n            result\n        )\n\n        Assertions.assertNull(actualByInserted)\n        Assertions.assertNotNull(actualByUpdated)\n        Assertions.assertNotNull(actualByUpdated?.postedAt)\n    }\n\n    // キャッシュに存在する\n    // まだ未送信である\n    // APIがRenoteMuteをサポートしていない場合\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun existsInCacheAndNotPushedAndNotSupportApi() = runTest {\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-1\"),\n            createdAt = Clock.System.now(),\n            postedAt = null,\n        )\n\n        var actualByUpdated: RenoteMuteRecord? = null\n        var actualByInserted: RenoteMuteRecord? = null\n        val dao: RenoteMuteDao = object : RenoteMuteDao {\n            override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long {\n                actualByInserted = renoteMuteRecord\n                return 1\n            }\n\n            override suspend fun update(renoteMuteRecord: RenoteMuteRecord) {\n                actualByUpdated = renoteMuteRecord\n            }\n\n            override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> = emptyList()\n            override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> = emptyList()\n            override suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord? = null\n            override fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?> = emptyFlow()\n            override suspend fun delete(accountId: Long, userId: String) = Unit\n            override suspend fun deleteBy(accountId: Long) = Unit\n            override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n            override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> = emptyList()\n        }\n\n        val delegate = CreateRenoteMuteAndPushToRemoteDelegateImpl(\n            getAccount = {\n                Account(\n                    remoteId = \"\",\n                    instanceDomain = \"\",\n                    userName = \"\",\n                    instanceType = Account.InstanceType.MISSKEY,\n                    token = \"\"\n                )\n            },\n            renoteMuteApiAdapter = object : RenoteMuteApiAdapter {\n                override suspend fun create(userId: User.Id) = Unit\n                override suspend fun delete(userId: User.Id) = Unit\n                override suspend fun findBy(\n                    accountId: Long,\n                    sinceId: String?,\n                    untilId: String?,\n                ): List<RenoteMuteDTO> = emptyList()\n            },\n            findRenoteMuteAndUpdateMemCache = object : FindRenoteMuteAndUpdateMemCacheDelegate {\n                var isFirst = true\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    if (isFirst) {\n                        isFirst = false\n                        return Result.success(RenoteMute(\n                            User.Id(0L, \"user-1\"),\n                            createdAt = Clock.System.now(),\n                            postedAt = null,\n                        ))\n                    }\n                    return Result.success(\n                        expect\n                    )\n                }\n            },\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return false\n                }\n            },\n            renoteMuteDao = dao,\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        val result = delegate.invoke(User.Id(0L, \"user-1\"))\n            .getOrThrow()\n\n        Assertions.assertEquals(\n            expect,\n            result\n        )\n\n        Assertions.assertNull(actualByInserted)\n        Assertions.assertNull(actualByUpdated)\n        Assertions.assertNull(actualByUpdated?.postedAt)\n    }\n\n    // キャッシュに存在する\n    // すでに送信済みの場合\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun existsInCacheAndAlreadyPushed() = runTest {\n\n        val expect = RenoteMute(\n            User.Id(0L, \"user-1\"),\n            createdAt = Clock.System.now(),\n            postedAt = Clock.System.now() + 1.days,\n        )\n\n        var actualByUpdated: RenoteMuteRecord? = null\n        var actualByInserted: RenoteMuteRecord? = null\n        val dao: RenoteMuteDao = object : RenoteMuteDao {\n            override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long {\n                actualByInserted = renoteMuteRecord\n                return 1\n            }\n\n            override suspend fun update(renoteMuteRecord: RenoteMuteRecord) {\n                actualByUpdated = renoteMuteRecord\n            }\n\n            override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> = emptyList()\n            override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> = emptyList()\n            override suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord? = null\n            override fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?> = emptyFlow()\n            override suspend fun delete(accountId: Long, userId: String) = Unit\n            override suspend fun deleteBy(accountId: Long) = Unit\n            override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n            override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> = emptyList()\n        }\n\n        val delegate = CreateRenoteMuteAndPushToRemoteDelegateImpl(\n            getAccount = {\n                Account(\n                    remoteId = \"\",\n                    instanceDomain = \"\",\n                    userName = \"\",\n                    instanceType = Account.InstanceType.MISSKEY,\n                    token = \"\"\n                )\n            },\n            renoteMuteApiAdapter = object : RenoteMuteApiAdapter {\n                override suspend fun create(userId: User.Id) = Unit\n                override suspend fun delete(userId: User.Id) = Unit\n                override suspend fun findBy(\n                    accountId: Long,\n                    sinceId: String?,\n                    untilId: String?,\n                ): List<RenoteMuteDTO> = emptyList()\n            },\n            findRenoteMuteAndUpdateMemCache = object : FindRenoteMuteAndUpdateMemCacheDelegate {\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    return Result.success(expect)\n                }\n            },\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return true\n                }\n            },\n            renoteMuteDao = dao,\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        val result = delegate.invoke(User.Id(0L, \"user-1\"))\n            .getOrThrow()\n\n        Assertions.assertEquals(\n            expect,\n            result\n        )\n\n        Assertions.assertNull(actualByInserted)\n        Assertions.assertNull(actualByUpdated)\n        Assertions.assertNull(actualByUpdated?.postedAt)\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/delegate/FindRenoteMuteAndUpdateMemCacheDelegateTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.RenoteMuteCache\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteRecord\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\ninternal class FindRenoteMuteAndUpdateMemCacheDelegateTest {\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun whenExists() = runTest {\n        val now = Clock.System.now()\n        val cache = RenoteMuteCache()\n\n        val dao: RenoteMuteDao = object : RenoteMuteDao {\n            override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long = 1L\n            override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> = emptyList()\n            override suspend fun update(renoteMuteRecord: RenoteMuteRecord) = Unit\n            override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> = emptyList()\n            override suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord = RenoteMuteRecord(0L, \"user-1\", now, null)\n            override fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?> = emptyFlow()\n            override suspend fun delete(accountId: Long, userId: String) = Unit\n            override suspend fun deleteBy(accountId: Long) = Unit\n            override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n            override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> = emptyList()\n        }\n        val delegate = FindRenoteMuteAndUpdateMemCacheDelegateImpl(\n            renoteMuteDao = dao,\n            cache = cache,\n            Dispatchers.Default\n        )\n        val result = delegate.invoke(User.Id(0L, \"user-1\")).getOrThrow()\n        Assertions.assertEquals(\n            RenoteMute(\n                User.Id(0L, \"user-1\"),\n                now,\n                null,\n            ),\n            result\n        )\n        Assertions.assertTrue(cache.exists(User.Id(0L, \"user-1\")))\n        Assertions.assertFalse(cache.isNotFound(User.Id(0L, \"user-1\")))\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun whenNotExists() = runTest {\n        val cache = RenoteMuteCache()\n        val dao: RenoteMuteDao = object : RenoteMuteDao {\n            override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long = 1L\n            override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> = emptyList()\n            override suspend fun update(renoteMuteRecord: RenoteMuteRecord) = Unit\n            override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> = emptyList()\n            override suspend fun findByUser(accountId: Long, userId: String): RenoteMuteRecord? = null\n            override fun observeByUser(accountId: Long, userId: String): Flow<RenoteMuteRecord?> = emptyFlow()\n            override suspend fun delete(accountId: Long, userId: String) = Unit\n            override suspend fun deleteBy(accountId: Long) = Unit\n            override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n            override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> = emptyList()\n        }\n        val delegate = FindRenoteMuteAndUpdateMemCacheDelegateImpl(\n            renoteMuteDao = dao,\n            cache = cache,\n            Dispatchers.Default\n        )\n        val result = delegate.invoke(User.Id(0L, \"user-1\"))\n        Assertions.assertTrue(result.isFailure)\n        Assertions.assertFalse(cache.exists(User.Id(0L, \"user-1\")))\n        Assertions.assertTrue(cache.isNotFound(User.Id(0L, \"user-1\")))\n\n    }\n}"
  },
  {
    "path": "modules/data/src/test/java/net/pantasystem/milktea/data/infrastructure/user/renote/mute/delegate/SyncRenoteMuteDelegateImplTest.kt",
    "content": "package net.pantasystem.milktea.data.infrastructure.user.renote.mute.delegate\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.emptyFlow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport kotlinx.coroutines.test.runTest\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.api.misskey.users.UserDTO\nimport net.pantasystem.milktea.api.misskey.users.renote.mute.RenoteMuteDTO\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.*\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteDao\nimport net.pantasystem.milktea.data.infrastructure.user.renote.mute.db.RenoteMuteRecord\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport kotlin.time.Duration.Companion.days\n\ninternal class SyncRenoteMuteDelegateImplTest {\n    // キャッシュが存在している　\n    // キャッシュは一度もPushしたことがない\n    // APIはRenoteMuteに対応している\n    // リモートには一つもRenoteMuteは存在しない\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun existsInCacheAndNotPushedAndSupportApiAndNotExistsInRemote() = runTest {\n        val cacheCreatedAt = Clock.System.now() - 1.days\n        val postedAt = Clock.System.now()\n\n        val currentAccount = Account(\n            remoteId = \"\",\n            instanceDomain = \"\",\n            userName = \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        )\n        val unPushedLocalData = listOf(\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-1\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-2\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-3\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-4\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-5\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            )\n        )\n\n        var insertAllActualData: List<RenoteMuteRecord>? = null\n        var callPushArgsActualData: List<User.Id> = emptyList()\n        var isDeleteByAccountCalled = false\n        val lock = Mutex()\n\n        val delegate = SyncRenoteMuteDelegateImpl(\n            getAccount = {\n                currentAccount\n            },\n            cache = RenoteMuteCache(),\n            renoteMuteDao = object : RenoteMuteDao {\n                override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long = 1L\n                override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> {\n                    insertAllActualData = records\n                    return emptyList()\n                }\n                override suspend fun update(renoteMuteRecord: RenoteMuteRecord) = Unit\n                override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> {\n                    return unPushedLocalData\n                }\n                override suspend fun findByUser(\n                    accountId: Long,\n                    userId: String,\n                ): RenoteMuteRecord? = null\n\n                override fun observeByUser(\n                    accountId: Long,\n                    userId: String,\n                ): Flow<RenoteMuteRecord?> = emptyFlow()\n\n                override suspend fun delete(accountId: Long, userId: String) = Unit\n\n                override suspend fun deleteBy(accountId: Long) {\n                    isDeleteByAccountCalled = true\n                }\n\n                override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n\n                override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> {\n                    return unPushedLocalData\n                }\n\n            },\n            createAndPushToRemote = object : CreateRenoteMuteAndPushToRemoteDelegate {\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    lock.withLock {\n                        callPushArgsActualData = callPushArgsActualData + userId\n                    }\n                    return Result.success(\n                        unPushedLocalData.first {\n                            it.userId == userId.id\n                        }.toModel().copy(\n                            postedAt = postedAt\n                        )\n                    )\n                }\n            },\n            unPushedRenoteMutesDiffFilter = UnPushedRenoteMutesDiffFilter(),\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return true\n                }\n            },\n            findAllRemoteRenoteMutesDelegate = object : FindAllRemoteRenoteMutesDelegate {\n                override suspend fun invoke(account: Account): List<RenoteMuteDTO> {\n                    return emptyList()\n                }\n                                                                                         },\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        delegate.invoke(currentAccount.accountId).getOrThrow()\n\n        Assertions.assertEquals(\n            unPushedLocalData.map {\n                it.toModel().userId\n            }.toSet(),\n            callPushArgsActualData.toSet()\n        )\n\n        Assertions.assertEquals(\n            unPushedLocalData.map {\n                it.toModel().userId\n            }.toSet(),\n            insertAllActualData?.map {\n                it.toModel().userId\n            }?.toSet()\n        )\n\n        Assertions.assertEquals(\n            unPushedLocalData.map {\n                it.toModel().copy(postedAt = postedAt)\n            }.sortedBy {\n                it.userId.id\n            },\n            insertAllActualData?.map {\n                it.toModel()\n            }?.sortedBy {\n                it.userId.id\n            }\n        )\n\n        Assertions.assertTrue(isDeleteByAccountCalled)\n\n    }\n\n    // キャッシュは存在している\n    // キャッシュは一度もPushしたことがない\n    // APIはRenoteMuteに対応している\n    // リモートにはキャッシュに存在しないRenoteMuteが存在している\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun existsInCacheAndNotPushedAndSupportApiAndExistsInRemote() = runTest {\n        val cacheCreatedAt = Clock.System.now() - 1.days\n        val postedAt = Clock.System.now()\n        val remoteCreatedAt = Clock.System.now()\n\n        val currentAccount = Account(\n            remoteId = \"\",\n            instanceDomain = \"\",\n            userName = \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        )\n        val unPushedLocalData = listOf(\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-1\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-2\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-3\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-4\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-5\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            )\n        )\n\n        val alreadyExistsRemoteData = listOf(\n            RenoteMuteDTO(\n                \"mute-1\",\n                muteeId = \"remote-mute-user-1\",\n                mutee = UserDTO(\"remote-mute-user-1\", \"\"),\n                createdAt = remoteCreatedAt\n            ),\n            RenoteMuteDTO(\n                \"mute-2\",\n                muteeId = \"remote-mute-user-2\",\n                mutee = UserDTO(\"remote-mute-user-2\", \"\"),\n                createdAt = remoteCreatedAt\n            )\n        )\n\n        var insertAllActualData: List<RenoteMuteRecord>? = null\n        var callPushArgsActualData: List<User.Id> = emptyList()\n        var isDeleteByAccountCalled = false\n        val lock = Mutex()\n\n        val delegate = SyncRenoteMuteDelegateImpl(\n            getAccount = {\n                currentAccount\n            },\n            cache = RenoteMuteCache(),\n            renoteMuteDao = object : RenoteMuteDao {\n                override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long = 1L\n                override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> {\n                    insertAllActualData = records\n                    return emptyList()\n                }\n                override suspend fun update(renoteMuteRecord: RenoteMuteRecord) = Unit\n                override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> {\n                    return unPushedLocalData\n                }\n                override suspend fun findByUser(\n                    accountId: Long,\n                    userId: String,\n                ): RenoteMuteRecord? = null\n\n                override fun observeByUser(\n                    accountId: Long,\n                    userId: String,\n                ): Flow<RenoteMuteRecord?> = emptyFlow()\n\n                override suspend fun delete(accountId: Long, userId: String) = Unit\n\n                override suspend fun deleteBy(accountId: Long) {\n                    isDeleteByAccountCalled = true\n                }\n\n                override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n\n                override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> {\n                    return unPushedLocalData\n                }\n\n            },\n            createAndPushToRemote = object : CreateRenoteMuteAndPushToRemoteDelegate {\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    lock.withLock {\n                        callPushArgsActualData = callPushArgsActualData + userId\n                        return Result.success(\n                            unPushedLocalData.first {\n                                it.userId == userId.id\n                            }.toModel().copy(\n                                postedAt = postedAt\n                            )\n                        )\n                    }\n\n                }\n            },\n            unPushedRenoteMutesDiffFilter = UnPushedRenoteMutesDiffFilter(),\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return true\n                }\n            },\n            findAllRemoteRenoteMutesDelegate = object : FindAllRemoteRenoteMutesDelegate {\n                override suspend fun invoke(account: Account): List<RenoteMuteDTO> {\n                    return alreadyExistsRemoteData\n                }\n            },\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        delegate.invoke(currentAccount.accountId).getOrThrow()\n\n        Assertions.assertEquals(\n            unPushedLocalData.map {\n                it.toModel().userId\n            }.toSet(),\n            callPushArgsActualData.toSet()\n        )\n\n        Assertions.assertEquals(\n            (alreadyExistsRemoteData.map {\n                it.toModel(currentAccount.accountId).userId\n            } + unPushedLocalData.map {\n                it.toModel().userId\n            }).toSet(),\n            insertAllActualData?.map {\n                it.toModel().userId\n            }?.toSet()\n        )\n\n        Assertions.assertEquals(\n            alreadyExistsRemoteData.map {\n                it.toModel(currentAccount.accountId)\n            } + unPushedLocalData.map {\n                it.toModel().copy(postedAt = postedAt)\n            }.sortedBy {\n                it.userId.id\n            },\n            insertAllActualData?.map {\n                it.toModel()\n            }?.sortedBy {\n                it.userId.id\n            }\n        )\n\n        Assertions.assertTrue(isDeleteByAccountCalled)\n    }\n\n    // キャッシュは存在している\n    // キャッシュは一度もPushしたことがない\n    // APIはRenoteMuteに対応していない\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @Test\n    fun existsInCacheAndNotPushedNotSupportApi() = runTest {\n        val cacheCreatedAt = Clock.System.now() - 1.days\n        val postedAt = Clock.System.now()\n\n        val currentAccount = Account(\n            remoteId = \"\",\n            instanceDomain = \"\",\n            userName = \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        )\n        val unPushedLocalData = listOf(\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-1\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-2\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-3\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-4\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            ),\n            RenoteMuteRecord(\n                currentAccount.accountId,\n                userId = \"user-5\",\n                createdAt = cacheCreatedAt,\n                postedAt = null,\n            )\n        )\n\n        var insertAllActualData: List<RenoteMuteRecord>? = null\n        var callPushArgsActualData: List<User.Id> = emptyList()\n        var isDeleteByAccountCalled = false\n\n        val delegate = SyncRenoteMuteDelegateImpl(\n            getAccount = {\n                currentAccount\n            },\n            cache = RenoteMuteCache(),\n            renoteMuteDao = object : RenoteMuteDao {\n                override suspend fun insert(renoteMuteRecord: RenoteMuteRecord): Long = 1L\n                override suspend fun insertAll(records: List<RenoteMuteRecord>): List<Long> {\n                    insertAllActualData = records\n                    return emptyList()\n                }\n                override suspend fun update(renoteMuteRecord: RenoteMuteRecord) = Unit\n                override suspend fun findByAccount(accountId: Long): List<RenoteMuteRecord> {\n                    return unPushedLocalData\n                }\n                override suspend fun findByUser(\n                    accountId: Long,\n                    userId: String,\n                ): RenoteMuteRecord? = null\n\n                override fun observeByUser(\n                    accountId: Long,\n                    userId: String,\n                ): Flow<RenoteMuteRecord?> = emptyFlow()\n\n                override suspend fun delete(accountId: Long, userId: String) = Unit\n\n                override suspend fun deleteBy(accountId: Long) {\n                    isDeleteByAccountCalled = true\n                }\n\n                override fun observeBy(accountId: Long): Flow<List<RenoteMuteRecord>> = emptyFlow()\n\n                override suspend fun findByUnPushed(accountId: Long): List<RenoteMuteRecord> {\n                    return unPushedLocalData\n                }\n\n            },\n            createAndPushToRemote = object : CreateRenoteMuteAndPushToRemoteDelegate {\n                override suspend fun invoke(userId: User.Id): Result<RenoteMute> {\n                    callPushArgsActualData = callPushArgsActualData + userId\n                    return Result.success(\n                        unPushedLocalData.first {\n                            it.userId == userId.id\n                        }.toModel().copy(\n                            postedAt = postedAt\n                        )\n                    )\n                }\n            },\n            unPushedRenoteMutesDiffFilter = UnPushedRenoteMutesDiffFilter(),\n            isSupportRenoteMuteInstance = object : IsSupportRenoteMuteInstance {\n                override suspend fun invoke(accountId: Long): Boolean {\n                    return false\n                }\n            },\n            findAllRemoteRenoteMutesDelegate = object : FindAllRemoteRenoteMutesDelegate {\n                override suspend fun invoke(account: Account): List<RenoteMuteDTO> {\n                    return emptyList()\n                }\n            },\n            coroutineDispatcher = Dispatchers.Default\n        )\n\n        delegate.invoke(currentAccount.accountId).getOrThrow()\n\n        Assertions.assertEquals(0, callPushArgsActualData.size)\n\n        Assertions.assertNull(insertAllActualData)\n\n        Assertions.assertFalse(isDeleteByAccountCalled)\n\n    }\n\n\n\n}"
  },
  {
    "path": "modules/features/account/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/account/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    namespace 'net.pantasystem.milktea.account'\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        compose true\n    }\n    \n    viewBinding {\n        enabled = true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:features:messaging')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:features:user')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.fragment.ktx\n    implementation libs.activity.ktx\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n\n    implementation libs.compose.constraintlayout\n\n}"
  },
  {
    "path": "modules/features/account/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/account/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/account/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/account/src/main/java/net/pantasystem/milktea/account/AccountFragment.kt",
    "content": "package net.pantasystem.milktea.account\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport coil.compose.rememberAsyncImagePainter\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageType\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.model.instance.online.user.count.OnlineUserCountResult\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.followlist.FollowFollowerActivity\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass AccountFragment : Fragment() {\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val currentPageableViewModel: CurrentPageableTimelineViewModel by activityViewModels()\n\n    private val accountViewModel by viewModels<AccountScreenViewModel>()\n\n\n    @OptIn(ExperimentalComposeUiApi::class)\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?,\n    ): View {\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val uiState by accountViewModel.uiState.collectAsState()\n\n                    Scaffold(contentWindowInsets = WindowInsets.safeDrawing) { paddingValues ->\n                        LazyColumn(\n                            modifier = Modifier\n                                .fillMaxSize()\n                                .padding(paddingValues)\n                                .nestedScroll(rememberNestedScrollInteropConnection())\n                        ) {\n                            item {\n                                when (val account = uiState.currentAccount) {\n                                    null -> {\n                                        Text(stringResource(id = R.string.unauthorized_error))\n                                    }\n                                    else -> {\n                                        when (val user = uiState.userInfo) {\n                                            is User.Detail -> {\n                                                Column(\n                                                    Modifier\n                                                        .fillMaxWidth()\n                                                        .padding(\n                                                            horizontal = 14.dp,\n                                                            vertical = 8.dp\n                                                        )\n                                                ) {\n                                                    Text(stringResource(id = R.string.account))\n                                                    Box(\n                                                        Modifier\n\n                                                            .border(\n                                                                1.dp,\n                                                                MaterialTheme.colorScheme.primary,\n                                                                RoundedCornerShape(8.dp)\n                                                            )\n                                                    ) {\n                                                        AccountInfoLayout(\n                                                            isUserNameMain = false,\n                                                            userDetail = user,\n                                                            account = account,\n                                                            onFollowerCountButtonClicked = {\n                                                                requireActivity().startActivity(\n                                                                    FollowFollowerActivity.newIntent(\n                                                                        requireContext(),\n                                                                        user.id,\n                                                                        isFollowing = false\n                                                                    )\n                                                                )\n                                                            },\n                                                            onFollowingCountButtonClicked = {\n                                                                requireActivity().startActivity(\n                                                                    FollowFollowerActivity.newIntent(\n                                                                        requireContext(),\n                                                                        user.id,\n                                                                        isFollowing = true\n                                                                    )\n                                                                )\n                                                            }\n                                                        )\n                                                    }\n                                                }\n\n                                            }\n                                            else -> {\n                                                Box(\n                                                    modifier = Modifier.fillMaxWidth(),\n                                                    contentAlignment = Alignment.Center\n                                                ) {\n                                                    CircularProgressIndicator()\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n\n                            }\n\n                            item {\n\n                                when (val info = uiState.instanceInfo) {\n                                    null -> Unit\n                                    else -> {\n                                        Column(\n                                            Modifier\n                                                .fillMaxWidth()\n                                                .padding(horizontal = 14.dp, vertical = 8.dp)\n                                        ) {\n                                            Text(stringResource(id = R.string.instance))\n                                            Box(\n                                                Modifier\n                                                    .border(\n                                                        1.dp,\n                                                        MaterialTheme.colorScheme.primary,\n                                                        RoundedCornerShape(8.dp)\n                                                    )\n                                            ) {\n                                                Column(\n                                                    Modifier\n                                                        .fillMaxWidth()\n                                                        .padding(8.dp),\n                                                    horizontalAlignment = Alignment.CenterHorizontally,\n                                                ) {\n                                                    Image(\n                                                        rememberAsyncImagePainter(info.iconUrl),\n                                                        contentDescription = null,\n                                                        modifier = Modifier\n                                                            .size(52.dp)\n                                                            .clip(\n                                                                RoundedCornerShape(8.dp)\n                                                            )\n                                                    )\n                                                    Text(\n                                                        info.name,\n                                                        fontWeight = FontWeight.Bold,\n                                                        fontSize = 20.sp\n                                                    )\n                                                    when (val count = uiState.onlineUserCount) {\n                                                        is OnlineUserCountResult.Success -> {\n                                                            Text(\n                                                                stringResource(\n                                                                    id = R.string.online_user_count_message,\n                                                                    count.count\n                                                                )\n                                                            )\n                                                        }\n                                                        else -> Unit\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n\n                            }\n                        }\n                    }\n\n\n                }\n            }\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        currentPageableViewModel.setCurrentPageType(CurrentPageType.Account)\n    }\n}"
  },
  {
    "path": "modules/features/account/src/main/java/net/pantasystem/milktea/account/AccountInfoLayout.kt",
    "content": "package net.pantasystem.milktea.account\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport androidx.constraintlayout.compose.ConstraintLayout\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.R\n\n@Composable\nfun AccountInfoLayout(\n    modifier: Modifier = Modifier,\n    isUserNameMain: Boolean,\n    userDetail: User.Detail,\n    account: Account,\n    onFollowingCountButtonClicked: () -> Unit,\n    onFollowerCountButtonClicked: () -> Unit,\n) {\n    ConstraintLayout(\n        modifier.fillMaxWidth()\n    ) {\n        val (\n            headerRef,\n            avatarIconRef,\n            mainNameRef,\n            subNameRef,\n            descriptionRef,\n            aggregationRef,\n            fieldsRef,\n        ) = createRefs()\n\n        Image(\n            painter = rememberAsyncImagePainter(userDetail.info.bannerUrl),\n            contentDescription = null,\n            contentScale = ContentScale.Crop,\n            modifier = Modifier\n                .fillMaxWidth()\n                .height(92.dp)\n                .constrainAs(headerRef) {\n                    top.linkTo(parent.top)\n                    start.linkTo(parent.start)\n                    end.linkTo(parent.end)\n\n                }\n        )\n\n\n\n        AvatarIcon(\n            url = userDetail.avatarUrl,\n            size = 64.dp,\n            borderStrokeWidth = 2.dp,\n            borderStrokeColor = MaterialTheme.colorScheme.surface,\n            modifier = Modifier\n                .size(64.dp)\n                .constrainAs(avatarIconRef) {\n                    start.linkTo(parent.start, margin = 8.dp)\n                    bottom.linkTo(subNameRef.bottom)\n                },\n        )\n\n        CustomEmojiText(\n            text = if (isUserNameMain) userDetail.displayUserName else userDetail.displayName,\n            fontWeight = FontWeight.Bold,\n            emojis = userDetail.emojis,\n            parsedResult = if (isUserNameMain) null else userDetail.parsedResult,\n            accountHost = account.getHost(),\n            sourceHost = userDetail.host,\n            modifier = Modifier\n                .constrainAs(mainNameRef) {\n                    start.linkTo(avatarIconRef.end, margin = 4.dp)\n                    top.linkTo(headerRef.bottom)\n                }\n        )\n        CustomEmojiText(\n            text = if (!isUserNameMain) userDetail.displayUserName else userDetail.displayName,\n            fontWeight = FontWeight.Bold,\n            emojis = userDetail.emojis,\n            parsedResult = if (isUserNameMain) userDetail.parsedResult else null,\n            accountHost = account.getHost(),\n            sourceHost = userDetail.host,\n            modifier = Modifier\n                .constrainAs(subNameRef) {\n                    start.linkTo(avatarIconRef.end, margin = 4.dp)\n                    top.linkTo(mainNameRef.bottom)\n                }\n        )\n\n        CustomEmojiText(\n            text = userDetail.info.description ?: \"\",\n            maxLines = 5,\n            textAlign = TextAlign.Start,\n            emojis = userDetail.emojis,\n            accountHost = account.getHost(),\n            sourceHost = userDetail.host,\n            modifier = Modifier\n                .padding(start = 8.dp, end = 8.dp)\n                .fillMaxWidth()\n                .constrainAs(descriptionRef) {\n                    start.linkTo(avatarIconRef.start)\n                    top.linkTo(subNameRef.bottom, margin = 2.dp)\n                    end.linkTo(parent.end)\n                }\n        )\n\n        Column(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(start = 8.dp, end = 8.dp, bottom = 8.dp)\n                .constrainAs(aggregationRef) {\n                    start.linkTo(parent.start)\n                    end.linkTo(parent.end)\n                    top.linkTo(descriptionRef.bottom, margin = 4.dp)\n                }\n        ) {\n            for (i in 0 until userDetail.info.fields.size) {\n                val field = userDetail.info.fields[i]\n\n                if (i == 0) {\n                    HorizontalDivider(modifier = Modifier.fillMaxWidth())\n                }\n                Row(\n                    Modifier.fillMaxWidth(),\n                    verticalAlignment = Alignment.CenterVertically,\n                ) {\n                    Text(field.name, modifier = Modifier.weight(0.2f))\n                    Text(field.value, modifier = Modifier.weight(0.8f))\n                }\n                HorizontalDivider(modifier = Modifier.fillMaxWidth())\n            }\n        }\n\n\n        Row(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(start = 8.dp, end = 8.dp, bottom = 8.dp)\n                .constrainAs(fieldsRef) {\n                    start.linkTo(parent.start)\n                    end.linkTo(parent.end)\n                    top.linkTo(aggregationRef.bottom)\n                }\n        ) {\n            Text(\n                \"${userDetail.info.notesCount ?: 0} ${stringResource(id = R.string.post)}\",\n                color = MaterialTheme.colorScheme.primary,\n                modifier = Modifier\n                    .padding(2.dp)\n            )\n            Spacer(modifier = Modifier.width(4.dp))\n            Text(\n                \"${userDetail.info.followingCount ?: 0} ${stringResource(id = R.string.following)}\",\n                color = MaterialTheme.colorScheme.primary,\n                modifier = Modifier\n                    .padding(2.dp)\n                    .clickable {\n                        onFollowingCountButtonClicked()\n                    },\n            )\n\n            Spacer(modifier = Modifier.width(4.dp))\n            Text(\n                \"${userDetail.info.followersCount ?: 0} ${stringResource(id = R.string.follower)}\",\n                color = MaterialTheme.colorScheme.primary,\n                modifier = Modifier\n                    .padding(2.dp)\n                    .clickable {\n                        onFollowerCountButtonClicked()\n                    }\n            )\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/account/src/main/java/net/pantasystem/milktea/account/AccountScreenViewModel.kt",
    "content": "package net.pantasystem.milktea.account\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.instance.online.user.count.OnlineUserCountRepository\nimport net.pantasystem.milktea.model.instance.online.user.count.OnlineUserCountResult\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass AccountScreenViewModel @Inject constructor(\n    accountStore: AccountStore,\n    private val userRepository: UserRepository,\n    private val onlineUserCountRepository: OnlineUserCountRepository,\n    private val instanceInfoService: InstanceInfoService,\n    private val loggerFactory: Logger.Factory,\n) : ViewModel() {\n\n    private val logger by lazy {\n        loggerFactory.create(\"AccountVM\")\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val user = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest {\n        userRepository.observe(User.Id(it.accountId, it.remoteId))\n    }.catch {\n        logger.error(\"observe current accounts user error\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val currentAccount = accountStore.observeCurrentAccount.catch {\n        logger.error(\"observe current account error\", it)\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null\n    )\n\n    private val instanceInfo = accountStore.observeCurrentAccount.filterNotNull().map {\n        instanceInfoService.find(it.normalizedInstanceUri).getOrThrow()\n    }.catch {\n        logger.error(\"インスタンス情報の取得に失敗\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val onlineUserCount = accountStore.observeCurrentAccount.filterNotNull().map {\n        onlineUserCountRepository.find(it.accountId).onFailure { e ->\n            logger.error(\"オンラインユーザー数の取得に失敗\", e)\n        }.getOrNull()\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val uiState = combine(currentAccount, user, instanceInfo, onlineUserCount) { a, u, info, count ->\n        AccountUiState(\n            currentAccount = a,\n            userInfo = u,\n            instanceInfo = info,\n            onlineUserCount = count,\n        )\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), AccountUiState())\n\n    init {\n        accountStore.observeCurrentAccount.filterNotNull().onEach { account ->\n            userRepository.sync(User.Id(account.accountId, account.remoteId)).onFailure {\n                logger.error(\"sync accounts user info error\", it)\n            }\n        }.launchIn(viewModelScope)\n    }\n}\n\ndata class AccountUiState(\n    val currentAccount: Account? = null,\n    val userInfo: User? = null,\n    val instanceInfo: InstanceInfoType? = null,\n    val onlineUserCount: OnlineUserCountResult? = null,\n)"
  },
  {
    "path": "modules/features/account/src/main/java/net/pantasystem/milktea/account/AccountTabFragment.kt",
    "content": "package net.pantasystem.milktea.account\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayoutMediator\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.account.databinding.FragmentAccountTabBinding\nimport net.pantasystem.milktea.common.ui.ToolbarSetter\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.UserPinnedNotesFragmentFactory\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass AccountTabFragment : Fragment(R.layout.fragment_account_tab) {\n\n    @Inject\n    lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    lateinit var userPinnedNotesFragmentFactory: UserPinnedNotesFragmentFactory\n\n    private val viewModel by viewModels<AccountTabViewModel>()\n\n    private var _binding: FragmentAccountTabBinding? = null\n    val binding: FragmentAccountTabBinding\n        get() = requireNotNull(_binding)\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val binding = FragmentAccountTabBinding.bind(view)\n        _binding = binding\n\n        val adapter = AccountTabPagerAdapter(\n            pageableFragmentFactory,\n            userPinnedNotesFragmentFactory,\n            this,\n        )\n        binding.viewPager.adapter = adapter\n        binding.tabLayout.tabMode = TabLayout.MODE_SCROLLABLE\n\n        TabLayoutMediator(\n            binding.tabLayout,\n            binding.viewPager\n        ) { tab, position ->\n            tab.text = getString(adapter.tabs[position].title)\n        }.attach()\n\n\n        viewModel.tabs.onEach {\n            adapter.submitList(it)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n    }\n\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        (requireActivity() as? ToolbarSetter?)?.apply {\n            setTitle(R.string.account)\n            setToolbar(binding.toolbar)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/account/src/main/java/net/pantasystem/milktea/account/AccountTabPagerAdapter.kt",
    "content": "package net.pantasystem.milktea.account\n\nimport androidx.fragment.app.Fragment\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.UserPinnedNotesFragmentFactory\nimport net.pantasystem.milktea.messaging.MessagingHistoryFragment\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.user.reaction.UserReactionsFragment\n\n\nclass AccountTabPagerAdapter(\n    val pageableFragmentFactory: PageableFragmentFactory,\n    val userPinnedNotesFragmentFactory: UserPinnedNotesFragmentFactory,\n    activity: Fragment,\n) : FragmentStateAdapter(activity) {\n\n    var tabs: List<AccountTabTypes> = emptyList()\n        private set\n\n    override fun createFragment(position: Int): Fragment {\n        return when (val tab = tabs[position]) {\n            is AccountTabTypes.Gallery -> pageableFragmentFactory.create(\n                tab.accountId,\n                Pageable.Gallery.User(tab.userId.id),\n            )\n            is AccountTabTypes.Media -> pageableFragmentFactory.create(\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    withFiles = true\n                )\n            )\n\n            is AccountTabTypes.PinNote -> userPinnedNotesFragmentFactory.create(tab.userId)\n            is AccountTabTypes.Reactions -> UserReactionsFragment.newInstance(tab.userId)\n            is AccountTabTypes.UserTimeline -> pageableFragmentFactory.create(\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    includeReplies = false\n                )\n            )\n            is AccountTabTypes.UserTimelineWithReplies -> pageableFragmentFactory.create(\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    includeReplies = true\n                )\n            )\n            is AccountTabTypes.MastodonMedia -> pageableFragmentFactory.create(\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    isOnlyMedia = true,\n                )\n            )\n            is AccountTabTypes.MastodonUserTimeline -> pageableFragmentFactory.create(\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    excludeReplies = true,\n                )\n            )\n            is AccountTabTypes.MastodonUserTimelineWithReplies -> pageableFragmentFactory.create(\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    excludeReplies = false,\n                )\n            )\n            AccountTabTypes.Account -> AccountFragment()\n            AccountTabTypes.Message -> MessagingHistoryFragment()\n            is AccountTabTypes.MastodonUserTimelineOnlyPosts -> pageableFragmentFactory.create(\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    excludeReblogs = true,\n                )\n            )\n            is AccountTabTypes.UserTimelineOnlyPosts -> pageableFragmentFactory.create(\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    includeMyRenotes = false,\n                )\n            )\n        }\n\n    }\n\n    override fun getItemCount(): Int {\n        return tabs.size\n    }\n\n    fun submitList(list: List<AccountTabTypes>) {\n\n        val old = tabs\n        tabs = list\n        val callback = object : DiffUtil.Callback() {\n            override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n\n            override fun getNewListSize(): Int {\n                return list.size\n            }\n\n            override fun getOldListSize(): Int {\n                return old.size\n            }\n\n            override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n        }\n        val result = DiffUtil.calculateDiff(callback)\n        result.dispatchUpdatesTo(this)\n    }\n\n\n}\n"
  },
  {
    "path": "modules/features/account/src/main/java/net/pantasystem/milktea/account/AccountTabViewModel.kt",
    "content": "package net.pantasystem.milktea.account\n\nimport androidx.annotation.StringRes\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\n@HiltViewModel\nclass AccountTabViewModel @Inject constructor(\n    accountStore: AccountStore,\n    private val featureEnables: FeatureEnables,\n) : ViewModel() {\n\n    val tabs = accountStore.observeCurrentAccount.filterNotNull().map { account ->\n        val isEnableGallery =\n            featureEnables.isEnable(account.normalizedInstanceUri, FeatureType.Gallery)\n        val userId = User.Id(account.accountId, account.remoteId)\n        val isEnableMessaging =\n            featureEnables.isEnable(account.normalizedInstanceUri, FeatureType.Messaging, false)\n        when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                listOfNotNull(\n                    AccountTabTypes.Account,\n                    if (isEnableMessaging) AccountTabTypes.Message else null,\n                    AccountTabTypes.UserTimeline(userId),\n                    AccountTabTypes.UserTimelineWithReplies(userId),\n                    AccountTabTypes.UserTimelineOnlyPosts(userId),\n                    AccountTabTypes.PinNote(userId),\n                    AccountTabTypes.Media(userId),\n                    if (isEnableGallery) AccountTabTypes.Gallery(\n                        userId, accountId = account.accountId\n                    ) else null,\n                    AccountTabTypes.Reactions(userId),\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                listOf(\n                    AccountTabTypes.Account,\n                    AccountTabTypes.MastodonUserTimeline(userId),\n                    AccountTabTypes.MastodonUserTimelineWithReplies(userId),\n                    AccountTabTypes.MastodonUserTimelineOnlyPosts(userId),\n                    AccountTabTypes.MastodonMedia(userId)\n                )\n            }\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        listOf(AccountTabTypes.Account)\n    )\n\n}\n\nsealed class AccountTabTypes(\n    @StringRes val title: Int\n) {\n\n    object Account : AccountTabTypes(R.string.account)\n    object Message : AccountTabTypes(R.string.message)\n\n    data class UserTimeline(val userId: User.Id) : AccountTabTypes(R.string.post)\n    data class UserTimelineWithReplies(val userId: User.Id) :\n        AccountTabTypes(R.string.notes_and_replies)\n\n    data class UserTimelineOnlyPosts(val userId: User.Id) : AccountTabTypes(R.string.post_only)\n\n    data class PinNote(val userId: User.Id) : AccountTabTypes(R.string.pin)\n    data class Gallery(val userId: User.Id, val accountId: Long) :\n        AccountTabTypes(R.string.gallery)\n\n    data class Reactions(val userId: User.Id) : AccountTabTypes(R.string.reaction)\n    data class Media(val userId: User.Id) : AccountTabTypes(R.string.media)\n\n    data class MastodonUserTimeline(val userId: User.Id) : AccountTabTypes(R.string.post)\n\n    data class MastodonUserTimelineOnlyPosts(val userId: User.Id) : AccountTabTypes(R.string.post_only)\n    data class MastodonUserTimelineWithReplies(val userId: User.Id) :\n        AccountTabTypes(R.string.notes_and_replies)\n\n    data class MastodonMedia(val userId: User.Id) : AccountTabTypes(R.string.media)\n}"
  },
  {
    "path": "modules/features/account/src/main/res/layout/fragment_account_tab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        android:layout_height=\"match_parent\"\n        android:layout_width=\"match_parent\">\n\n    <com.google.android.material.appbar.AppBarLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:fitsSystemWindows=\"true\"\n            android:stateListAnimator=\"@null\"\n            android:id=\"@+id/appBar\"\n            android:background=\"?attr/colorSurface\">\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                app:layout_scrollFlags=\"scroll|enterAlways\"\n                android:elevation=\"0dp\" />\n    </com.google.android.material.appbar.AppBarLayout>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n\n\n        <com.google.android.material.tabs.TabLayout\n                android:id=\"@+id/tabLayout\"\n                android:layout_height=\"?attr/actionBarSize\"\n                android:layout_width=\"match_parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:tabMaxWidth=\"0dp\"\n                app:tabMode=\"fixed\"\n                app:tabGravity=\"fill\" />\n\n\n\n        <androidx.viewpager2.widget.ViewPager2\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n\n                android:id=\"@+id/viewPager\" />\n    </LinearLayout>\n\n</androidx.coordinatorlayout.widget.CoordinatorLayout>"
  },
  {
    "path": "modules/features/antenna/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/antenna/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.antenna'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:features:note')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.fragment.ktx\n    implementation libs.wada811.databinding\n    implementation libs.activity.ktx\n\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    implementation libs.lifecycle.livedata\n    implementation libs.retrofit\n    implementation libs.recyclerview\n    implementation libs.androidx.constraintlayout\n    implementation libs.androidx.swiperefreshlayout\n    implementation libs.recyclerview\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/antenna/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/antenna/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/antenna/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/AntennaEditorActivity.kt",
    "content": "package net.pantasystem.milktea.antenna\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.MenuItem\nimport android.widget.Toast\nimport androidx.activity.addCallback\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.antenna.databinding.ActivityAntennaEditorBinding\nimport net.pantasystem.milktea.antenna.viewmodel.AntennaEditorViewModel\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.ChangedDiffResult\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation.Companion.EXTRA_SELECTED_USER_CHANGED_DIFF\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigationArgs\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n@Suppress(\"DEPRECATION\")\n@ExperimentalCoroutinesApi\n@FlowPreview\n@AndroidEntryPoint\nclass AntennaEditorActivity : AppCompatActivity() {\n    companion object{\n        const val EXTRA_ANTENNA_ID = \"net.pantasystem.milktea.antenna.AntennaEditorActivity.EXTRA_ANTENNA_ID\"\n\n        fun newIntent(context: Context, antennaId: Antenna.Id?) : Intent{\n            return Intent(context, AntennaEditorActivity::class.java).apply {\n                putExtra(EXTRA_ANTENNA_ID, antennaId)\n            }\n        }\n    }\n\n    @FlowPreview\n    private var mViewModel: AntennaEditorViewModel? = null\n\n    private lateinit var mBinding: ActivityAntennaEditorBinding\n\n    val viewModel: AntennaEditorViewModel by viewModels()\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    lateinit var searchAndSelectUserNavigation: SearchAndSelectUserNavigation\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_antenna_editor)\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_antenna_editor)\n        setSupportActionBar(mBinding.antennaEditorToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(mBinding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            mBinding.antennaEditorToolbar.updatePadding(top = insets.top)\n            mBinding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        val antennaId = intent.getSerializableExtra(EXTRA_ANTENNA_ID) as? Antenna.Id\n        if(savedInstanceState == null){\n            if (antennaId != null) {\n                viewModel.setAntennaId(antennaId)\n            }\n            val ft = supportFragmentManager.beginTransaction()\n            ft.replace(R.id.antennaEditorBase, AntennaEditorFragment.newInstance(antennaId))\n            ft.commit()\n        }\n\n        this.mViewModel = viewModel\n        viewModel.selectUserEvent.onEach {\n            showSearchAndSelectUserActivity(it)\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n        viewModel.name.onEach {\n            supportActionBar?.title = it\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n        viewModel.antennaRemovedEvent.onEach {\n            Toast.makeText(this, getString(R.string.remove), Toast.LENGTH_SHORT).show()\n            setResult(RESULT_OK)\n            finish()\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n\n        viewModel.antennaAddedStateEvent.onEach {\n            if (it) {\n                Toast.makeText(this, getString(R.string.success), Toast.LENGTH_LONG).show()\n            } else {\n                Toast.makeText(this, getString(R.string.failure), Toast.LENGTH_LONG).show()\n            }\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n\n        onBackPressedDispatcher.addCallback {\n            setResult(RESULT_OK)\n            finish()\n        }\n    }\n\n    @FlowPreview\n    private fun showSearchAndSelectUserActivity(userIds: List<User.Id>){\n        val intent = searchAndSelectUserNavigation.newIntent(SearchAndSelectUserNavigationArgs(selectedUserIds = userIds))\n        requestSearchAndUserResult.launch(intent)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when(item.itemId){\n            android.R.id.home ->{\n                setResult(RESULT_OK)\n                finish()\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n\n\n    @FlowPreview\n    val requestSearchAndUserResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n        val data = result.data\n        val resultCode = result.resultCode\n        if(resultCode == Activity.RESULT_OK && data != null){\n            (data.getSerializableExtra(EXTRA_SELECTED_USER_CHANGED_DIFF) as? ChangedDiffResult)?.let {\n                val userNames = it.selectedUserNames\n                mViewModel?.setUserNames(userNames)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/AntennaEditorFragment.kt",
    "content": "package net.pantasystem.milktea.antenna\n\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nimport android.widget.AdapterView\nimport android.widget.ArrayAdapter\nimport androidx.core.widget.addTextChangedListener\nimport androidx.databinding.DataBindingUtil\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.antenna.databinding.FragmentAntennaEditorBinding\nimport net.pantasystem.milktea.antenna.viewmodel.AntennaEditorViewModel\nimport net.pantasystem.milktea.common_android.ui.listview.applyFlexBoxLayout\nimport net.pantasystem.milktea.common_android_ui.user.UserChipListAdapter\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport net.pantasystem.milktea.model.antenna.AntennaSource\n\n@FlowPreview\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass AntennaEditorFragment : Fragment(R.layout.fragment_antenna_editor){\n\n    companion object {\n        const val EXTRA_ANTENNA_ID = \"net.pantasystem.milktea.antenna.AntennaEditorFragment.EXTRA_ANTENNA_ID\"\n        fun newInstance(antennaId: Antenna.Id?): AntennaEditorFragment {\n            return AntennaEditorFragment().apply{\n                arguments = Bundle().apply{\n                    antennaId?.let {\n                        putSerializable(EXTRA_ANTENNA_ID, antennaId)\n                    }\n                }\n            }\n        }\n    }\n\n    val viewModel: AntennaEditorViewModel by activityViewModels()\n\n    @Suppress(\"DEPRECATION\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val antennaId = arguments?.getSerializable(EXTRA_ANTENNA_ID) as? Antenna.Id\n        if (antennaId != null) {\n            viewModel.setAntennaId(antennaId)\n        }\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val binding = DataBindingUtil.bind<FragmentAntennaEditorBinding>(view)\n            ?: return\n        binding.lifecycleOwner = viewLifecycleOwner\n\n        val receivedSourceStringArray = resources.getStringArray(R.array.receiving_source_type)\n\n\n\n        binding.antennaEditorViewModel = viewModel\n\n\n        binding.receivingSourceSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{\n            override fun onItemSelected(\n                parent: AdapterView<*>?,\n                view: View?,\n                position: Int,\n                id: Long\n            ) {\n                resourceStringToSource(receivedSourceStringArray[position])?.let{\n                    viewModel.onSourceChanged(it)\n                }\n            }\n\n            override fun onNothingSelected(parent: AdapterView<*>?) = Unit\n        }\n\n        viewModel.source.onEach {\n            val srcIndex = receivedSourceStringArray.indexOf(sourceToResourceString(it))\n            Log.d(\"AntennaEditorViewModel\", \"srcIndex:$srcIndex, type:$it\")\n            binding.receivingSourceSpinner.setSelection(srcIndex)\n\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle).launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n\n        viewModel.userListList.observe(viewLifecycleOwner) { list ->\n            val userListListAdapter =\n                ArrayAdapter(view.context, android.R.layout.simple_spinner_dropdown_item, list.map {\n                    it.name\n                })\n            binding.userListListSpinner.adapter = userListListAdapter\n\n\n            binding.userListListSpinner.onItemSelectedListener =\n                object : AdapterView.OnItemSelectedListener {\n                    override fun onItemSelected(\n                        parent: AdapterView<*>?,\n                        view: View?,\n                        position: Int,\n                        id: Long\n                    ) {\n                        viewModel.onUserListSelected(list[position])\n                    }\n\n                    override fun onNothingSelected(parent: AdapterView<*>?) = Unit\n                }\n\n        }\n        viewModel.userList.onEach {\n            it?.let { ul ->\n                val index = viewModel.userListList.value?.indexOfFirst { list ->\n                    ul.id == list.id\n                } ?: 0\n                Log.d(\n                    \"AntennaEditorFragment\",\n                    \"選択したIndex:$index, userList:${viewModel.userList.value}\"\n                )\n                binding.userListListSpinner.setSelection(index)\n            }\n\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle).launchIn(viewLifecycleOwner.lifecycleScope)\n\n//\n//        viewModel.groupList.observe( viewLifecycleOwner) {\n//            it?.let { groups ->\n//                val groupsAdapter = ArrayAdapter(\n//                    view.context,\n//                    android.R.layout.simple_spinner_dropdown_item,\n//                    groups.map { group ->\n//                        group.name\n//                    })\n//                binding.groupListSpinner.adapter = groupsAdapter\n//                binding.groupListSpinner.onItemSelectedListener =\n//                    object : AdapterView.OnItemSelectedListener {\n//                        override fun onItemSelected(\n//                            parent: AdapterView<*>?,\n//                            view: View?,\n//                            position: Int,\n//                            id: Long\n//                        ) {\n//                            viewModel.group.value = groups[position]\n//                        }\n//\n//                        override fun onNothingSelected(parent: AdapterView<*>?) = Unit\n//\n//                    }\n//\n//            }\n//        }\n\n//        viewModel.group.observe( viewLifecycleOwner) { g ->\n//            g?.let {\n//                val index = viewModel.groupList.value?.indexOfFirst { inG ->\n//                    g.id == inG.id\n//                } ?: 0\n//                binding.groupListSpinner.setSelection(index)\n//            }\n//\n//        }\n//\n\n        binding.antennaNameEditText.addTextChangedListener {\n            viewModel.onNameValueChanged(it.toString())\n        }\n        binding.keywordsToReceiveEditText.addTextChangedListener {\n            viewModel.onKeywordsValueChanged(it.toString())\n        }\n\n        binding.keywordsToExcludeEditText.addTextChangedListener {\n            viewModel.onExcludeKeywordsValueChanged(it.toString())\n        }\n\n        binding.caseSensitiveSwitch.setOnCheckedChangeListener { _, isChecked ->\n            viewModel.onCaseSensitiveChanged(isChecked)\n        }\n\n        binding.withFilesSwitch.setOnCheckedChangeListener { _, isChecked ->\n            viewModel.onWithFileChanged(isChecked)\n        }\n\n        binding.notifySwitch.setOnCheckedChangeListener { _, isChecked ->\n            viewModel.onNotifyChanged(isChecked)\n        }\n\n        binding.includeRepliesSwitch.setOnCheckedChangeListener { _, isChecked ->\n            viewModel.onWithRepliesChanged(isChecked)\n        }\n\n        val userChipAdapter = UserChipListAdapter(viewLifecycleOwner)\n        binding.specifiedUserListView.adapter = userChipAdapter\n        binding.specifiedUserListView.applyFlexBoxLayout(requireContext())\n\n        viewModel.users.onEach {\n            userChipAdapter.submitList(it)\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        binding.lifecycleOwner = viewLifecycleOwner\n\n    }\n\n    @FlowPreview\n    fun sourceToResourceString(src: AntennaSource): String{\n\n        return when(src){\n            AntennaSource.All -> getString(R.string.all_notes)\n            AntennaSource.Home -> getString(R.string.notes_from_following_users)\n            AntennaSource.List -> getString(R.string.notes_from_specific_list)\n            AntennaSource.Users -> getString(R.string.notes_from_specific_users)\n            AntennaSource.Group -> getString(R.string.notes_from_users_in_the_specified_group)\n        }\n    }\n\n    @FlowPreview\n    fun resourceStringToSource(str: String): AntennaSource?{\n        return when(str){\n            getString(R.string.all_notes) -> AntennaSource.All\n            getString(R.string.notes_from_following_users) -> AntennaSource.Home\n            getString(R.string.notes_from_specific_list) ->  AntennaSource.List\n            getString(R.string.notes_from_specific_users) ->  AntennaSource.Users\n            getString(R.string.notes_from_users_in_the_specified_group) -> AntennaSource.Group\n            else -> null\n        }\n    }\n}"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/AntennaListActivity.kt",
    "content": "package net.pantasystem.milktea.antenna\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.MenuItem\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.antenna.databinding.ActivityAntennaListBinding\nimport net.pantasystem.milktea.antenna.viewmodel.AntennaListViewModel\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.AntennaNavigation\nimport net.pantasystem.milktea.common_navigation.AntennaNavigationArgs\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n@AndroidEntryPoint\nclass AntennaListActivity : AppCompatActivity() {\n\n\n    private val mAntennaListViewModel: AntennaListViewModel by viewModels()\n\n    private lateinit var mBinding: ActivityAntennaListBinding\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @OptIn(ExperimentalCoroutinesApi::class, FlowPreview::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_antenna_list)\n        setSupportActionBar(mBinding.antennaListToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(mBinding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            mBinding.antennaListToolbar.updatePadding(top = insets.top)\n            mBinding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n\n        mAntennaListViewModel.confirmDeletionAntennaEvent.onEach {\n            confirmDeleteAntenna(it)\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n        mAntennaListViewModel.editAntennaEvent.onEach {\n            val intent = AntennaEditorActivity.newIntent(this, it.id)\n            requestEditAntennaResult.launch(intent)\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n\n        mBinding.addAntennaFab.setOnClickListener {\n            requestEditAntennaResult.launch(Intent(this, AntennaEditorActivity::class.java))\n        }\n\n    }\n\n    private fun confirmDeleteAntenna(antenna: Antenna){\n        MaterialAlertDialogBuilder(this)\n            .setTitle(getString(R.string.confirm_deletion))\n            .setMessage(antenna.name)\n            .setPositiveButton(android.R.string.ok){ _,_  ->\n                mAntennaListViewModel.deleteAntenna(antenna)\n            }\n            .setNegativeButton(android.R.string.cancel){ _, _ ->\n\n            }.show()\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when(item.itemId){\n            android.R.id.home -> finish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n\n\n    private val requestEditAntennaResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n        mAntennaListViewModel.loadInit()\n    }\n\n\n}\n\nclass AntennaNavigationImpl @Inject constructor(\n    val activity: Activity\n): AntennaNavigation {\n    override fun newIntent(args: AntennaNavigationArgs): Intent {\n        return Intent(activity, AntennaListActivity::class.java).apply {\n            putExtra(AntennaListViewModel.EXTRA_SPECIFIED_ACCOUNT_ID, args.specifiedAccountId)\n            putExtra(AntennaListViewModel.EXTRA_ADD_TAB_TO_ACCOUNT_ID, args.addTabToAccountId)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/AntennaListAdapter.kt",
    "content": "package net.pantasystem.milktea.antenna\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport net.pantasystem.milktea.antenna.databinding.ItemAntennaBinding\nimport net.pantasystem.milktea.antenna.viewmodel.AntennaListItem\nimport net.pantasystem.milktea.antenna.viewmodel.AntennaListViewModel\n\nclass AntennaListAdapter(\n    private val antennaListViewModel: AntennaListViewModel,\n    val lifecycleOwner: LifecycleOwner\n) : ListAdapter<AntennaListItem, AntennaListAdapter.ViewHolder>(ItemCallback()){\n\n    class ItemCallback : DiffUtil.ItemCallback<AntennaListItem>(){\n        override fun areContentsTheSame(oldItem: AntennaListItem, newItem: AntennaListItem): Boolean {\n            return oldItem == newItem\n        }\n\n        override fun areItemsTheSame(oldItem: AntennaListItem, newItem: AntennaListItem): Boolean {\n            return oldItem.antenna.id == newItem.antenna.id\n        }\n    }\n\n    class ViewHolder(val binding: ItemAntennaBinding) : RecyclerView.ViewHolder(binding.root)\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        val inflater = LayoutInflater.from(parent.context)\n        val binding = DataBindingUtil.inflate<ItemAntennaBinding>(inflater, R.layout.item_antenna, parent, false)\n        return ViewHolder(binding)\n    }\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n        val binding = holder.binding\n        binding.antenna = getItem(position)\n        binding.antennaListViewModel = antennaListViewModel\n        binding.lifecycleOwner = lifecycleOwner\n\n    }\n\n}"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/AntennaListFragment.kt",
    "content": "package net.pantasystem.milktea.antenna\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.antenna.databinding.FragmentAntennaListBinding\nimport net.pantasystem.milktea.antenna.viewmodel.AntennaListViewModel\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\n\n@FlowPreview\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass AntennaListFragment : Fragment(R.layout.fragment_antenna_list){\n\n    val binding: FragmentAntennaListBinding by dataBinding()\n    private val antennaViewModel: AntennaListViewModel by activityViewModels()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val layoutManager = LinearLayoutManager(view.context)\n\n\n        val adapter = AntennaListAdapter(antennaViewModel, viewLifecycleOwner)\n        binding.antennaListView.adapter = adapter\n        binding.antennaListView.layoutManager = layoutManager\n\n        antennaViewModel.uiState.onEach { uiState ->\n            val antennas = when(val content = uiState.antennas.content) {\n                is StateContent.Exist -> content.rawContent\n                is StateContent.NotExist -> emptyList()\n            }\n            adapter.submitList(antennas)\n\n            val isLoading = uiState.antennas is ResultState.Loading\n            binding.antennaListSwipeRefresh.isRefreshing = isLoading\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        binding.antennaListSwipeRefresh.setOnRefreshListener {\n            antennaViewModel.loadInit()\n        }\n    }\n}"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/AntennaPagedStateHelper.kt",
    "content": "package net.pantasystem.milktea.antenna\n\nimport android.widget.ImageButton\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.antenna.viewmodel.AntennaListItem\n\nobject AntennaPagedStateHelper{\n\n    @JvmStatic\n    @BindingAdapter(\"targetAntenna\")\n    fun ImageButton.setPagedState(antenna: AntennaListItem?){\n        if(antenna?.isAddedToTab == true){\n            this.setImageResource(R.drawable.ic_remove_to_tab_24px)\n        }else {\n            this.setImageResource(R.drawable.ic_add_to_tab_24px)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/viewmodel/AntennaEditorViewModel.kt",
    "content": "package net.pantasystem.milktea.antenna.viewmodel\n\nimport androidx.lifecycle.MediatorLiveData\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_viewmodel.UserViewData\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport net.pantasystem.milktea.model.antenna.AntennaRepository\nimport net.pantasystem.milktea.model.antenna.AntennaSource\nimport net.pantasystem.milktea.model.antenna.SaveAntennaParam\nimport net.pantasystem.milktea.model.antenna.from\nimport net.pantasystem.milktea.model.antenna.str\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.list.UserListRepository\nimport net.pantasystem.milktea.model.user.User\nimport java.util.regex.Pattern\nimport javax.inject.Inject\n\n\n\n@HiltViewModel\nclass AntennaEditorViewModel @Inject constructor(\n    private val userViewDataFactory: UserViewData.Factory,\n    loggerFactory: Logger.Factory,\n    private val accountRepository: AccountRepository,\n    private val userListRepository: UserListRepository,\n    private val antennaRepository: AntennaRepository,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel(){\n\n\n    companion object {\n        const val STATE_ANTENNA_ID = \"antenna_id\"\n        const val STATE_LIST_ID = \"list_id\"\n        const val STATE_GROUP_ID = \"group_id\"\n        const val STATE_NAME = \"name\"\n        const val STATE_SOURCE = \"source\"\n        const val STATE_KEYWORDS = \"keywords\"\n        const val STATE_EXCLUDE_KEYWORDS = \"exclude_keywords\"\n        const val STATE_USERNAME_LIST = \"username_list\"\n        const val STATE_NOTIFY = \"notify\"\n        const val STATE_WITH_FILE = \"with_files\"\n        const val CASE_SENSITIVE = \"case_sensitive\"\n        const val STATE_WITH_REPLIES = \"with_replies\"\n\n    }\n    private val logger = loggerFactory.create(\"AntennaEditorViewModel\")\n\n\n    private val _antennaId = savedStateHandle.getStateFlow<Antenna.Id?>(STATE_ANTENNA_ID, null)\n\n\n    val antenna = _antennaId.filterNotNull().map {\n        antennaRepository.find(it).getOrNull()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null,\n    )\n\n    val name = savedStateHandle.getStateFlow<String?>(STATE_NAME, null)\n\n    val source = savedStateHandle.getStateFlow<String>(STATE_SOURCE, AntennaSource.All.str()).map {\n        AntennaSource.from(it)\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        AntennaSource.All,\n    )\n\n    val isList = source.map {\n        it is AntennaSource.List\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        false,\n    )\n\n\n    val isUsers = source.map {\n        it is AntennaSource.Users\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        false,\n    )\n\n\n    val isGroup = source.map {\n        it is AntennaSource.Users\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        false,\n    )\n\n    val keywords = savedStateHandle.getStateFlow<String?>(STATE_KEYWORDS, null)\n\n    val excludeKeywords = savedStateHandle.getStateFlow<String?>(STATE_EXCLUDE_KEYWORDS, null)\n\n\n    private val userNames = savedStateHandle.getStateFlow<List<String>>(\n        STATE_USERNAME_LIST,\n        emptyList()\n    )\n\n    @ExperimentalCoroutinesApi\n    private val mUsers = userNames.map { list ->\n        list.filterNot {\n            it.isBlank()\n        }.map { userName: String ->\n            val userNameAndHost = userName.split(\"@\").filterNot { it == \"\" }\n            userViewDataFactory.create(userNameAndHost[0], userNameAndHost.getOrNull(1), getAccount().getOrThrow().accountId, viewModelScope, Dispatchers.IO)\n        }\n    }\n\n    @ExperimentalCoroutinesApi\n    val users: StateFlow<List<UserViewData>> = mUsers.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n\n\n    val userListList = MediatorLiveData<List<UserList>>().apply{\n        viewModelScope.launch {\n            runCancellableCatching {\n                val account = getAccount().getOrThrow()\n                userListRepository.findByAccountId(account.accountId)\n            }.onSuccess {\n                postValue(it)\n            }\n        }\n    }\n\n    private val userListId = savedStateHandle.getStateFlow<UserList.Id?>(STATE_LIST_ID, null)\n\n    val userList = userListId.map {\n        if (it == null) null else userListRepository.findOne(it)\n    }.catch {\n        emit(null)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n//    val groupList = MediatorLiveData<List<Group>?>().apply{\n//        addSource(this@AntennaEditorViewModel.source){\n//            /*if(it == Source.GROUP && this.value.isNullOrEmpty()){\n//                miCore.getMisskeyAPI(accountRelation)\n//            }*/\n//        }\n//    }\n//\n//    val group = MediatorLiveData<Group>().apply{\n//        addSource(groupList){\n//            this.value = it?.firstOrNull { g ->\n//                g.id == this@AntennaEditorViewModel.antenna.value?.userGroupId\n//            }?: it?.firstOrNull()\n//        }\n//    }\n\n    /**\n     * 新しいノートを通知します\n     */\n    val notify = savedStateHandle.getStateFlow(STATE_NOTIFY, true)\n\n    /**\n     * ファイルが添付されたノートのみ\n     */\n    val withFile =  savedStateHandle.getStateFlow(STATE_WITH_FILE, false)\n\n    /**\n     * 大文字と小文字を区別します\n     */\n    val caseSensitive =  savedStateHandle.getStateFlow(CASE_SENSITIVE, false)\n    /**\n     * 返信を含める\n     */\n    val withReplies = savedStateHandle.getStateFlow(STATE_WITH_REPLIES, false)\n\n    private val _antennaAddedStateEvent = MutableSharedFlow<Boolean>(extraBufferCapacity = 10)\n    val antennaAddedStateEvent: SharedFlow<Boolean> = _antennaAddedStateEvent\n    \n    fun createOrUpdate(){\n\n        viewModelScope.launch {\n            runCancellableCatching {\n                val account = getAccount().getOrThrow()\n                val antenna = savedStateHandle.get<Antenna.Id?>(STATE_ANTENNA_ID)?.let {\n                    antennaRepository.find(it).getOrThrow()\n                }\n                val params = SaveAntennaParam(\n                    savedStateHandle[STATE_NAME] ?: antenna?.name ?: \"\",\n                    savedStateHandle.get<String?>(STATE_SOURCE)?.let {\n                                AntennaSource.from(it)\n                    } ?: antenna?.src ?: AntennaSource.All,\n                    savedStateHandle[STATE_LIST_ID] ?: antenna?.userListId,\n                    null,\n                    toListKeywords(savedStateHandle[STATE_KEYWORDS]?: \"\"),\n                    toListKeywords(savedStateHandle[STATE_EXCLUDE_KEYWORDS] ?: \"\"),\n                    savedStateHandle[STATE_USERNAME_LIST] ?: antenna?.users ?: emptyList(),\n                    savedStateHandle[CASE_SENSITIVE] ?: antenna?.caseSensitive ?: false,\n                    savedStateHandle[STATE_WITH_FILE] ?: antenna?.withFile ?: false,\n                    savedStateHandle[STATE_WITH_REPLIES] ?: antenna?.withReplies ?: false,\n                    savedStateHandle[STATE_NOTIFY] ?: antenna?.notify ?: true,\n                    )\n                if (antenna == null) {\n                    antennaRepository.create(account.accountId, params)\n                        .getOrThrow()\n                } else {\n                    antennaRepository.update(antenna.id, params)\n                        .getOrThrow()\n                }\n            }.onSuccess {\n                setAntennaId(it.id)\n                withContext(Dispatchers.Main) {\n                    _antennaAddedStateEvent.tryEmit(true)\n                }\n            }.onFailure {\n                withContext(Dispatchers.Main) {\n                    _antennaAddedStateEvent.tryEmit(false)\n                }\n            }\n        }\n\n    }\n\n    val antennaRemovedEvent = MutableSharedFlow<Unit>(extraBufferCapacity = 10)\n\n    fun removeRemote(){\n        val antennaId = _antennaId.value ?: return\n        viewModelScope.launch {\n            antennaRepository.delete(antennaId).onSuccess {\n                withContext(Dispatchers.Main) {\n                    antennaRemovedEvent.tryEmit(Unit)\n                }\n            }\n        }\n    }\n\n\n    val selectUserEvent = MutableSharedFlow<List<User.Id>>(extraBufferCapacity = 10)\n    @ExperimentalCoroutinesApi\n    fun selectUser(){\n        selectUserEvent.tryEmit(users.value.mapNotNull {\n            it.user.value?.id\n        })\n    }\n\n    fun onSourceChanged(source: AntennaSource){\n        savedStateHandle[STATE_SOURCE] = source.str()\n    }\n\n    fun onUserListSelected(userList: UserList?){\n        savedStateHandle[STATE_LIST_ID] = userList?.id\n    }\n\n    fun onNameValueChanged(name: String){\n        savedStateHandle[STATE_NAME] = name\n    }\n\n    fun onKeywordsValueChanged(keywords: String){\n        savedStateHandle[STATE_KEYWORDS] = keywords\n    }\n\n    fun onExcludeKeywordsValueChanged(keywords: String){\n        savedStateHandle[STATE_EXCLUDE_KEYWORDS] = keywords\n    }\n\n    fun onCaseSensitiveChanged(caseSensitive: Boolean){\n        savedStateHandle[CASE_SENSITIVE] = caseSensitive\n    }\n\n    fun onWithFileChanged(withFile: Boolean){\n        savedStateHandle[STATE_WITH_FILE] = withFile\n    }\n\n    fun onWithRepliesChanged(withReplies: Boolean){\n        savedStateHandle[STATE_WITH_REPLIES] = withReplies\n    }\n\n    fun onNotifyChanged(notify: Boolean){\n        savedStateHandle[STATE_NOTIFY] = notify\n    }\n\n    \n    private fun setupKeywords(keywords: List<List<String>>?): String{\n        val builder = StringBuilder()\n        keywords?.forEach {  list ->\n            list.forEach {  word ->\n                builder.append(word)\n            }\n            builder.append(\"\\n\")\n        }\n        return builder.toString()\n    }\n\n    private fun toListKeywords(keywords: String): List<List<String>>{\n        return keywords.split('\\n').map{\n            it.split(Pattern.compile(\"\"\"[ 　]\"\"\")).filter{ str ->\n                str.isNotEmpty()\n\n            }\n        }.filter{ list ->\n            list.isNotEmpty()\n        }\n    }\n\n    fun setUserNames(userNames: List<String>){\n        logger.debug { \"setUserNames: $userNames\" }\n        savedStateHandle[STATE_USERNAME_LIST] = userNames\n    }\n\n    fun setAntennaId(antennaId: Antenna.Id) {\n        viewModelScope.launch {\n            antennaRepository.find(antennaId).onSuccess { antenna ->\n                savedStateHandle[STATE_NAME] = antenna.name\n                savedStateHandle[STATE_SOURCE] = antenna.src.str()\n                savedStateHandle[STATE_KEYWORDS] = setupKeywords(antenna.keywords)\n                savedStateHandle[STATE_EXCLUDE_KEYWORDS] = setupKeywords(antenna.excludeKeywords)\n                savedStateHandle[STATE_USERNAME_LIST] = antenna.users\n\n                savedStateHandle[STATE_NOTIFY] = antenna.notify\n                savedStateHandle[STATE_WITH_FILE] = antenna.withFile\n                savedStateHandle[CASE_SENSITIVE] = antenna.caseSensitive\n                savedStateHandle[STATE_WITH_REPLIES] = antenna.withReplies\n\n                savedStateHandle[STATE_ANTENNA_ID] = antenna.id\n                savedStateHandle[STATE_LIST_ID] = antenna.userListId\n                savedStateHandle[STATE_GROUP_ID] = antenna.userGroupId\n            }.onFailure {\n                logger.error(\"fetch antenna filed\", it)\n            }\n        }\n    }\n\n    private suspend fun getAccount(): Result<Account> = runCancellableCatching {\n        _antennaId.value?.let {\n            accountRepository.get(it.accountId).getOrThrow()\n        } ?: accountRepository.getCurrentAccount().getOrThrow()\n    }\n}"
  },
  {
    "path": "modules/features/antenna/src/main/java/net/pantasystem/milktea/antenna/viewmodel/AntennaListViewModel.kt",
    "content": "package net.pantasystem.milktea.antenna.viewmodel\n\nimport android.util.Log\nimport androidx.lifecycle.*\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport net.pantasystem.milktea.model.antenna.AntennaRepository\nimport net.pantasystem.milktea.model.antenna.AntennaToggleAddToTabUseCase\nimport java.util.*\nimport javax.inject.Inject\n\n@HiltViewModel\nclass AntennaListViewModel @Inject constructor(\n    loggerFactory: Logger.Factory,\n    private val accountStore: AccountStore,\n    private val antennaRepository: AntennaRepository,\n    private val antennaToggleAddToTabUseCase: AntennaToggleAddToTabUseCase,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_SPECIFIED_ACCOUNT_ID = \"AntennaListViewModel.EXTRA_SPECIFIED_ACCOUNT_ID\"\n        const val EXTRA_ADD_TAB_TO_ACCOUNT_ID = \"AntennaListViewModel.EXTRA_ADD_TAB_TO_ACCOUNT_ID\"\n    }\n\n    private val logger by lazy(LazyThreadSafetyMode.NONE) {\n        loggerFactory.create(\"AntennaListViewModel\")\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val currentAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_SPECIFIED_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val addTabToAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_ADD_TAB_TO_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val refreshAntennasEvents = MutableStateFlow(Date().time)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val antennasState = refreshAntennasEvents.flatMapLatest {\n        currentAccount.filterNotNull().flatMapLatest { account ->\n            suspend {\n                Log.d(\"AntennaListViewModel\", \"antenna account state: ${account.accountId}\")\n                antennaRepository.findByAccountId(account.accountId).getOrThrow()\n            }.asLoadingStateFlow()\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState()\n    )\n\n    val uiState = combine(currentAccount, addTabToAccount, antennasState) { ca, ata, state ->\n        AntennaListUiState(\n            currentAccount = ca,\n            addTabToAccount = ata,\n            antennas = state.convert { antennas ->\n                antennas.map { antenna ->\n                    AntennaListItem(\n                        antenna = antenna,\n                        isAddedToTab = (ata ?: ca)?.pages?.any { page ->\n                            page.pageParams.antennaId == antenna.id.antennaId\n                                    && (page.attachedAccountId ?: page.accountId) == antenna.id.accountId\n                        } ?: false\n                    )\n                }\n            }\n        )\n    }\n\n    private val _editAntennaEvent = MutableSharedFlow<Antenna>(extraBufferCapacity = 10)\n    val editAntennaEvent: SharedFlow<Antenna> = _editAntennaEvent\n\n    private val _confirmDeletionAntennaEvent = MutableSharedFlow<Antenna>(extraBufferCapacity = 10)\n    val confirmDeletionAntennaEvent: SharedFlow<Antenna> = _confirmDeletionAntennaEvent\n\n    private val openAntennasTimelineEvent = MutableSharedFlow<Antenna>(extraBufferCapacity = 10)\n\n\n    private val mPagedAntennaIds = MutableLiveData<Set<Antenna.Id>>()\n\n\n    init {\n\n        accountStore.observeCurrentAccount.onEach {\n            loadInit()\n\n            mPagedAntennaIds.postValue(\n                it?.pages?.mapNotNull { page ->\n                    val pageable = page.pageable()\n                    if (pageable is Pageable.Antenna) {\n                        it.accountId.let { accountId ->\n                            Antenna.Id(accountId, pageable.antennaId)\n                        }\n                    } else {\n                        null\n                    }\n                }?.toSet() ?: emptySet()\n            )\n        }.launchIn(viewModelScope + Dispatchers.IO)\n\n\n    }\n\n    private val deleteResultEvent = MutableSharedFlow<Boolean>(extraBufferCapacity = 10)\n\n    fun loadInit() {\n        refreshAntennasEvents.tryEmit(Date().time)\n    }\n\n    fun toggleTab(antenna: Antenna?) = viewModelScope.launch {\n        antenna ?: return@launch\n        runCancellableCatching {\n            antennaToggleAddToTabUseCase(antenna, savedStateHandle[EXTRA_ADD_TAB_TO_ACCOUNT_ID])\n        }.onFailure {\n            logger.error(\"Failed to toggle tab\", it)\n        }\n    }\n\n    fun confirmDeletionAntenna(antenna: Antenna?) {\n        antenna ?: return\n        _confirmDeletionAntennaEvent.tryEmit(antenna)\n    }\n\n    fun editAntenna(antenna: Antenna?) {\n        antenna ?: return\n        _editAntennaEvent.tryEmit(antenna)\n    }\n\n    fun openAntennasTimeline(antenna: Antenna?) {\n        antenna ?: return\n        openAntennasTimelineEvent.tryEmit(antenna)\n    }\n\n    fun deleteAntenna(antenna: Antenna) {\n        viewModelScope.launch {\n            antennaRepository.delete(antenna.id).onSuccess {\n                loadInit()\n            }.onFailure {\n                deleteResultEvent.tryEmit(false)\n            }\n        }\n    }\n}\n\ndata class AntennaListItem(\n    val antenna: Antenna,\n    val isAddedToTab: Boolean,\n)\n\ndata class AntennaListUiState(\n    val currentAccount: Account?,\n    val addTabToAccount: Account?,\n    val antennas: ResultState<List<AntennaListItem>>,\n)"
  },
  {
    "path": "modules/features/antenna/src/main/res/layout/activity_antenna_editor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.antenna.AntennaEditorActivity\">\n        <com.google.android.material.appbar.AppBarLayout\n                android:id=\"@+id/antennaEditorAppBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                >\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/antennaEditorToolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"/>\n        </com.google.android.material.appbar.AppBarLayout>\n        <FrameLayout\n                android:id=\"@+id/antennaEditorBase\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"/>\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>"
  },
  {
    "path": "modules/features/antenna/src/main/res/layout/activity_antenna_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.antenna.AntennaListActivity\">\n\n        <com.google.android.material.appbar.AppBarLayout\n                android:id=\"@+id/antennaListAppBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/antennaListToolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:title=\"@string/antenna\"\n                    />\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <androidx.fragment.app.FragmentContainerView\n                android:id=\"@+id/fragment2\"\n                android:name=\"net.pantasystem.milktea.antenna.AntennaListFragment\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                />\n\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/addAntennaFab\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:clickable=\"true\"\n                app:srcCompat=\"@drawable/ic_add_black_24dp\"\n                android:focusable=\"true\"\n                android:layout_gravity=\"bottom|end\"\n                android:layout_marginBottom=\"16dp\"\n                android:layout_marginEnd=\"16dp\"\n                tools:ignore=\"ContentDescription\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/antenna/src/main/res/layout/fragment_antenna_editor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n\n        <import type=\"net.pantasystem.milktea.antenna.viewmodel.AntennaEditorViewModel\"/>\n\n        <import type=\"android.view.View\" />\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n        <variable\n                name=\"antennaEditorViewModel\"\n                type=\"net.pantasystem.milktea.antenna.viewmodel.AntennaEditorViewModel\" />\n\n    </data>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\">\n        <ScrollView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0dp\"\n                android:layout_weight=\"1\">\n\n            <LinearLayout\n                    android:id=\"@+id/antennaEditorLinearLayout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"16dp\">\n\n                <com.google.android.material.textfield.TextInputLayout\n                        android:id=\"@+id/antennaNameInputLayout\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:layout_marginBottom=\"8dp\"\n                        style=\"?textInputOutlinedStyle\">\n\n                    <com.google.android.material.textfield.TextInputEditText\n                            android:id=\"@+id/antennaNameEditText\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:hint=\"@string/name\"\n                            android:text=\"@{antennaEditorViewModel.name}\"/>\n                </com.google.android.material.textfield.TextInputLayout>\n\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/receiving_source\"\n                        />\n                <Spinner\n                        android:id=\"@+id/receivingSourceSpinner\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:entries=\"@array/receiving_source_type\"\n                        />\n\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/list\"\n                        android:visibility=\"@{ antennaEditorViewModel.isList ? View.VISIBLE : View.GONE}\"\n                        />\n                <Spinner\n                        android:id=\"@+id/userListListSpinner\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:visibility=\"@{ antennaEditorViewModel.isList ? View.VISIBLE : View.GONE}\"\n                        />\n\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/group\"\n                        android:visibility=\"@{ antennaEditorViewModel.isGroup ? View.VISIBLE : View.GONE }\"\n                        />\n                <Spinner\n                        android:id=\"@+id/groupListSpinner\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:visibility=\"@{ antennaEditorViewModel.isGroup ? View.VISIBLE : View.GONE }\"\n                        />\n\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/user\"\n                        android:visibility=\"@{ antennaEditorViewModel.isUsers ? View.VISIBLE : View.GONE }\"\n                        />\n                <androidx.recyclerview.widget.RecyclerView\n                        android:id=\"@+id/specifiedUserListView\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        tools:listitem=\"@layout/item_user_chip\"\n                        tools:itemCount=\"1\"\n                        android:visibility=\"@{ antennaEditorViewModel.isUsers ? View.VISIBLE : View.GONE }\"\n\n                        />\n                <Button\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"end\"\n                        android:text=\"@string/add_user\"\n                        android:visibility=\"@{ antennaEditorViewModel.isUsers ? View.VISIBLE : View.GONE }\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:onClick=\"@{ ()-> antennaEditorViewModel.selectUser() }\"\n                        />\n\n                <androidx.appcompat.widget.SwitchCompat\n                        android:id=\"@+id/includeRepliesSwitch\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/include_replies\"\n                        android:layout_marginBottom=\"8dp\"\n                        android:checked=\"@{ SafeUnbox.unbox(antennaEditorViewModel.withReplies) }\"/>\n\n                <com.google.android.material.textfield.TextInputLayout\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        style=\"?textInputOutlinedStyle\">\n                    <com.google.android.material.textfield.TextInputEditText\n                            android:id=\"@+id/keywordsToReceiveEditText\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:hint=\"@string/keywords_to_receive\"\n                            android:inputType=\"textMultiLine\"\n                            android:text=\"@{ antennaEditorViewModel.keywords }\"\n                            />\n                </com.google.android.material.textfield.TextInputLayout>\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/keyword_input_method\"\n                        android:layout_marginBottom=\"8dp\"/>\n                <com.google.android.material.textfield.TextInputLayout\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        style=\"?textInputOutlinedStyle\">\n                    <com.google.android.material.textfield.TextInputEditText\n                            android:id=\"@+id/keywordsToExcludeEditText\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:hint=\"@string/keywords_to_exclude\"\n                            android:text=\"@{ antennaEditorViewModel.excludeKeywords }\"\n                            android:inputType=\"textMultiLine\"/>\n                </com.google.android.material.textfield.TextInputLayout>\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/keyword_input_method\"\n                        android:layout_marginBottom=\"8dp\"/>\n                <androidx.appcompat.widget.SwitchCompat\n                        android:id=\"@+id/caseSensitiveSwitch\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/case_sensitive\"\n                        android:checked=\"@{ SafeUnbox.unbox(antennaEditorViewModel.caseSensitive) }\"/>\n\n                <androidx.appcompat.widget.SwitchCompat\n                        android:id=\"@+id/withFilesSwitch\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/with_files\"\n                        android:checked=\"@{ SafeUnbox.unbox(antennaEditorViewModel.withFile) }\"/>\n\n                <androidx.appcompat.widget.SwitchCompat\n                        android:id=\"@+id/notifySwitch\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/notify_notes\"\n                        android:checked=\"@{ SafeUnbox.unbox(antennaEditorViewModel.notify) }\"\n                        />\n\n\n            </LinearLayout>\n        </ScrollView>\n\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                android:padding=\"8dp\">\n            <com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/save\"\n                    android:layout_marginEnd=\"16dp\"\n                    app:icon=\"@drawable/ic_save_black_24dp\"\n                    android:onClick=\"@{ ()-> antennaEditorViewModel.createOrUpdate() }\"/>\n            <Button\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/delete\"\n                    android:drawableEnd=\"@drawable/ic_delete_black_24dp\"\n                    android:onClick=\"@{ ()-> antennaEditorViewModel.removeRemote() }\"\n                    />\n        </LinearLayout>\n    </LinearLayout>\n\n</layout>"
  },
  {
    "path": "modules/features/antenna/src/main/res/layout/fragment_antenna_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <androidx.constraintlayout.widget.ConstraintLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n                android:id=\"@+id/antennaListSwipeRefresh\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/antennaListView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:clipToPadding=\"false\"\n                    android:paddingBottom=\"70dp\"/>\n        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/antenna/src/main/res/layout/item_antenna.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n        <variable\n                name=\"antenna\"\n                type=\"net.pantasystem.milktea.antenna.viewmodel.AntennaListItem\" />\n        <variable\n                name=\"antennaListViewModel\"\n                type=\"net.pantasystem.milktea.antenna.viewmodel.AntennaListViewModel\" />\n    </data>\n    <androidx.cardview.widget.CardView\n\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardBackgroundColor=\"?attr/colorSurface\"\n            app:cardCornerRadius=\"8dp\"\n            android:layout_margin=\"8dp\">\n        <RelativeLayout\n                android:layout_width=\"match_parent\" android:layout_height=\"match_parent\"\n                android:padding=\"8dp\"\n                >\n            <TextView\n                    android:id=\"@+id/antennaNameInputLayout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    tools:text=\"かわいいどうぶつたち\"\n                    android:textSize=\"20sp\"\n                    android:text=\"@{SafeUnbox.unbox(antenna.antenna.name)}\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:onClick=\"@{ ()-> antennaListViewModel.openAntennasTimeline(antenna.antenna) }\"\n                    />\n\n            <ImageButton\n                    android:id=\"@+id/addToTabButton\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    tools:srcCompat=\"@drawable/ic_add_to_tab_24px\"\n                    app:srcCompat=\"@drawable/ic_add_black_24dp\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:contentDescription=\"@string/add_to_tab\"\n                    android:layout_below=\"@id/antennaNameInputLayout\"\n                    android:onClick=\"@{ ()-> antennaListViewModel.toggleTab(antenna.antenna) }\"\n                    app:targetAntenna=\"@{antenna}\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <ImageButton\n                    android:id=\"@+id/removeAntennaButton\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    app:srcCompat=\"@drawable/ic_delete_black_24dp\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:contentDescription=\"@string/add_to_tab\"\n                    android:layout_below=\"@id/antennaNameInputLayout\"\n                    android:layout_toStartOf=\"@id/editAntennaButton\"\n                    android:onClick=\"@{ ()-> antennaListViewModel.confirmDeletionAntenna(antenna.antenna) }\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <ImageButton\n                    android:id=\"@+id/editAntennaButton\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    app:srcCompat=\"@drawable/ic_edit_black_24dp\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:contentDescription=\"@string/add_to_tab\"\n                    android:layout_below=\"@id/antennaNameInputLayout\"\n                    android:layout_alignParentEnd=\"true\"\n                    android:onClick=\"@{ ()-> antennaListViewModel.editAntenna(antenna.antenna) }\"\n                    app:tint=\"?attr/normalIconTint\" />\n        </RelativeLayout>\n    </androidx.cardview.widget.CardView>\n\n</layout>\n"
  },
  {
    "path": "modules/features/auth/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/auth/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'dagger.hilt.android.plugin'\n    id 'kotlin-kapt'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n    }\n    buildFeatures {\n        dataBinding true\n        compose true\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.auth'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_compose')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n    testImplementation libs.arch.core.testing\n\n    implementation libs.androidx.emoji2\n    implementation libs.androidx.emoji2.bundled\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n\n    // For instrumentation tests\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n\n    // For local unit tests\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n    implementation libs.wada811.databinding\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n\n    // hilt\n    implementation libs.hilt.android\n\n    kapt libs.hilt.compiler\n\n\n    // For instrumentation tests\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n\n    // For local unit tests\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.fragment.ktx\n\n\n\n    implementation libs.retrofit\n    implementation libs.retrofit.serialization.converter\n    implementation libs.activity.ktx\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    implementation libs.compose.constraintlayout\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n    implementation 'com.github.kenglxn.QRGen:android:3.0.1'\n\n}"
  },
  {
    "path": "modules/features/auth/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/auth/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/auth/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application>\n        <activity\n                android:name=\".JoinMilkteaActivity\"\n                android:exported=\"false\"\n                android:launchMode=\"singleInstance\">\n            <meta-data\n                    android:name=\"android.app.lib_name\"\n                    android:value=\"\" />\n        </activity>\n        <activity\n                android:name=\".SignUpActivity\"\n                android:exported=\"false\"\n                android:windowSoftInputMode=\"adjustResize\"\n                android:launchMode=\"singleInstance\">\n            <meta-data\n                    android:name=\"android.app.lib_name\"\n                    android:value=\"\" />\n        </activity>\n        <activity\n                android:name=\".WebViewAuthActivity\"\n                android:exported=\"false\">\n            <meta-data\n                    android:name=\"android.app.lib_name\"\n                    android:value=\"\" />\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/AuthApprovedScreen.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\n\n@Composable\nfun AuthApprovedScreen(\n    modifier: Modifier = Modifier,\n    state: Authorization.Approved,\n    onConfirm: () -> Unit,\n) {\n    Column(\n        modifier = modifier\n            .fillMaxSize()\n            .padding(16.dp),\n        verticalArrangement = Arrangement.SpaceBetween,\n    ) {\n        Column(\n            modifier = Modifier.fillMaxWidth()\n        ) {\n            Text(stringResource(id = R.string.auth_welcome), fontSize = 32.sp, fontWeight = FontWeight.Bold)\n        }\n\n        Row(Modifier.fillMaxWidth()) {\n            Button(\n                onClick = onConfirm,\n                shape = RoundedCornerShape(32.dp),\n                modifier = Modifier\n                    .padding(16.dp)\n                    .weight(0.75f)\n            ) {\n                Text(\n                    stringResource(id = R.string.auth_continue_auth)\n                )\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/AuthFormScreen.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.foundation.text.KeyboardOptions\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.OutlinedButton\nimport androidx.compose.material3.OutlinedTextField\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Switch\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TextButton\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Clear\nimport androidx.compose.material.icons.filled.Search\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.snapshotFlow\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.testTag\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.input.ImeAction\nimport androidx.compose.ui.text.input.KeyboardType\nimport androidx.compose.ui.text.input.PasswordVisualTransformation\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport net.pantasystem.milktea.auth.viewmodel.app.AuthUiState\nimport net.pantasystem.milktea.auth.viewmodel.app.AuthUserInputState\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.common.ui.isScrolledToTheEnd\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\n\n@Composable\nfun AuthFormScreen(\n    modifier: Modifier = Modifier,\n    uiState: AuthUiState,\n    password: String,\n    instanceDomain: String,\n    onInputInstanceDomain: (String) -> Unit,\n    onInputPassword: (String) -> Unit,\n    onStartAuthButtonClicked: () -> Unit,\n    onShowPrivacyPolicy: () -> Unit,\n    onShowTermsOfService: () -> Unit,\n    onTogglePrivacyPolicyAgreement: (Boolean) -> Unit,\n    onToggleTermsOfServiceAgreement: (Boolean) -> Unit,\n    onToggleAcceptMastodonAlphaTest: (Boolean) -> Unit,\n    onSignUpButtonClicked: () -> Unit,\n    onBottomReached: () -> Unit,\n) {\n\n    Column(\n        modifier\n            .fillMaxSize(),\n        verticalArrangement = Arrangement.SpaceBetween\n    ) {\n        Column(\n            Modifier\n                .fillMaxWidth()\n                .verticalScroll(rememberScrollState())\n                .padding(16.dp),\n            horizontalAlignment = Alignment.CenterHorizontally\n        ) {\n            OutlinedTextField(\n                instanceDomain,\n                onValueChange = onInputInstanceDomain,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .testTag(\"instanceUrlTextField\"),\n                maxLines = 1,\n                label = {\n                    Text(stringResource(R.string.auth_instance_domain))\n                },\n                leadingIcon = {\n                    Icon(Icons.Default.Search, contentDescription = null)\n                },\n                trailingIcon = {\n                    IconButton(\n                        onClick = {\n                            onInputInstanceDomain(\"\")\n                        },\n                    ) {\n                        Icon(Icons.Default.Clear, contentDescription = \"clear instance domain\")\n                    }\n                }\n            )\n            if (uiState.formState.isIdPassword) {\n                Spacer(Modifier.height(8.dp))\n                OutlinedTextField(\n                    password,\n                    onInputPassword,\n                    modifier = Modifier.fillMaxWidth().testTag(\"passwordTextField\"),\n                    maxLines = 1,\n                    label = {\n                        Text(stringResource(R.string.password))\n                    },\n                    visualTransformation = PasswordVisualTransformation(),\n                    keyboardOptions = KeyboardOptions(\n                        keyboardType = KeyboardType.Password,\n                        imeAction = ImeAction.Done,\n                    ),\n                )\n            }\n\n\n            if (uiState.isProgress) {\n                Spacer(Modifier.height(8.dp))\n                CircularProgressIndicator()\n            }\n\n        }\n\n        FilteredInstances(\n            Modifier\n                .fillMaxWidth()\n                .weight(1f),\n            uiState = uiState,\n            onInputInstanceDomain = onInputInstanceDomain,\n            onBottomReached = onBottomReached\n        )\n\n        Column(\n            Modifier\n                .fillMaxWidth()\n                .padding(vertical = 8.dp, horizontal = 14.dp),\n            horizontalAlignment = Alignment.End,\n        ) {\n            if (uiState.instanceInfoResultState is ResultState.Fixed\n                && uiState.instanceInfoResultState.content is StateContent.Exist\n            ) {\n                AgreementLayout(\n                    uiState = uiState,\n                    onShowPrivacyPolicy = onShowPrivacyPolicy,\n                    onShowTermsOfService = onShowTermsOfService,\n                    onTogglePrivacyPolicyAgreement = onTogglePrivacyPolicyAgreement,\n                    onToggleTermsOfServiceAgreement = onToggleTermsOfServiceAgreement,\n                    onToggleAcceptMastodonAlphaTest = onToggleAcceptMastodonAlphaTest\n                )\n            }\n\n            Spacer(Modifier.height(8.dp))\n\n            Row(\n                Modifier.fillMaxWidth(),\n                horizontalArrangement = Arrangement.End\n            ) {\n                OutlinedButton(\n                    onClick = onSignUpButtonClicked,\n                    Modifier.testTag(\"signUpButton\"),\n                    shape = RoundedCornerShape(32.dp)\n                ) {\n                    Text(stringResource(R.string.auth_sign_up))\n                }\n\n                Spacer(modifier = Modifier.width(8.dp))\n\n                Button(\n                    onClick = onStartAuthButtonClicked,\n                    Modifier.testTag(\"authenticateButton\"),\n                    enabled = uiState.instanceInfoResultState is ResultState.Fixed\n                            && uiState.instanceInfoResultState.content is StateContent.Exist\n                            && uiState.formState.isPrivacyPolicyAgreement\n                            && uiState.formState.isTermsOfServiceAgreement\n                            && (!uiState.isMastodon || uiState.formState.isAcceptMastodonAlphaTest),\n                    shape = RoundedCornerShape(32.dp),\n                ) {\n                    Text(stringResource(R.string.start_auth))\n                }\n            }\n\n            Spacer(modifier = Modifier.height(4.dp))\n        }\n\n    }\n}\n\n@Composable\nprivate fun AgreementLayout(\n    uiState: AuthUiState,\n    onShowPrivacyPolicy: () -> Unit,\n    onShowTermsOfService: () -> Unit,\n    onTogglePrivacyPolicyAgreement: (Boolean) -> Unit,\n    onToggleTermsOfServiceAgreement: (Boolean) -> Unit,\n    onToggleAcceptMastodonAlphaTest: (Boolean) -> Unit,\n) {\n    Row(\n        Modifier.fillMaxWidth(),\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.SpaceBetween\n    ) {\n        TextButton(\n            onClick = onShowTermsOfService\n        ) {\n            Text(stringResource(id = R.string.auth_terms_of_service_agreeation))\n        }\n        Switch(\n            checked = uiState.formState.isTermsOfServiceAgreement,\n            onCheckedChange = onToggleTermsOfServiceAgreement,\n            Modifier.testTag(\"toggleTermsOfServiceAgreementSwitch\"),\n        )\n    }\n    Row(\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.SpaceBetween,\n        modifier = Modifier.fillMaxWidth()\n    ) {\n        TextButton(\n            modifier = Modifier.clickable(onClick = onShowPrivacyPolicy),\n            onClick = onShowPrivacyPolicy,\n        ) {\n            Text(stringResource(id = R.string.auth_privacy_policy_agreeation))\n        }\n        Switch(\n            checked = uiState.formState.isPrivacyPolicyAgreement,\n            onCheckedChange = onTogglePrivacyPolicyAgreement,\n            Modifier.testTag(\"togglePrivacyPolicyAgreementSwitch\")\n        )\n    }\n\n    if (uiState.isMastodon) {\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            horizontalArrangement = Arrangement.SpaceBetween,\n            modifier = Modifier.fillMaxWidth()\n        ) {\n            Text(\n                stringResource(id = R.string.auth_accpet_mastodon_alpha_test),\n                modifier = Modifier\n                    .padding(8.dp)\n                    .weight(1f)\n            )\n            Switch(\n                checked = uiState.formState.isAcceptMastodonAlphaTest,\n                onCheckedChange = onToggleAcceptMastodonAlphaTest,\n            )\n        }\n    }\n\n}\n\n@Composable\nprivate fun FilteredInstances(\n    modifier: Modifier = Modifier,\n    uiState: AuthUiState,\n    onInputInstanceDomain: (String) -> Unit,\n    onBottomReached: () -> Unit,\n) {\n    val listState = rememberLazyListState()\n    LaunchedEffect(Unit) {\n        snapshotFlow {\n            listState.isScrolledToTheEnd()\n        }.distinctUntilChanged().collect {\n            if (it) {\n                onBottomReached()\n            }\n        }\n    }\n    val instances = uiState.misskeyInstanceInfosResponse\n    LazyColumn(\n        modifier,\n        state = listState,\n    ) {\n        items(instances) { instance ->\n            Box(\n                Modifier\n                    .fillMaxWidth()\n                    .clickable {\n                        onInputInstanceDomain(instance.url)\n                    }\n            ) {\n                Text(\n                    instance.url,\n                    modifier = Modifier\n                        .fillMaxWidth()\n                        .padding(vertical = 8.dp, horizontal = 16.dp)\n                )\n            }\n        }\n    }\n}\n\n@Preview\n@Composable\nfun Preview_AuthFormScreen() {\n    MaterialTheme {\n        Scaffold {\n            AuthFormScreen(\n                Modifier\n                    .padding(it)\n                    .fillMaxSize(),\n                onInputInstanceDomain = {},\n                onInputPassword = {},\n                onStartAuthButtonClicked = {},\n                instanceDomain = \"\",\n                password = \"\",\n                uiState = AuthUiState(\n                    formState = AuthUserInputState(\n                        \"\",\n                        \"\",\n                        \"\",\n                        \"\",\n                        isPrivacyPolicyAgreement = false,\n                        isTermsOfServiceAgreement = false,\n                        isAcceptMastodonAlphaTest = false,\n                    ),\n                    instanceInfoResultState = ResultState.initialState(),\n                    stateType = Authorization.BeforeAuthentication,\n                    misskeyInstanceInfosResponse = emptyList(),\n                ),\n                onShowPrivacyPolicy = {},\n                onShowTermsOfService = {},\n                onTogglePrivacyPolicyAgreement = {},\n                onToggleTermsOfServiceAgreement = {},\n                onToggleAcceptMastodonAlphaTest = {},\n                onSignUpButtonClicked = {},\n                onBottomReached = {}\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/AuthScreen.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.WindowInsetsSides\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.navigationBars\nimport androidx.compose.foundation.layout.only\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.windowInsetsPadding\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material3.TopAppBarDefaults\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.semantics.semantics\nimport androidx.compose.ui.semantics.testTagsAsResourceId\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport net.pantasystem.milktea.auth.viewmodel.app.AppAuthViewModel\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\nimport androidx.compose.foundation.layout.safeContent\n\n@OptIn(ExperimentalCoroutinesApi::class, ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class)\n@Composable\nfun AuthScreen(\n    modifier: Modifier = Modifier,\n    authViewModel: AppAuthViewModel,\n    onCopyToClipboard: (String) -> Unit,\n    onShowPrivacyPolicy: () -> Unit,\n    onShowTermsOfService: () -> Unit,\n    onSignUpButtonClicked: () -> Unit,\n) {\n    val uiState by authViewModel.state.collectAsState()\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeContent,\n        modifier = modifier.semantics {\n            testTagsAsResourceId = true\n        },\n        topBar = {\n            TopAppBar(\n                colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),\n                title = {\n                    when(uiState.stateType) {\n                        is Authorization.Approved -> {\n                            Text(stringResource(id = R.string.success))\n                        }\n                        Authorization.BeforeAuthentication -> {\n                            Text(stringResource(R.string.auth))\n                        }\n                        is Authorization.Finish -> {\n                            Text(\"認証完了\")\n                        }\n                        is Authorization.Waiting4UserAuthorization -> {\n                            Text(stringResource(id = R.string.auth_waiting_4_approval))\n                        }\n                    }\n                }\n            )\n        }\n    ) { paddingValues ->\n        Box(\n            Modifier\n                .fillMaxSize()\n                .padding(paddingValues)\n        ) {\n            when (val stateType = uiState.stateType) {\n                Authorization.BeforeAuthentication -> {\n                    val password by authViewModel.password.collectAsState()\n                    val instanceDomain by authViewModel.instanceDomain.collectAsState()\n                    AuthFormScreen(\n                        uiState = uiState,\n                        password = password,\n                        instanceDomain = instanceDomain,\n                        onInputInstanceDomain = {\n                            authViewModel.instanceDomain.value = it\n                        },\n\n                        onInputPassword = {\n                            authViewModel.password.value = it\n                        },\n                        onStartAuthButtonClicked = {\n                            authViewModel.auth()\n                        },\n                        onToggleTermsOfServiceAgreement = authViewModel::onToggleTermsOfServiceAgreement,\n                        onTogglePrivacyPolicyAgreement = authViewModel::onTogglePrivacyPolicyAgreement,\n                        onShowTermsOfService = onShowTermsOfService,\n                        onShowPrivacyPolicy = onShowPrivacyPolicy,\n                        onToggleAcceptMastodonAlphaTest = authViewModel::onToggleAcceptMastodonAlphaTest,\n                        onSignUpButtonClicked = onSignUpButtonClicked,\n                        onBottomReached = authViewModel::onBottomReached\n                    )\n                }\n                is Authorization.Waiting4UserAuthorization -> {\n                    Waiting4ApproveScreen(\n                        state = stateType,\n                        onApprovedButtonClicked = {\n                            authViewModel.getAccessToken()\n                        },\n                        onCopyAuthUrlButtonClicked = {\n                            onCopyToClipboard(stateType.generateAuthUrl())\n                        }\n                    )\n                }\n                is Authorization.Approved -> {\n                    AuthApprovedScreen(\n                        state = stateType,\n                        onConfirm = {\n                            authViewModel.onConfirmAddAccount()\n                        }\n                    )\n                }\n                is Authorization.Finish -> {\n\n                }\n\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/AuthorizationActivity.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.util.Log\nimport android.widget.Toast\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.lifecycle.whenResumed\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.auth.viewmodel.app.AppAuthViewModel\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.MainNavigation\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.CustomAuthStore\nimport net.pantasystem.milktea.data.infrastructure.auth.from\nimport java.util.Locale\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n\nconst val EXTRA_HOST = \"EXTRA_HOST\"\nconst val EXTRA_USERNAME = \"EXTRA_USERNAME\"\n\nclass AuthorizationNavigationImpl @Inject constructor(\n    val activity: Activity\n) : AuthorizationNavigation {\n    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n    override fun newIntent(args: AuthorizationArgs): Intent {\n        val intent = Intent(activity, AuthorizationActivity::class.java)\n        when (args) {\n            is AuthorizationArgs.New -> {}\n            is AuthorizationArgs.ReAuth -> {\n                intent.putExtra(EXTRA_HOST, args.account?.getHost())\n                intent.putExtra(EXTRA_USERNAME, args.account?.userName)\n            }\n        }\n        return intent\n    }\n}\n\n@FlowPreview\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass AuthorizationActivity : AppCompatActivity() {\n\n    private val appAuthViewModel: AppAuthViewModel by viewModels()\n\n    @Inject\n    lateinit var mainNavigation: MainNavigation\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n//        setContentView(R.layout.activity_authorization)\n\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                appAuthViewModel.state.collect {\n                    Log.d(\"AuthorizationActivity\", \"state:$it\")\n                    if (it.stateType is Authorization.Finish) {\n                        startActivity(mainNavigation.newIntent(Unit))\n                        finish()\n                        return@collect\n                    }\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            whenResumed {\n                appAuthViewModel.waiting4UserAuthorizationStepEvent.collect {\n                    if (appAuthViewModel.isOpenInWebView.value) {\n                        startActivity(\n                            Intent(\n                                this@AuthorizationActivity,\n                                WebViewAuthActivity::class.java\n                            ).also { intent ->\n                                intent.putExtra(EXTRA_AUTH_URL, it.generateAuthUrl())\n                                intent.putExtra(EXTRA_USERNAME, appAuthViewModel.username.value)\n                            })\n                    } else {\n                        startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(it.generateAuthUrl())))\n                    }\n                }\n            }\n        }\n\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                AuthScreen(authViewModel = appAuthViewModel,\n                    onCopyToClipboard = {\n                        (getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager)?.also { clipboardManager ->\n                            it.let {\n                                clipboardManager.setPrimaryClip(\n                                    ClipData.newPlainText(\n                                        \"misskey auth url\",\n                                        it\n                                    )\n                                )\n                                Toast.makeText(\n                                    this,\n                                    getString(R.string.auth_copied_to_clipboard),\n                                    Toast.LENGTH_LONG\n                                ).show()\n                            }\n                        }\n                    },\n                    onShowPrivacyPolicy = {\n                        showPrivacyPolicy()\n                    },\n                    onShowTermsOfService = {\n                        showTermsOfService()\n                    },\n                    onSignUpButtonClicked = {\n                        val intent = Intent(this, SignUpActivity::class.java)\n                        startActivity(intent)\n                    }\n                )\n            }\n        }\n\n        val username = intent.getStringExtra(EXTRA_USERNAME)\n        val host = intent.getStringExtra(EXTRA_HOST)\n        if (host != null) {\n            appAuthViewModel.instanceDomain.value = host\n        }\n        if (username != null) {\n            appAuthViewModel.username.value = username\n        }\n\n    }\n\n\n    @SuppressLint(\"MissingSuperCall\")\n    override fun onNewIntent(intent: Intent) {\n        super.onNewIntent(intent)\n        val authStore = CustomAuthStore.newInstance(this)\n        val callbackToken = intent.data?.getQueryParameter(\"token\")\n        val callbackMastodonCode = intent.data?.getQueryParameter(\"code\")\n\n        if (callbackToken?.isNotBlank() == true) {\n            authStore.getCustomAuthBridge()?.let {\n                val state = Authorization.Waiting4UserAuthorization.from(it)\n                appAuthViewModel.getAccessToken(w4a = state)\n\n            }\n        } else if (callbackMastodonCode?.isNotBlank() == true) {\n            authStore.getCustomAuthBridge()?.let {\n                val state = Authorization.Waiting4UserAuthorization.from(it)\n                appAuthViewModel.getAccessToken(callbackMastodonCode, w4a = state)\n            }\n        }\n    }\n\n    private fun showPrivacyPolicy() {\n        val locale = Locale.getDefault()\n        val url = when(locale.language) {\n            Locale.CHINESE.language -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/privacy_policy_ch.md\"\n            }\n            Locale.ENGLISH.language -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/privacy_policy_en.md\"\n            }\n            Locale.JAPAN.language -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/privacy_policy_ja.md\"\n            }\n            else -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/privacy_policy_en.md\"\n            }\n        }\n        val intent = Intent(Intent.ACTION_VIEW)\n        intent.data = Uri.parse(url)\n        startActivity(intent)\n    }\n\n    private fun showTermsOfService() {\n        val locale = Locale.getDefault()\n        val url = when(locale.language) {\n            Locale.CHINESE.language -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/terms_of_service_ch.md\"\n            }\n            Locale.ENGLISH.language -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/terms_of_service_en.md\"\n            }\n            Locale.JAPAN.language -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/terms_of_service_jp.md\"\n            }\n            else -> {\n                \"https://github.com/pantasystem/Milktea/blob/develop/terms_of_service_en.md\"\n            }\n        }\n        val intent = Intent(Intent.ACTION_VIEW)\n        intent.data = Uri.parse(url)\n        startActivity(intent)\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/InstanceInfoCard.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.CheckCircle\nimport androidx.compose.material.icons.outlined.Circle\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.api.misskey.infos.SimpleInstanceInfo\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun MisskeyInstanceInfoCard(\n    modifier: Modifier = Modifier,\n    info: SimpleInstanceInfo,\n    selected: Boolean,\n    onClick: () -> Unit,\n) {\n    Surface(\n        modifier = modifier,\n        color = MaterialTheme.colorScheme.surface,\n        onClick = onClick,\n    ) {\n        Row(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(\n                    vertical = 12.dp, horizontal = 16.dp\n                ),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Image(\n                rememberAsyncImagePainter(info.iconUrl),\n                contentDescription = null,\n                modifier = Modifier\n                    .size(32.dp)\n                    .clip(RoundedCornerShape(8.dp)),\n                contentScale = ContentScale.Crop,\n            )\n            Spacer(modifier = Modifier.width(8.dp))\n            Column(\n                Modifier.weight(1f)\n            ) {\n                Text(\n                    info.name ?: info.url,\n                    fontSize = 18.sp,\n                    maxLines = 1,\n                    overflow = TextOverflow.Ellipsis\n                )\n                if (info.description != null) {\n                    Text(\n                        info.description ?: \"\",\n                        fontSize = 14.sp,\n                        maxLines = 2,\n                        overflow = TextOverflow.Ellipsis,\n                    )\n                }\n            }\n            Spacer(modifier = Modifier.width(8.dp))\n            CircleCheckbox(selected = selected)\n        }\n    }\n}\n\n@Composable\n@Stable\nprivate fun CircleCheckbox(modifier: Modifier = Modifier, selected: Boolean) {\n\n    val color = MaterialTheme.colorScheme\n    val imageVector = if (selected) Icons.Filled.CheckCircle else Icons.Outlined.Circle\n    val tint = color.primary\n    val background = if (selected) Color.White else Color.Transparent\n\n    Icon(\n        imageVector = imageVector, tint = tint,\n        modifier = modifier.background(background, shape = CircleShape),\n        contentDescription = \"checkbox\"\n    )\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/JoinMilkteaActivity.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.appcompat.app.AppCompatActivity\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass JoinMilkteaActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                JoinMilkteaScreen(\n                    onCreateAccountButtonClicked = {\n                        startActivity(\n                            Intent(this, SignUpActivity::class.java)\n                        )\n                    },\n                    onLoginButtonClicked = {\n                        startActivity(authorizationNavigation.newIntent(AuthorizationArgs.New))\n                    }\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/JoinMilkteaScreen.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.OutlinedButton\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\n\n@Composable\nfun JoinMilkteaScreen(\n    onCreateAccountButtonClicked: () -> Unit,\n    onLoginButtonClicked: () -> Unit,\n) {\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        modifier = Modifier.fillMaxSize()\n    ) { paddingValues ->\n        Box(modifier = Modifier\n            .padding(paddingValues)\n            .fillMaxSize()) {\n            Column(\n                horizontalAlignment = Alignment.CenterHorizontally,\n                verticalArrangement = Arrangement.SpaceBetween,\n                modifier = Modifier\n                    .padding(\n                        vertical = 64.dp,\n                        horizontal = 32.dp\n                    )\n                    .fillMaxSize(),\n            ) {\n                Text(\n                    stringResource(id = R.string.auth_join_milktea_title), fontSize = 28.sp,\n                    fontWeight = FontWeight.Bold,\n                    modifier = Modifier.fillMaxWidth(),\n                    textAlign = TextAlign.Left\n                )\n\n                Column(\n                    modifier = Modifier.fillMaxWidth(),\n                    horizontalAlignment = Alignment.CenterHorizontally\n                ) {\n                    Button(\n                        onClick = onCreateAccountButtonClicked,\n                        modifier = Modifier.fillMaxWidth(),\n                        shape = RoundedCornerShape(32.dp)\n                    ) {\n                        Text(stringResource(id = R.string.auth_sign_up))\n                    }\n\n                    Spacer(modifier = Modifier.height(16.dp))\n\n                    OutlinedButton(\n                        onClick = onLoginButtonClicked,\n                        modifier = Modifier.fillMaxWidth(),\n                        shape = RoundedCornerShape(32.dp),\n                    ) {\n                        Text(stringResource(id = R.string.auth_sign_in))\n                    }\n                }\n            }\n        }\n\n    }\n}\n\n@Preview\n@Composable\nfun Preview_joinMilkteaScreen() {\n    JoinMilkteaScreen(onCreateAccountButtonClicked = {}, onLoginButtonClicked = {})\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/SignUpActivity.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.auth.viewmodel.SignUpViewModel\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass SignUpActivity : AppCompatActivity() {\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val signUpViewModel by viewModels<SignUpViewModel>()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                val uiState by signUpViewModel.uiState.collectAsState()\n                val keyword by signUpViewModel.keyword.collectAsState()\n                SignUpScreen(\n                    uiState = uiState,\n                    instanceDomain = keyword,\n                    onInputKeyword = signUpViewModel::onInputKeyword,\n                    onNextButtonClicked = { instanceType ->\n                        val intent = Intent(Intent.ACTION_VIEW)\n                        intent.data = Uri.parse(instanceType.uri)\n                        startActivity(intent)\n                    },\n                    onSelected = signUpViewModel::onSelected,\n                    onNavigateUp = {\n                        finish()\n                    },\n                    onBottomReached = {\n                        signUpViewModel.onBottomReached()\n                    }\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/SignUpScreen.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.OutlinedTextField\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material3.TopAppBarDefaults\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.Clear\nimport androidx.compose.material.icons.filled.Search\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.snapshotFlow\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport net.pantasystem.milktea.api.misskey.infos.SimpleInstanceInfo\nimport net.pantasystem.milktea.auth.viewmodel.SignUpUiState\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.ui.isScrolledToTheEnd\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun SignUpScreen(\n    instanceDomain: String,\n    uiState: SignUpUiState,\n    onInputKeyword: (String) -> Unit,\n    onNextButtonClicked: (InstanceInfoType) -> Unit,\n    onSelected: (SimpleInstanceInfo) -> Unit,\n    onNavigateUp: () -> Unit,\n    onBottomReached: () -> Unit,\n) {\n\n    val listState = rememberLazyListState()\n    LaunchedEffect(Unit) {\n        snapshotFlow {\n            listState.isScrolledToTheEnd()\n        }.distinctUntilChanged().collect {\n            if (it) {\n                onBottomReached()\n            }\n        }\n    }\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        modifier = Modifier.fillMaxSize(),\n        topBar = {\n            TopAppBar(\n                title = {\n                    Text(stringResource(R.string.auth_find_instance))\n                },\n                colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = \"navigate up\")\n                    }\n                }\n            )\n        },\n    ) { paddingValues ->\n        Column(\n            Modifier\n                .padding(paddingValues)\n                .fillMaxSize(),\n            verticalArrangement = Arrangement.SpaceBetween\n        ) {\n            OutlinedTextField(\n                instanceDomain,\n                onValueChange = onInputKeyword,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(horizontal = 16.dp),\n                maxLines = 1,\n                label = {\n                    Text(stringResource(R.string.auth_instance_domain))\n                },\n                trailingIcon = {\n                    IconButton(\n                        onClick = {\n                            onInputKeyword(\"\")\n                        },\n                    ) {\n                        Icon(Icons.Default.Clear, contentDescription = \"clear instance domain\")\n                    }\n                },\n                leadingIcon = {\n                    Icon(Icons.Default.Search, contentDescription = null)\n                },\n            )\n            LazyColumn(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .weight(1f),\n                state = listState,\n            ) {\n                items(uiState.filteredInfos) { instance ->\n                    MisskeyInstanceInfoCard(\n                        info = instance,\n                        selected = uiState.keyword == instance.url\n                                || (uiState.selectedUrl == instance.url && !uiState.filteredInfos.any {\n                            it.url == uiState.keyword\n                        }),\n                        onClick = {\n                            onSelected(instance)\n                        }\n                    )\n                }\n            }\n            Column(\n                Modifier\n                    .fillMaxWidth()\n                    .padding(16.dp),\n                horizontalAlignment = Alignment.CenterHorizontally\n            ) {\n                Text(stringResource(id = R.string.auth_find_instance_show_in_web_browser_message))\n                Button(\n                    shape = RoundedCornerShape(32.dp),\n                    onClick = {\n                        when (val content = uiState.instanceInfo.content) {\n                            is StateContent.Exist -> {\n                                onNextButtonClicked(content.rawContent)\n                            }\n\n                            is StateContent.NotExist -> Unit\n                        }\n                    },\n                    enabled = uiState.instanceInfo is ResultState.Fixed\n                            && uiState.instanceInfo.content is StateContent.Exist\n                ) {\n                    Text(\n                        stringResource(id = R.string.auth_find_instance_next_button_text),\n                        modifier = Modifier.padding(horizontal = 64.dp)\n                    )\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/Waiting4ApproveScreen.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ContentCopy\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.asImageBitmap\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.glxn.qrgen.android.QRCode\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\n\n@Composable\nfun Waiting4ApproveScreen(\n    modifier: Modifier = Modifier,\n    state: Authorization.Waiting4UserAuthorization,\n    onApprovedButtonClicked: () -> Unit,\n    onCopyAuthUrlButtonClicked: () -> Unit,\n) {\n    var qrCode: ImageBitmap? by remember {\n        mutableStateOf(null)\n    }\n    DisposableEffect(key1 = state) {\n        qrCode = QRCode.from(state.generateAuthUrl()).bitmap().asImageBitmap()\n        onDispose {\n            qrCode = null\n        }\n    }\n\n    Column(\n        modifier\n            .fillMaxSize()\n            .padding(16.dp),\n        verticalArrangement = Arrangement.SpaceBetween,\n    ) {\n        Column {\n            Text(stringResource(id = R.string.auth_waiting_4_u_to_approve), fontSize = 18.sp)\n            Spacer(modifier = Modifier.height(8.dp))\n            Row(\n                modifier = Modifier.fillMaxWidth(),\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                OutlinedTextField(\n                    modifier = Modifier.weight(1f),\n                    value = state.generateAuthUrl(),\n                    onValueChange = {},\n                )\n                IconButton(onClick = onCopyAuthUrlButtonClicked) {\n                    Icon(Icons.Default.ContentCopy, contentDescription = \"Copy url\")\n                }\n            }\n        }\n\n        when(val image = qrCode) {\n            null -> Unit\n            else -> {\n                Column(\n                    Modifier.fillMaxWidth(),\n                    horizontalAlignment = Alignment.CenterHorizontally,\n                ) {\n                    Text(stringResource(id = R.string.auth_qr_code_message))\n                    Image(image, contentDescription = null, modifier = Modifier.size(128.dp))\n                }\n            }\n        }\n\n\n\n        Button(\n            onClick = onApprovedButtonClicked,\n            shape = RoundedCornerShape(32.dp),\n            modifier = Modifier.align(Alignment.End)\n        ) {\n            Text(stringResource(id = R.string.auth_i_have_approved))\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/WebViewAuthActivity.kt",
    "content": "package net.pantasystem.milktea.auth\n\nimport android.annotation.SuppressLint\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.webkit.WebResourceRequest\nimport android.webkit.WebStorage\nimport android.webkit.WebView\nimport android.webkit.WebViewClient\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.wada811.databinding.dataBinding\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.filterNot\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.auth.databinding.ActivityWebViewAuthBinding\nimport androidx.activity.enableEdgeToEdge\n\nconst val EXTRA_AUTH_URL = \"EXTRA_AUTH_URL\"\n\nclass WebViewAuthActivity : AppCompatActivity() {\n    val binding by dataBinding<ActivityWebViewAuthBinding>()\n\n    private val authUrl by lazy {\n        intent.getStringExtra(EXTRA_AUTH_URL)\n    }\n\n    private val username by lazy {\n        intent.getStringExtra(EXTRA_USERNAME)\n    }\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_web_view_auth)\n\n        WebStorage.getInstance().deleteAllData()\n        binding.webView.settings.javaScriptEnabled = true\n        binding.webView.settings.domStorageEnabled = true\n        binding.webView.webViewClient = object : WebViewClient() {\n            override fun shouldOverrideUrlLoading(\n                view: WebView?,\n                request: WebResourceRequest?\n            ): Boolean {\n                val url = request?.url\n                Log.d(\"WebViewAuthActivity\", \"shouldOverrideUrlLoading uri:$url\")\n\n                if (url != null) {\n                    if (url.scheme == \"misskey\" && url.host == \"app_auth_callback\") {\n                        Log.d(\"WebViewAuthActivity\", \"該当する\")\n                        startActivity(Intent(Intent.ACTION_VIEW, url))\n                        return true\n                    }\n                }\n                return false\n            }\n\n            override fun onPageFinished(view: WebView?, url: String?) {\n                super.onPageFinished(view, url)\n                delayedLoad()\n            }\n        }\n\n        binding.webView.loadUrl(authUrl!!)\n\n\n    }\n\n    fun delayedLoad() {\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                (0 until Int.MAX_VALUE).asFlow().map {\n                    delay(500)\n                }.filter {\n                    binding.webView.url == authUrl\n                }.filterNot {\n                    username.isNullOrBlank()\n                }.map {\n                    load()\n                }.collect {\n\n                }\n            }\n        }\n    }\n    private fun load() {\n        binding.webView.loadUrl(\"\"\"\n            javascript:console.log(\n                (function(){\n                    const tag = Array.from(document.getElementsByTagName('input'))\n                        .filter(e => e.type=='text')[0];\n                    if ('$username' && tag.value != '$username' && !tag.value) {\n                        tag.value = '$username';\n                    }\n                }())\n            )\n        \"\"\".trimIndent())\n    }\n\n}\n\n//Array.from(document.getElementsByTagName('input'))\n//.filter(e => e.type=='text')[0].value = '$username'"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/di/module/NavigationModule.kt",
    "content": "package net.pantasystem.milktea.auth.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.auth.AuthorizationNavigationImpl\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\n\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n    @Binds\n    abstract fun provideAuthorizationNavigation(impl: AuthorizationNavigationImpl): AuthorizationNavigation\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/suggestions/InstanceSuggestionsPagingModel.kt",
    "content": "package net.pantasystem.milktea.auth.suggestions\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.api.milktea.instance.ticker.InstanceTickerAPIServiceBuilder\nimport net.pantasystem.milktea.api.misskey.infos.SimpleInstanceInfo\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.paginator.EntityConverter\nimport net.pantasystem.milktea.common.paginator.PaginationState\nimport net.pantasystem.milktea.common.paginator.PreviousLoader\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.common.paginator.StateLocker\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport javax.inject.Inject\n\nclass InstanceSuggestionsPagingModel @Inject constructor(\n    private val instanceTickerAPIBuilder: InstanceTickerAPIServiceBuilder,\n    private val loggerFactory: Logger.Factory,\n) : StateLocker,\n    PaginationState<SimpleInstanceInfo>,\n    PreviousLoader<SimpleInstanceInfo>,\n    EntityConverter<SimpleInstanceInfo, SimpleInstanceInfo> {\n\n    private val logger by lazy {\n        loggerFactory.create(\"InstanceSuggestionsPagingModel\")\n    }\n    private var _offset = 0\n    private var _name: String = \"\"\n    private val _state =\n        MutableStateFlow<PageableState<List<SimpleInstanceInfo>>>(PageableState.Loading.Init())\n\n    private var _job: Job? = null\n\n    override suspend fun convertAll(list: List<SimpleInstanceInfo>): List<SimpleInstanceInfo> {\n        return list\n    }\n\n    override val state: Flow<PageableState<List<SimpleInstanceInfo>>>\n        get() = _state\n\n    override fun getState(): PageableState<List<SimpleInstanceInfo>> {\n        return _state.value\n    }\n\n    override fun setState(state: PageableState<List<SimpleInstanceInfo>>) {\n        _state.value = state\n    }\n\n    override suspend fun loadPrevious(): Result<List<SimpleInstanceInfo>> =\n        runCancellableCatching {\n            instanceTickerAPIBuilder.build(\"https://milktea-instance-ticker.milktea.workers.dev/\").getInstances(\n                offset = _offset,\n                name = _name,\n//                lang = Locale.current.language,\n            ).throwIfHasError().body()!!.also {\n                _offset += it.size\n            }\n        }\n\n    suspend fun setQueryName(name: String) {\n        _job?.cancel()\n        mutex.withLock {\n            _name = name\n            _offset = 0\n        }\n        setState(PageableState.Loading.Init())\n    }\n\n    override val mutex: Mutex = Mutex()\n\n    private val previousPagingController = PreviousPagingController.create(\n        this,\n    )\n\n    fun onLoadNext(scope: CoroutineScope) {\n        _job?.cancel()\n        _job = scope.launch {\n            previousPagingController.loadPrevious().onFailure {\n                logger.error(\"Failed to load previous\", it)\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/viewmodel/Permissions.kt",
    "content": "package net.pantasystem.milktea.auth.viewmodel\n\nimport net.pantasystem.milktea.model.instance.Version\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.getVersion\n\nobject Permissions{\n    private val defaultPermission = listOf(\n        \"write:user-groups\",\n        \"read:user-groups\",\n        \"read:page-likes\",\n        \"write:page-likes\",\n        \"write:pages\",\n        \"read:pages\",\n        \"write:votes\",\n        \"write:reactions\",\n        \"read:reactions\",\n        \"write:notifications\",\n        \"read:notifications\",\n        \"write:notes\",\n        \"write:mutes\",\n        \"read:mutes\",\n        \"read:account\",\n        \"write:account\",\n        \"read:blocks\",\n        \"write:blocks\",\n        \"read:drive\",\n        \"write:drive\",\n        \"read:favorites\",\n        \"write:favorites\",\n        \"read:following\",\n        \"write:following\",\n        \"read:messaging\",\n        \"write:messaging\"\n    )\n\n    private val V_12_47_0: List<String> = defaultPermission.toMutableList().apply {\n        addAll(listOf(\"read:channels\", \"write:channels\"))\n    }\n\n    private val V_12_75_0: List<String> = V_12_47_0.toMutableList().apply {\n        addAll(\n            listOf(\n                \"read:gallery\",\n                \"write:gallery\",\n                \"read:gallery-likes\",\n                \"write:gallery-likes\"\n            )\n        )\n    }\n\n    fun getPermission(version: Version) : List<String>{\n        return when {\n            version >= Version(\"12.75.0\") -> {\n                V_12_75_0\n            }\n            version >= Version(\"12.47.0\") -> {\n                V_12_47_0\n            }\n            else -> {\n                defaultPermission\n            }\n        }\n    }\n\n\n    fun getPermission(softwareType: NodeInfo.SoftwareType.Misskey?): List<String>? {\n        return when {\n            softwareType == null -> {\n                null\n            }\n            softwareType is NodeInfo.SoftwareType.Misskey.Foundkey -> {\n                V_12_47_0\n            }\n            softwareType.getVersion() >= Version(\"12.75.0\") -> {\n                V_12_75_0\n            }\n            softwareType.getVersion() >= Version(\"12.47.0\") -> {\n                V_12_47_0\n            }\n            else -> {\n                defaultPermission\n            }\n        }\n    }\n\n    fun getPermission(softwareType: NodeInfo.SoftwareType.Firefish?): List<String> {\n        return V_12_75_0\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/viewmodel/SignUpViewModel.kt",
    "content": "package net.pantasystem.milktea.auth.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.api.misskey.infos.SimpleInstanceInfo\nimport net.pantasystem.milktea.auth.suggestions.InstanceSuggestionsPagingModel\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport javax.inject.Inject\n\n@HiltViewModel\nclass SignUpViewModel @Inject constructor(\n    private val instanceInfoService: InstanceInfoService,\n    private val instancePagingModel: InstanceSuggestionsPagingModel,\n) : ViewModel() {\n\n    private var _keyword = MutableStateFlow(\"\")\n    val keyword = _keyword.asStateFlow()\n\n//    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n//    private val instancesInfosResponse = keyword.flatMapLatest { name ->\n//        suspend {\n//            requireNotNull(\n//                instancesInfosAPIBuilder.build().getInstances(\n//                    name = name\n//                ).throwIfHasError()\n//                    .body()\n//            ).distinctBy {\n//                it.url\n//            }\n//        }.asFlow()\n//    }.catch {\n//        logger.error(\"インスタンス情報の取得に失敗\", it)\n//    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val instancesInfosResponse = instancePagingModel.state.map {\n        (it.content as? StateContent.Exist)?.rawContent\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList(),\n    )\n\n\n    private var _selectedInstanceUrl = MutableStateFlow<String?>(\"misskey.io\")\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val instanceInfo = combine(keyword, _selectedInstanceUrl) { it, selected ->\n        selected?.let {\n            \"https://$it\"\n        } ?: if (it.startsWith(\"https://\") || it.startsWith(\"http://\")) {\n            it\n        } else {\n            \"https://$it\"\n        }\n    }.flatMapLatest {\n        suspend {\n            instanceInfoService.find(it).getOrThrow()\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState()\n    )\n\n    val uiState = combine(\n        instancesInfosResponse,\n        keyword,\n        instanceInfo,\n        _selectedInstanceUrl\n    ) { infos, keyword, info, selected ->\n        SignUpUiState(\n            keyword = keyword,\n            selected,\n            info,\n            infos ?: emptyList(),\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        SignUpUiState()\n    )\n\n    init {\n        instancePagingModel.onLoadNext(viewModelScope)\n    }\n\n    fun onInputKeyword(value: String) {\n        viewModelScope.launch {\n            _keyword.value = value\n            instancePagingModel.setQueryName(value)\n            instancePagingModel.onLoadNext(this)\n        }\n    }\n\n    fun onSelected(instancesInfosResponse: SimpleInstanceInfo) {\n        _selectedInstanceUrl.value = instancesInfosResponse.url\n    }\n\n    fun onBottomReached() {\n        instancePagingModel.onLoadNext(viewModelScope)\n    }\n}\n\ndata class SignUpUiState(\n    val keyword: String = \"\",\n    val selectedUrl: String? = \"misskey.io\",\n    val instanceInfo: ResultState<InstanceInfoType> = ResultState.initialState(),\n    val instancesInfosResponse: List<SimpleInstanceInfo> = emptyList(),\n) {\n\n    val filteredInfos = instancesInfosResponse\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/viewmodel/app/AppAuthViewModel.kt",
    "content": "package net.pantasystem.milktea.auth.viewmodel.app\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.filterNot\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.api.misskey.MisskeyAPIServiceBuilder\nimport net.pantasystem.milktea.api.misskey.auth.UserKey\nimport net.pantasystem.milktea.auth.suggestions.InstanceSuggestionsPagingModel\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.toFirefishModel\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.toModel\nimport net.pantasystem.milktea.model.account.ClientIdRepository\nimport net.pantasystem.milktea.model.instance.SyncMetaExecutor\nimport java.util.Date\nimport javax.inject.Inject\n\n\nconst val CALL_BACK_URL = \"misskey://app_auth_callback\"\n\n@ExperimentalCoroutinesApi\n@HiltViewModel\nclass AppAuthViewModel @Inject constructor(\n    private val authService: AuthStateHelper,\n    loggerFactory: Logger.Factory,\n    private val misskeyAPIServiceBuilder: MisskeyAPIServiceBuilder,\n    private val getAccessToken: GetAccessToken,\n    private val clientIdRepository: ClientIdRepository,\n    private val syncMetaExecutor: SyncMetaExecutor,\n    private val instanceSuggestionsPagingModel: InstanceSuggestionsPagingModel,\n) : ViewModel() {\n\n    private val logger = loggerFactory.create(\"AppAuthViewModel\")\n\n    val instanceDomain = MutableStateFlow(\"\")\n\n    val isOpenInWebView = MutableStateFlow(false)\n\n    val username = MutableStateFlow(\"\")\n\n    val appName = MutableStateFlow(\"Milktea\")\n\n    val password = MutableStateFlow(\"\")\n\n    private val metaState = instanceDomain.map {\n        authService.convertEnableUrl(it)\n    }.filter {\n        authService.checkUrlPattern(it)\n    }.flatMapLatest {\n        suspend {\n            authService.getInstanceInfoType(it)\n        }.asLoadingStateFlow()\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope, SharingStarted.Lazily, ResultState.Fixed(\n            StateContent.NotExist()\n        )\n    )\n\n    private val misskeyInstances = instanceSuggestionsPagingModel.state.map {\n        (it.content as? StateContent.Exist)?.rawContent ?: emptyList()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n\n    private val isPrivacyPolicyAgreement = MutableStateFlow(false)\n    private val isTermsOfServiceAgreement = MutableStateFlow(false)\n\n    private val isAcceptMastodonAlphaTest = MutableStateFlow(false)\n\n    private val checkBoxes = combine(\n        isPrivacyPolicyAgreement,\n        isTermsOfServiceAgreement,\n        isAcceptMastodonAlphaTest,\n    ) { privacyPolicy, termsOfService, isAcceptMastodonAlphaTest ->\n        CheckBoxes(\n            isPrivacyPolicyAgreement = privacyPolicy,\n            isTermsOfServiceAgreement = termsOfService,\n            isAcceptMastodonAlphaTest = isAcceptMastodonAlphaTest\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        CheckBoxes()\n    )\n\n    private val authUserInputState = combine(\n        instanceDomain,\n        appName,\n        password,\n        checkBoxes,\n    ) { domain, name, password, checkBoxes ->\n        AuthUserInputState(\n            instanceDomain = authService.convertEnableUrl(domain),\n            appName = name,\n            rawInputInstanceDomain = domain,\n            password = password,\n            isPrivacyPolicyAgreement = checkBoxes.isPrivacyPolicyAgreement,\n            isTermsOfServiceAgreement = checkBoxes.isTermsOfServiceAgreement,\n            isAcceptMastodonAlphaTest = checkBoxes.isAcceptMastodonAlphaTest,\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        AuthUserInputState(\n            \"misskey.io\",\n            \"\",\n            \"Milktea\",\n            \"\",\n            isTermsOfServiceAgreement = false,\n            isPrivacyPolicyAgreement = false,\n            isAcceptMastodonAlphaTest = false,\n        )\n    )\n\n    private val instanceInfo = authUserInputState.flatMapLatest {\n        metaState\n    }.combine(authUserInputState) { meta, inputState ->\n        BeforeAuthState(\n            meta = meta,\n            inputState = inputState\n        )\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope, SharingStarted.Lazily, BeforeAuthState(\n            meta = ResultState.Fixed(\n                StateContent.NotExist()\n            ),\n            inputState = authUserInputState.value,\n        )\n    )\n\n    private val startAuthEventFlow = MutableSharedFlow<Long>(extraBufferCapacity = 100)\n\n    private val waiting4UserApprove = instanceInfo.filterNot {\n        it.inputState.isIdPassword\n    }.flatMapLatest { state ->\n        startAuthEventFlow.map {\n            state\n        }\n    }.flatMapLatest {\n        suspend {\n            when (val meta = it.meta.content) {\n                is StateContent.Exist -> {\n                    val instanceBase = meta.rawContent.uri\n                    logger.debug { \"instanceBaseUrl: $instanceBase\" }\n                    authService.createWaiting4Approval(\n                        instanceBase,\n                        authService.createApp(\n                            instanceBase,\n                            instanceType = meta.rawContent,\n                            appName = it.inputState.appName\n                        )\n                    )\n                }\n\n                is StateContent.NotExist -> throw IllegalStateException()\n            }\n        }.asLoadingStateFlow()\n    }.catch {\n        logger.error(\"アプリの作成に失敗\", it)\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.Fixed(StateContent.NotExist())\n    )\n\n    private val generateTokenResult =\n        MutableStateFlow<GenerateTokenResult>(GenerateTokenResult.Fixed)\n\n    val waiting4UserAuthorizationStepEvent = waiting4UserApprove.mapNotNull {\n        (it.content as? StateContent.Exist)?.rawContent\n    }.distinctUntilChanged().shareIn(viewModelScope, SharingStarted.WhileSubscribed(5_000))\n\n    private val approved = MutableStateFlow<Authorization.Approved?>(null)\n\n\n    private val confirmAddAccountEventFlow = MutableSharedFlow<Long>(extraBufferCapacity = 100)\n    private val finished = confirmAddAccountEventFlow.flatMapLatest {\n        approved.filterNotNull()\n    }.map {\n        runCancellableCatching {\n            authService.createAccount(it)\n        }.onFailure {\n            logger.error(\"アカウント登録処理失敗\", it)\n        }.onSuccess {\n            syncMetaExecutor(it.account.normalizedInstanceUri)\n        }.getOrNull()\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val combineStates = combine(\n        waiting4UserApprove,\n        approved,\n        finished,\n        generateTokenResult\n    ) { waiting4Approve, approved, finished, result ->\n        CombineStates(waiting4Approve, approved, finished, result)\n    }\n\n    val state = combine(\n        instanceInfo,\n        combineStates,\n        misskeyInstances,\n    ) { formState, (waiting4Approve, approved, finished, result), misskeyInstances ->\n        AuthUiState(\n            formState = formState.inputState,\n            instanceInfoResultState = formState.meta,\n            stateType = when {\n                result is GenerateTokenResult.Failure -> Authorization.BeforeAuthentication\n                finished != null -> finished\n                approved != null -> approved\n                waiting4Approve.content is StateContent.Exist -> (waiting4Approve.content as StateContent.Exist).rawContent\n                else -> Authorization.BeforeAuthentication\n            },\n            waiting4ApproveState = waiting4Approve,\n            clientId = \"clientId: ${clientIdRepository.getOrCreate().clientId}\",\n            misskeyInstanceInfosResponse = misskeyInstances,\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        AuthUiState(\n            formState = authUserInputState.value,\n            instanceInfoResultState = metaState.value,\n            stateType = Authorization.BeforeAuthentication,\n            misskeyInstanceInfosResponse = emptyList(),\n        )\n    )\n\n\n    init {\n        instanceDomain.onEach {\n            instanceSuggestionsPagingModel.setQueryName(it)\n            instanceSuggestionsPagingModel.onLoadNext(viewModelScope)\n        }.launchIn(viewModelScope)\n\n        waiting4UserApprove.mapNotNull {\n            (it.content as? StateContent.Exist)?.rawContent\n        }.filterNotNull().flatMapLatest { a ->\n            (0..Int.MAX_VALUE).asFlow().map {\n                delay(4000)\n                when (a) {\n                    is Authorization.Waiting4UserAuthorization.Misskey -> {\n                        try {\n                            val token = misskeyAPIServiceBuilder.buildAuthAPI(a.instanceBaseURL)\n                                .getAccessToken(\n                                    UserKey(\n                                        appSecret = a.appSecret,\n                                        a.session.token\n                                    )\n                                )\n                                .throwIfHasError()\n                                .body()\n                                ?: throw IllegalStateException(\"response bodyがありません。\")\n\n                            val authenticated = Authorization.Approved(\n                                a.instanceBaseURL,\n                                accessToken = token.toModel(a.appSecret)\n                            )\n                            ResultState.Fixed(StateContent.Exist(authenticated))\n                        } catch (e: Throwable) {\n                            ResultState.Error(StateContent.NotExist(), e)\n                        }\n                    }\n\n                    is Authorization.Waiting4UserAuthorization.Firefish -> {\n                        try {\n                            val token = misskeyAPIServiceBuilder.buildAuthAPI(a.instanceBaseURL)\n                                .getAccessToken(\n                                    UserKey(\n                                        appSecret = a.appSecret,\n                                        a.session.token\n                                    )\n                                )\n                                .throwIfHasError()\n                                .body()\n                                ?: throw IllegalStateException(\"response bodyがありません。\")\n\n                            val authenticated = Authorization.Approved(\n                                a.instanceBaseURL,\n                                accessToken = token.toFirefishModel(a.appSecret)\n                            )\n                            ResultState.Fixed(StateContent.Exist(authenticated))\n                        } catch (e: Throwable) {\n                            ResultState.Error(StateContent.NotExist(), e)\n                        }\n                    }\n\n                    else -> {\n                        ResultState.Fixed(StateContent.NotExist())\n                    }\n                }\n            }\n        }.mapNotNull {\n            it.content as? StateContent.Exist\n        }.onEach {\n            approved.value = it.rawContent\n        }.launchIn(viewModelScope + Dispatchers.IO)\n\n        // NOTE: id, passwordのサポート\n        authUserInputState.flatMapLatest { state ->\n            startAuthEventFlow.distinctUntilChanged().map {\n                state\n            }\n        }.filter {\n            it.isIdPassword\n        }.map {\n            authService.signIn(it)\n        }.onEach { result ->\n            result.onSuccess {\n                approved.value = Authorization.Approved(\n                    instanceBaseURL = it.baseUrl,\n                    accessToken = it\n                )\n            }.onFailure {\n                logger.error(\"signIn failed\", it)\n            }\n        }.launchIn(viewModelScope)\n\n    }\n\n    fun auth() {\n        startAuthEventFlow.tryEmit(Date().time)\n    }\n\n\n    fun getAccessToken(code: String? = null, w4a: Authorization.Waiting4UserAuthorization? = null) {\n        val a = w4a ?: (waiting4UserApprove.value.content as? StateContent.Exist)?.rawContent\n        ?: throw IllegalStateException(\"現在の状態: ${state.value}でアクセストークンを取得することはできません。\")\n        viewModelScope.launch {\n\n            getAccessToken.getAccessToken(a, code).onSuccess {\n                val authenticated = Authorization.Approved(\n                    a.instanceBaseURL,\n                    it\n                )\n                generateTokenResult.tryEmit(GenerateTokenResult.Success)\n                approved.value = authenticated\n            }.onFailure {\n                generateTokenResult.tryEmit(GenerateTokenResult.Failure)\n            }\n        }\n    }\n\n    fun onConfirmAddAccount() {\n        confirmAddAccountEventFlow.tryEmit(Date().time)\n    }\n\n    fun onToggleTermsOfServiceAgreement(value: Boolean) {\n        isTermsOfServiceAgreement.value = value\n    }\n\n    fun onTogglePrivacyPolicyAgreement(value: Boolean) {\n        isPrivacyPolicyAgreement.value = value\n    }\n\n    fun onToggleAcceptMastodonAlphaTest(value: Boolean) {\n        isAcceptMastodonAlphaTest.value = value\n    }\n\n    fun onBottomReached() {\n        instanceSuggestionsPagingModel.onLoadNext(viewModelScope)\n    }\n\n}\n\nprivate data class CombineStates(\n    val waiting4UserApprove: ResultState<Authorization.Waiting4UserAuthorization>,\n    val approved: Authorization.Approved? = null,\n    val finished: Authorization.Finish? = null,\n    val generateTokenResult: GenerateTokenResult = GenerateTokenResult.Fixed\n)\n\nprivate data class CheckBoxes(\n    val isPrivacyPolicyAgreement: Boolean = false,\n    val isTermsOfServiceAgreement: Boolean = false,\n    val isAcceptMastodonAlphaTest: Boolean = false,\n)"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/viewmodel/app/AuthStateHelper.kt",
    "content": "package net.pantasystem.milktea.auth.viewmodel.app\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.mastodon.apps.CreateApp\nimport net.pantasystem.milktea.api.misskey.I\nimport net.pantasystem.milktea.api.misskey.MisskeyAPIServiceBuilder\nimport net.pantasystem.milktea.api.misskey.auth.AppSecret\nimport net.pantasystem.milktea.api.misskey.auth.Session\nimport net.pantasystem.milktea.api.misskey.auth.SignInRequest\nimport net.pantasystem.milktea.api.misskey.auth.fromDTO\nimport net.pantasystem.milktea.api.misskey.auth.fromFirefishDTO\nimport net.pantasystem.milktea.api.misskey.auth.fromPleromaDTO\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.auth.viewmodel.Permissions\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.converters.MastodonAccountDTOEntityConverter\nimport net.pantasystem.milktea.data.converters.UserDTOEntityConverter\nimport net.pantasystem.milktea.data.infrastructure.account.newAccount\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.AccessToken\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.CustomAuthStore\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.createAuth\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.app.AppType\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.sw.register.SubscriptionRegistration\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport java.util.regex.Pattern\nimport javax.inject.Inject\n\nval urlPattern: Pattern = Pattern.compile(\"\"\"(https?)(://)([-_.!~*'()\\[\\]a-zA-Z0-9;/?:@&=+${'$'},%#]+)\"\"\")\n\nclass AuthStateHelper @Inject constructor(\n    private val mastodonAPIProvider: MastodonAPIProvider,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n    private val customAuthStore: CustomAuthStore,\n    private val misskeyAPIServiceBuilder: MisskeyAPIServiceBuilder,\n    private val accountRepository: AccountRepository,\n    private val accountStore: AccountStore,\n    private val subscriptionRegistration: SubscriptionRegistration,\n    private val userDataSource: UserDataSource,\n    private val userDTOEntityConverter: UserDTOEntityConverter,\n    private val instanceInfoService: InstanceInfoService,\n    private val mastodonAccountDTOEntityConverter: MastodonAccountDTOEntityConverter,\n) {\n\n\n    suspend fun createWaiting4Approval(\n        instanceBase: String,\n        app: AppType,\n    ): Authorization.Waiting4UserAuthorization {\n        return when (app) {\n            is AppType.Mastodon -> {\n                val authState = app.createAuth(instanceBase, \"read write follow push\")\n                customAuthStore.setCustomAuthBridge(authState)\n                Authorization.Waiting4UserAuthorization.Mastodon(\n                    instanceBase,\n                    client = app,\n                    scope = \"read write follow push\"\n                )\n            }\n            is AppType.Pleroma -> {\n                val authState = app.createAuth(instanceBase, \"read write follow push\")\n                customAuthStore.setCustomAuthBridge(authState)\n                Authorization.Waiting4UserAuthorization.Pleroma(\n                    instanceBase,\n                    client = app,\n                    scope = \"read write follow push\"\n                )\n            }\n            is AppType.Misskey -> {\n                val secret = app.secret\n                val session = generateMisskeySession(instanceBase, secret)\n\n                customAuthStore.setCustomAuthBridge(\n                    app.createAuth(instanceBase, session)\n                )\n                Authorization.Waiting4UserAuthorization.Misskey(\n                    instanceBase,\n                    appSecret = app.secret!!,\n                    session = session,\n                    viaName = app.name\n                )\n            }\n            is AppType.Firefish -> {\n                val secret = app.secret\n                val session = generateMisskeySession(instanceBase, secret)\n\n                customAuthStore.setCustomAuthBridge(\n                    app.createAuth(instanceBase, session)\n                )\n                Authorization.Waiting4UserAuthorization.Firefish(\n                    instanceBase,\n                    appSecret = app.secret!!,\n                    session = session,\n                    viaName = app.name\n                )\n            }\n        }\n    }\n\n    suspend fun createApp(\n        url: String,\n        instanceType: InstanceInfoType,\n        appName: String\n    ): AppType {\n        when (instanceType) {\n            is InstanceInfoType.Mastodon -> {\n                val app = mastodonAPIProvider.get(url)\n                    .createApp(\n                        CreateApp(\n                            clientName = appName,\n                            redirectUris = CALL_BACK_URL,\n                            scopes = \"read write follow push\"\n                        )\n                    ).throwIfHasError().body()\n                    ?: throw IllegalStateException(\"Appの作成に失敗しました。\")\n                return AppType.fromDTO(app)\n            }\n            is InstanceInfoType.Pleroma -> {\n                val app = mastodonAPIProvider.get(url)\n                    .createApp(\n                        CreateApp(\n                            clientName = appName,\n                            redirectUris = CALL_BACK_URL,\n                            scopes = \"read write follow push\"\n                        )\n                    ).throwIfHasError().body()\n                    ?: throw IllegalStateException(\"Appの作成に失敗しました。\")\n\n                return AppType.fromPleromaDTO(app)\n            }\n            is InstanceInfoType.Misskey -> {\n                val version = instanceType.version\n                val misskeyAPI = misskeyAPIProvider.get(url)\n                val app = misskeyAPI.createApp(\n                    net.pantasystem.milktea.api.misskey.app.CreateApp(\n                        null,\n                        appName,\n                        \"misskey android application\",\n                        CALL_BACK_URL,\n                        permission = Permissions.getPermission(instanceType.softwareType)\n                            ?: Permissions.getPermission(version)\n                    )\n                ).throwIfHasError().body()\n                    ?: throw IllegalStateException(\"Appの作成に失敗しました。\")\n                return AppType.fromDTO(app)\n            }\n            is InstanceInfoType.Firefish -> {\n                val misskeyAPI = misskeyAPIProvider.get(url)\n                val app = misskeyAPI.createApp(\n                    net.pantasystem.milktea.api.misskey.app.CreateApp(\n                        null,\n                        appName,\n                        \"misskey android application\",\n                        CALL_BACK_URL,\n                        permission = Permissions.getPermission(instanceType.softwareType)\n                    )\n                ).throwIfHasError().body()\n                    ?: throw IllegalStateException(\"Appの作成に失敗しました。\")\n                return AppType.fromFirefishDTO(app)\n            }\n        }\n\n    }\n\n    suspend fun getInstanceInfoType(url: String): InstanceInfoType {\n        if (urlPattern.matcher(url).find()) {\n\n            return instanceInfoService.find(url).getOrThrow()\n        } else {\n            throw IllegalArgumentException(\"not support pattern url: $url\")\n        }\n    }\n\n    fun convertEnableUrl(base: String): String {\n\n        val urlFromIdPassword = if (userNameRegex.matches(base)) {\n            runCancellableCatching {\n                userNameRegex.find(base)?.groups?.get(2)\n            }.getOrNull()?.value\n        } else null\n\n        var url = if (base.startsWith(\"https://\")) {\n            base\n        } else if (!urlFromIdPassword.isNullOrBlank()) {\n            \"https://$urlFromIdPassword\"\n        }\n        else {\n            \"https://$base\"\n        }.replace(\" \", \"\").replace(\"\\t\", \"\").replace(\"　\", \"\")\n\n        if (url.endsWith(\"/\")) {\n            url = url.substring(url.indices)\n        }\n        return url\n    }\n\n    suspend fun createAccount(a: Authorization.Approved): Authorization.Finish {\n        val account = accountRepository.add(\n            a.accessToken.newAccount(a.instanceBaseURL),\n            false\n        ).getOrThrow()\n        val user = when (val token = a.accessToken) {\n            is AccessToken.Mastodon -> {\n                mastodonAccountDTOEntityConverter.convert(\n                    account,\n                    token.account,\n                )\n            }\n            is AccessToken.Misskey -> {\n                userDTOEntityConverter.convert(\n                    account,\n                    token.user,\n                    true\n                ) as User.Detail\n            }\n            is AccessToken.MisskeyIdAndPassword -> {\n                userDTOEntityConverter.convert(\n                    account,\n                    token.user,\n                    true\n                ) as User.Detail\n            }\n            is AccessToken.Pleroma -> {\n                mastodonAccountDTOEntityConverter.convert(\n                    account,\n                    token.account,\n                )\n            }\n            is AccessToken.Firefish -> {\n                userDTOEntityConverter.convert(\n                    account,\n                    token.user,\n                    true\n                ) as User.Detail\n            }\n        }\n        userDataSource.add(user)\n        accountStore.addAccount(account)\n        subscriptionRegistration.register(account.accountId)\n\n        return Authorization.Finish(account, user)\n    }\n\n    suspend fun signIn(formState: AuthUserInputState): Result<AccessToken.MisskeyIdAndPassword> =\n        runCancellableCatching {\n            withContext(Dispatchers.IO) {\n\n                val baseUrl = convertEnableUrl(requireNotNull(formState.host))\n                val api = misskeyAPIServiceBuilder.buildAuthAPI(baseUrl)\n                require(formState.isIdPassword) {\n                    \"入力がid, passwordのパターンと異なります\"\n                }\n                val res = api.signIn(\n                    SignInRequest(\n                        username = requireNotNull(formState.username),\n                        password = formState.password,\n                    )\n                ).throwIfHasError().body()\n                requireNotNull(res)\n                val userDTO = misskeyAPIProvider.get(baseUrl).i(\n                    I(\n                        res.i\n                    )\n                ).throwIfHasError().body()\n                AccessToken.MisskeyIdAndPassword(\n                    baseUrl = baseUrl,\n                    accessToken = res.i,\n                    user = requireNotNull(userDTO)\n                )\n            }\n        }\n\n    fun checkUrlPattern(url: String): Boolean {\n        return urlPattern.matcher(url).find()\n    }\n\n    private suspend fun generateMisskeySession(instanceBase: String, secret: String?, retryCount: Int = 0): Session {\n        val authApi = misskeyAPIServiceBuilder.buildAuthAPI(instanceBase)\n        try {\n            return authApi.generateSession(\n                AppSecret(\n                    secret!!\n                )\n            ).throwIfHasError().body()!!\n        } catch (e: APIError) {\n            if (retryCount < 100) {\n                delay(100)\n                return generateMisskeySession(instanceBase, secret, retryCount + 1)\n            }\n            throw e\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/viewmodel/app/GetAccessToken.kt",
    "content": "package net.pantasystem.milktea.auth.viewmodel.app\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.MisskeyAPIServiceBuilder\nimport net.pantasystem.milktea.api.misskey.auth.UserKey\nimport net.pantasystem.milktea.api.misskey.auth.createObtainToken\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.mastodon.MastodonAPIProvider\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.AccessToken\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.toFirefishModel\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.toModel\nimport net.pantasystem.milktea.data.infrastructure.auth.custom.toPleromaModel\nimport javax.inject.Inject\n\n\nclass GetAccessToken @Inject constructor(\n    val mastodonAPIProvider: MastodonAPIProvider,\n    val misskeyAPIProvider: MisskeyAPIProvider,\n    val misskeyAPIServiceBuilder: MisskeyAPIServiceBuilder,\n    loggerFactory: Logger.Factory,\n) {\n\n    val logger by lazy {\n        loggerFactory.create(\"GetAccessToken\")\n    }\n\n    suspend fun getAccessToken(a: Authorization.Waiting4UserAuthorization, code: String? = null): Result<AccessToken> {\n        return runCancellableCatching {\n            withContext(Dispatchers.IO) {\n                when (a) {\n                    is Authorization.Waiting4UserAuthorization.Misskey -> {\n                        val accessToken = getMisskeyAccessToken(a)\n                        accessToken.toModel(a.appSecret)\n                    }\n                    is Authorization.Waiting4UserAuthorization.Mastodon -> {\n                        getAccessToken4Mastodon(a, code!!)\n                    }\n                    is Authorization.Waiting4UserAuthorization.Pleroma -> {\n                        getAccessToken4Pleroma(a, code!!)\n                    }\n                    is Authorization.Waiting4UserAuthorization.Firefish -> {\n                        val accessToken = getFirefishAccessToken(a)\n                        accessToken.toFirefishModel(a.appSecret)\n                    }\n                }\n            }\n        }\n    }\n    private suspend fun getAccessToken4Mastodon(\n        a: Authorization.Waiting4UserAuthorization.Mastodon,\n        code: String\n    ): AccessToken.Mastodon {\n        try {\n            logger.debug { \"認証種別Mastodon: $a\" }\n            val obtainToken = a.client.createObtainToken(scope = a.scope, code = code)\n            val accessToken = mastodonAPIProvider.get(a.instanceBaseURL).obtainToken(obtainToken)\n                .throwIfHasError()\n                .body()\n            logger.debug { \"accessToken:$accessToken\" }\n            val me = mastodonAPIProvider.get(a.instanceBaseURL, accessToken!!.accessToken)\n                .verifyCredentials()\n                .throwIfHasError()\n            logger.debug { \"自身の情報, code=${me.code()}, message=${me.message()}\" }\n            val account = me.body()!!\n            return accessToken.toModel(account)\n        } catch (e: Exception) {\n            logger.warning(\"AccessToken取得失敗\", e = e)\n            throw e\n        }\n    }\n\n    private suspend fun getAccessToken4Pleroma(\n        a: Authorization.Waiting4UserAuthorization.Pleroma,\n        code: String\n    ): AccessToken.Pleroma {\n        try {\n            logger.debug { \"認証種別Mastodon: $a\" }\n            val obtainToken = a.client.createObtainToken(scope = a.scope, code = code)\n            val accessToken = mastodonAPIProvider.get(a.instanceBaseURL).obtainToken(obtainToken)\n                .throwIfHasError()\n                .body()\n            logger.debug { \"accessToken:$accessToken\" }\n            val me = mastodonAPIProvider.get(a.instanceBaseURL, accessToken!!.accessToken)\n                .verifyCredentials()\n                .throwIfHasError()\n            logger.debug { \"自身の情報, code=${me.code()}, message=${me.message()}\" }\n            val account = me.body()!!\n            return accessToken.toPleromaModel(account)\n        } catch (e: Exception) {\n            logger.warning(\"AccessToken取得失敗\", e = e)\n            throw e\n        }\n    }\n\n    private suspend fun getMisskeyAccessToken(a: Authorization.Waiting4UserAuthorization.Misskey, retryCount: Int = 0): net.pantasystem.milktea.api.misskey.auth.AccessToken {\n        return try {\n            misskeyAPIServiceBuilder.buildAuthAPI(a.instanceBaseURL).getAccessToken(\n                UserKey(\n                    appSecret = a.appSecret,\n                    a.session.token\n                )\n            ).throwIfHasError().body()!!\n        } catch (e: APIError) {\n            if (retryCount > 25) {\n                throw e\n            }\n            delay(100)\n            getMisskeyAccessToken(a, retryCount + 1)\n        }\n    }\n\n    private suspend fun getFirefishAccessToken(a: Authorization.Waiting4UserAuthorization.Firefish, retryCount: Int = 0): net.pantasystem.milktea.api.misskey.auth.AccessToken {\n        return try {\n            misskeyAPIServiceBuilder.buildAuthAPI(a.instanceBaseURL).getAccessToken(\n                UserKey(\n                    appSecret = a.appSecret,\n                    a.session.token\n                )\n            ).throwIfHasError().body()!!\n        } catch (e: APIError) {\n            if (retryCount > 25) {\n                throw e\n            }\n            delay(100)\n            getFirefishAccessToken(a, retryCount + 1)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/java/net/pantasystem/milktea/auth/viewmodel/app/UIState.kt",
    "content": "package net.pantasystem.milktea.auth.viewmodel.app\n\nimport net.pantasystem.milktea.api.misskey.infos.SimpleInstanceInfo\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.auth.Authorization\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\n\n\ndata class AuthUserInputState(\n    val instanceDomain: String,\n    val rawInputInstanceDomain: String,\n    val appName: String,\n    val password: String,\n    val isPrivacyPolicyAgreement: Boolean,\n    val isTermsOfServiceAgreement: Boolean,\n    val isAcceptMastodonAlphaTest: Boolean,\n) {\n    val isIdPassword: Boolean by lazy {\n        userNameRegex.matches(rawInputInstanceDomain)\n    }\n\n    val username: String? by lazy {\n        runCancellableCatching {\n            userNameRegex.find(rawInputInstanceDomain)?.groups?.get(1)\n        }.getOrNull()?.value\n    }\n\n    val host: String? by lazy {\n        runCancellableCatching {\n            userNameRegex.find(rawInputInstanceDomain)?.groups?.get(2)\n        }.getOrNull()?.value\n    }\n\n}\n\ndata class BeforeAuthState(\n    val inputState: AuthUserInputState,\n    val meta: ResultState<InstanceInfoType>,\n)\n\n\nsealed interface GenerateTokenResult {\n    object Success : GenerateTokenResult\n    object Fixed : GenerateTokenResult\n    object Failure : GenerateTokenResult\n\n}\n\nval userNameRegex = Regex(\"\"\"\\A@([\\w._\\-]+)@([\\w._\\-]+)\"\"\")\n\ndata class AuthUiState(\n    val formState: AuthUserInputState,\n    val instanceInfoResultState: ResultState<InstanceInfoType>,\n    val stateType: Authorization,\n    val waiting4ApproveState: ResultState<Authorization.Waiting4UserAuthorization> = ResultState.Fixed(\n        StateContent.NotExist()\n    ),\n    val clientId: String = \"\",\n    val misskeyInstanceInfosResponse: List<SimpleInstanceInfo>,\n) {\n    val isProgress by lazy {\n        instanceInfoResultState is ResultState.Loading || waiting4ApproveState is ResultState.Loading\n    }\n\n    val isMastodon by lazy {\n        (instanceInfoResultState.content as? StateContent.Exist)?.rawContent is InstanceInfoType.Mastodon\n    }\n}"
  },
  {
    "path": "modules/features/auth/src/main/res/layout/activity_web_view_auth.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\".WebViewAuthActivity\">\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"56dp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n        <WebView\n                android:id=\"@+id/webView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/toolbar\"\n                />\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/auth/src/test/java/net/pantasystem/milktea/auth/viewmodel/app/AuthUserInputStateTest.kt",
    "content": "package net.pantasystem.milktea.auth.viewmodel.app\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass AuthUserInputStateTest {\n\n    @Test\n    fun getUserName_GiveAcct() {\n        val formState = AuthUserInputState(\n            appName = \"\",\n            instanceDomain = \"https://misskey.io\",\n            password = \"test\",\n            rawInputInstanceDomain = \"@Panta@misskey.io\",\n            isTermsOfServiceAgreement = false,\n            isPrivacyPolicyAgreement = false,\n            isAcceptMastodonAlphaTest = false\n        )\n        Assertions.assertEquals(\"Panta\", formState.username)\n    }\n\n    @Test\n    fun getHost_GiveAcct() {\n        val formState = AuthUserInputState(\n            appName = \"\",\n            instanceDomain = \"https://misskey.io\",\n            password = \"test\",\n            rawInputInstanceDomain = \"@Panta@misskey.io\",\n            isTermsOfServiceAgreement = false,\n            isPrivacyPolicyAgreement = false,\n            isAcceptMastodonAlphaTest = false\n        )\n        Assertions.assertEquals(\"misskey.io\", formState.host)\n    }\n}"
  },
  {
    "path": "modules/features/channel/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/channel/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n    }\n    buildFeatures {\n        compose true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.channel'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:features:note')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_viewmodel')\n\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    // datetime\n    implementation libs.kotlin.datetime\n    implementation libs.activity.ktx\n    implementation libs.navigation.compose\n    implementation libs.androidx.hilt.navigation.compose\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/channel/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/channel/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/channel/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelActivity.kt",
    "content": "package net.pantasystem.milktea.channel\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.core.net.toUri\nimport androidx.hilt.navigation.compose.hiltViewModel\nimport androidx.navigation.NavType\nimport androidx.navigation.compose.NavHost\nimport androidx.navigation.compose.composable\nimport androidx.navigation.compose.rememberNavController\nimport androidx.navigation.navArgument\nimport androidx.navigation.navDeepLink\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.ChannelNavigation\nimport net.pantasystem.milktea.common_navigation.ChannelNavigationArgs\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.generateChannelNavUrl\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n\n@AndroidEntryPoint\nclass ChannelActivity : AppCompatActivity() {\n\n    @Inject\n    internal lateinit var accountStore: AccountStore\n\n    @Inject\n    internal lateinit var setTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    internal lateinit var settingStore: SettingStore\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n\n    private val channelViewModel: ChannelViewModel by viewModels()\n\n\n    private val notesViewModel: NotesViewModel by viewModels()\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setTheme.invoke()\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n\n        setContent {\n            val navController = rememberNavController()\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                NavHost(navController = navController, startDestination = \"/channels\") {\n                    composable(\"/channels\") {\n                        ChannelScreen(\n                            onNavigateUp = {\n                                finish()\n                            },\n                            accountStore = accountStore,\n                            channelViewModel = channelViewModel,\n                            onNavigateChannelDetail = {\n                                navController.navigate(\"/accounts/${it.accountId}/channels/${it.channelId}\")\n                            }\n                        )\n                    }\n                    composable(\n                        \"/accounts/{${ChannelDetailArgs.accountId}}/channels/{${ChannelDetailArgs.channelId}}\",\n                        arguments = listOf(\n                            navArgument(ChannelDetailArgs.accountId) {\n                                type = NavType.LongType\n                                defaultValue = accountStore.currentAccount?.accountId ?: 0\n                            },\n                            navArgument(ChannelDetailArgs.channelId) {\n                                type = NavType.StringType\n                            }\n                        ),\n                        deepLinks = listOf(navDeepLink { uriPattern = \"milktea://channels/{${ChannelDetailArgs.channelId}}?accountId={${ChannelDetailArgs.accountId}}\" })\n                    ) {\n                        val viewModel: ChannelDetailViewModel = hiltViewModel()\n                        val channel by viewModel.channel.collectAsState()\n                        ChannelDetailScreen(\n                            onNavigateUp = { if(!navController.popBackStack()) finish() },\n                            channelId = viewModel.channelId,\n                            channel = channel,\n                            onNavigateNoteEditor = {\n                                startActivity(\n                                    NoteEditorActivity.newBundle(\n                                        this@ChannelActivity,\n                                        channelId = it,\n                                        accountId = it.accountId,\n                                    )\n                                )\n                            },\n                            fragmentManagerProvider = {\n                                supportFragmentManager\n                            },\n                            timelineFragmentProvider = {\n                                pageableFragmentFactory.create(\n                                    viewModel.channelId.accountId,\n                                    Pageable.ChannelTimeline(viewModel.channelId.channelId)\n                                )\n                            }\n                        )\n                    }\n                }\n            }\n        }\n    }\n}\n\n\nclass ChannelNavigationImpl @Inject constructor(val activity: Activity) : ChannelNavigation {\n    override fun newIntent(args: ChannelNavigationArgs): Intent {\n        return Intent(activity, ChannelActivity::class.java).also { intent ->\n            intent.putExtra(ChannelViewModel.EXTRA_SPECIFIED_ACCOUNT_ID, args.specifiedAccountId)\n            intent.putExtra(ChannelViewModel.EXTRA_ADD_TAB_TO_ACCOUNT_ID, args.addTabToAccountId)\n        }\n    }\n}\n\nclass ChannelDetailNavigationImpl @Inject constructor(val activity: Activity) : ChannelDetailNavigation {\n    override fun newIntent(args: Channel.Id): Intent {\n        return Intent(\n            Intent.ACTION_VIEW,\n            Channel.generateChannelNavUrl(args.channelId, args.accountId).toUri(),\n            activity,\n            ChannelActivity::class.java,\n        )\n    }\n}"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelCard.kt",
    "content": "package net.pantasystem.milktea.channel\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.AccountCircle\nimport androidx.compose.material.icons.filled.Edit\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.user.User\n\nsealed interface ChannelCardAction {\n    val channel: Channel\n\n    data class OnClick(override val channel: Channel) : ChannelCardAction\n    data class OnFollowButtonClicked(override val channel: Channel) : ChannelCardAction\n    data class OnUnFollowButtonClicked(override val channel: Channel) : ChannelCardAction\n    data class OnToggleTabButtonClicked(override val channel: Channel) : ChannelCardAction\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\n@Stable\nfun ChannelCard(\n    channel: Channel,\n    isPaged: Boolean,\n    onAction: (ChannelCardAction) -> Unit = {},\n) {\n    Card(\n        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),\n        modifier = Modifier.padding(8.dp),\n        shape = RoundedCornerShape(8.dp),\n        onClick = {\n            onAction.invoke(ChannelCardAction.OnClick(channel))\n        }) {\n        Column(\n            modifier = Modifier.fillMaxWidth()\n        ) {\n\n            ChannelCardHeader(channel = channel)\n\n            Row(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(8.dp),\n                horizontalArrangement = Arrangement.SpaceBetween,\n                verticalAlignment = Alignment.Bottom\n            ) {\n                Column(\n                    modifier = Modifier.weight(1f, true)\n                ) {\n                    Text(\n                        channel.name, fontSize = 18.sp\n                    )\n                    if (!channel.description.isNullOrBlank()) {\n                        Text(channel.description ?: \"\", maxLines = 3)\n                    }\n                }\n                ChannelCardActionButtons(channel = channel, isPaged = isPaged, onAction = onAction)\n            }\n        }\n    }\n}\n\n@Composable\n@Stable\nprivate fun AddToTabButton(isPaged: Boolean, onPressed: () -> Unit) {\n    IconButton(onClick = onPressed) {\n        if (isPaged) {\n            Icon(\n                painter = painterResource(R.drawable.ic_remove_to_tab_24px),\n                contentDescription = \"add to tab\",\n                tint = MaterialTheme.colorScheme.secondary\n            )\n        } else {\n            Icon(\n                painter = painterResource(R.drawable.ic_add_to_tab_24px),\n                contentDescription = \"add to tab\",\n                tint = MaterialTheme.colorScheme.secondary\n            )\n        }\n\n    }\n}\n\n@Composable\n@Stable\nprivate fun ChannelCardHeader(channel: Channel) {\n    val (r, g, b) = channel.rgpFromName\n    Box {\n        Image(\n            painter = rememberAsyncImagePainter(channel.bannerUrl),\n            contentDescription = \"header\",\n            contentScale = ContentScale.Crop,\n            modifier = Modifier\n                .background(Color(r, g, b))\n                .fillMaxWidth()\n                .height(150.dp)\n        )\n\n        ChannelCardAggregateLabel(\n            channel = channel, modifier = Modifier\n                .padding(8.dp)\n                .align(Alignment.TopEnd)\n        )\n    }\n}\n\n@Composable\n@Stable\nprivate fun ChannelCardActionButtons(\n    channel: Channel, isPaged: Boolean, onAction: (ChannelCardAction) -> Unit\n) {\n    Row {\n        AddToTabButton(isPaged = isPaged, onPressed = {\n            onAction.invoke(\n                ChannelCardAction.OnToggleTabButtonClicked(channel)\n            )\n        })\n        if (channel.isFollowing != null) {\n            ToggleFollowButton(isFollowing = channel.isFollowing!!, onChanged = { followed ->\n                if (followed) {\n                    onAction.invoke(\n                        ChannelCardAction.OnFollowButtonClicked(\n                            channel\n                        )\n                    )\n                } else {\n                    onAction.invoke(\n                        ChannelCardAction.OnUnFollowButtonClicked(\n                            channel\n                        )\n                    )\n                }\n            })\n        }\n    }\n}\n\n@Composable\nprivate fun ChannelCardAggregateLabel(modifier: Modifier = Modifier, channel: Channel) {\n    Surface(\n        shape = RoundedCornerShape(8.dp),\n        color = Color.Black.copy(alpha = 0.75f),\n        contentColor = Color.White,\n        modifier = modifier\n    ) {\n        Column(\n            modifier = Modifier.padding(4.dp)\n        ) {\n            Row(\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                Icon(\n                    imageVector = Icons.Default.AccountCircle, contentDescription = \"users count\"\n                )\n                Spacer(modifier = Modifier.width(2.dp))\n                Text(stringResource(id = R.string.channel_n_people, channel.usersCount))\n            }\n            Row(\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                Icon(\n                    imageVector = Icons.Default.Edit, contentDescription = \"posts count\"\n                )\n                Spacer(modifier = Modifier.width(2.dp))\n                Text(stringResource(id = R.string.channel_n_posts, channel.notesCount))\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun ToggleFollowButton(isFollowing: Boolean, onChanged: (Boolean) -> Unit) {\n    if (isFollowing) {\n        Button(\n            onClick = {\n                onChanged.invoke(false)\n            },\n            shape = RoundedCornerShape(32.dp)\n        ) {\n            Text(stringResource(id = R.string.unfollow))\n        }\n    } else {\n        OutlinedButton(\n            onClick = {\n                onChanged.invoke(true)\n            }, shape = RoundedCornerShape(32.dp)\n        ) {\n            Text(stringResource(id = R.string.follow))\n        }\n    }\n}\n\n\n@Preview(showBackground = true)\n@Composable\nfun PreviewChannelCard() {\n    LazyColumn {\n        item {\n            ChannelCard(\n                Channel(\n                    id = Channel.Id(0, \"channelId\"),\n                    bannerUrl = \"https://s3.arkjp.net/misskey/00edb5ca-2e15-45e9-b7cb-a2ee6c7c7e1e.jpg\",\n                    createdAt = Clock.System.now(),\n                    description = \"消えたので作った\",\n                    name = \"はるのんしすてむどっとこむ\",\n                    lastNotedAt = Clock.System.now(),\n                    notesCount = 10,\n                    userId = User.Id(0, \"userId\"),\n                    usersCount = 4,\n                    isFollowing = true,\n                    hasUnreadNote = true,\n                    allowRenoteToExternal = true,\n                ),\n                isPaged = true,\n            )\n        }\n        item {\n            ChannelCard(\n                Channel(\n                    id = Channel.Id(0, \"channelId\"),\n                    bannerUrl = \"https://s3.arkjp.net/misskey/00edb5ca-2e15-45e9-b7cb-a2ee6c7c7e1e.jpg\",\n                    createdAt = Clock.System.now(),\n                    description = \"説明説明説明説明説明説明\",\n                    name = \"パン太は人間だよ\",\n                    lastNotedAt = Clock.System.now(),\n                    notesCount = 10,\n                    userId = User.Id(0, \"userId\"),\n                    usersCount = 4,\n                    isFollowing = false,\n                    hasUnreadNote = false,\n                    allowRenoteToExternal = true,\n                ), isPaged = false\n            )\n        }\n        item {\n            ChannelCard(\n                Channel(\n                    id = Channel.Id(0, \"channelId\"),\n                    bannerUrl = \"https://s3.arkjp.net/misskey/00edb5ca-2e15-45e9-b7cb-a2ee6c7c7e1e.jpg\",\n                    createdAt = Clock.System.now(),\n                    description = \"説明説明説明説明説明説明\",\n                    name = \"a\",\n                    lastNotedAt = Clock.System.now(),\n                    notesCount = 10,\n                    userId = User.Id(0, \"userId\"),\n                    usersCount = 4,\n                    isFollowing = false,\n                    hasUnreadNote = false,\n                    allowRenoteToExternal = true,\n                ), isPaged = false\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelDetailScreen.kt",
    "content": "package net.pantasystem.milktea.channel\n\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.FloatingActionButton\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material3.TopAppBarDefaults\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.Edit\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.viewinterop.AndroidView\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentContainerView\nimport androidx.fragment.app.FragmentManager\nimport net.pantasystem.milktea.common_compose.rememberFragment\nimport net.pantasystem.milktea.model.channel.Channel\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun ChannelDetailScreen(\n    onNavigateUp: () -> Unit,\n    onNavigateNoteEditor: (Channel.Id) -> Unit,\n    channelId: Channel.Id,\n    channel: Channel?,\n    fragmentManagerProvider: () -> FragmentManager,\n    timelineFragmentProvider: () -> Fragment,\n) {\n    var container: FragmentContainerView? by remember {\n        mutableStateOf(null)\n    }\n    val timelineFragment = rememberFragment(fragmentManager = fragmentManagerProvider()) {\n        timelineFragmentProvider()\n    }\n\n    LaunchedEffect(Unit) {\n        fragmentManagerProvider().beginTransaction()\n            .replace(container!!.id , timelineFragment)\n            .commitAllowingStateLoss()\n    }\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            TopAppBar(\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = null)\n                    }\n                },\n                title = {\n                    Text(channel?.name ?: \"\")\n                },\n                colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),\n            )\n        },\n        floatingActionButton = {\n            FloatingActionButton(onClick = { onNavigateNoteEditor(channelId) }) {\n                Icon(Icons.Default.Edit, contentDescription = null)\n            }\n        }\n    ) { paddingValues ->\n        AndroidView(\n            modifier = Modifier.padding(paddingValues),\n            factory = { context ->\n                FragmentContainerView(context).also { container ->\n                    container.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)\n                    container.id = View.generateViewId()\n                }.also {\n                    container = it\n                }\n        },)\n    }\n}"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelDetailViewModel.kt",
    "content": "package net.pantasystem.milktea.channel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.ChannelRepository\nimport net.pantasystem.milktea.model.channel.ChannelStateModel\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ChannelDetailViewModel @Inject constructor(\n    private val channelRepository: ChannelRepository,\n    channelStateModel: ChannelStateModel,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n\n    val channelId by lazy {\n        ChannelDetailArgs(savedStateHandle).channelId\n    }\n\n    val channel = channelStateModel.observeOne(channelId)\n        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    init {\n        viewModelScope.launch {\n            channelRepository.findOne(channelId)\n        }\n    }\n}\n\nclass ChannelDetailArgs(savedStateHandle: SavedStateHandle) {\n    companion object {\n        const val accountId = \"accountId\"\n        const val channelId = \"channelId\"\n    }\n\n    val channelId: Channel.Id by lazy {\n        Channel.Id(\n            accountId = savedStateHandle[\"accountId\"]!!,\n            channelId = savedStateHandle[\"channelId\"]!!\n        )\n    }\n}"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelListStatePage.kt",
    "content": "package net.pantasystem.milktea.channel\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid\nimport androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.data.infrastructure.channel.ChannelListType\nimport net.pantasystem.milktea.model.channel.Channel\n\n@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)\n@Composable\nfun ChannelListStateScreen(\n    uiState: ChannelListUiState,\n    listType: ChannelListType,\n    viewModel: ChannelViewModel,\n    navigateToDetailView: (Channel.Id) -> Unit = {}\n) {\n\n\n    val pagingState = uiState.getByType(listType)\n\n    LaunchedEffect(listType) {\n        viewModel.clearAndLoad(listType)\n    }\n\n    PullToRefreshBox(\n        isRefreshing = false,\n        onRefresh = {\n            viewModel.clearAndLoad(listType)\n        },\n        modifier = Modifier\n            .fillMaxSize()\n    ) {\n        LazyVerticalStaggeredGrid(\n            columns = StaggeredGridCells.Adaptive(350.dp),\n            modifier = Modifier.fillMaxSize(),\n        ) {\n            when (val content = pagingState.content) {\n                is StateContent.Exist -> {\n                    items(content.rawContent.size) { index ->\n                        val channel = content.rawContent[index]\n                        ChannelCard(\n                            channel = channel.channel,\n                            isPaged = channel.isAddedTab,\n                            onAction = {\n                                when (it) {\n                                    is ChannelCardAction.OnToggleTabButtonClicked -> {\n                                        viewModel.toggleTab(it.channel.id)\n                                    }\n                                    is ChannelCardAction.OnUnFollowButtonClicked -> {\n                                        viewModel.unFollow(it.channel.id)\n                                    }\n                                    is ChannelCardAction.OnFollowButtonClicked -> {\n                                        viewModel.follow(it.channel.id)\n                                    }\n                                    is ChannelCardAction.OnClick -> {\n                                        navigateToDetailView.invoke(channel.channel.id)\n                                    }\n                                }\n                            }\n                        )\n                    }\n                }\n                is StateContent.NotExist -> {\n                    item {\n                        Column(\n                            horizontalAlignment = Alignment.CenterHorizontally,\n                            verticalArrangement = Arrangement.Center,\n                            modifier = Modifier.fillMaxSize()\n                        ) {\n                            when (pagingState) {\n                                is PageableState.Loading -> {\n                                    ReachedElement()\n                                }\n                                is PageableState.Fixed -> {\n                                    Text(\"no contents\")\n                                }\n                                is PageableState.Error -> {\n                                    Text(\"error:${(pagingState.throwable)}\")\n                                }\n                            }\n                        }\n                    }\n\n                }\n            }\n\n        }\n\n    }\n}\n\n@Composable\nfun ReachedElement() {\n    Column(\n        horizontalAlignment = Alignment.CenterHorizontally,\n        modifier = Modifier\n            .padding(16.dp)\n            .fillMaxWidth()\n    ) {\n        CircularProgressIndicator()\n    }\n}"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelScreen.kt",
    "content": "package net.pantasystem.milktea.channel\n\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.foundation.pager.HorizontalPager\nimport androidx.compose.foundation.pager.rememberPagerState\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.data.infrastructure.channel.ChannelListType\nimport net.pantasystem.milktea.model.channel.Channel\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\ndata class ChannelTypeWithTitle(\n    val type: ChannelListType,\n    val title: String,\n)\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun ChannelScreen(\n    onNavigateUp: () -> Unit,\n    onNavigateChannelDetail: (channel: Channel.Id) -> Unit,\n    accountStore: AccountStore,\n    channelViewModel: ChannelViewModel,\n) {\n\n    val currentAccount by accountStore.observeCurrentAccount.collectAsState(initial = null)\n    val channelTypeWithTitleList = listOf(\n        ChannelTypeWithTitle(ChannelListType.FEATURED, stringResource(id = R.string.featured)),\n        ChannelTypeWithTitle(ChannelListType.FOLLOWED, stringResource(id = R.string.following)),\n        ChannelTypeWithTitle(ChannelListType.OWNED, stringResource(id = R.string.channel_owned))\n    )\n\n    val pagerState = rememberPagerState { channelTypeWithTitleList.size }\n    val coroutine = rememberCoroutineScope()\n\n    val uiState by channelViewModel.uiState.collectAsState()\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            Column {\n                TopAppBar(\n                    navigationIcon = {\n                        IconButton(\n                            onClick = {\n                                onNavigateUp.invoke()\n                            },\n                        ) {\n                            Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = \"Back\")\n                        }\n                    },\n                    title = {\n                        Text(stringResource(id = R.string.channel))\n                    },\n                )\n                if (currentAccount != null) {\n                    TabRow(selectedTabIndex = pagerState.currentPage) {\n                        channelTypeWithTitleList.forEachIndexed { i, item ->\n\n                            Tab(\n                                selected = pagerState.currentPage == i,\n                                onClick = { coroutine.launch { pagerState.animateScrollToPage(i) } },\n                                text = { Text(item.title) }\n                            )\n                        }\n                    }\n                }\n\n            }\n        }\n    ) { padding ->\n        if (currentAccount == null) {\n            CircularProgressIndicator(\n                modifier = Modifier.padding(padding)\n            )\n        } else {\n            HorizontalPager(state = pagerState, modifier = Modifier.padding(padding)) {\n                ChannelListStateScreen(\n                    listType = channelTypeWithTitleList[pagerState.currentPage].type,\n                    viewModel = channelViewModel,\n                    navigateToDetailView = onNavigateChannelDetail,\n                    uiState = uiState\n                )\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/ChannelViewModel.kt",
    "content": "package net.pantasystem.milktea.channel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.paginator.PreviousPagingController\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.data.infrastructure.channel.ChannelListType\nimport net.pantasystem.milktea.data.infrastructure.channel.ChannelPagingModel\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.account.page.newPage\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.ChannelRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ChannelViewModel @Inject constructor(\n    val accountStore: AccountStore,\n    private val channelRepository: ChannelRepository,\n    private val accountRepository: AccountRepository,\n    channelPagingModelFactory: ChannelPagingModel.Factory,\n    loggerFactory: Logger.Factory,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_SPECIFIED_ACCOUNT_ID = \"ChannelViewModel.EXTRA_SPECIFIED_ACCOUNT_ID\"\n        const val EXTRA_ADD_TAB_TO_ACCOUNT_ID = \"ChannelViewModel.EXTRA_ADD_TAB_TO_ACCOUNT_ID\"\n    }\n\n    val logger: Logger by lazy {\n        loggerFactory.create(\"ChannelViewModel\")\n    }\n\n\n    private val featuredChannelPagingModel =\n        channelPagingModelFactory.create(ChannelListType.FEATURED) {\n            getAccount()\n        }\n\n    private val followedChannelPagingModel =\n        channelPagingModelFactory.create(ChannelListType.FOLLOWED) {\n            getAccount()\n        }\n\n    private val ownedChannelPagingModel = channelPagingModelFactory.create(ChannelListType.OWNED) {\n        getAccount()\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val currentAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_SPECIFIED_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val tabToAddAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_ADD_TAB_TO_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val uiState = combine(\n        featuredChannelPagingModel.observeChannels(),\n        followedChannelPagingModel.observeChannels(),\n        ownedChannelPagingModel.observeChannels(),\n        currentAccount,\n        tabToAddAccount,\n    ) { featured, followed, owned, currentAccount, tabToAddAccount ->\n        ChannelListUiState.from(\n            featured = featured,\n            followed = followed,\n            owned = owned,\n            currentAccount = currentAccount,\n            tabToAddAccount = tabToAddAccount,\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ChannelListUiState()\n    )\n\n\n    fun clearAndLoad(type: ChannelListType) {\n        viewModelScope.launch {\n            val model = when (type) {\n                ChannelListType.OWNED -> ownedChannelPagingModel\n                ChannelListType.FOLLOWED -> followedChannelPagingModel\n                ChannelListType.FEATURED -> featuredChannelPagingModel\n            }\n            model.clear()\n            PreviousPagingController.create(\n                model,\n            ).loadPrevious()\n        }\n    }\n\n    fun follow(channelId: Channel.Id) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                channelRepository.follow(channelId)\n            }.onFailure {\n                logger.info(\"follow error:$channelId\", e = it)\n            }\n        }\n    }\n\n    fun unFollow(channelId: Channel.Id) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                channelRepository.unFollow(channelId)\n            }.onFailure {\n                logger.info(\"unFollow error:$channelId\", e = it)\n            }\n        }\n    }\n\n    fun toggleTab(channelId: Channel.Id) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                val account = getAddTabToAccount()\n                val channel = channelRepository.findOne(channelId).getOrThrow()\n                val relatedAccount = accountRepository.get(channel.id.accountId).getOrThrow()\n                val page = account.newPage(\n                    Pageable.ChannelTimeline(channelId = channelId.channelId),\n                    channel.name,\n                ).copy(\n                    attachedAccountId = getSpecifiedAccountId(),\n                    title = if (account.accountId == relatedAccount.accountId) {\n                        channel.name\n                    } else {\n                        \"${channel.name}(${relatedAccount.getAcct()})\"\n                    }\n                )\n                val first =\n                    account.pages.firstOrNull { (it.pageable() as? Pageable.ChannelTimeline)?.channelId == channelId.channelId }\n                if (first == null) {\n                    accountStore.addPage(page)\n                } else {\n                    accountStore.removePage(first)\n                }\n            }\n        }\n    }\n\n    //\n//    fun setSpecifiedAccountId(accountId: Long) {\n//        savedStateHandle[EXTRA_SPECIFIED_ACCOUNT_ID] = accountId\n//    }\n//\n//    fun setAddTabToAccountId(accountId: Long) {\n//        savedStateHandle[EXTRA_ADD_TAB_TO_ACCOUNT_ID] = accountId\n//    }\n//\n    private fun getSpecifiedAccountId(): Long? {\n        return savedStateHandle[EXTRA_SPECIFIED_ACCOUNT_ID]\n    }\n\n    private fun getAddToTabAccountId(): Long? {\n        return savedStateHandle[EXTRA_ADD_TAB_TO_ACCOUNT_ID]\n    }\n\n    private suspend fun getAccount(): Account {\n        val accountId = getSpecifiedAccountId()\n        if (accountId != null) {\n            return accountRepository.get(accountId).getOrThrow()\n        }\n        return accountRepository.getCurrentAccount().getOrThrow()\n    }\n\n    private suspend fun getAddTabToAccount(): Account {\n        val accountId = getAddToTabAccountId()\n        if (accountId != null) {\n            return accountRepository.get(accountId).getOrThrow()\n        }\n        return accountRepository.getCurrentAccount().getOrThrow()\n    }\n}\n\ndata class ChannelListUiState(\n    val currentAccount: Account? = null,\n    val featuredChannels: PageableState<List<ChannelListItem>> = PageableState.Loading.Init(),\n    val followedChannels: PageableState<List<ChannelListItem>> = PageableState.Loading.Init(),\n    val ownedChannels: PageableState<List<ChannelListItem>> = PageableState.Loading.Init(),\n) {\n\n    companion object {\n        fun from(\n            featured: PageableState<List<Channel>>,\n            followed: PageableState<List<Channel>>,\n            owned: PageableState<List<Channel>>,\n            currentAccount: Account?,\n            tabToAddAccount: Account?,\n        ): ChannelListUiState {\n            return ChannelListUiState(\n                currentAccount = currentAccount,\n                featuredChannels = featured.convert { list ->\n                    list.map { channel ->\n                        ChannelListItem(\n                            channel,\n                            isAddedTab = tabToAddAccount?.pages?.any { page ->\n                                page.pageParams.channelId == channel.id.channelId\n                                        && channel.id.accountId == (\n                                        page.attachedAccountId ?: page.accountId)\n                            } ?: false\n                        )\n                    }\n                },\n                followedChannels = followed.convert { list ->\n                    list.map { channel ->\n                        ChannelListItem(\n                            channel,\n                            isAddedTab = tabToAddAccount?.pages?.any { page ->\n                                page.pageParams.channelId == channel.id.channelId\n                                        && channel.id.accountId == (\n                                        page.attachedAccountId ?: page.accountId)\n                            } ?: false\n                        )\n                    }\n                },\n                ownedChannels = owned.convert { list ->\n                    list.map { channel ->\n                        ChannelListItem(\n                            channel,\n                            isAddedTab = tabToAddAccount?.pages?.any { page ->\n                                page.pageParams.channelId == channel.id.channelId\n                                        && channel.id.accountId == (\n                                        page.attachedAccountId ?: page.accountId)\n                            } ?: false\n                        )\n\n                    }\n                },\n            )\n        }\n    }\n\n    fun getByType(type: ChannelListType): PageableState<List<ChannelListItem>> {\n        return when (type) {\n            ChannelListType.OWNED -> ownedChannels\n            ChannelListType.FOLLOWED -> followedChannels\n            ChannelListType.FEATURED -> featuredChannels\n        }\n    }\n}\n\ndata class ChannelListItem(\n    val channel: Channel,\n    val isAddedTab: Boolean,\n)\n"
  },
  {
    "path": "modules/features/channel/src/main/java/net/pantasystem/milktea/channel/di/module/NavigationModule.kt",
    "content": "package net.pantasystem.milktea.channel.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.channel.ChannelDetailNavigationImpl\nimport net.pantasystem.milktea.channel.ChannelNavigationImpl\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.ChannelNavigation\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n    @Binds\n    abstract fun bindChannelNavigation(impl: ChannelNavigationImpl): ChannelNavigation\n\n    @Binds\n    abstract fun bindChannelDetailNavigation(impl: ChannelDetailNavigationImpl): ChannelDetailNavigation\n}"
  },
  {
    "path": "modules/features/clip/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/clip/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    namespace 'net.pantasystem.milktea.clip'\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        compose true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:features:note')\n    implementation project(path: ':modules:common_android')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.fragment.ktx\n    implementation libs.activity.ktx\n}"
  },
  {
    "path": "modules/features/clip/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/clip/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/clip/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application>\n        <activity\n                android:name=\".ClipDetailActivity\"\n                android:exported=\"false\">\n            <meta-data\n                    android:name=\"android.app.lib_name\"\n                    android:value=\"\" />\n        </activity>\n        <activity\n                android:name=\".ClipListActivity\"\n                android:exported=\"false\">\n            <meta-data\n                    android:name=\"android.app.lib_name\"\n                    android:value=\"\" />\n        </activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "modules/features/clip/src/main/java/net/pantasystem/milktea/clip/ClipDetailActivity.kt",
    "content": "package net.pantasystem.milktea.clip\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport android.widget.FrameLayout\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.viewinterop.AndroidView\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.ClipDetailNavigation\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.clip.ClipId\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass ClipDetailActivity : AppCompatActivity() {\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val notesViewModel by viewModels<NotesViewModel>()\n\n    private val clipId: ClipId by lazy {\n        ClipId(\n            requireNotNull(intent.getLongExtra(ClipDetailNavigationImpl.EXTRA_ACCOUNT_ID, 0)),\n            requireNotNull(intent.getStringExtra(ClipDetailNavigationImpl.EXTRA_CLIP_ID))\n        )\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        NoteActionHandler(\n            supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            title = {\n                                Text(stringResource(id = R.string.clip))\n                            },\n                            navigationIcon = {\n                                IconButton(onClick = { finish() }) {\n                                    Icon(\n                                        Icons.Default.ArrowBack,\n                                        contentDescription = \"navigate up\"\n                                    )\n                                }\n                            }\n                        )\n                    }\n                ) { paddingValues ->\n                    AndroidView(\n                        modifier = Modifier.padding(paddingValues),\n                        factory = {\n                            FrameLayout(it).apply {\n                                id = R.id.container\n                            }\n                        },\n                        update = { frameLayout ->\n                            val fragment = pageableFragmentFactory.create(\n                                clipId.accountId,\n                                Pageable.ClipNotes(clipId.clipId)\n                            )\n                            val transaction = supportFragmentManager.beginTransaction()\n                            transaction.replace(frameLayout.id, fragment)\n                            transaction.commit()\n                        }\n                    )\n                }\n            }\n        }\n    }\n}\n\n\nclass ClipDetailNavigationImpl @Inject constructor(\n    val activity: Activity,\n) : ClipDetailNavigation {\n    companion object {\n        const val EXTRA_ACCOUNT_ID = \"ClipDetailNavigationImpl.EXTRA_ACCOUNT_ID\"\n        const val EXTRA_CLIP_ID = \"ClipDetailNavigationImpl.EXTRA_CLIP_ID\"\n    }\n\n    override fun newIntent(args: ClipId): Intent {\n        return Intent(activity, ClipDetailActivity::class.java).apply {\n            putExtra(EXTRA_ACCOUNT_ID, args.accountId)\n            putExtra(EXTRA_CLIP_ID, args.clipId)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/clip/src/main/java/net/pantasystem/milktea/clip/ClipListActivity.kt",
    "content": "package net.pantasystem.milktea.clip\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.error.UserActionAppGlobalErrorListener\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.ClipDetailNavigation\nimport net.pantasystem.milktea.common_navigation.ClipListNavigation\nimport net.pantasystem.milktea.common_navigation.ClipListNavigationArgs\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass ClipListActivity : AppCompatActivity() {\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var clipDetailNavigation: ClipDetailNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var userActionAppGlobalErrorListener: UserActionAppGlobalErrorListener\n\n    private val mode: ClipListNavigationArgs.Mode by lazy {\n        intent.getStringExtra(ClipListNavigationImpl.EXTRA_MODE)?.let {\n            ClipListNavigationArgs.Mode.valueOf(it)\n        } ?: ClipListNavigationArgs.Mode.View\n    }\n\n    private val clipListViewModel: ClipListViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n\n        applyTheme()\n        userActionAppGlobalErrorListener(lifecycle, supportFragmentManager)\n\n        setContent {\n            val uiState by clipListViewModel.uiState.collectAsState()\n\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                ClipListScreen(\n                    uiState = uiState,\n                    mode = mode,\n                    onClipTileClicked = {\n                        when(mode) {\n                            ClipListNavigationArgs.Mode.AddToTab -> {\n                                clipListViewModel.onClipTileClicked(it)\n                            }\n                            ClipListNavigationArgs.Mode.View -> {\n                                startActivity(clipDetailNavigation.newIntent(it.clip.id))\n                            }\n                        }\n                    },\n                    onToggleAddToTabButtonClicked = clipListViewModel::onToggleAddToTabButtonClicked,\n                    onNavigateUp = {\n                        finish()\n                    }\n                )\n            }\n        }\n    }\n\n\n}\n\nclass ClipListNavigationImpl @Inject constructor(\n    private val activity: Activity\n) : ClipListNavigation {\n    companion object {\n        const val EXTRA_ACCOUNT_ID = \"ClipListActivity.EXTRA_ACCOUNT_ID\"\n        const val EXTRA_MODE = \"ClipListActivity.EXTRA_MODE\"\n        const val EXTRA_ADD_TAB_TO_ACCOUNT_ID = \"ClipListActivity.EXTRA_ADD_TAB_TO_ACCOUNT_ID\"\n    }\n\n    override fun newIntent(args: ClipListNavigationArgs): Intent {\n        return Intent(activity, ClipListActivity::class.java).apply {\n            args.accountId?.let {\n                putExtra(EXTRA_ACCOUNT_ID, it)\n            }\n            putExtra(EXTRA_ADD_TAB_TO_ACCOUNT_ID, args.addTabToAccountId)\n            putExtra(EXTRA_MODE, args.mode.name)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/clip/src/main/java/net/pantasystem/milktea/clip/ClipListScreen.kt",
    "content": "package net.pantasystem.milktea.clip\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common_navigation.ClipListNavigationArgs\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun ClipListScreen(\n    uiState: ClipListUiState,\n    mode: ClipListNavigationArgs.Mode,\n    onClipTileClicked: (ClipItemState) -> Unit,\n    onToggleAddToTabButtonClicked: (ClipItemState) -> Unit,\n    onNavigateUp: () -> Unit\n) {\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            TopAppBar(\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = \"navigate up\")\n                    }\n                },\n                title = {\n                    Text(text = stringResource(id = R.string.clip))\n                }\n            )\n        }\n    ) {\n        LazyColumn(\n            modifier = Modifier\n                .padding(it)\n                .fillMaxSize()\n        ) {\n            when (val content = uiState.clipStatusesState.content) {\n                is StateContent.Exist -> {\n                    items(content.rawContent) { clipState ->\n                        ClipTile(\n                            clipState = clipState,\n                            isSelectMode = mode != ClipListNavigationArgs.Mode.View,\n                            isSelected = mode != ClipListNavigationArgs.Mode.View && clipState.isAddedToTab,\n                            onClick = {\n                                onClipTileClicked(clipState)\n                            },\n                            onAddToTabButtonClicked = {\n                                onToggleAddToTabButtonClicked(\n                                    clipState\n                                )\n                            }\n                        )\n                    }\n                }\n                is StateContent.NotExist -> {\n                    item {\n                        Box(\n                            contentAlignment = Alignment.Center,\n                            modifier = Modifier.fillMaxWidth()\n                        ) {\n                            when (uiState.clipStatusesState) {\n                                is ResultState.Error -> {\n                                    Text(\"Load error\")\n                                }\n                                is ResultState.Fixed -> {\n                                    Text(\"Clip is not exists\")\n                                }\n                                is ResultState.Loading -> {\n                                    CircularProgressIndicator()\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/clip/src/main/java/net/pantasystem/milktea/clip/ClipListViewModel.kt",
    "content": "package net.pantasystem.milktea.clip\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.handler.AppGlobalError\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorAction\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_navigation.ClipListNavigationArgs\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.clip.Clip\nimport net.pantasystem.milktea.model.clip.ClipRepository\nimport net.pantasystem.milktea.model.clip.ToggleClipAddToTabUseCase\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ClipListViewModel @Inject constructor(\n    loggerFactory: Logger.Factory,\n    private val clipRepository: ClipRepository,\n    private val accountStore: AccountStore,\n    private val toggleClipAddToTabUseCase: ToggleClipAddToTabUseCase,\n    private val savedStateHandle: SavedStateHandle,\n    private val userActionAppGlobalErrorStore: UserActionAppGlobalErrorStore,\n) : ViewModel() {\n\n    private val logger by lazy(LazyThreadSafetyMode.NONE) {\n        loggerFactory.create(\"ClipListViewModel\")\n    }\n\n    private val accountId = savedStateHandle.getStateFlow<Long>(\n        ClipListNavigationImpl.EXTRA_ACCOUNT_ID, -1L\n    ).map {\n        it.takeIf {\n            it > 0\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val addTabToAccountId = savedStateHandle.getStateFlow<Long>(\n        ClipListNavigationImpl.EXTRA_ADD_TAB_TO_ACCOUNT_ID,\n        -1\n    ).map {\n        it.takeIf {\n            it > 0\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val currentAccount = accountId.flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.catch {\n        logger.error(\"currentAccount failed: $it\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val addTabToAccount = addTabToAccountId.flatMapLatest {\n        accountStore.getOrCurrent(it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val clips = currentAccount.filterNotNull().map {\n        it.accountId\n    }.distinctUntilChanged().flatMapLatest { accountId ->\n        suspend {\n            clipRepository.getMyClips(accountId).onFailure {\n                logger.error(\"getClips failed: $it\", it)\n            }.getOrThrow()\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState(),\n    )\n\n    private val clipItemStatuses = combine(\n        clips,\n        addTabToAccount,\n        currentAccount\n    ) { clipsState, addTabToAccount, account ->\n        clipsState.convert { clips ->\n            clips.map { clip ->\n                val isAddedToTab = (addTabToAccount ?: account)?.pages?.any {\n                    clip.id.clipId == it.pageParams.clipId\n                            && (it.attachedAccountId ?: it.accountId) == account?.accountId\n                }\n                ClipItemState(clip, isAddedToTab ?: false)\n            }\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState()\n    )\n\n    val uiState = combine(\n        currentAccount,\n        addTabToAccount,\n        clipItemStatuses\n    ) { ac, addTabToAccount, statuses ->\n        ClipListUiState(\n            ac, addTabToAccount, statuses\n        )\n    }.stateIn(\n        viewModelScope, SharingStarted.WhileSubscribed(5_000), ClipListUiState()\n    )\n\n    fun onToggleAddToTabButtonClicked(clipItemState: ClipItemState) {\n        viewModelScope.launch {\n            toggleClipAddToTabUseCase(\n                clipItemState.clip,\n                savedStateHandle[ClipListNavigationImpl.EXTRA_ADD_TAB_TO_ACCOUNT_ID]\n            ).onFailure {\n                if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"ClipListViewModel.onToggleAddToTabButtonClicked\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource.invoke(\"add/remove clip to tab failed\"),\n                            it\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                    )\n                ) {\n                    onToggleAddToTabButtonClicked(clipItemState)\n                }\n            }\n        }\n    }\n\n    fun onClipTileClicked(clipItemState: ClipItemState) {\n        val mode = savedStateHandle.get<String?>(ClipListNavigationImpl.EXTRA_MODE)?.let {\n            ClipListNavigationArgs.Mode.valueOf(it)\n        } ?: ClipListNavigationArgs.Mode.View\n        when (mode) {\n            ClipListNavigationArgs.Mode.AddToTab -> {\n                onToggleAddToTabButtonClicked(clipItemState)\n            }\n            ClipListNavigationArgs.Mode.View -> Unit\n        }\n    }\n}\n\ndata class ClipItemState(\n    val clip: Clip,\n    val isAddedToTab: Boolean,\n)\n\ndata class ClipListUiState(\n    val account: Account? = null,\n    val addToTabAccount: Account? = null,\n    val clipStatusesState: ResultState<List<ClipItemState>> = ResultState.initialState(),\n)"
  },
  {
    "path": "modules/features/clip/src/main/java/net/pantasystem/milktea/clip/ClipTile.kt",
    "content": "package net.pantasystem.milktea.clip\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.common_compose.CircleCheckbox\n\n@Composable\nfun ClipTile(\n    modifier: Modifier = Modifier,\n    clipState: ClipItemState,\n    isSelectMode: Boolean,\n    isSelected: Boolean,\n    onClick: () -> Unit,\n    onAddToTabButtonClicked: () -> Unit,\n) {\n    Surface(\n        modifier = modifier\n            .fillMaxWidth()\n            .clickable {\n                onClick()\n            },\n        color = MaterialTheme.colorScheme.surface\n    ) {\n        Row(\n            modifier = Modifier.padding(vertical = 16.dp, horizontal = 16.dp),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Column(modifier = Modifier.weight(1f)) {\n                Text(clipState.clip.name, fontSize = 20.sp)\n                if (clipState.clip.description != null) {\n                    Text(clipState.clip.description ?: \"\", fontSize = 16.sp)\n                }\n            }\n\n            if (isSelectMode) {\n                CircleCheckbox(selected = isSelected)\n            } else {\n                AddToTabButton(isPaged = clipState.isAddedToTab, onPressed = onAddToTabButtonClicked)\n            }\n\n        }\n    }\n}\n\n\n@Composable\n@Stable\nprivate fun AddToTabButton(isPaged: Boolean, onPressed: () -> Unit) {\n    IconButton(onClick = onPressed) {\n        if (isPaged) {\n            Icon(\n                painter = painterResource(R.drawable.ic_remove_to_tab_24px),\n                contentDescription = \"add to tab\",\n                tint = MaterialTheme.colorScheme.secondary\n            )\n        } else {\n            Icon(\n                painter = painterResource(R.drawable.ic_add_to_tab_24px),\n                contentDescription = \"add to tab\",\n                tint = MaterialTheme.colorScheme.secondary\n            )\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/clip/src/main/java/net/pantasystem/milktea/clip/NavigationModule.kt",
    "content": "package net.pantasystem.milktea.clip\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.common_navigation.ClipDetailNavigation\nimport net.pantasystem.milktea.common_navigation.ClipListNavigation\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n\n    @Binds\n    abstract fun bindClipListNavigation(impl: ClipListNavigationImpl): ClipListNavigation\n\n    @Binds\n    abstract fun bindClipDetailNavigation(impl: ClipDetailNavigationImpl): ClipDetailNavigation\n\n}"
  },
  {
    "path": "modules/features/drive/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/drive/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'dagger.hilt.android.plugin'\n    id 'kotlin-kapt'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n    }\n\n    buildFeatures {\n        dataBinding true\n        compose true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.drive'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_android_ui')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n\n    implementation libs.lifecycle.livedata\n    implementation libs.activity.ktx\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/drive/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/drive/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/drive/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/CreateFolderDialog.kt",
    "content": "package net.pantasystem.milktea.drive\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.lifecycle.ViewModelProvider\nimport net.pantasystem.milktea.drive.databinding.DialogCreateFolderBinding\nimport net.pantasystem.milktea.drive.viewmodel.DriveViewModel\n\nclass CreateFolderDialog : AppCompatDialogFragment(){\n    companion object {\n        const val FRAGMENT_TAG = \"CreateFolderDialog\"\n    }\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog =  super.onCreateDialog(savedInstanceState)\n        val view = View.inflate(dialog.context, R.layout.dialog_create_folder, null)\n        val binding = DialogCreateFolderBinding.bind(view)\n        dialog.setContentView(view)\n        val directoryViewModel = ViewModelProvider(requireActivity())[DriveViewModel::class.java]\n        binding.okButton.setOnClickListener {\n            val name = binding.editFolderName.text.toString()\n            if(name.isNotBlank()){\n                directoryViewModel.createDirectory(name)\n                dismiss()\n\n            }\n        }\n        binding.cancelButton.setOnClickListener {\n            dismiss()\n        }\n        return dialog\n    }\n}"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/DirectoryListScreen.kt",
    "content": "package net.pantasystem.milktea.drive\n\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxHeight\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.LazyListState\nimport androidx.compose.foundation.lazy.itemsIndexed\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.snapshotFlow\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.ui.isScrolledToTheEnd\nimport net.pantasystem.milktea.drive.viewmodel.DriveViewModel\nimport net.pantasystem.milktea.model.drive.Directory\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun DirectoryListScreen(driveViewModel: DriveViewModel) {\n    val uiState by driveViewModel.uiState.collectAsState()\n    val state: PageableState<List<Directory>> = uiState.directoriesState\n\n    val directories = ((state.content as? StateContent.Exist)?.rawContent?: emptyList())\n    val isLoading: Boolean = uiState.directoriesState is PageableState.Loading.Init\n    val listState = rememberLazyListState()\n\n    LaunchedEffect(Unit) {\n        snapshotFlow {\n            listState.isScrolledToTheEnd()\n        }.distinctUntilChanged().onEach {\n            if (it) {\n                driveViewModel.onDirectoryListViewBottomReached()\n            }\n        }.launchIn(this)\n    }\n\n    PullToRefreshBox(\n        isRefreshing = isLoading,\n        onRefresh = {\n            driveViewModel.onDirectoryListRefreshed()\n        },\n        modifier = Modifier.fillMaxHeight()\n    ) {\n        DirectoryListView(\n            uiState.canFileMove,\n            directories,\n            listState = listState,\n            onDirectorySelected = {\n                driveViewModel.push(it)\n            },\n            onMoveToFileHereButtonClicked = driveViewModel::onFileMoveToHereButtonClicked\n        )\n    }\n\n\n\n}\n\n@Composable\nfun DirectoryListTile(directory: Directory, onClick:()->Unit) {\n    Card (\n        shape = RoundedCornerShape(0.dp),\n        modifier = Modifier.padding(0.5.dp)\n    ){\n        Column(\n            Modifier\n                .clickable(onClick = onClick)\n                .fillMaxWidth()\n                .padding(8.dp)\n        ) {\n            Text(\n                directory.name,\n                fontSize = 20.sp\n            )\n        }\n    }\n\n}\n\n@Composable\nfun DirectoryListView(\n    canFileMove: Boolean,\n    directories: List<Directory>,\n    listState: LazyListState = rememberLazyListState(),\n    onDirectorySelected: (Directory)->Unit,\n    onMoveToFileHereButtonClicked: ()->Unit = {}\n) {\n    LazyColumn(\n        state = listState,\n        modifier = Modifier.fillMaxSize()\n    ) {\n        if (canFileMove) {\n            item {\n                Box(\n                    Modifier\n                        .fillMaxWidth()\n                        .padding(16.dp),\n                    contentAlignment = Alignment.Center,\n                ) {\n                    Button(\n                        onClick = onMoveToFileHereButtonClicked,\n                        Modifier\n                            .fillMaxWidth()\n                            .padding(vertical = 8.dp, horizontal = 32.dp),\n                        shape = RoundedCornerShape(32.dp)\n                    ) {\n                        Text(stringResource(id = R.string.move_files_here))\n                    }\n                }\n            }\n        }\n        this.itemsIndexed(directories, { index, _ ->\n            directories[index].id\n        }){ _, item ->\n            DirectoryListTile(item) {\n                onDirectorySelected.invoke(item)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/DriveActivity.kt",
    "content": "package net.pantasystem.milktea.drive\n\nimport android.Manifest\nimport android.app.Activity\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport androidx.activity.addCallback\nimport androidx.activity.compose.setContent\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android.platform.PermissionUtil\nimport net.pantasystem.milktea.common_android_ui.error.UserActionAppGlobalErrorListener\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.DriveNavigation\nimport net.pantasystem.milktea.common_navigation.DriveNavigationArgs\nimport net.pantasystem.milktea.common_navigation.EXTRA_ACCOUNT_ID\nimport net.pantasystem.milktea.common_navigation.EXTRA_INT_SELECTABLE_FILE_MAX_SIZE\nimport net.pantasystem.milktea.common_navigation.EXTRA_SELECTED_FILE_PROPERTY_IDS\nimport net.pantasystem.milktea.drive.viewmodel.DriveViewModel\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\nclass DriveNavigationImpl @Inject constructor(\n    val activity: Activity\n) : DriveNavigation {\n\n    override fun newIntent(args: DriveNavigationArgs): Intent {\n        return Intent(activity, DriveActivity::class.java)\n            .putExtra(EXTRA_INT_SELECTABLE_FILE_MAX_SIZE, args.selectableFileMaxSize)\n            .putExtra(EXTRA_ACCOUNT_ID, args.accountId)\n            .putExtra(\n                EXTRA_SELECTED_FILE_PROPERTY_IDS,\n                args.selectedFilePropertyIds?.let { ArrayList(it) })\n    }\n}\n\n@AndroidEntryPoint\nclass DriveActivity : AppCompatActivity() {\n\n\n    private val _driveViewModel: DriveViewModel by viewModels()\n\n    @Inject\n    lateinit var setTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var userActionAPpGlobalErrorListener: UserActionAppGlobalErrorListener\n\n    @OptIn(\n        ExperimentalMaterial3Api::class,\n        ExperimentalCoroutinesApi::class\n    )\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setTheme.invoke()\n\n        userActionAPpGlobalErrorListener(\n            lifecycle = lifecycle,\n            fragmentManager = supportFragmentManager\n        )\n\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                DriveScreen(\n                    driveViewModel = _driveViewModel,\n                    onNavigateUp = { finish() },\n                    onFixSelected = {\n                        val ids = _driveViewModel.getSelectedFileIds()\n                        if (ids.isNullOrEmpty()) {\n                            setResult(RESULT_CANCELED)\n                        } else {\n                            intent.putExtra(EXTRA_SELECTED_FILE_PROPERTY_IDS, ArrayList(ids))\n                            setResult(RESULT_OK, intent)\n                        }\n                        finish()\n\n                    },\n                    onShowLocalFilePicker = {\n                        showFileManager()\n                    },\n                    onShowCreateDirectoryEditor = {\n                        createDirectoryDialog()\n                    }\n                )\n            }\n        }\n\n        onBackPressedDispatcher.addCallback {\n            if (!_driveViewModel.pop()) {\n                remove()\n                onBackPressedDispatcher.onBackPressed()\n            }\n        }\n\n\n    }\n\n\n    private fun createDirectoryDialog() {\n        CreateFolderDialog().show(supportFragmentManager, CreateFolderDialog.FRAGMENT_TAG)\n    }\n\n    private fun showFileManager() {\n        if (checkPermissions()) {\n            val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)\n            intent.type = \"*/*\"\n            intent.addCategory(Intent.CATEGORY_OPENABLE)\n            registerForOpenFileActivityResult.launch(intent)\n        } else {\n            requestPermission()\n        }\n    }\n\n    private fun checkPermissions(): Boolean {\n        return PermissionUtil.checkReadStoragePermission(this)\n    }\n\n    private fun requestPermission() {\n        if (!checkPermissions()) {\n            if (Build.VERSION.SDK_INT >= 33) {\n                requestReadMediasPermissionResult.launch(\n                    PermissionUtil.getReadMediaPermissions().toTypedArray()\n                )\n            } else {\n                registerForReadExternalStoragePermissionResult.launch(\n                    Manifest.permission.READ_EXTERNAL_STORAGE\n                )\n            }\n        }\n    }\n\n    private val registerForOpenFileActivityResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n            val uri = result.data?.data\n            if (uri != null) {\n                uploadFile(uri)\n            }\n        }\n\n    private val registerForReadExternalStoragePermissionResult =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) {\n            if (it) {\n                showFileManager()\n            }\n        }\n\n    private val requestReadMediasPermissionResult =\n        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { results ->\n            if (results.any { it.value }) {\n                showFileManager()\n            }\n        }\n\n    private fun uploadFile(uri: Uri) {\n        _driveViewModel.uploadFile(uri)\n    }\n\n\n\n}\n"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/DriveFileCard.kt",
    "content": "package net.pantasystem.milktea.drive\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.combinedClickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.common_compose.SensitiveIcon\nimport net.pantasystem.milktea.drive.viewmodel.FileViewData\nimport net.pantasystem.milktea.model.drive.FileProperty\n\n\n@OptIn(ExperimentalFoundationApi::class)\n@ExperimentalMaterial3Api\n@Composable\nfun FilePropertySimpleCard(\n    file: FileViewData,\n    isSelectMode: Boolean = false,\n    onAction: (FilePropertyCardAction) -> Unit,\n) {\n    Card(\n        shape = RoundedCornerShape(0.dp),\n        modifier = Modifier.padding(0.5.dp).combinedClickable(\n            onClick = {\n                if (isSelectMode) {\n                    onAction(FilePropertyCardAction.OnToggleSelectItem(file.fileProperty.id, !file.isSelected))\n                } else {\n                    onAction(FilePropertyCardAction.OnOpenDropdownMenu(file.fileProperty.id))\n                }\n            },\n            onLongClick = {\n                onAction(FilePropertyCardAction.OnLongClicked(file.fileProperty))\n            }\n        ),\n        colors = CardDefaults.cardColors(\n            containerColor = if (file.isSelected) {\n                MaterialTheme.colorScheme.primary\n            } else {\n                MaterialTheme.colorScheme.surface\n            }\n        ),\n    ) {\n        Column(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(8.dp),\n        ) {\n            Row(\n                verticalAlignment = Alignment.Top\n            ) {\n                Box(\n                    contentAlignment = Alignment.TopEnd,\n                    modifier = Modifier\n                        .height(64.dp)\n                        .width(64.dp)\n                        .padding(end = 4.dp)\n                ) {\n                    Image(\n                        painter = rememberAsyncImagePainter(\n                            file.fileProperty.thumbnailUrl\n                                ?: file.fileProperty.url\n                        ),\n                        contentDescription = null,\n                        modifier = Modifier\n                            .height(64.dp)\n                            .width(64.dp),\n                        contentScale = ContentScale.Crop\n                    )\n                    if (file.fileProperty.isSensitive) {\n                        SensitiveIcon()\n                    }\n                }\n                Column(\n                    modifier = Modifier.weight(1f),\n                    verticalArrangement = Arrangement.SpaceBetween\n                ) {\n\n                    Text(\n                        file.fileProperty.name,\n                        fontSize = 20.sp,\n                        fontWeight = FontWeight.Bold,\n                        maxLines = 1,\n                    )\n                    Row {\n                        Text(\n                            file.fileProperty.type,\n                            modifier = Modifier.padding(end = 4.dp)\n                        )\n                        Text(\n                            file.fileProperty.size.toString()\n                        )\n                    }\n                }\n\n\n            }\n            Box(\n                modifier = Modifier.align(Alignment.End)\n            ) {\n                FileActionDropdownMenu(\n\n                    expanded = file.isDropdownMenuExpanded,\n                    onAction = { e ->\n                        onAction(FilePropertyCardAction.OnCloseDropdownMenu(file.fileProperty.id))\n                        when(e) {\n                            FileCardDropdownMenuAction.OnDeleteMenuItemClicked -> {\n                                onAction(FilePropertyCardAction.OnSelectDeletionMenuItem(file.fileProperty))\n                            }\n                            FileCardDropdownMenuAction.OnDismissRequest -> {\n                            }\n                            FileCardDropdownMenuAction.OnEditFileCaption -> {\n                                onAction(FilePropertyCardAction.OnSelectEditCaptionMenuItem(file.fileProperty))\n                            }\n                            FileCardDropdownMenuAction.OnNsfwMenuItemClicked -> {\n                                onAction(FilePropertyCardAction.OnToggleNsfw(file.fileProperty.id))\n                            }\n                            FileCardDropdownMenuAction.OnEditFileName -> {\n                                onAction(FilePropertyCardAction.OnSelectEditFileNameMenuItem(file.fileProperty))\n                            }\n                        }\n                    },\n                    property = file.fileProperty\n                )\n            }\n\n        }\n\n\n    }\n\n\n\n\n}\n\nsealed interface FilePropertyCardAction {\n    data class OnOpenDropdownMenu(val fileId: FileProperty.Id) : FilePropertyCardAction\n    data class OnCloseDropdownMenu(val fileId: FileProperty.Id) : FilePropertyCardAction\n    data class OnToggleSelectItem(val fileId: FileProperty.Id, val newValue: Boolean) : FilePropertyCardAction\n    data class OnToggleNsfw(val fileId: FileProperty.Id) : FilePropertyCardAction\n    data class OnSelectDeletionMenuItem(val file: FileProperty) : FilePropertyCardAction\n    data class OnSelectEditCaptionMenuItem(val file: FileProperty) : FilePropertyCardAction\n    data class OnSelectEditFileNameMenuItem(val file: FileProperty) : FilePropertyCardAction\n\n    data class OnLongClicked(val file: FileProperty) : FilePropertyCardAction\n}\n"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/DriveFileScreen.kt",
    "content": "package net.pantasystem.milktea.drive\n\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.LazyListState\nimport androidx.compose.foundation.lazy.grid.GridCells\nimport androidx.compose.foundation.lazy.grid.LazyVerticalGrid\nimport androidx.compose.foundation.lazy.grid.rememberLazyGridState\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.runtime.snapshotFlow\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.ui.isScrolledToTheEnd\nimport net.pantasystem.milktea.drive.viewmodel.DriveViewModel\nimport net.pantasystem.milktea.drive.viewmodel.FileViewData\nimport net.pantasystem.milktea.model.drive.FileProperty\n\n@ExperimentalCoroutinesApi\n@ExperimentalMaterial3Api\n@Composable\nfun FilePropertyListScreen(\n    driveViewModel: DriveViewModel,\n    isGridMode: Boolean,\n) {\n    val uiState by driveViewModel.uiState.collectAsState()\n    val filesState = uiState.driveFilesState\n\n    val isSelectMode: Boolean = uiState.isSelectMode\n    val files = (filesState.content as? StateContent.Exist)?.rawContent ?: emptyList()\n\n    var confirmDeleteTarget: FileProperty? by remember {\n        mutableStateOf(null)\n    }\n\n\n    var editCaptionTargetFile: FileProperty? by remember {\n        mutableStateOf(null)\n    }\n\n    var editNameTargetFile: FileProperty? by remember {\n        mutableStateOf(null)\n    }\n\n    ConfirmDeleteFilePropertyDialog(\n        isShow = confirmDeleteTarget != null,\n        filename = confirmDeleteTarget?.name ?: \"\",\n        onDismissRequest = {\n            confirmDeleteTarget = null\n        },\n        onConfirmed = {\n            driveViewModel.deleteFile(confirmDeleteTarget!!.id)\n            confirmDeleteTarget = null\n        }\n    )\n\n    EditCaptionDialog(\n        fileProperty = editCaptionTargetFile,\n        onDismiss = {\n            editCaptionTargetFile = null\n        },\n        onSave = { id, newCaption ->\n            editCaptionTargetFile = null\n            driveViewModel.updateCaption(id, newCaption)\n        }\n    )\n\n    EditFileNameDialog(\n        fileProperty = editNameTargetFile,\n        onDismiss = { editNameTargetFile = null },\n        onSave = { id, newName ->\n            editNameTargetFile = null\n            driveViewModel.updateFileName(id, newName)\n        },\n    )\n\n    val actionHandler: (FilePropertyCardAction) -> Unit = { cardAction ->\n        when (cardAction) {\n            is FilePropertyCardAction.OnCloseDropdownMenu -> {\n                driveViewModel.closeFileCardDropDownMenu()\n            }\n            is FilePropertyCardAction.OnOpenDropdownMenu -> {\n                driveViewModel.openFileCardDropDownMenu(cardAction.fileId)\n            }\n            is FilePropertyCardAction.OnToggleSelectItem -> {\n                driveViewModel.toggleSelect(cardAction.fileId)\n            }\n            is FilePropertyCardAction.OnToggleNsfw -> {\n                driveViewModel.toggleNsfw(cardAction.fileId)\n            }\n            is FilePropertyCardAction.OnSelectDeletionMenuItem -> {\n                confirmDeleteTarget = cardAction.file\n            }\n            is FilePropertyCardAction.OnSelectEditCaptionMenuItem -> {\n                editCaptionTargetFile = cardAction.file\n            }\n            is FilePropertyCardAction.OnSelectEditFileNameMenuItem -> {\n                editNameTargetFile = cardAction.file\n            }\n\n            is FilePropertyCardAction.OnLongClicked -> {\n                driveViewModel.selectAndSelectMode(cardAction.file)\n            }\n        }\n    }\n\n    PullToRefreshBox(\n        isRefreshing = filesState is PageableState.Loading.Init || filesState is PageableState.Loading.Future,\n        onRefresh = {\n            driveViewModel.onFileListRefreshed()\n        }\n    ) {\n        if (isGridMode) {\n            DriveFilesGridView(\n                files = files,\n                onLoadNext = {\n                    driveViewModel.onFileListViewBottomReached()\n                },\n                isSelectMode = isSelectMode,\n                onAction = actionHandler\n            )\n        } else {\n            FileViewDataListView(\n                files,\n                isSelectMode,\n                onAction = actionHandler,\n                onLoadNext = {\n                    driveViewModel.onFileListViewBottomReached()\n                }\n            )\n        }\n\n    }\n}\n\n@ExperimentalMaterial3Api\n@Composable\nfun FileViewDataListView(\n    list: List<FileViewData>,\n    isSelectMode: Boolean = false,\n    onLoadNext: () -> Unit,\n    onAction: (FilePropertyCardAction) -> Unit,\n) {\n    val state: LazyListState = rememberLazyListState()\n\n    LaunchedEffect(null) {\n        snapshotFlow {\n            state.isScrolledToTheEnd() && state.layoutInfo.totalItemsCount != state.layoutInfo.visibleItemsInfo.size && state.isScrollInProgress\n        }.distinctUntilChanged().onEach {\n            if (it) {\n                onLoadNext()\n            }\n        }.launchIn(this)\n    }\n    LazyColumn(\n        state = state,\n        modifier = Modifier.fillMaxSize()\n    ) {\n        this.items(\n            list,\n            key = {\n                it.fileProperty.id\n            }\n        ) { item ->\n            FilePropertySimpleCard(\n                file = item,\n                isSelectMode = isSelectMode,\n                onAction = onAction,\n            )\n        }\n    }\n}\n\n\n@Composable\nfun DriveFilesGridView(\n    files: List<FileViewData>,\n    isSelectMode: Boolean = false,\n    onLoadNext: () -> Unit,\n    onAction: (FilePropertyCardAction) -> Unit,\n) {\n    val state = rememberLazyGridState()\n    LaunchedEffect(null) {\n        snapshotFlow {\n            state.isScrolledToTheEnd() && state.layoutInfo.totalItemsCount != state.layoutInfo.visibleItemsInfo.size && state.isScrollInProgress\n        }.distinctUntilChanged().onEach {\n            if (it) {\n                onLoadNext()\n            }\n        }.launchIn(this)\n    }\n    LazyVerticalGrid(\n        columns = GridCells.Adaptive(minSize = 128.dp),\n        modifier = Modifier.fillMaxSize(),\n        state = state\n    ) {\n        items(files.size) { index ->\n            FilePropertyGridItem(\n                fileViewData = files[index],\n                onAction = onAction,\n                isSelectMode = isSelectMode\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/DriveScreen.kt",
    "content": "package net.pantasystem.milktea.drive\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.lazy.LazyRow\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.FloatingActionButton\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Tab\nimport androidx.compose.material3.TabRow\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material3.TopAppBarDefaults\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Add\nimport androidx.compose.material.icons.filled.AddAPhoto\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.ArrowRight\nimport androidx.compose.material.icons.filled.Check\nimport androidx.compose.material.icons.filled.Grid3x3\nimport androidx.compose.material.icons.filled.List\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.foundation.pager.HorizontalPager\nimport androidx.compose.foundation.pager.rememberPagerState\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.drive.viewmodel.DriveViewModel\nimport net.pantasystem.milktea.model.drive.Directory\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n\n@ExperimentalCoroutinesApi\n@ExperimentalMaterial3Api\n@Composable\nfun DriveScreen(\n    driveViewModel: DriveViewModel,\n    onNavigateUp: () -> Unit,\n    onFixSelected: () -> Unit,\n    onShowLocalFilePicker: () -> Unit,\n    onShowCreateDirectoryEditor: () -> Unit,\n    tabTitles: List<String> = listOf(\n        stringResource(id = R.string.drive_file),\n        stringResource(id = R.string.drive_folder)\n    )\n) {\n    require(tabTitles.size == 2)\n\n    val isGridMode: Boolean by driveViewModel.isUsingGridView.collectAsState()\n    val uiState by driveViewModel.uiState.collectAsState()\n\n    val isSelectMode: Boolean = uiState.isSelectMode\n\n    val selectableMaxCount = uiState.maxSelectableSize\n\n    val selectedFileIds: Set<FileProperty.Id> = uiState.selectedFilePropertyIds.toSet()\n    val pagerState = rememberPagerState { tabTitles.size }\n    val scope = rememberCoroutineScope()\n\n\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n\n            Column {\n\n                TopAppBar(\n                    title = {\n                        if (isSelectMode && selectableMaxCount != null && selectableMaxCount > 0) {\n                            Text(\"${stringResource(R.string.selected)} ${selectedFileIds.size}/${selectableMaxCount}\")\n                        } else {\n                            Text(stringResource(id = R.string.drive))\n                        }\n                    },\n                    navigationIcon = {\n                        IconButton(\n                            onClick = {\n                                onNavigateUp.invoke()\n                            },\n                        ) {\n                            Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = \"Back\")\n                        }\n                    },\n                    actions = {\n                        if (isSelectMode) {\n                            IconButton(onClick = onFixSelected) {\n                                Icon(imageVector = Icons.Filled.Check, contentDescription = \"Fix\")\n                            }\n                        }\n                    },\n                    colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface)\n\n                )\n                Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {\n                    PathHorizontalView(currentDir = uiState.currentDirectory, modifier = Modifier.weight(1f)) { dir ->\n                        driveViewModel.popUntil(dir)\n                    }\n                    ToggleViewMode(isGridMode = isGridMode) {\n                        driveViewModel.setUsingGridView(!isGridMode)\n                    }\n                }\n\n                TabRow(\n                    selectedTabIndex = pagerState.currentPage,\n                    containerColor = MaterialTheme.colorScheme.surface\n                ) {\n                    tabTitles.forEachIndexed { index, s ->\n                        Tab(\n                            text = { Text(text = s) },\n                            selected = index == pagerState.currentPage,\n                            onClick = {\n\n                                scope.launch {\n                                    pagerState.animateScrollToPage(index)\n                                }\n\n                            }\n\n                        )\n                    }\n\n                }\n            }\n        },\n        floatingActionButton = {\n            if (pagerState.currentPage == 0) {\n                FloatingActionButton(onClick = onShowLocalFilePicker) {\n                    Icon(imageVector = Icons.Filled.AddAPhoto, contentDescription = null)\n                }\n            } else {\n                FloatingActionButton(onClick = onShowCreateDirectoryEditor) {\n                    Icon(imageVector = Icons.Filled.Add, contentDescription = null)\n                }\n            }\n\n        }\n\n    ) { padding ->\n\n\n        HorizontalPager(state = pagerState, modifier = Modifier.padding(padding)) { page ->\n            if (page == 0) {\n                FilePropertyListScreen(\n                    driveViewModel = driveViewModel,\n                    isGridMode = isGridMode\n                )\n            } else {\n                DirectoryListScreen(driveViewModel = driveViewModel)\n            }\n        }\n    }\n}\n\n\n@Composable\nfun PathHorizontalView(\n    modifier: Modifier = Modifier,\n    currentDir: Directory?,\n    onSelected: (Directory?) -> Unit\n) {\n\n    val path = remember(currentDir) {\n        val path = mutableListOf<Directory>()\n        var dir = currentDir\n        while (dir != null) {\n            path.add(0, dir)\n            dir = dir.parent\n        }\n        path\n    }\n\n    Surface(\n        modifier = modifier,\n        color = MaterialTheme.colorScheme.surface,\n    ) {\n        LazyRow(\n            Modifier\n                .fillMaxWidth(),\n        ) {\n            item {\n                Row(\n                    modifier = Modifier\n                        .padding(4.dp)\n                        .clickable {\n                            onSelected.invoke(null)\n                        }\n\n                ) {\n                    Text(text = \"root\")\n                    Icon(imageVector = Icons.Filled.ArrowRight, contentDescription = null)\n\n                }\n            }\n\n\n            this.items(path, key = {\n                it.id to it.name\n            }) { dir ->\n                Row(\n                    modifier = Modifier\n                        .padding(4.dp)\n                        .clickable {\n                            onSelected.invoke(dir)\n                        }\n\n                ) {\n                    Text(text = dir.name)\n                    Icon(imageVector = Icons.Filled.ArrowRight, contentDescription = null)\n\n                }\n            }\n        }\n    }\n\n}\n\n@Composable\nprivate fun ToggleViewMode(\n    modifier: Modifier = Modifier,\n    isGridMode: Boolean,\n    onClick: () -> Unit,\n) {\n    Box(\n        modifier = modifier\n            .padding(4.dp)\n            .clickable {\n                onClick()\n            }\n            .clip(RoundedCornerShape(4.dp))\n    ) {\n        if (isGridMode) {\n            Icon(Icons.Default.Grid3x3, contentDescription = null, modifier = Modifier.size(24.dp))\n        } else {\n            Icon(Icons.Default.List, contentDescription = null, modifier = Modifier.size(24.dp))\n        }\n    }\n}"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/FileActionDropdownMenu.kt",
    "content": "package net.pantasystem.milktea.drive\n\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.wrapContentWidth\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.*\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.window.Dialog\nimport net.pantasystem.milktea.common_compose.drive.EditCaptionDialogLayout\nimport net.pantasystem.milktea.common_compose.drive.EditFileNameDialogLayout\nimport net.pantasystem.milktea.model.drive.FileProperty\n\n@Composable\n@Stable\nfun FileActionDropdownMenu(\n    property: FileProperty,\n    expanded: Boolean,\n    onAction: (FileCardDropdownMenuAction) -> Unit\n) {\n\n    DropdownMenu(\n        expanded = expanded,\n        onDismissRequest = {\n            onAction(FileCardDropdownMenuAction.OnDismissRequest)\n        },\n        modifier = Modifier.wrapContentWidth(),\n    ) {\n        DropdownMenuItem(\n            text = {\n                if (property.isSensitive) Text(stringResource(R.string.drive_undo_nsfw))\n                else Text(stringResource(R.string.drive_mark_as_nsfw))\n            },\n            leadingIcon = {\n                if (property.isSensitive) Icon(Icons.Default.Image, contentDescription = stringResource(R.string.drive_undo_nsfw), modifier = Modifier.size(24.dp))\n                else Icon(Icons.Default.HideImage, contentDescription = stringResource(R.string.drive_mark_as_nsfw), modifier = Modifier.size(24.dp))\n            },\n            onClick = { onAction(FileCardDropdownMenuAction.OnNsfwMenuItemClicked) }\n        )\n\n        HorizontalDivider()\n        DropdownMenuItem(\n            text = { Text(stringResource(R.string.delete)) },\n            leadingIcon = { Icon(Icons.Default.Delete, modifier = Modifier.size(24.dp), contentDescription = stringResource(R.string.delete)) },\n            onClick = { onAction(FileCardDropdownMenuAction.OnDeleteMenuItemClicked) }\n        )\n        HorizontalDivider()\n        DropdownMenuItem(\n            text = { Text(stringResource(R.string.edit_caption)) },\n            leadingIcon = { Icon(Icons.Default.Comment, modifier = Modifier.size(24.dp), contentDescription = stringResource(R.string.edit_caption)) },\n            onClick = { onAction(FileCardDropdownMenuAction.OnEditFileCaption) }\n        )\n        HorizontalDivider()\n        DropdownMenuItem(\n            text = { Text(stringResource(id = R.string.edit_file_name)) },\n            leadingIcon = { Icon(Icons.Default.Edit, modifier = Modifier.size(24.dp), contentDescription = stringResource(id = R.string.edit_file_name)) },\n            onClick = { onAction(FileCardDropdownMenuAction.OnEditFileName) }\n        )\n    }\n\n\n}\n\n@Composable\nfun ConfirmDeleteFilePropertyDialog(\n    isShow: Boolean,\n    filename: String,\n    onDismissRequest: () -> Unit,\n    onConfirmed: () -> Unit,\n) {\n    if (isShow) {\n        AlertDialog(\n            onDismissRequest = onDismissRequest,\n\n            title = {\n                Text(stringResource(R.string.drive_file_deletion_confirmation))\n            },\n            confirmButton = {\n                TextButton(onClick = onConfirmed) {\n                    Text(stringResource(R.string.delete))\n                }\n            },\n            text = {\n                Text(stringResource(R.string.drive_do_u_want_2_delete_s, filename))\n            },\n            dismissButton = {\n                TextButton(onClick = onDismissRequest) {\n                    Text(stringResource(R.string.cancel))\n                }\n            }\n        )\n    }\n\n}\n\n\n@Composable\nfun EditCaptionDialog(\n    fileProperty: FileProperty?,\n    onDismiss: () -> Unit,\n    onSave: (FileProperty.Id, newCaption: String) -> Unit\n) {\n\n    var captionText: String by remember(fileProperty) {\n        mutableStateOf(fileProperty?.comment ?: \"\")\n    }\n    if (fileProperty != null) {\n        Dialog(onDismissRequest = onDismiss) {\n            EditCaptionDialogLayout(value = captionText, onCancelButtonClicked = onDismiss, onTextChanged = {\n                captionText = it\n            }, onSaveButtonClicked = {\n                onSave(fileProperty.id, captionText)\n            })\n        }\n    }\n\n}\n\n@Composable\nfun EditFileNameDialog(\n    fileProperty: FileProperty?,\n    onDismiss: () -> Unit,\n    onSave: (FileProperty.Id, newName: String) -> Unit\n) {\n    var nameText: String by remember(fileProperty) {\n        mutableStateOf(fileProperty?.name ?: \"\")\n    }\n    if (fileProperty != null) {\n        Dialog(onDismissRequest = onDismiss) {\n            EditFileNameDialogLayout(\n                value = nameText,\n                onTextChanged = {\n                    nameText = it\n                },\n                onSaveButtonClicked = {\n                    onSave(fileProperty.id, nameText)\n                },\n                onCancelButtonClicked = {\n                    onDismiss()\n                }\n            )\n        }\n\n    }}\n\nsealed interface FileCardDropdownMenuAction {\n    object OnDismissRequest : FileCardDropdownMenuAction\n    object OnNsfwMenuItemClicked : FileCardDropdownMenuAction\n    object OnDeleteMenuItemClicked : FileCardDropdownMenuAction\n    object OnEditFileCaption : FileCardDropdownMenuAction\n    object OnEditFileName : FileCardDropdownMenuAction\n}"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/FilePropertyGridItem.kt",
    "content": "package net.pantasystem.milktea.drive\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.combinedClickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.CheckCircle\nimport androidx.compose.material.icons.outlined.Circle\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.unit.dp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.common_compose.SensitiveIcon\nimport net.pantasystem.milktea.drive.viewmodel.FileViewData\n\n@OptIn(ExperimentalFoundationApi::class)\n@Composable\n@Stable\nfun FilePropertyGridItem(\n    fileViewData: FileViewData,\n    isSelectMode: Boolean = false,\n    onAction: (FilePropertyCardAction) -> Unit\n) {\n    Surface(\n        modifier = Modifier\n            .fillMaxWidth()\n            .padding(1.dp)\n            .aspectRatio(1f)\n            .combinedClickable(\n                onClick = {\n                    if (isSelectMode) {\n                        onAction(\n                            FilePropertyCardAction.OnToggleSelectItem(\n                                fileViewData.fileProperty.id,\n                                !fileViewData.isSelected\n                            )\n                        )\n                    } else {\n                        onAction(FilePropertyCardAction.OnOpenDropdownMenu(fileViewData.fileProperty.id))\n                    }\n                },\n                onLongClick = {\n                    onAction(FilePropertyCardAction.OnLongClicked(fileViewData.fileProperty))\n                }\n            )\n    ) {\n\n        Box(\n            Modifier.fillMaxSize(),\n            contentAlignment = Alignment.Center\n        ) {\n            if (\n                fileViewData.fileProperty.thumbnailUrl == null\n                || (!fileViewData.fileProperty.type.startsWith(\"image\")\n                && !fileViewData.fileProperty.type.startsWith(\"video\"))\n            ) {\n                Text(fileViewData.fileProperty.name)\n            } else {\n                Image(\n                    rememberAsyncImagePainter(\n                        fileViewData.fileProperty.thumbnailUrl\n                    ),\n                    contentDescription = null,\n                    modifier = Modifier.fillMaxSize(),\n                    contentScale = ContentScale.Crop\n                )\n            }\n\n            if (fileViewData.fileProperty.isSensitive) {\n                SensitiveIcon(modifier = Modifier.align(Alignment.TopStart))\n            }\n\n            if (isSelectMode) {\n                CircleCheckbox(Modifier.align(Alignment.TopEnd),selected = fileViewData.isSelected) {\n                    onAction(\n                        FilePropertyCardAction.OnToggleSelectItem(\n                            fileViewData.fileProperty.id,\n                            !fileViewData.isSelected\n                        )\n                    )\n                }\n            }\n\n        }\n\n\n        FileActionDropdownMenu(\n            expanded = fileViewData.isDropdownMenuExpanded,\n            onAction = { e ->\n                onAction(FilePropertyCardAction.OnCloseDropdownMenu(fileViewData.fileProperty.id))\n                when (e) {\n                    FileCardDropdownMenuAction.OnDeleteMenuItemClicked -> {\n                        onAction(FilePropertyCardAction.OnSelectDeletionMenuItem(fileViewData.fileProperty))\n                    }\n                    FileCardDropdownMenuAction.OnDismissRequest -> {\n                    }\n                    FileCardDropdownMenuAction.OnEditFileCaption -> {\n                        onAction(FilePropertyCardAction.OnSelectEditCaptionMenuItem(fileViewData.fileProperty))\n                    }\n                    FileCardDropdownMenuAction.OnNsfwMenuItemClicked -> {\n                        onAction(FilePropertyCardAction.OnToggleNsfw(fileViewData.fileProperty.id))\n                    }\n                    FileCardDropdownMenuAction.OnEditFileName -> {\n                        onAction(FilePropertyCardAction.OnSelectEditFileNameMenuItem(fileViewData.fileProperty))\n                    }\n                }\n            },\n            property = fileViewData.fileProperty\n        )\n    }\n}\n\n@Composable\n@Stable\nprivate fun CircleCheckbox(modifier: Modifier = Modifier, selected: Boolean, enabled: Boolean = true, onChecked: () -> Unit) {\n\n    val color = MaterialTheme.colorScheme\n    val imageVector = if (selected) Icons.Filled.CheckCircle else Icons.Outlined.Circle\n    val tint = color.primary\n    val background = if (selected) Color.White else Color.Transparent\n\n    IconButton(\n        onClick = { onChecked() },\n        modifier = modifier,\n        enabled = enabled\n    ) {\n\n        Icon(\n            imageVector = imageVector, tint = tint,\n            modifier = Modifier.background(background, shape = CircleShape),\n            contentDescription = \"checkbox\"\n        )\n    }\n}\n"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/FileUtils.kt",
    "content": "package net.pantasystem.milktea.drive\n\n\n\n"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/di/module/NavigationModule.kt",
    "content": "package net.pantasystem.milktea.drive.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.common_navigation.DriveNavigation\nimport net.pantasystem.milktea.drive.DriveNavigationImpl\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n\n    @Binds\n    abstract fun providerDriveNavigation(impl: DriveNavigationImpl): DriveNavigation\n\n}"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/viewmodel/DriveUiStateBuilder.kt",
    "content": "package net.pantasystem.milktea.drive.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.Directory\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport javax.inject.Inject\n\nclass DriveUiStateBuilder @Inject constructor() {\n\n    operator fun invoke(\n        currentAccountFlow: Flow<Account?>,\n        currentDirectoryFlow: Flow<Directory?>,\n        directoriesStateFlow: Flow<PageableState<List<Directory>>>,\n        filesStateFlow: Flow<PageableState<List<FileProperty>>>,\n        fileCardDropDownedFlow: Flow<FileProperty.Id?>,\n        maxSelectableSizeFlow: Flow<Int?>,\n        modesFlow: Flow<Modes>,\n        selectedFileIdsFlow: Flow<List<FileProperty.Id>>,\n        coroutineScope: CoroutineScope,\n    ): Flow<DriveUiState> {\n        val filesState = combine(\n            filesStateFlow,\n            selectedFileIdsFlow,\n            fileCardDropDownedFlow,\n            maxSelectableSizeFlow\n        ) { files, selected, dropdown, maxSize ->\n            files.convert { state ->\n                state.map {\n                    FileViewData(\n                        fileProperty = it,\n                        isSelected = selected.contains(it.id),\n                        isDropdownMenuExpanded = dropdown == it.id,\n                        isEnabled = (maxSize == null || selected.size < maxSize) || selected.contains(it.id),\n                    )\n                }\n            }\n        }.stateIn(\n            coroutineScope,\n            SharingStarted.WhileSubscribed(5_000),\n            PageableState.initialState(),\n        )\n\n        val pagingStateFlow = combine(\n            directoriesStateFlow,\n            filesState,\n        ) { dState, fState ->\n            PagingState(\n                directoriesState = dState,\n                driveFilesState = fState,\n            )\n        }.stateIn(\n            coroutineScope,\n            SharingStarted.WhileSubscribed(5_000),\n            PagingState(),\n        )\n\n        return combine(\n            currentAccountFlow,\n            currentDirectoryFlow,\n            pagingStateFlow,\n            modesFlow,\n            selectedFileIdsFlow,\n        ) { ac, dir, pagingState, mode, selected ->\n            DriveUiState(\n                currentAccount = ac,\n                currentDirectory = dir,\n                directoriesState = pagingState.directoriesState,\n                driveFilesState = pagingState.driveFilesState,\n                selectedFilePropertyIds = selected,\n                actionMode = mode.actionMode,\n                viewMode = mode.viewMode,\n                isSelectMode = mode.isSelectMode || mode.maxSelectableSize != null && mode.maxSelectableSize > 0,\n                maxSelectableSize = mode.maxSelectableSize,\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/viewmodel/DriveViewModel.kt",
    "content": "package net.pantasystem.milktea.drive.viewmodel\n\nimport android.net.Uri\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.drive.DriveDirectoryPagingStore\nimport net.pantasystem.milktea.app_store.drive.FilePropertyPagingStore\nimport net.pantasystem.milktea.app_store.handler.AppGlobalError\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorAction\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.convert\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_navigation.EXTRA_ACCOUNT_ID\nimport net.pantasystem.milktea.common_navigation.EXTRA_INT_SELECTABLE_FILE_MAX_SIZE\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.drive.CreateDirectory\nimport net.pantasystem.milktea.model.drive.Directory\nimport net.pantasystem.milktea.model.drive.DirectoryId\nimport net.pantasystem.milktea.model.drive.DriveDirectoryRepository\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.UriToAppFileUseCase\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass DriveViewModel @Inject constructor(\n    private val directoryRepository: DriveDirectoryRepository,\n    private val accountStore: AccountStore,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val accountRepository: AccountRepository,\n    private val configRepository: LocalConfigRepository,\n    private val savedStateHandle: SavedStateHandle,\n    private val directoryPagingStore: DriveDirectoryPagingStore,\n    private val filePagingStore: FilePropertyPagingStore,\n    private val filePropertyRepository: DriveFileRepository,\n    private val uriToAppFileUseCase: UriToAppFileUseCase,\n    private val userActionAppGlobalErrorHandler: UserActionAppGlobalErrorStore,\n    loggerFactory: Logger.Factory,\n    buildDriveUiState: DriveUiStateBuilder,\n) : ViewModel() {\n\n    companion object {\n        const val STATE_CURRENT_DIRECTORY_ID = \"STATE_CURRENT_DIRECTORY_ID\"\n        const val STATE_SELECTABLE_MODE = \"STATE_SELECTABLE_MODE\"\n        const val STATE_SELECTED_FILE_PROPERTY_IDS = \"STATE_SELECTED_FILE_PROPERTY_IDS\"\n    }\n\n    private val logger = loggerFactory.create(\"DriveViewModel\")\n\n    private val currentDirectoryStrId = savedStateHandle.getStateFlow<String?>(\n        STATE_CURRENT_DIRECTORY_ID,\n        null\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val currentAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val maxSelectableSize = savedStateHandle.getStateFlow<Int?>(\n        EXTRA_INT_SELECTABLE_FILE_MAX_SIZE,\n        null,\n    )\n\n    private val currentDirectory = combine(\n        currentDirectoryStrId,\n        currentAccount,\n    ) { directoryStrId, account ->\n        directoryStrId?.let { dirId ->\n            account?.let { ac ->\n                directoryRepository.findOne(DirectoryId(ac.accountId, dirId)).getOrThrow()\n            }\n        }\n    }.catch {\n        logger.error(\"currentDirectory error\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val directoriesState = directoryPagingStore.state.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init(),\n    )\n\n    private val selectedFileIds = savedStateHandle.getStateFlow<List<FileProperty.Id>>(\n        STATE_SELECTED_FILE_PROPERTY_IDS,\n        emptyList(),\n    )\n\n    private val fState = filePagingStore.state.convert {\n        filePropertyDataSource.observeIn(it ?: emptyList())\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init(),\n    )\n    private val _fileCardDropDowned = MutableStateFlow<FileProperty.Id?>(null)\n\n    private val isSelectMode = savedStateHandle.getStateFlow<Boolean>(\n        STATE_SELECTABLE_MODE,\n        false,\n    )\n\n    val isUsingGridView = configRepository.observe().map {\n        it.isDriveUsingGridView\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), false)\n\n\n    private val modes = combine(isSelectMode, maxSelectableSize, isUsingGridView) { select, size, grid ->\n        Modes(\n            isSelectMode = select,\n            maxSelectableSize = size,\n            actionMode = if (select) DriveUiState.ActionMode.Selectable else DriveUiState.ActionMode.Normal,\n            viewMode = if (grid) DriveUiState.ViewMode.Grid else DriveUiState.ViewMode.List,\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        Modes()\n    )\n\n\n    val uiState = buildDriveUiState(\n        currentAccountFlow = currentAccount,\n        currentDirectoryFlow = currentDirectory,\n        directoriesStateFlow = directoriesState,\n        filesStateFlow = fState,\n        fileCardDropDownedFlow = _fileCardDropDowned,\n        maxSelectableSizeFlow = maxSelectableSize,\n        modesFlow = modes,\n        selectedFileIdsFlow = selectedFileIds,\n        coroutineScope = viewModelScope,\n    ).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        DriveUiState()\n    )\n\n    init {\n        combine(currentAccount.filterNotNull(), currentDirectory) { ac, dir ->\n            ac to dir\n        }.onEach { (ac, dir) ->\n            refreshPagingState(ac, dir)\n        }.launchIn(viewModelScope)\n    }\n\n    fun getSelectedFileIds(): List<FileProperty.Id>? {\n        return savedStateHandle.get<List<FileProperty.Id>>(STATE_SELECTED_FILE_PROPERTY_IDS)\n    }\n\n\n    fun push(directory: Directory) {\n        savedStateHandle[STATE_CURRENT_DIRECTORY_ID] = directory.id.directoryId\n        logger.debug {\n            \"push directory:${directory.name} id:${directory.id.directoryId} parentId:${directory.parent?.id?.directoryId}\"\n        }\n    }\n\n\n    fun pop(): Boolean {\n        val currentDir = currentDirectory.value\n        val dir = currentDir?.parentId?.directoryId\n        savedStateHandle[STATE_CURRENT_DIRECTORY_ID] = dir\n\n        return currentDir != null\n    }\n\n    fun popUntil(directory: Directory?) {\n        savedStateHandle[STATE_CURRENT_DIRECTORY_ID] = directory?.id?.directoryId\n    }\n\n    fun setUsingGridView(value: Boolean) {\n        viewModelScope.launch {\n            configRepository.get().flatMapCancellableCatching { config ->\n                configRepository.save(\n                    config.copy(isDriveUsingGridView = value)\n                )\n            }.onFailure {\n                logger.error(\"setUsingGridView error value:$value\", it)\n            }\n        }\n    }\n\n    fun onFileListViewBottomReached() {\n        viewModelScope.launch {\n            filePagingStore.loadPrevious().onFailure {\n                logger.error(\"onFileListViewBottomReached error\", it)\n            }\n        }\n    }\n\n    fun onDirectoryListViewBottomReached() {\n        viewModelScope.launch {\n            directoryPagingStore.loadPrevious().onFailure {\n                logger.error(\"onDirectoryListViewBottomReached error\", it)\n            }\n        }\n    }\n\n    fun onDirectoryListRefreshed() {\n        viewModelScope.launch {\n            directoryPagingStore.clear()\n            directoryPagingStore.loadPrevious().onFailure {\n                logger.error(\"onDirectoryListRefreshed error\", it)\n            }\n        }\n    }\n\n    fun onFileListRefreshed() {\n        viewModelScope.launch {\n            filePagingStore.clear()\n            filePagingStore.loadPrevious().onFailure {\n                logger.error(\"onFileListRefreshed error\", it)\n            }\n        }\n    }\n\n\n    fun toggleNsfw(id: FileProperty.Id) {\n        viewModelScope.launch {\n            try {\n                filePropertyRepository.toggleNsfw(id)\n            } catch (e: Exception) {\n                logger.info(\"nsfwの更新に失敗しました\", e = e)\n                if (userActionAppGlobalErrorHandler.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"DriveViewModel.toggleNsfw\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"Nsfw update failed\"),\n                            e,\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                )) {\n                    toggleNsfw(id)\n                }\n\n            }\n        }\n    }\n\n\n    fun deleteFile(id: FileProperty.Id) {\n        viewModelScope.launch {\n            filePropertyRepository.delete(id).onFailure { e ->\n                logger.info(\"ファイルの削除に失敗しました\", e = e)\n                if (userActionAppGlobalErrorHandler.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"DriveViewModel.deleteFile\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"File delete failed\"),\n                            e,\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                )) {\n                    deleteFile(id)\n                }\n            }\n        }\n    }\n\n    fun updateCaption(id: FileProperty.Id, newCaption: String) {\n        viewModelScope.launch {\n\n            filePropertyRepository.update(\n                filePropertyRepository.find(id)\n                    .update(comment = newCaption)\n            ).onFailure {\n                logger.info(\"キャプションの更新に失敗しました。\", e = it)\n                if (userActionAppGlobalErrorHandler.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"DriveViewModel.updateCaption\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"Caption update failed\"),\n                            it,\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                )) {\n                    updateCaption(id, newCaption)\n                }\n            }\n        }\n    }\n\n    fun updateFileName(id: FileProperty.Id, name: String) {\n        viewModelScope.launch {\n            filePropertyRepository.update(\n                filePropertyRepository.find(id)\n                    .update(name = name)\n            ).onFailure {\n                logger.error(\"update file name failed\", it)\n                if (userActionAppGlobalErrorHandler.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"DriveViewModel.updateFileName\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"File name update failed\"),\n                            it,\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                )) {\n                    updateFileName(id, name)\n                }\n            }\n        }\n    }\n\n    fun openFileCardDropDownMenu(fileId: FileProperty.Id) {\n        _fileCardDropDowned.value = fileId\n    }\n\n    fun closeFileCardDropDownMenu() {\n        _fileCardDropDowned.value = null\n    }\n\n    fun toggleSelect(id: FileProperty.Id) {\n        val maxSelectableSize: Int? = savedStateHandle[EXTRA_INT_SELECTABLE_FILE_MAX_SIZE]\n        val newList = (savedStateHandle.get<List<FileProperty.Id>>(STATE_SELECTED_FILE_PROPERTY_IDS) ?: emptyList()).let { list ->\n            if (list.contains(id)) {\n                list - id\n            } else {\n                if (list.size >= (maxSelectableSize ?: Int.MAX_VALUE)) {\n                    list\n                } else {\n                    list + id\n                }\n            }\n        }\n        savedStateHandle[STATE_SELECTED_FILE_PROPERTY_IDS] = newList\n        if (!uiState.value.requireSelectedResult && newList.isEmpty()) {\n            savedStateHandle[STATE_SELECTABLE_MODE] = false\n        }\n    }\n\n    private fun uploadFile(file: AppFile.Local) {\n        viewModelScope.launch {\n            try {\n                val currentDir = getCurrentDirId()\n                val accountId = savedStateHandle.get<Long>(EXTRA_ACCOUNT_ID)\n                    ?: accountRepository.getCurrentAccount().getOrThrow().accountId\n                val e = filePropertyRepository.create(\n                    accountId,\n                    file.copy(folderId = currentDir)\n                ).getOrThrow()\n                filePagingStore.onCreated(e.id)\n            } catch (e: Exception) {\n                logger.info(\"ファイルアップロードに失敗した\")\n                if (userActionAppGlobalErrorHandler.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"DriveViewModel.uploadFile\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"File upload failed\"),\n                            e,\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                )) {\n                    uploadFile(file)\n                }\n            }\n        }\n    }\n\n    fun uploadFile(uri: Uri) {\n        runCancellableCatching {\n            uriToAppFileUseCase(uri)\n        }.onSuccess {\n            uploadFile(it)\n        }\n    }\n\n\n    fun createDirectory(folderName: String) {\n        if (folderName.isNotBlank()) {\n            viewModelScope.launch {\n                val accountId = savedStateHandle.get<Long>(EXTRA_ACCOUNT_ID)\n                    ?: accountRepository.getCurrentAccount().getOrNull()?.accountId\n                    ?: return@launch\n                val currentDir = getCurrentDirId()\n\n                directoryRepository.create(\n                    CreateDirectory(\n                        accountId = accountId,\n                        directoryName = folderName,\n                        parentId = currentDir,\n                    )\n                ).onFailure {\n                    logger.error(\"error create folder\", it)\n                    if (userActionAppGlobalErrorHandler.dispatchAndAwaitUserAction(\n                            AppGlobalError(\n                                \"DriveViewModel.createDirectory\",\n                                AppGlobalError.ErrorLevel.Error,\n                                StringSource(\"Folder create failed\"),\n                                it,\n                            ),\n                            UserActionAppGlobalErrorAction.Type.Retry\n                    )) {\n                        createDirectory(folderName)\n                    }\n                }.onSuccess {\n                    directoryPagingStore.onCreated(it)\n                }\n            }\n\n        }\n\n    }\n\n    fun onFileMoveToHereButtonClicked() {\n        viewModelScope.launch {\n            val currentDir = getCurrentDirId()\n            val selectedFileIds = getSelectedFileIds()\n            if (selectedFileIds.isNullOrEmpty()) {\n                return@launch\n            }\n            selectedFileIds.map { id ->\n                filePropertyRepository.update(\n                    filePropertyRepository.find(id).update(\n                        folderId = currentDir\n                    )\n                ).onFailure {\n                    logger.error(\"error move file\", it)\n                }\n            }\n            savedStateHandle[STATE_SELECTED_FILE_PROPERTY_IDS] = emptyList<FileProperty.Id>()\n            if (!uiState.value.requireSelectedResult) {\n                savedStateHandle[STATE_SELECTABLE_MODE] = false\n            }\n            refresh()\n        }\n    }\n\n    fun selectAndSelectMode(fileProperty: FileProperty) {\n        if (uiState.value.requireSelectedResult) {\n            return\n        }\n        if (uiState.value.isSelectMode) {\n            return\n        }\n        savedStateHandle[STATE_SELECTABLE_MODE] = true\n        toggleSelect(fileProperty.id)\n    }\n\n    private fun getCurrentDirId(): String? {\n        return savedStateHandle.get<String>(STATE_CURRENT_DIRECTORY_ID)\n    }\n\n    private suspend fun refreshPagingState(account: Account?, currentDirectory: Directory?) {\n        filePagingStore.setCurrentDirectory(currentDirectory)\n        directoryPagingStore.setCurrentDirectory(currentDirectory)\n\n        filePagingStore.setCurrentAccount(account)\n        directoryPagingStore.setAccount(account)\n\n        refresh()\n    }\n\n    private fun refresh() {\n        viewModelScope.launch {\n            filePagingStore.clear()\n            filePagingStore.loadPrevious().onFailure {\n                logger.error(\"refreshPagingState error\", it)\n            }\n        }\n\n        viewModelScope.launch {\n            directoryPagingStore.clear()\n            directoryPagingStore.loadPrevious().onFailure {\n                logger.error(\"refreshPagingState error\", it)\n            }\n        }\n    }\n}\n\ndata class DriveUiState(\n    val currentAccount: Account? = null,\n    val currentDirectory: Directory? = null,\n    val directoriesState: PageableState<List<Directory>> = PageableState.Loading.Init(),\n    val driveFilesState: PageableState<List<FileViewData>> = PageableState.Loading.Init(),\n    val actionMode: ActionMode = ActionMode.Normal,\n    val viewMode: ViewMode = ViewMode.List,\n    val selectedFilePropertyIds: List<FileProperty.Id> = emptyList(),\n    val maxSelectableSize: Int? = null,\n    val isSelectMode: Boolean = false,\n) {\n    enum class ActionMode {\n        Normal,\n        Selectable,\n    }\n\n    enum class ViewMode {\n        List,\n        Grid,\n    }\n\n    val requireSelectedResult: Boolean by lazy {\n        isSelectMode && maxSelectableSize != null\n    }\n\n    val canFileMove: Boolean by lazy {\n        isSelectMode && maxSelectableSize == null && selectedFilePropertyIds.isNotEmpty()\n    }\n}\n\ndata class Modes(\n    val isSelectMode: Boolean = false,\n    val maxSelectableSize: Int? = null,\n    val actionMode: DriveUiState.ActionMode = DriveUiState.ActionMode.Normal,\n    val viewMode: DriveUiState.ViewMode = DriveUiState.ViewMode.List,\n)\n\ndata class PagingState(\n    val directoriesState: PageableState<List<Directory>> = PageableState.Loading.Init(),\n    val driveFilesState: PageableState<List<FileViewData>> = PageableState.Loading.Init(),\n)"
  },
  {
    "path": "modules/features/drive/src/main/java/net/pantasystem/milktea/drive/viewmodel/FileViewData.kt",
    "content": "package net.pantasystem.milktea.drive.viewmodel\n\nimport net.pantasystem.milktea.model.drive.FileProperty\n\ndata class FileViewData(\n    val fileProperty: FileProperty,\n    val isSelected: Boolean,\n    val isEnabled: Boolean,\n    val isDropdownMenuExpanded: Boolean,\n)\n"
  },
  {
    "path": "modules/features/drive/src/main/res/layout/dialog_create_folder.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <RelativeLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\">\n        <TextView\n                android:id=\"@+id/titleView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/drive_create_folder\"\n                android:textSize=\"24sp\"\n                android:textColor=\"?android:attr/textColorPrimary\"\n                android:layout_marginBottom=\"8dp\"\n                />\n        <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/folderNameInput\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:layout_below=\"@id/titleView\"\n                style=\"?textInputOutlinedStyle\"\n                >\n            <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/editFolderName\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/drive_folder_name\"\n                    android:singleLine=\"true\"/>\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <Button\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/folderNameInput\"\n                android:id=\"@+id/cancelButton\"\n                android:layout_toStartOf=\"@id/okButton\"\n                android:layout_marginEnd=\"8dp\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                android:text=\"@android:string/cancel\"/>\n        <Button\n                android:id=\"@+id/okButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/folderNameInput\"\n                android:layout_alignParentEnd=\"true\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                android:text=\"@android:string/ok\"/>\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/favorite/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/favorite/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n\n    buildFeatures {\n        dataBinding true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.favorite'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:features:note')\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.kotlin.datetime\n\n    implementation libs.wada811.databinding\n    implementation libs.fragment.ktx\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.lifecycle.livedata\n    implementation libs.activity.ktx\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/favorite/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/favorite/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/favorite/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/favorite/src/main/java/net/pantasystem/milktea/favorite/FavoriteActivity.kt",
    "content": "package net.pantasystem.milktea.favorite\n\nimport android.os.Bundle\nimport android.view.MenuItem\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.error.UserActionAppGlobalErrorListener\nimport net.pantasystem.milktea.favorite.databinding.ActivityFavoriteBinding\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n\n@AndroidEntryPoint\nclass FavoriteActivity : AppCompatActivity() {\n\n    lateinit var mBinding: ActivityFavoriteBinding\n\n    val notesViewModel by viewModels<NotesViewModel>()\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var userActionAppGlobalErrorListener: UserActionAppGlobalErrorListener\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        userActionAppGlobalErrorListener(lifecycle, supportFragmentManager)\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_favorite)\n        setSupportActionBar(mBinding.favoriteToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(mBinding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            mBinding.favoriteToolbar.updatePadding(top = insets.top)\n            mBinding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        supportActionBar?.title = getString(R.string.favorite)\n\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n        val fragment = pageableFragmentFactory.create(\n            Pageable.Favorite\n        )\n\n        val manager = supportFragmentManager.beginTransaction()\n        manager.replace(R.id.favorite_fragment_base, fragment)\n        manager.commit()\n\n\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> finish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n}\n"
  },
  {
    "path": "modules/features/favorite/src/main/res/layout/activity_favorite.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.favorite.FavoriteActivity\">\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/favorite_toolbar\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"?attr/actionBarSize\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <FrameLayout\n                android:id=\"@+id/favorite_fragment_base\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/favorite_toolbar\">\n\n        </FrameLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/gallery/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/gallery/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n\n    }\n\n    buildFeatures {\n        dataBinding true\n        compose true\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.gallery'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_viewmodel')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.lifecycle.livedata\n\n    implementation libs.wada811.databinding\n\n\n    implementation libs.kotlin.datetime\n\n    implementation libs.fragment.ktx\n    implementation libs.activity.ktx\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/gallery/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/gallery/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/gallery/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/GalleryEditorFragment.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport android.Manifest\nimport android.app.Activity.RESULT_OK\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.core.content.ContextCompat\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.lifecycleScope\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.*\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.*\nimport net.pantasystem.milktea.gallery.viewmodel.EditType\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryEditorViewModel\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@FlowPreview\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass GalleryEditorFragment : Fragment() {\n\n    companion object {\n        fun newInstance(editType: EditType): GalleryEditorFragment {\n            return GalleryEditorFragment().also {\n                it.arguments = Bundle().also { args ->\n                    args.putSerializable(\"EDIT_TYPE\", editType)\n                }\n            }\n        }\n    }\n\n    @Inject\n    lateinit var driveFileRepository: DriveFileRepository\n\n    @Inject\n    lateinit var dataSource: FilePropertyDataSource\n\n    @Inject\n    lateinit var driveNavigation: DriveNavigation\n\n    @Inject\n    lateinit var mediaNavigation: MediaNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel: GalleryEditorViewModel by viewModels()\n\n    @Suppress(\"DEPRECATION\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val args = arguments?.getSerializable(\"EDIT_TYPE\") as? EditType ?: EditType.Create(null)\n        viewModel.setType(args)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    GalleryEditorPage(\n                        galleryEditorViewModel = viewModel,\n                        onAction = this@GalleryEditorFragment::onAction\n                    )\n                }\n            }\n        }.rootView\n    }\n\n    private fun onAction(action: GalleryEditorPageAction) {\n        when (action) {\n            is GalleryEditorPageAction.OnSave -> {\n                onSave()\n            }\n            is GalleryEditorPageAction.NavigateToMediaPreview -> {\n                val intent = mediaNavigation.newIntent(\n                    MediaNavigationArgs.Files(\n                        listOf(action.file),\n                        0\n                    )\n                )\n                requireActivity().startActivity(intent)\n            }\n            GalleryEditorPageAction.NavigateUp -> {\n                (requireActivity() as? GalleryPostsActivity)?.pop()\n            }\n            GalleryEditorPageAction.PickDriveFile -> {\n                showDrivePicker()\n            }\n            GalleryEditorPageAction.PickLocalFile -> {\n                if (!checkPermission()) {\n                    requestReadExternalStoragePermissionResultListener.launch(\n                        Manifest.permission.READ_EXTERNAL_STORAGE\n                    )\n                } else {\n                    showFilePicker()\n                }\n            }\n        }\n    }\n\n    private fun onSave() {\n        if (!viewModel.validate()) {\n            return\n        }\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewModel.save()\n            withContext(Dispatchers.Main) {\n                (requireActivity() as? GalleryPostsActivity)?.pop()\n            }\n        }\n    }\n\n\n    private fun showDrivePicker() {\n        val intent = driveNavigation.newIntent(\n            DriveNavigationArgs(\n                selectableFileMaxSize = Int.MAX_VALUE,\n            )\n        )\n        intent.action = Intent.ACTION_OPEN_DOCUMENT\n\n        driveActivityResult.launch(intent)\n    }\n\n    @Suppress(\"DEPRECATION\")\n    private val driveActivityResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n            if (it.resultCode == RESULT_OK && it.data != null) {\n                val result =\n                    it.data?.getSerializableExtra(EXTRA_SELECTED_FILE_PROPERTY_IDS) as? ArrayList<*>\n                val list = result?.mapNotNull { obj ->\n                    obj as? FileProperty.Id\n                } ?: emptyList()\n                viewModel.addFilePropertyIds(list)\n\n            }\n        }\n\n    private fun checkPermission(): Boolean {\n        val permissionCheck = ContextCompat.checkSelfPermission(\n            requireContext(),\n            Manifest.permission.READ_EXTERNAL_STORAGE\n        )\n        return permissionCheck == PackageManager.PERMISSION_GRANTED\n    }\n\n    private val pickFileResultListener =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n            val uri = it.data?.data\n            if (uri != null) {\n                viewModel.addFile(uri)\n            }\n        }\n\n    private fun showFilePicker() {\n        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)\n        intent.type = \"image/*\"\n        intent.addCategory(Intent.CATEGORY_OPENABLE)\n        pickFileResultListener.launch(intent)\n    }\n\n    private val requestReadExternalStoragePermissionResultListener =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) {\n            if (it) {\n                showFilePicker()\n            }\n        }\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/GalleryEditorPage.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.Cloud\nimport androidx.compose.material.icons.filled.PhotoAlbum\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_compose.SwitchTile\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryEditorViewModel\nimport net.pantasystem.milktea.model.file.FilePreviewSource\n\nsealed interface GalleryEditorPageAction {\n    object NavigateUp : GalleryEditorPageAction\n    data class NavigateToMediaPreview(val file: FilePreviewSource) : GalleryEditorPageAction\n    object PickDriveFile : GalleryEditorPageAction\n    object PickLocalFile : GalleryEditorPageAction\n    object OnSave : GalleryEditorPageAction\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun GalleryEditorPage(\n    galleryEditorViewModel: GalleryEditorViewModel,\n    onAction: (GalleryEditorPageAction) -> Unit\n) {\n\n    val state by galleryEditorViewModel.state.collectAsState()\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeContent,\n        topBar = {\n            TopAppBar(\n                title = {\n                    Text(text = stringResource(id = R.string.create_gallery))\n                },\n                navigationIcon = {\n                    IconButton(onClick = { onAction.invoke(GalleryEditorPageAction.NavigateUp) }) {\n                        Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = \"Back\")\n                    }\n                }\n            )\n        }\n    ) {\n\n        Column(\n            Modifier\n                .padding(it)\n                .fillMaxSize()\n        ) {\n            LazyColumn(\n                Modifier\n                    .padding(16.dp)\n                    .fillMaxHeight()\n                    .weight(1f)\n            ) {\n                item {\n                    Text(stringResource(id = R.string.gallery_pick_image))\n\n                    if (state.pickedImages.isNotEmpty()) {\n                        PickedImagePreview(\n                            viewModel = galleryEditorViewModel,\n                            onShow = { file ->\n                                onAction.invoke(GalleryEditorPageAction.NavigateToMediaPreview(file))\n                            }\n                        )\n                    }\n\n                    Button(onClick = { onAction.invoke(GalleryEditorPageAction.PickDriveFile) }) {\n                        Icon(Icons.Default.Cloud, contentDescription = null)\n                        Text(\n                            textAlign = TextAlign.Center,\n                            modifier = Modifier.fillMaxWidth(),\n                            text = stringResource(id = R.string.gallery_pick_image_from_device)\n                        )\n                    }\n                    Button(onClick = { onAction.invoke(GalleryEditorPageAction.PickLocalFile) }) {\n                        Icon(Icons.Default.PhotoAlbum, contentDescription = null)\n                        Text(\n                            textAlign = TextAlign.Center,\n                            modifier = Modifier.fillMaxWidth(),\n                            text = stringResource(id = R.string.gallery_pick_image_from_drive)\n                        )\n                    }\n\n                    Spacer(modifier = Modifier.height(8.dp))\n\n                    OutlinedTextField(\n                        modifier = Modifier.fillMaxWidth(),\n                        value = state.title,\n                        label = {\n                            Text(stringResource(id = R.string.title))\n                        },\n                        onValueChange = { title ->\n                            galleryEditorViewModel.setTitle(title)\n                        },\n                        maxLines = 1\n                    )\n\n                    Spacer(modifier = Modifier.height(8.dp))\n\n                    OutlinedTextField(\n                        modifier = Modifier.fillMaxWidth(),\n                        value = state.description ?: \"\",\n                        label = {\n                            Text(stringResource(id = R.string.description))\n                        },\n                        onValueChange = { text ->\n                            galleryEditorViewModel.setDescription(text)\n                        }\n                    )\n\n                    Spacer(modifier = Modifier.height(8.dp))\n\n                    SwitchTile(\n                        checked = state.isSensitive,\n                        onChanged = {\n                            galleryEditorViewModel.toggleSensitive()\n                        },\n                        modifier = Modifier.fillMaxWidth()\n                    ) {\n                        Text(text = stringResource(id = R.string.sensitive))\n                    }\n                }\n\n            }\n\n            Row(\n                Modifier\n                    .fillMaxWidth()\n                    .padding(start = 16.dp, end = 16.dp),\n                horizontalArrangement = Arrangement.End\n            ) {\n                Button(onClick = { onAction.invoke(GalleryEditorPageAction.OnSave) }) {\n                    Text(stringResource(id = R.string.save))\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/GalleryPostCard.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.pager.HorizontalPager\nimport androidx.compose.foundation.pager.rememberPagerState\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.ui.draw.clip\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.FavoriteButton\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryPostUiState\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.make\n\n\nsealed interface GalleryPostCardAction {\n    val galleryPost: GalleryPost\n\n    data class OnAvatarIconClicked(override val galleryPost: GalleryPost) : GalleryPostCardAction\n    data class OnThumbnailClicked(\n        override val galleryPost: GalleryPost,\n        val fileProperty: FileProperty,\n        val files: List<FileProperty>,\n        val index: Int,\n    ) : GalleryPostCardAction\n\n    data class OnFavoriteButtonClicked(override val galleryPost: GalleryPost, val value: Boolean) :\n        GalleryPostCardAction\n}\n\n@Composable\nfun GalleryPostCard(\n    galleryState: GalleryPostUiState,\n    visibleFileIds: Set<FileProperty.Id>,\n    onAction: (GalleryPostCardAction) -> Unit,\n) {\n    val pagerState = rememberPagerState(pageCount = { galleryState.files.size })\n\n\n    Card(\n        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),\n        modifier = Modifier.padding(8.dp),\n        shape = RoundedCornerShape(16.dp),\n    ) {\n        Column(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(top = 8.dp, bottom = 8.dp)\n        ) {\n            Row(\n                verticalAlignment = Alignment.CenterVertically,\n                modifier = Modifier.padding(start = 8.dp, end = 8.dp)\n            ) {\n                AvatarIcon(\n                    url = galleryState.user.avatarUrl,\n                    size = 50.dp,\n                    onAvatarClick = {\n                        onAction.invoke(\n                            GalleryPostCardAction.OnAvatarIconClicked(\n                                galleryState.galleryPost\n                            )\n                        )\n\n                    },\n                    modifier = Modifier.padding(4.dp),\n                )\n                Spacer(modifier = Modifier.width(4.dp))\n                Column {\n                    Text(\n                        galleryState.user.displayName,\n                        maxLines = 1,\n                    )\n                    Text(\n                        galleryState.user.displayUserName,\n                        maxLines = 1,\n                    )\n                }\n\n            }\n            Spacer(Modifier.height(4.dp))\n            HorizontalPager(\n                state = pagerState,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .height(250.dp)\n            ) { page ->\n                ThumbnailPreview(file = galleryState.files[page], visibleFileIds = visibleFileIds) {\n                    onAction.invoke(\n                        GalleryPostCardAction.OnThumbnailClicked(\n                            galleryState.galleryPost,\n                            galleryState.files[page],\n                            galleryState.files,\n                            page,\n                        )\n                    )\n                }\n            }\n            Row(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(top = 4.dp, bottom = 4.dp),\n                horizontalArrangement = Arrangement.Center,\n            ) {\n                repeat(pagerState.pageCount) { index ->\n                    Box(\n                        modifier = Modifier\n                            .padding(horizontal = 2.dp)\n                            .size(8.dp)\n                            .clip(CircleShape)\n                            .background(\n                                if (pagerState.currentPage == index) MaterialTheme.colorScheme.primary\n                                else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.3f)\n                            )\n                    )\n                }\n            }\n            Row(\n                Modifier\n                    .fillMaxWidth()\n                    .padding(start = 8.dp, end = 8.dp),\n                verticalAlignment = Alignment.Bottom\n            ) {\n                Column(\n                    modifier = Modifier.weight(1f),\n                    verticalArrangement = Arrangement.Center\n                ) {\n                    Text(\n                        galleryState.galleryPost.title,\n                        modifier = Modifier.fillMaxWidth(),\n                        fontSize = 20.sp\n                    )\n                    if (!galleryState.galleryPost.description.isNullOrBlank()) {\n                        Text(galleryState.galleryPost.description ?: \"\")\n                    }\n                }\n\n                if (galleryState.galleryPost is GalleryPost.Authenticated) {\n                    FavoriteButton(isFavorite = galleryState.galleryPost.isLiked, onClick = {\n                        onAction.invoke(\n                            GalleryPostCardAction.OnFavoriteButtonClicked(\n                                galleryState.galleryPost,\n                                !galleryState.galleryPost.isLiked,\n                            )\n                        )\n                    })\n                }\n            }\n\n        }\n    }\n}\n\n@Preview\n@Composable\nfun PreviewGalleryPostCard() {\n    GalleryPostCard(\n        galleryState = GalleryPostUiState(\n            galleryPost = GalleryPost.Authenticated(\n                id = GalleryPost.Id(0L, \"id\"),\n                createdAt = Clock.System.now(),\n                updatedAt = Clock.System.now(),\n                description = \"hogehoge\",\n                fileIds = listOf(),\n                isLiked = true,\n                isSensitive = false,\n                likedCount = 10,\n                tags = emptyList(),\n                title = \"ギャラリーかも\",\n                userId = User.Id(0L, \"userId\")\n            ),\n            files = listOf(\n                FileProperty(\n                    FileProperty.Id(0L, \"1\"),\n                    createdAt = Clock.System.now(),\n                    md5 = \"\",\n                    thumbnailUrl = \"\",\n                    name = \"test\",\n                    size = 500,\n                    type = \"image/png\",\n                    url = \"\"\n                ),\n                FileProperty(\n                    FileProperty.Id(0L, \"1\"),\n                    createdAt = Clock.System.now(),\n                    md5 = \"\",\n                    thumbnailUrl = \"\",\n                    name = \"test\",\n                    size = 500,\n                    type = \"image/png\",\n                    url = \"\"\n                ),\n                FileProperty(\n                    FileProperty.Id(0L, \"1\"),\n                    createdAt = Clock.System.now(),\n                    md5 = \"\",\n                    thumbnailUrl = \"\",\n                    name = \"test\",\n                    size = 500,\n                    type = \"image/png\",\n                    url = \"\"\n                ),\n                FileProperty(\n                    FileProperty.Id(0L, \"1\"),\n                    createdAt = Clock.System.now(),\n                    md5 = \"\",\n                    thumbnailUrl = \"\",\n                    name = \"test\",\n                    size = 500,\n                    type = \"image/png\",\n                    url = \"\"\n                )\n            ),\n            currentIndex = 0,\n            isFavoriteSending = false,\n            user = User.Simple.make(\n                id = User.Id(0, \"test\"),\n                name = \"harunon\",\n                userName = \"harunonsysytem\"\n            )\n        ),\n        onAction = {}, visibleFileIds = emptySet()\n    )\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/GalleryPostCardList.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.ui.isScrolledToTheEnd\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryPostsViewModel\n\n@OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class)\n@Composable\nfun GalleryPostCardList(\n    viewModel: GalleryPostsViewModel,\n    onAction: (GalleryPostCardAction) -> Unit\n) {\n    val listViewState = rememberLazyListState()\n    val visibleFileIds by viewModel.visibleFileIds.collectAsState()\n\n    LaunchedEffect(key1 = null) {\n        viewModel.loadInit()\n    }\n\n    LaunchedEffect(key1 = null) {\n        snapshotFlow {\n            listViewState.isScrolledToTheEnd() && listViewState.layoutInfo.totalItemsCount != listViewState.layoutInfo.visibleItemsInfo.size\n        }.distinctUntilChanged().onEach {\n            if (it) {\n                viewModel.loadPrevious()\n            }\n        }.launchIn(this)\n    }\n\n    val state by viewModel.galleryPosts.collectAsState()\n\n    val content = state.content\n    PullToRefreshBox(\n        modifier = Modifier\n            .fillMaxSize()\n            .nestedScroll(rememberNestedScrollInteropConnection()),\n        isRefreshing = state is PageableState.Loading.Init,\n        onRefresh = {\n            viewModel.loadInit()\n        }\n    ) {\n        if (content is StateContent.Exist) {\n\n            LazyColumn(\n                modifier = Modifier\n                    .fillMaxSize(),\n                state = listViewState,\n            ) {\n                items(content.rawContent) { post ->\n                    GalleryPostCard(\n                        galleryState = post,\n                        onAction = {\n                            if (\n                                it is GalleryPostCardAction.OnThumbnailClicked\n                                && (!visibleFileIds.contains(it.fileProperty.id) && it.fileProperty.isSensitive)\n                            ) {\n                                viewModel.toggleFileVisibleState(it.fileProperty.id)\n                            } else {\n                                onAction.invoke(it)\n                            }\n                        },\n                        visibleFileIds = visibleFileIds\n                    )\n                }\n                if (state is PageableState.Loading.Previous) {\n                    item {\n                        Box(\n                            Modifier.fillMaxWidth(),\n                            contentAlignment = Alignment.Center\n                        ) {\n                            CircularProgressIndicator()\n                        }\n                    }\n                }\n            }\n        } else {\n            Box(Modifier.fillMaxSize()) {\n                when (state) {\n\n                    is PageableState.Loading -> {\n                        Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {\n                            CircularProgressIndicator()\n                        }\n                    }\n                    is PageableState.Error -> {\n                        Text(\"Load error\")\n                    }\n                    is PageableState.Fixed -> {\n                        Text(\"No contents\")\n                    }\n                }\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/GalleryPostTabFragment.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.activityViewModels\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport net.pantasystem.milktea.gallery.databinding.FragmentGalleryPostTabBinding\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryPostActionViewModel\nimport net.pantasystem.milktea.model.account.page.Pageable\n\n@AndroidEntryPoint\nclass GalleryPostTabFragment : Fragment(R.layout.fragment_gallery_post_tab){\n\n    val binding: FragmentGalleryPostTabBinding by dataBinding()\n    private val actionViewModel: GalleryPostActionViewModel by activityViewModels()\n\n    @OptIn(ExperimentalCoroutinesApi::class, FlowPreview::class)\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val appCompatActivity = (requireActivity() as AppCompatActivity)\n        appCompatActivity.setSupportActionBar(binding.toolbar)\n        appCompatActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        binding.galleryTab.setupWithViewPager(binding.viewPager)\n\n        val adapter = GalleryPostTabPagerAdapter(\n            listOf(\n                Pageable.Gallery.Posts,\n                Pageable.Gallery.ILikedPosts,\n                Pageable.Gallery.MyPosts\n            ),\n            listOf(\n                getString(R.string.gallery),\n                getString(R.string.my_liking),\n                getString(R.string.my_posts),\n            ),\n            childFragmentManager\n        )\n        binding.viewPager.adapter = adapter\n\n\n        binding.fab.setOnClickListener {\n            actionViewModel.showEditor()\n        }\n\n    }\n\n\n}\n\n@FlowPreview\n@ExperimentalCoroutinesApi\n@Suppress(\"DEPRECATION\")\nclass GalleryPostTabPagerAdapter(\n    val tabs: List<Pageable.Gallery>,\n    private val pageTitles: List<String>,\n    fragmentManager: FragmentManager\n) : androidx.fragment.app.FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n\n    init {\n        assert(tabs.size == pageTitles.size) {\n            \"与えられたタブ数(${tabs.size})と、タイトルの数(${pageTitles.size})が一致しません\"\n        }\n    }\n\n    override fun getCount(): Int {\n        return tabs.size\n    }\n\n    override fun getItem(position: Int): Fragment {\n        return GalleryPostsFragment.newInstance(tabs[position], null)\n    }\n\n    override fun getPageTitle(position: Int): CharSequence {\n        return pageTitles[position]\n    }\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/GalleryPostsActivity.kt",
    "content": "package net.pantasystem.milktea.gallery\n\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.MenuItem\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.gallery.databinding.ActivityGalleryPostsBinding\nimport net.pantasystem.milktea.gallery.viewmodel.Action\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryPostActionViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass GalleryPostsActivity : AppCompatActivity() {\n\n\n\n    val binding: ActivityGalleryPostsBinding by dataBinding()\n    private val actionViewModel: GalleryPostActionViewModel by viewModels()\n\n    @Inject\n    lateinit var setTheme: ApplyTheme\n\n    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setTheme.invoke()\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_gallery_posts)\n\n        val action = intent.action ?: Intent.ACTION_VIEW\n\n        val ft = supportFragmentManager.beginTransaction()\n        if(action == Intent.ACTION_EDIT) {\n            ft.replace(R.id.base, GalleryEditorFragment())\n        }else{\n            ft.replace(R.id.base, GalleryPostTabFragment())\n        }\n        ft.commit()\n\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                actionViewModel.viewAction.collect {\n                    when(it) {\n                        is Action.OpenCreationEditor -> {\n                            Log.d(\"GalleryPostsActivity\", \"アクションがあった\")\n                            val t = supportFragmentManager.beginTransaction()\n                            t.replace(R.id.base, GalleryEditorFragment())\n                            t.addToBackStack(null)\n                            t.commit()\n                        }\n                    }\n                }\n            }\n\n        }\n\n\n    }\n\n\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when(item.itemId){\n            android.R.id.home ->{\n                pop()\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    fun pop() {\n        if(supportFragmentManager.backStackEntryCount > 0) {\n            Log.d(\"count\", \"backStackEntryCount:${supportFragmentManager.backStackEntryCount}\")\n            supportFragmentManager.popBackStack()\n        }else{\n            finish()\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/GalleryPostsFragment.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Toast\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.ViewCompositionStrategy\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.ErrorType\nimport net.pantasystem.milktea.common.MisskeyErrorCodes\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.*\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryPostsViewModel\nimport net.pantasystem.milktea.gallery.viewmodel.provideFactory\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass GalleryPostsFragment : Fragment() {\n\n    companion object {\n        private const val EXTRA_ACCOUNT_ID = \"jp.panta.misskeyandroidclient.view.gallery.ACCOUNT_ID\"\n        private const val EXTRA_PAGEABLE =\n            \"jp.panta.misskeyandroidclient.view.gallery.EXTRA_PAGEABLE\"\n\n        fun newInstance(pageable: Pageable.Gallery, accountId: Long?): GalleryPostsFragment {\n            return GalleryPostsFragment().apply {\n                arguments = Bundle().also {\n                    it.putSerializable(EXTRA_PAGEABLE, pageable)\n                    if (accountId != null) {\n                        it.putLong(EXTRA_ACCOUNT_ID, accountId)\n                    }\n                }\n            }\n        }\n    }\n\n\n    val pageable: Pageable.Gallery by lazy {\n        arguments?.getSerializable(EXTRA_PAGEABLE) as Pageable.Gallery\n    }\n\n    private val currentTimelineViewModel: CurrentPageableTimelineViewModel by activityViewModels()\n\n    @Inject\n    lateinit var viewModelFactory: GalleryPostsViewModel.ViewModelAssistedFactory\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n\n    @Inject\n    lateinit var mediaNavigation: MediaNavigation\n\n    @Inject\n    lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n\n    private val accountId: Long? by lazy {\n        arguments?.getLong(EXTRA_ACCOUNT_ID, -1)?.takeIf {\n            it > 0\n        }\n    }\n\n    val viewModel: GalleryPostsViewModel by viewModels {\n        val pageable = arguments?.getSerializable(EXTRA_PAGEABLE) as Pageable.Gallery\n        GalleryPostsViewModel.provideFactory(viewModelFactory, pageable, accountId)\n    }\n\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return ComposeView(requireContext()).apply {\n            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    GalleryPostCardList(\n                        viewModel = viewModel,\n                        onAction = {\n                            when (it) {\n                                is GalleryPostCardAction.OnFavoriteButtonClicked -> {\n                                    viewModel.toggleFavorite(it.galleryPost.id)\n                                }\n                                is GalleryPostCardAction.OnThumbnailClicked -> {\n                                    startActivity(\n                                        mediaNavigation.newIntent(\n                                            MediaNavigationArgs.Files(\n                                                files = it.files.map { property ->\n                                                    FilePreviewSource.Remote(\n                                                        AppFile.Remote(property.id),\n                                                        property\n                                                    )\n                                                },\n                                                index = it.index\n                                            )\n                                        )\n                                    )\n                                }\n                                is GalleryPostCardAction.OnAvatarIconClicked -> {\n                                    startActivity(\n                                        userDetailNavigation.newIntent(\n                                            UserDetailNavigationArgs.UserId(\n                                                it.galleryPost.userId\n                                            )\n                                        )\n                                    )\n                                }\n                            }\n                        }\n                    )\n                }\n            }\n        }\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                viewModel.error.collect {\n                    if (it is APIError.ClientException && (it.error as? ErrorType.Misskey)?.errorCodeeType == MisskeyErrorCodes.PermissionDenied) {\n                        Toast.makeText(requireContext(), \"再認証が必要です。\", Toast.LENGTH_LONG).show()\n                        // 再認証をする\n                        startActivity(authorizationNavigation.newIntent(AuthorizationArgs.New))\n                    }\n                }\n            }\n        }\n\n\n    }\n\n    override fun onResume() {\n        super.onResume()\n        currentTimelineViewModel.setCurrentPageable(accountId, pageable)\n    }\n\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/PickedImagePreview.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport net.pantasystem.milktea.common_compose.HorizontalFilePreviewList\nimport net.pantasystem.milktea.gallery.viewmodel.GalleryEditorViewModel\nimport net.pantasystem.milktea.model.file.FilePreviewSource\n\n@Composable\nfun PickedImagePreview(\n    viewModel: GalleryEditorViewModel,\n    onShow: (FilePreviewSource) -> Unit,\n) {\n    val files = viewModel.pickedImages.collectAsState()\n    HorizontalFilePreviewList(\n        files = files.value,\n        onShow = {\n            onShow(it)\n        },\n        onToggleSensitive = {\n            viewModel.toggleSensitive(it.file)\n        },\n        onDetach = {\n            viewModel.detach(it.file)\n        }\n    )\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/ThumbnailPreview.kt",
    "content": "package net.pantasystem.milktea.gallery\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.PlayCircleOutline\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.res.stringResource\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.model.drive.FileProperty\n\n@Composable\nfun ThumbnailPreview(\n    file: FileProperty,\n    modifier: Modifier = Modifier,\n    visibleFileIds: Set<FileProperty.Id>,\n    onClick: () -> Unit,\n) {\n\n    val isVisible = visibleFileIds.contains(file.id) || !file.isSensitive\n    Box(\n        modifier = modifier.clickable(onClick = onClick).fillMaxSize(),\n        contentAlignment = Alignment.Center\n    ) {\n        if(!isVisible) {\n            Text(stringResource(R.string.gallery_sensitive_content))\n        }\n        \n\n        if(isVisible) {\n            Image(\n                painter = rememberAsyncImagePainter(\n                    file.thumbnailUrl ?: \"\",\n                ),\n                contentDescription = null,\n                contentScale = ContentScale.Crop,\n                modifier = modifier.fillMaxSize(),\n            )\n        }\n\n        if(file.type.startsWith(\"video\")) {\n            Image(\n                Icons.Default.PlayCircleOutline,\n                contentDescription = null,\n                contentScale = ContentScale.Fit,\n                modifier = modifier.fillMaxSize(),\n            )\n        }\n\n\n    }\n\n}\n"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/viewmodel/GalleryEditorViewModel.kt",
    "content": "package net.pantasystem.milktea.gallery.viewmodel\n\nimport android.net.Uri\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.CreateGalleryTaskExecutor\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.file.UriToAppFileUseCase\nimport net.pantasystem.milktea.model.gallery.CreateGalleryPost\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.gallery.GalleryRepository\nimport net.pantasystem.milktea.model.gallery.toTask\nimport java.io.Serializable\nimport javax.inject.Inject\n\n\nsealed class EditType : Serializable {\n    data class Update(\n        val postId: GalleryPost.Id\n    ) : EditType()\n\n    data class Create(\n        val accountId: Long?\n    ) : EditType()\n}\n\ndata class GalleryEditorUiState(\n    val type: EditType,\n    val title: String = \"\",\n    val description: String? = null,\n    val pickedImages: List<AppFile> = emptyList(),\n    val isSensitive: Boolean = false,\n) {\n\n    fun validate(): Boolean {\n        return this.pickedImages.isNotEmpty() && this.title.isNotBlank()\n    }\n\n    fun detach(file: AppFile): GalleryEditorUiState {\n        return copy(\n            pickedImages = pickedImages.filterNot { f ->\n                f == file\n            }\n        )\n    }\n\n}\n\n@HiltViewModel\nclass GalleryEditorViewModel @Inject constructor(\n    private val galleryRepository: GalleryRepository,\n    val filePropertyDataSource: FilePropertyDataSource,\n    val accountRepository: AccountRepository,\n    private val taskExecutor: CreateGalleryTaskExecutor,\n    val driveFileRepository: DriveFileRepository,\n    private val uriToAppFileUseCase: UriToAppFileUseCase,\n    loggerFactory: Logger.Factory,\n) : ViewModel() {\n\n\n    companion object;\n\n    private val _state = MutableStateFlow(\n        GalleryEditorUiState(\n            type = EditType.Create(accountId = null),\n        )\n    )\n\n    val state: StateFlow<GalleryEditorUiState> = _state\n\n    val logger = loggerFactory.create(\"GalleryEditorVM\")\n\n    val pickedImages = state.map {\n        it.pickedImages.map { appFile ->\n            when (appFile) {\n                is AppFile.Local -> FilePreviewSource.Local(appFile)\n                is AppFile.Remote -> FilePreviewSource.Remote(\n                    appFile,\n                    fileProperty = driveFileRepository.find(appFile.id)\n                )\n            }\n        }\n    }.catch {\n        logger.error(\"ファイル取得失敗\", it)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())\n\n\n    init {\n\n        viewModelScope.launch {\n            state.map {\n                it.type\n            }.distinctUntilChanged().map {\n                when (it) {\n                    is EditType.Update -> {\n                        val gallery = galleryRepository.find(it.postId)\n                        val files = filePropertyDataSource.findIn(gallery.fileIds).getOrNull()\n                        state.value.copy(\n                            title = gallery.title,\n                            description = gallery.description,\n                            isSensitive = gallery.isSensitive,\n                            pickedImages = files?.map { file -> file.id }?.map { fileId ->\n                                AppFile.Remote(fileId)\n                            } ?: emptyList(),\n                        )\n                    }\n                    is EditType.Create -> {\n                        GalleryEditorUiState(type = it)\n                    }\n                }\n            }.catch { error ->\n                logger.error(\"致命的なエラーが発生\", error)\n            }.collect { newState ->\n                _state.update {\n                    newState\n                }\n            }\n        }\n    }\n\n    fun setType(type: EditType) {\n        _state.update {\n            it.copy(\n                type = type\n            )\n        }\n    }\n\n    fun detach(file: AppFile) {\n        _state.update {\n            it.detach(file)\n        }\n    }\n\n    fun toggleSensitive(file: AppFile) {\n        when (file) {\n            is AppFile.Local -> {\n\n                _state.update { state ->\n                    state.copy(\n                        pickedImages = state.pickedImages.map {\n                            if (it === file) {\n                                it.copy(isSensitive = !file.isSensitive)\n                            } else {\n                                it\n                            }\n                        }\n                    )\n                }\n            }\n            is AppFile.Remote -> {\n                viewModelScope.launch {\n                    runCancellableCatching {\n                        driveFileRepository.toggleNsfw(file.id)\n                    }.onFailure {\n                        logger.info(\"sensitiveの切り替えに失敗しました。\", e = it)\n                    }\n                }\n            }\n        }\n    }\n\n\n    fun addFilePropertyIds(ids: List<FileProperty.Id>) {\n        viewModelScope.launch {\n            filePropertyDataSource.findIn(ids).onSuccess { files ->\n                _state.update { state ->\n                    val list = state.pickedImages.toMutableList().also { list ->\n                        list.addAll(\n                            files.map {\n                                AppFile.Remote(it.id)\n                            }\n                        )\n                    }\n                    state.copy(\n                        pickedImages = list\n                    )\n                }\n            }\n\n        }\n    }\n\n    fun addFile(file: AppFile) {\n        _state.update { state ->\n            state.copy(\n                pickedImages = state.pickedImages.toMutableList().also { mutable ->\n                    mutable.add(file)\n                }\n            )\n        }\n    }\n\n    fun addFile(uri: Uri) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                uriToAppFileUseCase(uri)\n            }.onSuccess { appFile ->\n                addFile(appFile)\n            }.onFailure {\n                logger.error(\"ファイルの追加に失敗しました。\", it)\n            }\n        }\n    }\n\n    fun validate(): Boolean {\n        return this.state.value.validate()\n    }\n\n    fun setTitle(text: String?) {\n        _state.update {\n            it.copy(title = text ?: \"\")\n        }\n    }\n\n    fun setDescription(text: String?) {\n        _state.update {\n            it.copy(description = text)\n        }\n    }\n\n    fun toggleSensitive() {\n        _state.update {\n            it.copy(isSensitive = !it.isSensitive)\n        }\n    }\n\n    suspend fun save() {\n        val files = state.value.pickedImages\n        val title = state.value.title\n        val description = state.value.description ?: \"\"\n        val isSensitive = state.value.isSensitive\n        if (validate()) {\n            val create = CreateGalleryPost(\n                title,\n                getAccount(),\n                files,\n                description,\n                isSensitive\n            )\n            taskExecutor.dispatch(create.toTask(galleryRepository))\n        }\n\n    }\n\n    private var _accountId: Long? = null\n    private val _accountLock = Mutex()\n\n\n    private suspend fun getAccount(): Account {\n        _accountLock.withLock {\n            if (_accountId == null) {\n                return accountRepository.getCurrentAccount().getOrThrow().also {\n                    _accountId = it.accountId\n                }\n            }\n            return accountRepository.get(_accountId!!).getOrThrow()\n        }\n    }\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/viewmodel/GalleryFavoriteable.kt",
    "content": "package net.pantasystem.milktea.gallery.viewmodel\n\nimport net.pantasystem.milktea.model.gallery.GalleryPost\n\ninterface GalleryToggleLikeOrUnlike  {\n\n    suspend fun toggle(galleryId: GalleryPost.Id)\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/viewmodel/GalleryPostActionViewModel.kt",
    "content": "package net.pantasystem.milktea.gallery.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\n\n\nsealed class Action {\n    object OpenCreationEditor : Action()\n}\n\nclass GalleryPostActionViewModel : ViewModel() {\n\n    private val _viewAction = MutableSharedFlow<Action>(extraBufferCapacity = 10)\n    val viewAction = _viewAction.asSharedFlow()\n\n\n    fun showEditor() {\n        _viewAction.tryEmit(Action.OpenCreationEditor)\n    }\n}"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/viewmodel/GalleryPostUiState.kt",
    "content": "package net.pantasystem.milktea.gallery.viewmodel\n\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.user.User\n\ndata class GalleryPostUiState(\n    val galleryPost: GalleryPost,\n    val files: List<FileProperty>,\n    val user: User,\n    val currentIndex: Int,\n    val isFavoriteSending: Boolean\n)\n"
  },
  {
    "path": "modules/features/gallery/src/main/java/net/pantasystem/milktea/gallery/viewmodel/GalleryPostsViewModel.kt",
    "content": "@file:Suppress(\"UNCHECKED_CAST\")\n\npackage net.pantasystem.milktea.gallery.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.app_store.gallery.GalleryPostSendFavoriteStore\nimport net.pantasystem.milktea.app_store.gallery.GalleryPostsStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryDataSource\nimport net.pantasystem.milktea.model.gallery.GalleryPost\nimport net.pantasystem.milktea.model.gallery.GalleryPostRelation\nimport net.pantasystem.milktea.model.gallery.GalleryRepository\nimport net.pantasystem.milktea.model.user.UserRepository\n\nclass GalleryPostsViewModel @AssistedInject constructor(\n\n    private val galleryDataSource: GalleryDataSource,\n    galleryRepository: GalleryRepository,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val userRepository: UserRepository,\n    private val accountRepository: AccountRepository,\n    private val galleryPostsStoreFactory: GalleryPostsStore.Factory,\n    private val loggerFactory: Logger.Factory,\n    @Assisted val pageable: Pageable.Gallery,\n    @Assisted private var accountId: Long?,\n) : ViewModel(), GalleryToggleLikeOrUnlike {\n\n\n    @AssistedFactory\n    interface ViewModelAssistedFactory {\n\n        fun create(pageable: Pageable.Gallery, accountId: Long?): GalleryPostsViewModel\n    }\n    companion object;\n\n    private val logger by lazy {\n        loggerFactory.create(\"GalleryPostsViewModel\")\n    }\n\n    private val galleryPostsStore: GalleryPostsStore by lazy {\n        galleryPostsStoreFactory.create(pageable, this::getAccount)\n    }\n\n    private val _galleryPosts =\n        MutableStateFlow<PageableState<List<GalleryPostUiState>>>(\n            PageableState.Fixed(\n                StateContent.NotExist()))\n    val galleryPosts: StateFlow<PageableState<List<GalleryPostUiState>>> = _galleryPosts\n    private val lock = Mutex()\n\n    private val galleryPostSendFavoriteStore =\n        GalleryPostSendFavoriteStore(galleryRepository)\n\n    private val _error = MutableSharedFlow<Throwable>(\n        extraBufferCapacity = 100,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n    val error: Flow<Throwable> = _error\n\n    private val currentIndexes = MutableStateFlow<Map<GalleryPost.Id, Int>>(emptyMap())\n\n    private val _visibleFileIds = MutableStateFlow<Set<FileProperty.Id>>(emptySet())\n    val visibleFileIds: StateFlow<Set<FileProperty.Id>>\n        get() = _visibleFileIds\n\n    init {\n        galleryDataSource.events().mapNotNull {\n            it as? GalleryDataSource.Event.Deleted\n        }.onEach { ev ->\n            lock.withLock {\n                val state = _galleryPosts.value\n                val content = state.content\n                if (content is StateContent.Exist) {\n                    _galleryPosts.value = PageableState.Fixed(\n                        content.copy(\n                            content.rawContent.filterNot {\n                                it.galleryPost.id == ev.galleryPostId\n                            }\n                        )\n                    )\n                }\n            }\n        }.launchIn(viewModelScope + Dispatchers.IO)\n        loadInit()\n    }\n\n    init {\n\n\n        val relations = combine(galleryPostsStore.state, galleryDataSource.state) { it, _ ->\n            it.suspendConvert {\n                coroutineScope {\n                    it.map { id ->\n                        async {\n                            galleryDataSource.find(id).getOrNull()\n                        }\n\n                    }.awaitAll().filterNotNull().map { post ->\n                        post to filePropertyDataSource.findIn(post.fileIds).getOrElse { emptyList() }\n                    }.filter { postWithFiles ->\n                        postWithFiles.second.isNotEmpty()\n                    }.map { postWithFiles ->\n                        GalleryPostRelation(\n                            postWithFiles.first,\n                            filePropertyDataSource.findIn(postWithFiles.first.fileIds).getOrElse { emptyList() },\n                            userRepository.find(postWithFiles.first.userId, false)\n                        )\n                    }\n                }\n            }\n        }\n\n        combine(\n            relations,\n            currentIndexes,\n            galleryPostSendFavoriteStore.state,\n        ) { posts, indexes, sends ->\n            posts.convert {\n                it.map { relation ->\n                    GalleryPostUiState(\n                        galleryPost = relation.galleryPost,\n                        files = relation.files,\n                        user = relation.user,\n                        currentIndex = indexes[relation.galleryPost.id] ?: 0,\n                        isFavoriteSending = sends.contains(relation.galleryPost.id),\n                    )\n                }\n            }\n        }.onEach {\n            _galleryPosts.value = it\n            if (it is PageableState.Error) {\n                _error.emit(it.throwable)\n            }\n        }.launchIn(viewModelScope + Dispatchers.IO)\n\n\n    }\n\n    fun loadInit() {\n        if (galleryPostsStore.mutex.isLocked) {\n            return\n        }\n        viewModelScope.launch {\n            galleryPostsStore.clear()\n            galleryPostsStore.loadPrevious().onFailure {\n                logger.error(\"failed loadInit\", it)\n            }\n        }\n    }\n\n//    fun loadFuture() {\n//        if (galleryPostsStore.mutex.isLocked) {\n//            return\n//        }\n//        viewModelScope.launch(Dispatchers.IO) {\n//            galleryPostsStore.loadFuture()\n//        }\n//    }\n\n    fun loadPrevious() {\n        if (galleryPostsStore.mutex.isLocked) {\n            return\n        }\n        viewModelScope.launch {\n            galleryPostsStore.loadPrevious().onFailure {\n                logger.error(\"failed loadPrevious\", it)\n            }\n        }\n    }\n\n    fun toggleFavorite(galleryId: GalleryPost.Id) {\n        viewModelScope.launch {\n            toggle(galleryId)\n        }\n    }\n\n    fun toggleFileVisibleState(fileId: FileProperty.Id) {\n        _visibleFileIds.update {\n            it.toMutableSet().also { set ->\n                if (set.contains(fileId)) {\n                    set.remove(fileId)\n                } else {\n                    set.add(fileId)\n                }\n            }\n        }\n    }\n\n    override suspend fun toggle(galleryId: GalleryPost.Id) {\n        runCancellableCatching {\n            galleryPostSendFavoriteStore.toggleFavorite(galleryId)\n        }.onFailure {\n            _error.emit(it)\n        }\n    }\n\n    suspend fun getAccount(): Account {\n        return accountId?.let {\n            accountRepository.get(it).getOrThrow()\n        } ?: accountRepository.getCurrentAccount().getOrThrow().also {\n            accountId = it.accountId\n        }\n    }\n\n\n}\n\nfun GalleryPostsViewModel.Companion.provideFactory(\n    factory: GalleryPostsViewModel.ViewModelAssistedFactory,\n    pageable: Pageable.Gallery,\n    accountId: Long?\n) = object : ViewModelProvider.Factory {\n    override fun <T : ViewModel> create(modelClass: Class<T>): T {\n        return factory.create(pageable, accountId) as T\n    }\n}"
  },
  {
    "path": "modules/features/gallery/src/main/res/drawable/ic_baseline_add_photo_alternate_24.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:tint=\"?attr/colorControlNormal\">\n  <path\n      android:fillColor=\"@android:color/white\"\n      android:pathData=\"M19,7v2.99s-1.99,0.01 -2,0L17,7h-3s0.01,-1.99 0,-2h3L17,2h2v3h3v2h-3zM16,11L16,8h-3L13,5L5,5c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2v-8h-3zM5,19l3,-4 2,3 3,-4 4,5L5,19z\"/>\n</vector>\n"
  },
  {
    "path": "modules/features/gallery/src/main/res/layout/activity_gallery_posts.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.gallery.GalleryPostsActivity\"\n            android:id=\"@+id/base\">\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/gallery/src/main/res/layout/fragment_gallery_post_tab.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        >\n\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n        <com.google.android.material.appbar.AppBarLayout\n                android:id=\"@+id/appBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:fitsSystemWindows=\"true\"\n                android:stateListAnimator=\"@null\">\n            <androidx.appcompat.widget.Toolbar\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:id=\"@+id/toolbar\"\n                    app:title=\"ギャラリー\"\n                    app:layout_scrollFlags=\"scroll|enterAlways\"\n                    android:elevation=\"4dp\"\n                    />\n\n        </com.google.android.material.appbar.AppBarLayout>\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"vertical\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                >\n            <com.google.android.material.tabs.TabLayout\n                    android:id=\"@+id/galleryTab\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:elevation=\"0dp\"\n                    />\n            <androidx.viewpager.widget.ViewPager\n                    android:id=\"@+id/viewPager\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    />\n        </LinearLayout>\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/fab\"\n                android:layout_gravity=\"bottom|end\"\n                android:layout_marginEnd=\"16dp\"\n                android:layout_marginBottom=\"16dp\"\n                android:src=\"@drawable/ic_baseline_add_photo_alternate_24\"\n                android:contentDescription=\"@string/create_gallery\"\n                />\n\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/group/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/group/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n        compose true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.group'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation libs.androidx.constraintlayout\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_resource')\n    implementation project(path: ':modules:common_compose')\n\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.fragment.ktx\n    implementation libs.activity.ktx\n\n    implementation libs.kotlin.datetime\n    implementation libs.navigation.compose\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/group/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/group/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/group/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <application>\n        <activity\n                android:name=\".GroupActivity\"\n                android:exported=\"false\" />\n    </application>\n\n</manifest>"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupActivity.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport android.app.Activity\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.navigation.compose.NavHost\nimport androidx.navigation.compose.composable\nimport androidx.navigation.compose.rememberNavController\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.ChangedDiffResult\nimport net.pantasystem.milktea.common_navigation.MessageNavigation\nimport net.pantasystem.milktea.common_navigation.MessageNavigationArgs\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigationArgs\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass GroupActivity : AppCompatActivity() {\n\n    private val groupListViewModel by viewModels<GroupListViewModel>()\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    lateinit var searchAndSelectUserNavigation: SearchAndSelectUserNavigation\n\n    @Inject\n    lateinit var messageNavigation: MessageNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n\n    private val groupDetailViewModel: GroupDetailViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        applyTheme.invoke()\n        setContent {\n            val navController = rememberNavController()\n            val uiState by groupListViewModel.uiState.collectAsState()\n\n            fun popBackStack() {\n                if (!navController.popBackStack()) {\n                    finish()\n                }\n            }\n\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                NavHost(navController = navController, startDestination = \"groups\") {\n                    composable(\"groups\") {\n                        GroupCardListPage(uiState = uiState, onAction = { action ->\n                            when (action) {\n                                is GroupCardListAction.OnClick -> {\n                                    groupDetailViewModel.setState(\n                                        GroupDetailUiStateType.Show(action.group.group.id)\n                                    )\n                                    navController.navigate(\"detail\")\n                                }\n                                GroupCardListAction.OnFabClick -> {\n                                    groupDetailViewModel.setState(\n                                        GroupDetailUiStateType.Editing(\n                                            null\n                                        )\n                                    )\n                                    navController.navigate(\"detail\")\n                                }\n                                GroupCardListAction.OnNavigateUp -> {\n                                    popBackStack()\n                                }\n                            }\n                        })\n                    }\n\n                    composable(\"detail\") {\n                        GroupDetailStatePage(\n                            groupDetailViewModel = groupDetailViewModel,\n                            onAction = { action ->\n                                when (action) {\n                                    is GroupDetailStatePageAction.OnShowUser -> {\n                                        startActivity(\n                                            userDetailNavigation.newIntent(\n                                                UserDetailNavigationArgs.UserId(\n                                                    action.user.id\n                                                )\n                                            )\n                                        )\n                                    }\n                                    GroupDetailStatePageAction.PopBackStack -> popBackStack()\n                                    is GroupDetailStatePageAction.OnInviteUsers -> {\n                                        requestSearchAndUserResult.launch(\n                                            searchAndSelectUserNavigation.newIntent(\n                                                SearchAndSelectUserNavigationArgs()\n                                            )\n                                        )\n                                    }\n                                    is GroupDetailStatePageAction.OnShowMessage -> {\n                                        startActivity(messageNavigation.newIntent(\n                                            MessageNavigationArgs(MessagingId.Group(action.group.id))\n                                        ))\n                                    }\n                                }\n                            })\n                    }\n                }\n            }\n\n\n        }\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        groupListViewModel.sync()\n    }\n\n    private val requestSearchAndUserResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n        val data = result.data\n        val resultCode = result.resultCode\n        if(resultCode == Activity.RESULT_OK && data != null){\n            (data.getSerializableExtra(SearchAndSelectUserNavigation.EXTRA_SELECTED_USER_CHANGED_DIFF) as? ChangedDiffResult)?.let {\n                groupDetailViewModel.inviteUsers(it.added)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupCard.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.group.GroupMember\nimport net.pantasystem.milktea.model.group.GroupWithMember\nimport net.pantasystem.milktea.model.user.User\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\n@Stable\nfun GroupCard(group: GroupWithMember, onClick: () -> Unit) {\n    Card(\n        onClick = onClick,\n        Modifier\n            .fillMaxWidth()\n            .padding(0.5.dp),\n    ) {\n        Column(\n            Modifier\n                .fillMaxWidth()\n                .padding(\n                    vertical = 12.dp,\n                    horizontal = 16.dp\n                )\n        ) {\n            Text(group.group.name, fontSize = 18.sp)\n            Spacer(modifier = Modifier.height(2.dp))\n            Row {\n                for (m in group.members) {\n                    Image(\n                        rememberAsyncImagePainter(m.avatarUrl),\n                        contentDescription = null,\n                        modifier = Modifier\n                            .size(32.dp)\n                            .clip(CircleShape),\n                        contentScale = ContentScale.Crop\n                    )\n                    Spacer(modifier = Modifier.width(4.dp))\n                }\n            }\n        }\n    }\n}\n\n@Preview\n@Composable\nfun Preview_GroupCard() {\n    GroupCard(\n        group = GroupWithMember(\n            Group(\n                id = Group.Id(0, \"\"),\n                createdAt = Clock.System.now(),\n                name = \"はるのんファンクラブ\",\n                ownerId = User.Id(0, \"\"),\n                userIds = (0 until 6).map { User.Id(0L, \"$it\") }\n            ),\n            members = listOf(\n                GroupMember(User.Id(0L, \"id\"), \"\"),\n                GroupMember(User.Id(0L, \"id\"), \"\"),\n                GroupMember(User.Id(0L, \"id\"), \"\"),\n                GroupMember(User.Id(0L, \"id\"), \"\"),\n                GroupMember(User.Id(0L, \"id\"), \"\"),\n            )\n        ),\n        onClick = {}\n    )\n\n}"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupCardListPage.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Add\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport net.pantasystem.milktea.model.group.GroupWithMember\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\n@Stable\nfun GroupCardListPage(uiState: GroupListUiState, onAction: (GroupCardListAction) -> Unit) {\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            TopAppBar(\n                navigationIcon = {\n                    IconButton(onClick = {\n                        onAction.invoke(GroupCardListAction.OnNavigateUp)\n                    }) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = null)\n                    }\n                },\n                title = {\n                    Text(stringResource(R.string.groups))\n                },\n                colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface)\n            )\n        },\n        floatingActionButton = {\n            FloatingActionButton(onClick = {\n                onAction.invoke(GroupCardListAction.OnFabClick)\n            }) {\n                Icon(Icons.Default.Add, contentDescription = null)\n            }\n        }\n    ) {\n        LazyColumn(\n            Modifier.padding(it)\n        ) {\n           items(uiState.joinedGroups.size) { index ->\n               GroupCard(group = uiState.joinedGroups[index], onClick = {\n                   onAction.invoke(GroupCardListAction.OnClick(uiState.joinedGroups[index]))\n               })\n           }\n        }\n    }\n\n}\n\nsealed interface GroupCardListAction {\n    data class OnClick(val group: GroupWithMember) : GroupCardListAction\n    object OnNavigateUp : GroupCardListAction\n    object OnFabClick : GroupCardListAction\n}"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupDetailPage.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.Edit\nimport androidx.compose.material.icons.filled.GroupAdd\nimport androidx.compose.material.icons.filled.Message\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport net.pantasystem.milktea.model.group.Group\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun GroupDetailPage(uiState: GroupDetailUiState, onAction: (GroupDetailPageAction) -> Unit,) {\n    if (uiState.type is GroupDetailUiStateType.Editing) {\n        GroupEditorDialog(\n            uiState.type.groupId == null,\n            uiState.type.name,\n            onAction = { action ->\n                when(action) {\n                    is GroupEditorDialogAction.OnSave -> {\n                        onAction(GroupDetailPageAction.OnConfirmedSave)\n                    }\n                    is GroupEditorDialogAction.OnDismiss -> {\n                        if (uiState.type.groupId == null) {\n                            onAction(GroupDetailPageAction.OnNavigateUp)\n                        } else {\n                            onAction(GroupDetailPageAction.OnEditingCanceled)\n                        }\n                    }\n                    is GroupEditorDialogAction.OnNameChanged -> {\n                        onAction(GroupDetailPageAction.OnInputName(action.text))\n                    }\n                }\n            }\n        )\n    }\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            TopAppBar(\n                title = {\n                    Text(\n                        uiState.title,\n                    )\n                },\n                navigationIcon = {\n                    IconButton(onClick = { onAction(GroupDetailPageAction.OnNavigateUp) }) {\n                        Icon(Icons.Default.ArrowBack, null)\n                    }\n                },\n                colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),\n                actions = {\n                    if (uiState.isOwner) {\n                        IconButton(onClick = {\n                            onAction(GroupDetailPageAction.OnEdit)\n                        }) {\n                            Icon(Icons.Default.Edit, contentDescription = null)\n                        }\n                    }\n                    IconButton(onClick = {\n                        uiState.group?.let {\n                            onAction(GroupDetailPageAction.ShowMessaging(it))\n                        }\n\n                    }) {\n                        Icon(Icons.Default.Message, contentDescription = null)\n                    }\n                }\n            )\n        },\n        floatingActionButton = {\n            if (uiState.isOwner) {\n                FloatingActionButton(onClick = {\n                    onAction(GroupDetailPageAction.OnInviteUsers(uiState.group!!))\n                }) {\n                    Icon(Icons.Default.GroupAdd, contentDescription = null)\n                }\n            }\n        }\n    ) {\n        LazyColumn(Modifier.padding(it)) {\n            items(uiState.members.size) { index ->\n                val member = uiState.members[index]\n                GroupMemberCard(\n                    member = member,\n                    ownerId = uiState.group?.ownerId,\n                    isOwnGroup = uiState.isOwner,\n                    onAction = { action ->\n                        onAction(GroupDetailPageAction.OnMemberAction(action))\n                    }\n                )\n            }\n        }\n    }\n}\n\nsealed interface GroupDetailPageAction {\n    object OnNavigateUp : GroupDetailPageAction\n    data class OnInputName(val text: String) : GroupDetailPageAction\n    object OnConfirmedSave : GroupDetailPageAction\n    object OnEditingCanceled : GroupDetailPageAction\n    object OnEdit : GroupDetailPageAction\n    data class OnMemberAction(val action: GroupMemberCardAction) : GroupDetailPageAction\n    data class OnInviteUsers(val group: Group) : GroupDetailPageAction\n    data class ShowMessaging(val group: Group) : GroupDetailPageAction\n}"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupDetailStatePage.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.user.User\n\n@Composable\nfun GroupDetailStatePage(\n    groupDetailViewModel: GroupDetailViewModel,\n    onAction: (GroupDetailStatePageAction) -> Unit,\n) {\n    val detailUiState by groupDetailViewModel.uiState.collectAsState()\n    GroupDetailPage(detailUiState, onAction = { action ->\n        when(action) {\n            GroupDetailPageAction.OnNavigateUp -> {\n                groupDetailViewModel.cancelEditing()\n                onAction(GroupDetailStatePageAction.PopBackStack)\n            }\n            is GroupDetailPageAction.OnInputName -> {\n                groupDetailViewModel.setName(action.text)\n            }\n            GroupDetailPageAction.OnConfirmedSave -> {\n                groupDetailViewModel.save()\n            }\n            GroupDetailPageAction.OnEditingCanceled -> {\n                groupDetailViewModel.cancelEditing()\n            }\n            is GroupDetailPageAction.ShowMessaging -> {\n                onAction(GroupDetailStatePageAction.OnShowMessage(action.group))\n            }\n            is GroupDetailPageAction.OnMemberAction -> {\n                when(action.action) {\n                    is GroupMemberCardAction.OnClick -> {\n                        onAction(GroupDetailStatePageAction.OnShowUser(action.action.user))\n                    }\n                    is GroupMemberCardAction.RejectMember -> {\n\n                    }\n                }\n            }\n            is GroupDetailPageAction.OnInviteUsers -> {\n                onAction(GroupDetailStatePageAction.OnInviteUsers(action.group))\n            }\n            is GroupDetailPageAction.OnEdit -> {\n                groupDetailViewModel.setState(GroupDetailUiStateType.Editing(\n                    detailUiState.type.groupId\n                ))\n            }\n        }\n    })\n}\n\nsealed interface GroupDetailStatePageAction {\n    object PopBackStack : GroupDetailStatePageAction\n    data class OnShowUser(val user: User) : GroupDetailStatePageAction\n    data class OnInviteUsers(val group: Group) : GroupDetailStatePageAction\n    data class OnShowMessage(val group: Group) : GroupDetailStatePageAction\n}"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupDetailUiStateBuilder.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.combine\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.group.GroupWithMember\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\nclass GroupDetailUiStateBuilder @Inject constructor() {\n\n    operator fun invoke(\n        currentAccountFlow: Flow<Account?>,\n        uiStateType: Flow<GroupDetailUiStateType>,\n        groupFlow: Flow<GroupWithMember?>,\n        syncStateFlow: Flow<SyncState>,\n        membersFlow: Flow<List<User>>,\n    ): Flow<GroupDetailUiState> {\n        return combine(\n            currentAccountFlow,\n            uiStateType,\n            groupFlow,\n            syncStateFlow,\n            membersFlow,\n        ) { ac, type, g, sync,  m ->\n            // NOTE: groupIdがnullの状態の時はグループ関連のデータを空かnullにしたい\n            // NOTE: 源流となるflowがgroupIdがnullの時はfilterするようにしてしまっているので、ここでempty, nullを割り当てている\n            GroupDetailUiState(\n                ac,\n                type,\n                if (type.groupId == null) null else g?.group,\n                if (type.groupId == null) emptyList() else m,\n                if (type.groupId == null) ResultState.Fixed(StateContent.NotExist()) else sync.syncMembersState,\n                if (type.groupId == null) ResultState.Fixed(StateContent.NotExist()) else sync.syncGroupState,\n                when (type) {\n                    is GroupDetailUiStateType.Editing -> {\n                        type.name\n                    }\n                    is GroupDetailUiStateType.Show -> {\n                        g?.group?.name ?: \"\"\n                    }\n                    is GroupDetailUiStateType.Rejecting -> {\n                        g?.group?.name ?: \"\"\n                    }\n                }\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupDetailViewModel.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.group.*\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\n@OptIn(ExperimentalCoroutinesApi::class)\nclass GroupDetailViewModel @Inject constructor(\n    private val userRepository: UserRepository,\n    private val userDataSource: UserDataSource,\n    private val groupRepository: GroupRepository,\n    private val groupDataSource: GroupDataSource,\n    private val accountStore: AccountStore,\n    loggerFactory: Logger.Factory,\n    buildUiState: GroupDetailUiStateBuilder,\n) : ViewModel() {\n\n    private val logger = loggerFactory.create(\"GroupDetailViewModel\")\n    private val uiStateType =\n        MutableStateFlow<GroupDetailUiStateType>(GroupDetailUiStateType.Editing(null))\n\n    private val groupSyncState = uiStateType.mapNotNull { type ->\n        type.groupId\n    }.distinctUntilChanged().flatMapLatest {\n        suspend {\n            groupRepository.syncOne(it)\n        }.asLoadingStateFlow()\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, ResultState.initialState())\n\n    private val membersSyncState = uiStateType.mapNotNull { type ->\n        type.groupId\n    }.distinctUntilChanged().flatMapLatest {\n        groupDataSource.observeOne(it)\n    }.flatMapLatest {\n        suspend {\n            userRepository.syncIn(it.group.userIds).getOrThrow()\n        }.asLoadingStateFlow()\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, ResultState.initialState())\n\n    private val members = uiStateType.mapNotNull { type ->\n        type.groupId\n    }.distinctUntilChanged().flatMapLatest {\n        groupDataSource.observeOne(it)\n    }.flatMapLatest { groupWithMember ->\n        userDataSource.observeIn(\n            groupWithMember.group.id.accountId,\n            groupWithMember.group.userIds.map { it.id })\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())\n\n    private val group = uiStateType.mapNotNull { type ->\n        type.groupId\n    }.distinctUntilChanged().flatMapLatest {\n        groupDataSource.observeOne(it)\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, null)\n\n    private val syncState = combine(\n        groupSyncState,\n        membersSyncState,\n    ) { g, m ->\n        SyncState(m, g)\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, SyncState())\n\n    val uiState = buildUiState(\n        accountStore.observeCurrentAccount,\n        uiStateType,\n        group,\n        syncState,\n        members,\n    ).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(500),\n        GroupDetailUiState(null, GroupDetailUiStateType.Editing(null), null)\n    )\n\n\n    fun setState(stateType: GroupDetailUiStateType) {\n        uiStateType.update {\n            val group = this.group.value\n            if (\n                stateType is GroupDetailUiStateType.Editing\n                && stateType.groupId == group?.group?.id\n            ) {\n                stateType.copy(name = group?.group?.name ?: \"\")\n            } else {\n                stateType\n            }\n        }\n    }\n\n\n    fun setName(name: String) {\n        uiStateType.update {\n            when (it) {\n                is GroupDetailUiStateType.Editing -> {\n                    it.copy(name = name)\n                }\n                is GroupDetailUiStateType.Show -> {\n                    // NOTE: 表示モードの時に編集しようとした時は、編集モードに移行するようにしている。\n                    GroupDetailUiStateType.Editing(it.groupId, name = name)\n                }\n                is GroupDetailUiStateType.Rejecting -> {\n                    GroupDetailUiStateType.Editing(it.groupId, name = name)\n                }\n            }\n        }\n    }\n\n    fun cancelEditing() {\n        uiStateType.update { type ->\n            if (type.groupId == null) {\n                type\n            } else {\n                GroupDetailUiStateType.Show(type.groupId!!)\n            }\n        }\n    }\n\n    fun inviteUsers(userIds: List<User.Id>) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                userIds.map {\n                    async {\n                        groupRepository.invite(\n                            Invite(\n                            uiStateType.value.groupId!!,\n                            it\n                        )\n                        )\n                    }\n                }.awaitAll()\n            }.onFailure {\n                logger.error(\"メンバーの追加に失敗\", it)\n            }\n        }\n    }\n\n\n    fun save() {\n        val type = uiStateType.value\n        if (type is GroupDetailUiStateType.Editing) {\n            viewModelScope.launch {\n                runCancellableCatching {\n                    if (type.groupId == null) {\n                        groupRepository.create(\n                            CreateGroup(accountStore.currentAccountId!!, type.name)\n                        )\n                    } else {\n                        groupRepository.update(UpdateGroup(type.groupId!!, type.name))\n                    }\n                }.onFailure {\n\n                }.onSuccess { group ->\n                    uiStateType.update {\n                        GroupDetailUiStateType.Show(group.id)\n                    }\n                }\n            }\n        }\n    }\n}\n\ndata class GroupDetailUiState(\n    val account: Account?,\n    val type: GroupDetailUiStateType,\n    val group: Group?,\n    val members: List<User> = emptyList(),\n    val syncMembersState: ResultState<List<User.Id>> = ResultState.Fixed(StateContent.NotExist()),\n    val syncGroupState: ResultState<Group> = ResultState.Fixed(StateContent.NotExist()),\n    val title: String = \"\",\n) {\n    val isOwner: Boolean get() {\n        return account?.let {\n            User.Id(it.accountId, it.remoteId)\n        } == group?.ownerId\n    }\n}\n\ndata class SyncState(\n    val syncMembersState: ResultState<List<User.Id>> = ResultState.Fixed(StateContent.NotExist()),\n    val syncGroupState: ResultState<Group> = ResultState.Fixed(StateContent.NotExist()),\n)\nsealed interface GroupDetailUiStateType {\n    val groupId: Group.Id?\n\n    data class Editing(override val groupId: Group.Id?, val name: String = \"\") : GroupDetailUiStateType\n    data class Rejecting(override val groupId: Group.Id?, val user: User) : GroupDetailUiStateType\n\n    data class Show(override val groupId: Group.Id) : GroupDetailUiStateType\n}\n\n\n"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupEditorDialog.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.ui.window.Dialog\n\n@Composable\n@Stable\nfun GroupEditorDialog(\n    isNew: Boolean,\n    name: String,\n    onAction: (GroupEditorDialogAction) -> Unit,\n) {\n\n    Dialog(onDismissRequest = { onAction(GroupEditorDialogAction.OnDismiss) }) {\n        Surface(\n            shape = MaterialTheme.shapes.medium,\n            color = MaterialTheme.colorScheme.surface,\n        ) {\n            Column(\n                modifier = Modifier.padding(16.dp)\n            ) {\n                Text(\n                    if (isNew) {\n                        stringResource(R.string.create_group)\n                    } else {\n                        stringResource(R.string.edit_group)\n                    },\n                    fontSize = 24.sp\n                )\n                Spacer(modifier = Modifier.height(8.dp))\n                TextField(\n                    value = name,\n                    placeholder = {\n                        Text(stringResource(R.string.group_name))\n                    },\n                    onValueChange = { text ->\n                        onAction(GroupEditorDialogAction.OnNameChanged(text))\n                    }\n                )\n                Row(\n                    Modifier.fillMaxWidth(),\n                    horizontalArrangement = Arrangement.End\n                ) {\n                    TextButton(onClick = { onAction(GroupEditorDialogAction.OnDismiss) }) {\n                        Text(stringResource(R.string.cancel))\n                    }\n                    TextButton(\n                        enabled = name.isNotBlank(),\n                        onClick = {\n                            onAction(GroupEditorDialogAction.OnSave)\n                        }\n                    ) {\n                        Text(stringResource(R.string.save))\n                    }\n                }\n            }\n        }\n    }\n}\n\nsealed interface GroupEditorDialogAction {\n    object OnDismiss : GroupEditorDialogAction\n    data class OnNameChanged(val text: String) : GroupEditorDialogAction\n    object OnSave : GroupEditorDialogAction\n}"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupListViewModel.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.group.GroupDataSource\nimport net.pantasystem.milktea.model.group.GroupRepository\nimport net.pantasystem.milktea.model.group.GroupWithMember\nimport net.pantasystem.milktea.model.user.UserRepository\nimport java.util.*\nimport javax.inject.Inject\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@HiltViewModel\nclass GroupListViewModel @Inject constructor(\n    private val groupRepository: GroupRepository,\n    private val accountStore: AccountStore,\n    private val groupDataSource: GroupDataSource,\n    private val userRepository: UserRepository,\n    loggerFactory: Logger.Factory,\n) : ViewModel() {\n\n    private val logger = loggerFactory.create(\"GroupViewModel\")\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val joinedGroups = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest { account ->\n        groupDataSource.observeJoinedGroups(account.accountId)\n    }.flowOn(Dispatchers.IO)\n        .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val ownedGroups = accountStore.observeCurrentAccount.filterNotNull().flatMapLatest { account ->\n        groupDataSource.observeOwnedGroups(account.accountId)\n    }.flowOn(Dispatchers.IO)\n        .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())\n\n    private val syncEvents = MutableSharedFlow<UUID>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 100)\n\n    private val ownedGroupSyncState = syncEvents.flatMapLatest {\n        accountStore.observeCurrentAccount\n    }.filterNotNull().flatMapLatest {\n\n        suspend {\n            groupRepository.syncByOwned(it.accountId)\n        }.asLoadingStateFlow()\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope,\n        SharingStarted.Eagerly,\n        ResultState.initialState()\n    )\n\n    private val joinedGroupSyncState = syncEvents.flatMapLatest {\n        accountStore.observeCurrentAccount\n    }.filterNotNull().flatMapLatest {\n        logger.debug { \"joinedGroupSyncState\" }\n        suspend {\n            groupRepository.syncByJoined(it.accountId)\n        }.asLoadingStateFlow()\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope,\n        SharingStarted.Eagerly,\n        ResultState.initialState(),\n    )\n\n    val uiState = combine(\n        ownedGroups,\n        joinedGroups,\n        ownedGroupSyncState,\n        joinedGroupSyncState\n    ) { ownedGroups, joinedGroups, ownedSyncState, joinedSyncState ->\n        GroupListUiState(\n            ownedGroups = ownedGroups,\n            joinedGroups = joinedGroups,\n            syncJoinedGroupsState = joinedSyncState,\n            syncOwnedGroupsState = ownedSyncState\n        )\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(1000),\n        GroupListUiState(\n            emptyList(),\n            emptyList(),\n            ResultState.initialState(),\n            ResultState.initialState()\n        )\n    )\n\n    init {\n        sync()\n        combine(joinedGroups, ownedGroups) { joined, owned ->\n            (joined.map {\n                it.group.userIds\n            }.flatten() + owned.map {\n                it.group.userIds\n            }.flatten()).distinct()\n        }.distinctUntilChanged().map {\n            userRepository.syncIn(it).onFailure { e ->\n                logger.error(\"ユーザーの同期エラー\", e)\n            }\n        }.launchIn(viewModelScope)\n    }\n\n    fun sync() {\n        syncEvents.tryEmit(UUID.randomUUID())\n    }\n\n}\n\ndata class GroupListUiState(\n    val joinedGroups: List<GroupWithMember>,\n    val ownedGroups: List<GroupWithMember>,\n    val syncJoinedGroupsState: ResultState<List<Group>>,\n    val syncOwnedGroupsState: ResultState<List<Group>>,\n)"
  },
  {
    "path": "modules/features/group/src/main/java/net/pantasystem/milktea/group/GroupMemberCard.kt",
    "content": "package net.pantasystem.milktea.group\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.model.user.User\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\n@Stable\nfun GroupMemberCard(\n    member: User,\n    ownerId: User.Id?,\n    isOwnGroup: Boolean,\n    onAction: (GroupMemberCardAction) -> Unit\n) {\n    Card(\n        modifier = Modifier\n            .padding(0.5.dp)\n            .fillMaxWidth(),\n        onClick = {\n            onAction(GroupMemberCardAction.OnClick(member))\n        }\n    ) {\n        Row(\n            Modifier\n                .fillMaxWidth()\n                .padding(8.dp)\n        ) {\n            AvatarIcon(\n                member.avatarUrl,\n                size = 50.dp,\n            )\n            Spacer(modifier = Modifier.width(4.dp))\n            Column {\n                Text(member.displayName)\n                Text(member.displayUserName)\n            }\n\n        }\n    }\n}\n\nsealed interface GroupMemberCardAction {\n    data class OnClick(val user: User) : GroupMemberCardAction\n    data class RejectMember(val user: User) : GroupMemberCardAction\n}"
  },
  {
    "path": "modules/features/media/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/media/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.media'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:worker')\n    implementation project(path: ':modules:api')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    //ExoPlayer\n    implementation 'com.google.android.exoplayer:exoplayer:2.18.2'\n    implementation \"com.google.android.exoplayer:exoplayer-core:2.18.2\"\n    implementation \"com.google.android.exoplayer:extension-okhttp:2.18.2\"\n\n\n    //PhotoView\n    implementation 'com.github.chrisbanes:PhotoView:2.3.0'\n\n    implementation libs.glide.glide\n    kapt libs.glide.compiler\n    implementation libs.animation.apng\n    implementation libs.wada811.databinding\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n    implementation libs.activity.ktx\n    implementation libs.androidx.work.ktx\n    implementation libs.hilt.work\n    kapt libs.androidx.hilt.compiler\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n    implementation libs.lifecycle.viewmodel\n    implementation libs.fragment.ktx\n}"
  },
  {
    "path": "modules/features/media/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/media/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/media/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/File.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.file.AboutMediaType\nimport net.pantasystem.milktea.model.file.AppFile\nimport java.io.Serializable\n\n\ndata class File(\n    val name: String,\n    val path: String?,\n    val type: String?,\n    val remoteFileId: FileProperty.Id?,\n    val localFileId: Long?,\n    val thumbnailUrl: String?,\n    val isSensitive: Boolean?,\n    val folderId: String? = null,\n    val comment: String? = null,\n    val blurhash: String? = null,\n) : Serializable {\n\n    companion object {\n        fun from(fileProperty: FileProperty): File {\n            return with(fileProperty) {\n                File(\n                    name,\n                    url,\n                    type,\n                    id,\n                    null,\n                    thumbnailUrl,\n                    isSensitive,\n                    null,\n                    comment,\n                    blurhash = blurhash,\n                )\n            }\n\n        }\n    }\n\n\n    val aboutMediaType = when {\n        this.type == null -> AboutMediaType.OTHER\n        this.type.startsWith(\"image\") -> AboutMediaType.IMAGE\n        this.type.startsWith(\"video\") -> AboutMediaType.VIDEO\n        this.type.startsWith(\"audio\") -> AboutMediaType.SOUND\n        else -> AboutMediaType.OTHER\n    }\n}\nfun AppFile.Local.toFile(): File {\n    return File(\n        name = name,\n        path = path,\n        type = type,\n        remoteFileId = null,\n        thumbnailUrl = thumbnailUrl,\n        isSensitive = isSensitive,\n        folderId = folderId,\n        localFileId = id\n    )\n}\n"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/ImageFragment.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport android.graphics.drawable.Drawable\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.View\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.engine.GlideException\nimport com.bumptech.glide.request.RequestListener\nimport com.bumptech.glide.request.target.Target\nimport com.wada811.databinding.dataBinding\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.media.databinding.FragmentImageBinding\n\nclass ImageFragment : Fragment(R.layout.fragment_image) {\n\n    companion object {\n        private const val EXTRA_INDEX = \"jp.panta.misskeyandroidclient.ui.media.EXTRA_INDEX\"\n        fun newInstance(index: Int, url: String, thumbnailUrl: String? = null): ImageFragment {\n            val bundle = Bundle().apply {\n                putString(ImageViewModel.EXTRA_IMAGE_URL, url)\n                putInt(EXTRA_INDEX, index)\n                putString(ImageViewModel.EXTRA_IMAGE_THUMBNAIL_URL, thumbnailUrl)\n            }\n            return ImageFragment().apply {\n                arguments = bundle\n            }\n        }\n\n        fun newInstance(index: Int, uri: Uri): ImageFragment {\n            return ImageFragment().apply {\n                arguments = Bundle().apply {\n                    putString(ImageViewModel.EXTRA_IMAGE_URI, uri.toString())\n                    putInt(EXTRA_INDEX, index)\n                }\n            }\n        }\n\n        fun newInstance(index: Int, file: File): ImageFragment {\n            return newInstance(index, file.path!!, file.thumbnailUrl)\n        }\n    }\n\n    var index = 0\n    val binding: FragmentImageBinding by dataBinding()\n\n    private val viewModel by viewModels<ImageViewModel>()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        index = arguments?.getInt(EXTRA_INDEX) ?: 0\n\n        binding.swipeFinishLayout.setOnFinishEventListener {\n            requireActivity().finish()\n        }\n\n\n        GlideApp.with(view)\n            .load(viewModel.getUri())\n            .addListener(object : RequestListener<Drawable?> {\n                override fun onLoadFailed(\n                    e: GlideException?,\n                    model: Any?,\n                    target: Target<Drawable?>?,\n                    isFirstResource: Boolean\n                ): Boolean {\n                    viewModel.onLoadFailed()\n                    return false\n                }\n\n                override fun onResourceReady(\n                    resource: Drawable?,\n                    model: Any?,\n                    target: Target<Drawable?>?,\n                    dataSource: DataSource?,\n                    isFirstResource: Boolean\n                ): Boolean {\n                    viewModel.onResourceReady()\n                    return false\n                }\n            })\n            .let {\n                val thumbnailUrl = viewModel.getThumbnailUrl()\n                val uri = viewModel.getUri()\n                if (thumbnailUrl != null && uri != thumbnailUrl)\n                    it.thumbnail(\n                        GlideApp.with(view).load(thumbnailUrl).fitCenter()\n                    )\n                else\n                    it\n            }\n            .into(binding.imageView)\n\n        viewModel.isImageLoading.onEach {\n            binding.progressBar.isVisible = it\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        val activity = requireActivity()\n        if (activity is MediaActivity) {\n            activity.setCurrentFileIndex(index)\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/ImageViewModel.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.launch\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ImageViewModel @Inject constructor(\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_IMAGE_URL = \"jp.panta.misskeyandroidclient.ui.media.EXTRA_IMAGE_URL\"\n        const val EXTRA_IMAGE_URI = \"jp.panta.misskeyandroidclient.ui.media.EXTRA_IMAGE_URI\"\n        const val EXTRA_IMAGE_THUMBNAIL_URL = \"jp.panta.misskeyandroidclient.ui.media.EXTRA_IMAGE_THUMBNAIL_URL\"\n    }\n\n\n    private val _isImageLoading = MutableStateFlow(true)\n    val isImageLoading = _isImageLoading.asStateFlow()\n\n    fun onResourceReady() {\n        viewModelScope.launch {\n            delay(100)\n            _isImageLoading.value = false\n        }\n    }\n\n    fun onLoadFailed() {\n        viewModelScope.launch {\n            delay(100)\n            _isImageLoading.value = false\n        }\n    }\n\n    fun getThumbnailUrl(): String? {\n        return savedStateHandle[EXTRA_IMAGE_THUMBNAIL_URL]\n    }\n\n    fun getUri(): String? {\n        return savedStateHandle[EXTRA_IMAGE_URI] ?: savedStateHandle[EXTRA_IMAGE_URL]\n    }\n}\n"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/MediaActivity.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.widget.Toast\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport androidx.fragment.app.FragmentActivity\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.work.WorkManager\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.MediaNavigation\nimport net.pantasystem.milktea.common_navigation.MediaNavigationArgs\nimport net.pantasystem.milktea.common_navigation.MediaNavigationKeys\nimport net.pantasystem.milktea.media.databinding.ActivityMediaBinding\nimport net.pantasystem.milktea.model.file.AboutMediaType\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport java.io.Serializable\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\nclass MediaNavigationImpl @Inject constructor(\n    val activity: Activity\n) : MediaNavigation {\n    override fun newIntent(args: MediaNavigationArgs): Intent {\n        return when (args) {\n            is MediaNavigationArgs.AFile -> {\n                val intent = Intent(activity, MediaActivity::class.java)\n                intent.putExtra(MediaNavigationKeys.EXTRA_FILE, when(val f = args.file) {\n                    is FilePreviewSource.Local -> f.file.toFile()\n                    is FilePreviewSource.Remote -> File.from(f.fileProperty)\n                })\n            }\n            is MediaNavigationArgs.Files -> {\n                val intent = Intent(activity, MediaActivity::class.java)\n                intent.putExtra(MediaNavigationKeys.EXTRA_FILES, ArrayList(args.files.map {\n                    when(val f = it) {\n                        is FilePreviewSource.Local -> f.file.toFile()\n                        is FilePreviewSource.Remote -> File.from(f.fileProperty)\n                    }\n                }))\n                intent.putExtra(\n                    MediaNavigationKeys.EXTRA_FILE_CURRENT_INDEX,\n                    args.index\n                )\n            }\n        }\n    }\n}\n\nsealed class Media : Serializable {\n    data class FileMedia(val file: File) : Media()\n}\n@AndroidEntryPoint\nclass MediaActivity : AppCompatActivity() {\n\n\n\n    companion object {\n\n\n        fun newInstance(activity: FragmentActivity, files: List<File>, index: Int): Intent {\n            return Intent(activity, MediaActivity::class.java).apply {\n                putExtra(MediaNavigationKeys.EXTRA_FILES, ArrayList(files))\n                putExtra(MediaNavigationKeys.EXTRA_FILE_CURRENT_INDEX, index)\n            }\n        }\n\n    }\n\n    private var mCurrentMedia: Media? = null\n    private var mMedias: List<Media>? = null\n    private lateinit var mBinding: ActivityMediaBinding\n\n    @Inject\n    lateinit var setTheme: ApplyTheme\n\n    private val viewModel by viewModels<MediaViewModel>()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setTheme.invoke()\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_media)\n        setSupportActionBar(mBinding.mediaToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(mBinding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            mBinding.mediaToolbar.updatePadding(top = insets.top)\n            mBinding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        supportActionBar?.title = \"\"\n\n        val pagerAdapter = MediaPagerAdapter(supportFragmentManager)\n        mBinding.mediaViewPager.adapter = pagerAdapter\n\n\n        viewModel.uiState.onEach { uiState ->\n            pagerAdapter.setFiles(uiState.medias)\n            mBinding.mediaViewPager.currentItem = uiState.currentIndex\n            mMedias = uiState.medias\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n    }\n\n\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> finish()\n            R.id.download_file -> {\n                mCurrentMedia?.let { m ->\n                    val file = (m as Media.FileMedia).file\n                    downloadFile(file)\n                }\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n\n        menuInflater.inflate(R.menu.menu_media, menu)\n        val media = mCurrentMedia\n        if (media is Media.FileMedia) {\n            menu.findItem(R.id.download_file)?.isVisible =\n                media.file.path?.startsWith(\"http\") == true\n        }\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    fun setCurrentFileIndex(index: Int) {\n        try {\n            mCurrentMedia = mMedias?.get(index)\n            Log.d(MediaNavigationKeys.TAG, \"現在の画像:$mCurrentMedia\")\n        } catch (e: IndexOutOfBoundsException) {\n            Log.d(MediaNavigationKeys.TAG, \"お探しのメディアは存在しません。\", e)\n        }\n    }\n\n    private fun downloadFile(file: File) {\n        Log.d(MediaNavigationKeys.TAG, \"ダウンロードを開始します:$file\")\n        Toast.makeText(\n            this,\n            getString(R.string.start_downloading_placeholder, file.name),\n            Toast.LENGTH_LONG\n        ).show()\n        WorkManager.getInstance(this)\n            .enqueue(\n                RemoteFileDownloadWorkManager.createWorkRequest(\n                    name = file.name,\n                    type = when (file.aboutMediaType) {\n                        AboutMediaType.VIDEO -> DownloadContentType.Video\n                        AboutMediaType.IMAGE -> DownloadContentType.Image\n                        AboutMediaType.SOUND -> DownloadContentType.Audio\n                        AboutMediaType.OTHER -> return\n                    },\n                    url = file.path ?: \"\",\n                )\n            )\n    }\n\n\n\n}\n"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/MediaPagerAdapter.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage net.pantasystem.milktea.media\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\n\n@Suppress(\"DEPRECATION\")\nclass MediaPagerAdapter(\n    fragmentManager: FragmentManager,\n) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n\n    private var _files = emptyList<Media>()\n\n    override fun getCount(): Int {\n        return _files.size\n    }\n\n    override fun getItem(position: Int): Fragment {\n        return when (val item = _files[position]) {\n            is Media.FileMedia -> createFragment(position, item.file)\n        }\n    }\n\n    fun setFiles(files: List<Media>) {\n        if (_files == files) return\n        _files = files\n        notifyDataSetChanged()\n    }\n\n    private fun createFragment(index: Int, file: File): Fragment {\n\n        return if (file.type?.contains(\"image\") == true) {\n            ImageFragment.newInstance(index, file)\n        } else {\n            PlayerFragment.newInstance(index, file.path!!)\n        }\n    }\n\n}\n"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/MediaViewModel.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport android.util.Log\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.combine\nimport net.pantasystem.milktea.common_navigation.MediaNavigationKeys\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MediaViewModel @Inject constructor(\n    private val savedStateHandle: SavedStateHandle,\n): ViewModel() {\n\n\n    private val files = savedStateHandle.getStateFlow<List<File>?>(\n        MediaNavigationKeys.EXTRA_FILES,\n        null\n    )\n\n    private val file = savedStateHandle.getStateFlow<File?>(\n        MediaNavigationKeys.EXTRA_FILE,\n        null,\n    )\n\n    val medias = combine(files, file) { files , file ->\n        when {\n            !files.isNullOrEmpty() -> {\n                files.map {\n                    Media.FileMedia(it)\n                }\n            }\n            file != null -> {\n                listOf<Media>(Media.FileMedia(file))\n            }\n            else -> {\n                Log.e(MediaNavigationKeys.TAG, \"params must not null\")\n                throw IllegalArgumentException()\n            }\n        }\n    }\n\n    private val currentIndex = savedStateHandle.getStateFlow<Int>(\n        MediaNavigationKeys.EXTRA_FILE_CURRENT_INDEX,\n        0,\n    )\n\n    val uiState = combine(medias, currentIndex) { medias, currentIndex ->\n        MediaUiState(medias, currentIndex)\n    }\n\n    fun setCurrentIndex(index: Int) {\n        savedStateHandle[MediaNavigationKeys.EXTRA_FILE_CURRENT_INDEX] = index\n    }\n}\n\ndata class MediaUiState(\n    val medias: List<Media>,\n    val currentIndex: Int,\n)"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/PhotoViewViewPager.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.MotionEvent\nimport androidx.viewpager.widget.ViewPager\n\n\n/**\n * PhotoViewでViewPagerを利用するとエラーが発生するのでその対処をする。\n */\nclass PhotoViewViewPager : ViewPager {\n\n\n    constructor(context: Context) : super(context)\n\n    constructor(context: Context, attrs: AttributeSet): super(context, attrs)\n\n\n\n\n    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {\n        return try{\n\n            return super.onInterceptTouchEvent(ev)\n        }catch(e: IllegalArgumentException){\n            false\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/PlayerFragment.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport android.net.Uri\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport com.google.android.exoplayer2.ExoPlayer\nimport com.google.android.exoplayer2.MediaItem\nimport com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource\nimport com.google.android.exoplayer2.source.ProgressiveMediaSource\nimport com.google.android.exoplayer2.ui.StyledPlayerView\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.api.misskey.OkHttpClientProvider\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass PlayerFragment : Fragment(R.layout.fragment_player){\n\n    companion object{\n        const val TAG = \"PlayerFragment\"\n        private const val EXTRA_MEDIA_SOURCE_URI = \"net.pantasystem.milktea.media.PlayerFragment.EXTRA_MEDIA_SOURCE_URI\"\n        private const val EXTRA_INDEX = \"net.pantasystem.milktea.media.PlayerFragment.extra.INDEX\"\n\n        fun newInstance(index: Int, uri: String): PlayerFragment {\n            return PlayerFragment().apply{\n                arguments = Bundle().apply{\n                    putString(EXTRA_MEDIA_SOURCE_URI, uri)\n                    putInt(EXTRA_INDEX, index)\n                }\n            }\n        }\n\n        fun newInstance(index: Int, uri: Uri): PlayerFragment {\n            return PlayerFragment().apply{\n                arguments = Bundle().apply{\n                    putString(EXTRA_MEDIA_SOURCE_URI, uri.toString())\n                    putInt(EXTRA_INDEX, index)\n                }\n            }\n        }\n    }\n\n    @Inject\n    internal lateinit var okHttpProvider: OkHttpClientProvider\n\n    private var mExoPlayer: ExoPlayer? = null\n    private var index: Int = 0\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val extraUri = arguments?.getString(EXTRA_MEDIA_SOURCE_URI)\n        Log.d(TAG, \"extraUri: $extraUri\")\n        val uri = if(extraUri == null) null else Uri.parse(extraUri)\n\n        index = arguments?.getInt(EXTRA_INDEX) ?: 0\n\n        if(uri == null){\n            Log.e(TAG, \"uri must not null\")\n            return\n        }\n\n        val okHttpDataSourceFactory = OkHttpDataSource.Factory(okHttpProvider.get())\n        val mediaDataSource = ProgressiveMediaSource.Factory(okHttpDataSourceFactory)\n            .createMediaSource(MediaItem.fromUri(uri))\n\n        val simpleExoPlayer = ExoPlayer.Builder(requireContext())\n            .build()\n        view.findViewById<StyledPlayerView>(R.id.player_view).player = simpleExoPlayer\n\n        simpleExoPlayer.setMediaSource(mediaDataSource)\n        simpleExoPlayer.prepare()\n        simpleExoPlayer.play()\n\n        view.findViewById<SwipeFinishLayout>(R.id.swipeFinishLayout).setOnFinishEventListener {\n            requireActivity().finish()\n        }\n\n        mExoPlayer = simpleExoPlayer\n\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        val activity = requireActivity()\n        if(activity is MediaActivity){\n            activity.setCurrentFileIndex(index)\n        }\n    }\n\n    override fun onStop(){\n        super.onStop()\n\n        mExoPlayer?.playWhenReady = false\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n\n        mExoPlayer?.release()\n    }\n}"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/RemoteFileDownloadWorkManager.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport android.Manifest\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.content.ContentValues\nimport android.content.Context\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.MediaStore\nimport android.util.Log\nimport android.widget.Toast\nimport androidx.core.app.NotificationCompat\nimport androidx.core.app.TaskStackBuilder\nimport androidx.core.content.ContextCompat\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.*\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common_android.notification.NotificationUtil\nimport java.io.IOException\nimport java.io.InputStream\nimport java.io.OutputStream\nimport java.net.URL\n\n@HiltWorker\nclass RemoteFileDownloadWorkManager @AssistedInject constructor(\n    @Assisted context: Context,\n    @Assisted val params: WorkerParameters,\n    private val notificationUtil: NotificationUtil,\n    private val loggerFactory: Logger.Factory,\n) : CoroutineWorker(context, params) {\n\n    val logger by lazy {\n        loggerFactory.create(\"RemoteFileDownloadWM\")\n    }\n\n    companion object {\n        const val EXTRA_DOWNLOAD_URL = \"RemoteFileDownloadWorkManager.EXTRA_DOWNLOAD_URL\"\n        const val EXTRA_MIME_TYPE = \"RemoteFileDownloadWorkManager.MIME_TYPE\"\n        const val EXTRA_FILE_NAME = \"RemoteFileDownloadWorkManager.FILE_NAME\"\n\n        const val NOTIFICATION_CHANNEL_ID: String = \"DOWNLOAD_MEDIA_NOTIFICATION\"\n\n        fun createWorkRequest(\n            type: DownloadContentType,\n            url: String,\n            name: String\n        ): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<RemoteFileDownloadWorkManager>()\n                .setInputData(\n                    Data.Builder()\n                        .putString(EXTRA_FILE_NAME, name)\n                        .putString(EXTRA_DOWNLOAD_URL, url)\n                        .putInt(EXTRA_MIME_TYPE, type.ordinal)\n                        .build()\n                ).build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n\n        val context = applicationContext\n        return try {\n            val fileName = params.inputData.getString(EXTRA_FILE_NAME)!!\n            val type = DownloadContentType.values()[params.inputData.getInt(EXTRA_MIME_TYPE, 0)]\n            val mediaCollection = when (type) {\n                DownloadContentType.Video -> {\n                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                        MediaStore.Video.Media.getContentUri(\n                            MediaStore.VOLUME_EXTERNAL_PRIMARY\n                        )\n                    } else {\n                        MediaStore.Video.Media.EXTERNAL_CONTENT_URI\n                    }\n                }\n                DownloadContentType.Image -> {\n                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                        MediaStore.Images.Media.getContentUri(\n                            MediaStore.VOLUME_EXTERNAL_PRIMARY\n                        )\n                    } else {\n                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI\n                    }\n                }\n                DownloadContentType.Audio -> {\n                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n                        MediaStore.Audio.Media.getContentUri(\n                            MediaStore.VOLUME_EXTERNAL_PRIMARY\n                        )\n                    } else {\n                        MediaStore.Audio.Media.EXTERNAL_CONTENT_URI\n                    }\n                }\n            }\n\n\n            val contentDetail = ContentValues().apply {\n                when (type) {\n                    DownloadContentType.Video -> put(MediaStore.Video.Media.DISPLAY_NAME, fileName)\n                    DownloadContentType.Image -> put(MediaStore.Images.Media.DISPLAY_NAME, \"$fileName.png\")\n                    DownloadContentType.Audio -> put(MediaStore.Audio.Media.DISPLAY_NAME, fileName)\n                }\n            }\n\n            val uri = context.contentResolver.insert(mediaCollection, contentDetail)\n\n\n            withContext(Dispatchers.IO) {\n                URL(params.inputData.getString(EXTRA_DOWNLOAD_URL)).openConnection()\n                    .getInputStream().use { inputStream ->\n                        context.contentResolver.openOutputStream(uri!!)?.use { outputStream ->\n                            // if image convert to bitmap\n                            if (type == DownloadContentType.Image) {\n                                val bitmap = BitmapFactory.decodeStream(inputStream)\n                                    ?: throw IOException(\"Failed to decode bitmap\")\n                                if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)) {\n                                    outputStream.close()\n                                    bitmap.recycle()\n                                }\n                            } else {\n                                inputStream.transferToOutputStream(outputStream)\n                            }\n                            inputStream.transferToOutputStream(outputStream)\n                        }\n                    }\n            }\n\n            withContext(Dispatchers.Main) {\n                if (ContextCompat.checkSelfPermission(\n                        context,\n                        Manifest.permission.POST_NOTIFICATIONS\n                    ) == PackageManager.PERMISSION_GRANTED\n                ) {\n                    NotificationUtil(context)\n                    val notificationManager = notificationUtil.makeNotificationManager(\n                        id = NOTIFICATION_CHANNEL_ID,\n                        description = \"Download Result Notification\",\n                        name = \"Download Notification\"\n                    )\n                    showDownloadSuccessNotification(context, notificationManager, uri!!)\n\n                } else {\n                    Toast.makeText(\n                        context,\n                        context.getString(R.string.success_download_file_message),\n                        Toast.LENGTH_LONG\n                    ).show()\n                }\n\n            }\n            Result.success()\n        } catch (e: Exception) {\n            Log.e(\"RemoteFileDownloadWM\", \"download error\", e)\n            logger.error(\"download error\", e)\n            withContext(Dispatchers.Main) {\n                Toast.makeText(\n                    context,\n                    context.getString(R.string.failed_download_file_message),\n                    Toast.LENGTH_LONG\n                ).show()\n            }\n            Result.failure()\n        }\n    }\n\n    private fun showDownloadSuccessNotification(context: Context, notificationManager: NotificationManager, uri: Uri) {\n        val builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)\n            .setSmallIcon(android.R.drawable.stat_sys_download_done)\n            .setContentTitle(context.getString(R.string.success_download_file_message))\n        builder.priority = NotificationCompat.PRIORITY_DEFAULT\n\n        val pendingIntentBuilder = TaskStackBuilder.create(context)\n            .addNextIntent(Intent(Intent.ACTION_VIEW).apply {\n                this.data = uri\n            })\n        val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n            pendingIntentBuilder.getPendingIntent(0, PendingIntent.FLAG_MUTABLE)\n        } else {\n            pendingIntentBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)\n        }\n        builder.setContentIntent(pendingIntent)\n        with(notificationManager) {\n            notify(uri.path.hashCode(), builder.build())\n        }\n    }\n}\n\nenum class DownloadContentType {\n    Video, Image, Audio\n}\n\n@Throws(IOException::class)\nfun InputStream.transferToOutputStream(out: OutputStream): Long {\n    var transferred: Long = 0\n    val buffer = ByteArray(8192)\n    var read: Int\n    while (this.read(buffer, 0, 8192).also { read = it } >= 0) {\n        out.write(buffer, 0, read)\n        transferred += read.toLong()\n    }\n    return transferred\n}"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/SwipeFinishLayout.kt",
    "content": "package net.pantasystem.milktea.media\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.GestureDetector\nimport android.view.MotionEvent\nimport android.view.View\nimport android.widget.FrameLayout\nimport com.github.chrisbanes.photoview.PhotoView\nimport kotlin.math.abs\n\nclass SwipeFinishLayout : FrameLayout {\n\n    companion object {\n\n        private const val SWIPE_THRESHOLD = 150\n\n        private const val SWIPE_VELOCITY_THRESHOLD = 150\n    }\n\n\n\n    constructor(context: Context) : super(context)\n\n    constructor(context: Context, attrs: AttributeSet): super(context, attrs)\n\n    fun interface OnFinishEventListener {\n        fun onFinish()\n    }\n\n\n\n    private var onFinishEventListener: OnFinishEventListener? = null\n\n    fun setOnFinishEventListener(listener: OnFinishEventListener?){\n        onFinishEventListener = listener\n    }\n\n\n    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {\n        return try{\n            if (ev?.action == MotionEvent.ACTION_DOWN) {\n                startY = ev.y\n            }\n            when(ev?.action) {\n                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {\n                    getPhotoView()?.animate()?.translationY(0f)?.rotation(0f)?.setDuration(200)?.start()\n                    totalTranslationY = 0f\n                }\n            }\n            if (ev != null) {\n                return gestureDetector.onTouchEvent(ev) || super.onInterceptTouchEvent(ev)\n            }\n            return super.onInterceptTouchEvent(null)\n        }catch(e: IllegalArgumentException){\n            false\n        }\n    }\n\n\n    private var startY = 0f\n\n    var lastY = 0f\n    var totalTranslationY = 0f\n\n\n    private val gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {\n\n        override fun onScroll(\n            e1: MotionEvent?,\n            e2: MotionEvent,\n            distanceX: Float,\n            distanceY: Float\n        ): Boolean {\n\n            // 縦スクロールの場合\n            if (abs(e2.y - startY) > abs(e2.x - (e1?.x ?: 0f))) {\n                if (isNotScaled()) {\n                    totalTranslationY += e2.rawY - lastY\n                    viewToMove()?.translationY = totalTranslationY\n                    viewToMove()?.rotation = totalTranslationY / 10\n                    lastY = e2.rawY\n                }\n\n            }\n\n            return super.onScroll(e1, e2, distanceX, distanceY)\n        }\n\n        override fun onFling(e1: MotionEvent?, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {\n            var result = false\n            try {\n                val diffY = e2.y.minus(e1?.y ?: 0f)\n                if (abs(diffY) > SWIPE_THRESHOLD && abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {\n                    if (abs(diffY) >= 0) {\n                        onSwipeTop()\n                        result = true\n                    }\n                }\n            } catch (exception: Exception) {\n                exception.printStackTrace()\n            }\n            viewToMove()?.animate()?.translationY(0f)?.rotation(0f)?.setDuration(200)?.start()\n            totalTranslationY = 0f\n            return result\n        }\n\n        override fun onDown(e: MotionEvent): Boolean {\n            lastY = e.rawY\n            return super.onDown(e)\n        }\n\n\n    })\n\n\n    private fun onSwipeTop() {\n\n        if (isNotScaled()) {\n            // Only close if not zoomed in\n            onFinishEventListener?.onFinish()\n//            (context as? Activity)?.finish()\n        }\n    }\n\n    private fun getPhotoView(): PhotoView? {\n        return try {\n            findViewById(R.id.imageView)\n        } catch (e: Exception) {\n            null\n        }\n    }\n\n    private fun getPlayerView(): View? {\n        return try {\n            findViewById(R.id.player_view)\n        } catch (e: Exception) {\n            null\n        }\n    }\n\n    private fun viewToMove(): View? {\n        return getPhotoView() ?: getPlayerView()\n    }\n\n    private fun isNotScaled(): Boolean {\n        return getPhotoView() == null || getPhotoView()?.scale == 1.0F\n    }\n\n\n}"
  },
  {
    "path": "modules/features/media/src/main/java/net/pantasystem/milktea/media/di/module/NavigationModule.kt",
    "content": "package net.pantasystem.milktea.media.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.common_navigation.MediaNavigation\nimport net.pantasystem.milktea.media.MediaNavigationImpl\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n\n    @Binds\n    abstract fun bindMediaNavigation(impl: MediaNavigationImpl): MediaNavigation\n\n}"
  },
  {
    "path": "modules/features/media/src/main/res/drawable/ic_file_download_black_24dp.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M19,9h-4V3H9v6H5l7,7 7,-7zM5,18v2h14v-2H5z\"/>\n</vector>\n"
  },
  {
    "path": "modules/features/media/src/main/res/layout/activity_media.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <FrameLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.media.MediaActivity\"\n            >\n\n\n\n        <net.pantasystem.milktea.media.PhotoViewViewPager\n                android:id=\"@+id/mediaViewPager\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:transitionName=\"image\"/>\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/mediaToolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"?attr/colorPrimary\"\n                android:minHeight=\"?attr/actionBarSize\"\n                android:theme=\"?attr/actionBarTheme\"\n                android:layout_gravity=\"top\"\n                android:backgroundTint=\"#00000000\"\n                android:elevation=\"0dp\"\n                />\n\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/media/src/main/res/layout/fragment_image.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        >\n        <net.pantasystem.milktea.media.SwipeFinishLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:id=\"@+id/swipeFinishLayout\">\n            <com.github.chrisbanes.photoview.PhotoView\n                android:id=\"@+id/imageView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"/>\n\n            <ProgressBar\n                android:id=\"@+id/progressBar\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\" />\n        </net.pantasystem.milktea.media.SwipeFinishLayout>\n    </FrameLayout>\n\n</layout>\n"
  },
  {
    "path": "modules/features/media/src/main/res/layout/fragment_player.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n    <net.pantasystem.milktea.media.SwipeFinishLayout\n        android:id=\"@+id/swipeFinishLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <com.google.android.exoplayer2.ui.StyledPlayerView\n            android:id=\"@+id/player_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"/>\n    </net.pantasystem.milktea.media.SwipeFinishLayout>\n</LinearLayout>"
  },
  {
    "path": "modules/features/media/src/main/res/menu/menu_media.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item\n            android:id=\"@+id/download_file\"\n            android:icon=\"@drawable/ic_file_download_black_24dp\"\n            android:title=\"@string/download\" />\n</menu>"
  },
  {
    "path": "modules/features/messaging/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/messaging/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n    }\n    buildFeatures {\n        dataBinding true\n        compose true\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.messaging'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_navigation')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.wada811.databinding\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n\n    implementation libs.kotlin.datetime\n\n\n    implementation libs.lifecycle.livedata\n\n    implementation libs.fragment.ktx\n    implementation libs.activity.ktx\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/messaging/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/messaging/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/messaging/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessageActivity.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.MessageNavigation\nimport net.pantasystem.milktea.common_navigation.MessageNavigationArgs\nimport net.pantasystem.milktea.messaging.databinding.ActivityMessageBinding\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\nclass MessageNavigationImpl @Inject constructor(\n    val activity: Activity\n) : MessageNavigation {\n    override fun newIntent(args: MessageNavigationArgs): Intent {\n        val intent = Intent(activity, MessageActivity::class.java)\n        intent.putExtra(MessageActivity.EXTRA_MESSAGING_ID, args.messagingId)\n        return intent\n    }\n}\n\n@AndroidEntryPoint\nclass MessageActivity : AppCompatActivity() {\n\n    companion object {\n        const val EXTRA_MESSAGING_ID =\n            \"net.pantasystem.milktea.messaging.MessageActivity.EXTRA_MESSAGING_ID\"\n    }\n\n    private lateinit var mBinding: ActivityMessageBinding\n\n    @Inject\n    lateinit var setTheme: ApplyTheme\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setTheme.invoke()\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_message)\n        mBinding.lifecycleOwner = this\n\n        val messagingId = intent?.getSerializableExtra(EXTRA_MESSAGING_ID) as MessagingId?\n\n        if (messagingId == null) {\n            Log.e(\"MessageActivity\", \"EXTRA_MESSAGE_HISTORY must not null\")\n            finish()\n            return\n        }\n\n        if (savedInstanceState == null) {\n            val ft = supportFragmentManager.beginTransaction()\n            val fragment = MessageFragment.newInstance(messagingId)\n            ft.add(R.id.content_main, fragment)\n            ft.commit()\n        }\n\n    }\n\n\n}\n"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessageBubble.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.aspectRatio\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.common_compose.getSimpleElapsedTime\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.make\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.make\n\n@Composable\n@Stable\nfun SelfMessageBubble(\n    message: Message,\n    accountHost: String?,\n) {\n\n    Row(\n        modifier = Modifier.fillMaxWidth(),\n        horizontalArrangement = Arrangement.End,\n    ) {\n        Spacer(Modifier.width(48.dp))\n\n        Column(\n            horizontalAlignment = Alignment.End\n        ) {\n            Surface(\n                shape = RoundedCornerShape(20.dp, 4.dp, 20.dp, 20.dp),\n                color = MaterialTheme.colorScheme.primary,\n                shadowElevation = 4.dp\n            ) {\n                Column(\n                    Modifier.padding(8.dp),\n                    horizontalAlignment = Alignment.End\n                ) {\n                    if (message.text != null) {\n                        CustomEmojiText(\n                            text = message.text ?: \"\",\n                            emojis = message.emojis,\n                            accountHost = accountHost,\n                            sourceHost = accountHost,\n                            fontSize = 16.sp\n                        )\n                    }\n                    if (message.file != null) {\n                        Image(\n                            modifier = Modifier\n                                .fillMaxWidth()\n                                .aspectRatio(4f / 3),\n                            painter = rememberAsyncImagePainter(message.file?.thumbnailUrl),\n                            contentDescription = null\n                        )\n                    }\n                }\n            }\n\n            Text(getSimpleElapsedTime(time = message.createdAt))\n        }\n\n    }\n}\n\n@Composable\n@Stable\nfun RecipientMessageBubble(\n    user: User,\n    message: Message,\n    accountHost: String?\n) {\n    Row(\n        modifier = Modifier.fillMaxWidth()\n    ) {\n        MessageAvatarIcon(avatarUrl = user.avatarUrl)\n        Spacer(Modifier.width(8.dp))\n        Column {\n            CustomEmojiText(\n                text = user.displayName,\n                emojis = user.emojis,\n                fontSize = 16.sp,\n                accountHost = accountHost,\n                sourceHost = user.host,\n            )\n            Surface(\n                shape = RoundedCornerShape(4.dp, 20.dp, 20.dp, 20.dp),\n                color = MaterialTheme.colorScheme.surface,\n                shadowElevation = 4.dp\n            ) {\n                Column(\n                    Modifier.padding(8.dp)\n                ) {\n                    if (message.text != null) {\n                        CustomEmojiText(text = message.text ?: \"\", emojis = message.emojis, accountHost = accountHost, sourceHost = user.host)\n                    }\n                    if (message.file != null) {\n                        Image(\n                            modifier = Modifier\n                                .fillMaxWidth()\n                                .aspectRatio(4f / 3),\n                            painter = rememberAsyncImagePainter(message.file?.thumbnailUrl),\n                            contentDescription = null\n                        )\n                    }\n\n                }\n\n            }\n            Text(getSimpleElapsedTime(time = message.createdAt))\n        }\n        Spacer(Modifier.width(48.dp))\n\n\n    }\n}\n\n\n@Composable\n@Stable\nprivate fun MessageAvatarIcon(avatarUrl: String?) {\n    AvatarIcon(url = avatarUrl, size = 50.dp)\n}\n\n@Preview\n@Composable\nfun PreviewMessageBubble() {\n    Column {\n        SelfMessageBubble(\n            Message.Direct.make(\n                id = Message.Id(0L, \"\"),\n                recipientId = User.Id(0L, \"\"),\n                userId = User.Id(0L, \"\"),\n                text = \"testtesttest\"\n            ),\n            accountHost = null,\n        )\n        RecipientMessageBubble(\n            User.Simple.make(User.Id(0L, \"\"), \"harunon\"),\n            Message.Direct.make(\n                id = Message.Id(0L, \"\"),\n                recipientId = User.Id(0L, \"\"),\n                userId = User.Id(0L, \"\"),\n                text = \"testtesttest\"\n            ),\n            accountHost = null,\n        )\n    }\n}"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessageFragment.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.DriveNavigation\nimport net.pantasystem.milktea.common_navigation.DriveNavigationArgs\nimport net.pantasystem.milktea.common_navigation.EXTRA_SELECTED_FILE_PROPERTY_IDS\nimport net.pantasystem.milktea.messaging.viewmodel.MessageEditorViewModel\nimport net.pantasystem.milktea.messaging.viewmodel.MessageViewModel\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass MessageFragment : Fragment() {\n\n    companion object {\n        private const val EXTRA_MESSAGING_ID =\n            \"jp.panta.misskeyandroidclient.viewmodel.messaging.EXTRA_MESSAGING_ID\"\n\n        fun newInstance(messagingId: MessagingId): MessageFragment {\n            return MessageFragment().also { fragment ->\n                fragment.arguments = Bundle().also {\n                    it.putSerializable(EXTRA_MESSAGING_ID, messagingId)\n                }\n            }\n        }\n    }\n\n\n\n    private val messageViewModel by viewModels<MessageViewModel>()\n\n    private val messageActionViewModel by viewModels<MessageEditorViewModel>()\n\n    private val messagingId: MessagingId by lazy {\n        arguments?.getSerializable(EXTRA_MESSAGING_ID) as MessagingId\n    }\n\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n\n    @Inject\n    lateinit var driveNavigation: DriveNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        messageActionViewModel.setMessagingId(messagingId)\n        messageViewModel.setMessagingId(messagingId)\n\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    MessageScreen(\n                        messageViewModel = messageViewModel,\n                        messageActionViewModel = messageActionViewModel,\n                        onOpenDriveToSelect = {\n                            openDriveActivity()\n                        },\n                        onNavigateUp = {\n                            requireActivity().finish()\n                        }\n                    )\n                }\n            }\n        }.rootView\n    }\n\n\n    private fun openDriveActivity() {\n        val intent = driveNavigation.newIntent(DriveNavigationArgs(selectableFileMaxSize = 1))\n        intent.action = Intent.ACTION_OPEN_DOCUMENT\n        intent.action = Intent.ACTION_OPEN_DOCUMENT\n        openDriveActivityForPickFileResult.launch(intent)\n    }\n\n    private val openDriveActivityForPickFileResult = registerForActivityResult(\n        ActivityResultContracts.StartActivityForResult()\n    ) { result ->\n        val ids =\n            (result.data?.getSerializableExtra(EXTRA_SELECTED_FILE_PROPERTY_IDS) as? List<*>)?.map {\n                it as FileProperty.Id\n            }\n        ids?.firstOrNull()?.let {\n            messageActionViewModel.setFilePropertyFromId(it)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessageHistoryCard.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.messaging.*\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.make\n\nsealed interface Action {\n    data class OnClick(val history: MessageHistoryRelation) : Action\n    data class OnAvatarIconClick(val user: User) : Action\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun MessageHistoryCard(\n    history: MessageHistoryRelation,\n    onAction: (Action) -> Unit,\n    isUserNameDefault: Boolean\n) {\n\n    Card(\n        onClick = {\n            onAction(Action.OnClick(history))\n        },\n        modifier = Modifier.fillMaxWidth()\n    ) {\n        Row(\n            modifier = Modifier.padding(\n                horizontal = 16.dp,\n                vertical = 12.dp\n            ),\n        ) {\n            AvatarIcon(\n                url = history.thumbnailUrl,\n                size = 64.dp,\n                onAvatarClick = {\n                    onAction(\n                        Action.OnAvatarIconClick(\n                            when (history) {\n                                is MessageHistoryRelation.Direct -> history.partner\n                                is MessageHistoryRelation.Group -> history.user\n                            }\n                        )\n                    )\n                }\n            )\n\n            Spacer(modifier = Modifier.width(8.dp))\n\n            Column {\n                when (history) {\n                    is MessageHistoryRelation.Direct -> {\n                        CustomEmojiText(\n                            text = history.getTitle(isUserNameDefault),\n                            emojis = history.partner.emojis,\n                            maxLines = 1,\n                            fontSize = 18.sp,\n                            fontWeight = FontWeight.SemiBold,\n                            accountHost = history.account.getHost(),\n                            sourceHost = history.partner.host,\n                            parsedResult = if (isUserNameDefault) null else history.partner.parsedResult\n                        )\n                    }\n                    is MessageHistoryRelation.Group -> {\n                        Text(\n                            history.getTitle(isUserNameDefault),\n                            maxLines = 1,\n                            fontSize = 18.sp,\n                            fontWeight = FontWeight.SemiBold\n                        )\n                    }\n                }\n\n                Spacer(modifier = Modifier.height(2.dp))\n                if (history.message.text != null) {\n                    Text(\n                        history.message.text ?: \"\"\n                    )\n                }\n\n\n            }\n        }\n\n    }\n\n}\n\n@Composable\n@Preview\nfun PreviewMessageHistoryCard() {\n\n    MessageHistoryCard(\n        history = MessageHistoryRelation.Direct(\n            account = Account(\n                remoteId = \"1\",\n                instanceDomain = \"\",\n                userName = \"\",\n                Account.InstanceType.MISSKEY,\n                \"\"\n            ),\n            message = Message.Direct(\n                Message.Id(0L, \"\"),\n                createdAt = Clock.System.now(),\n                emojis = emptyList(),\n                file = null,\n                fileId = null,\n                isRead = true,\n                recipientId = User.Id(0L, \"2\"),\n                text = \"testtest\",\n                userId = User.Id(0L, \"1\")\n            ),\n            recipient = User.Simple.make(User.Id(0L, \"2\"), userName = \"harunon\"),\n            user = User.Simple.make(User.Id(0L, \"1\"), userName = \"Klm\", name = \"しゃも爺\")\n        ),\n        onAction = {},\n        isUserNameDefault = false\n    )\n}"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessageHistoryScreen.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.messaging.viewmodel.MessageHistoryViewModel\nimport net.pantasystem.milktea.model.messaging.messagingId\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun MessageHistoryScreen(\n    historyViewModel: MessageHistoryViewModel,\n    onAction: (Action) -> Unit,\n) {\n\n    val uiState by historyViewModel.uiState.collectAsState()\n    val isRefreshing by historyViewModel.isRefreshing.collectAsState()\n\n    LaunchedEffect(key1 = null) {\n        historyViewModel.loadGroupAndUser()\n    }\n\n    PullToRefreshBox(\n        modifier = Modifier\n            .fillMaxSize()\n            .nestedScroll(rememberNestedScrollInteropConnection()),\n        isRefreshing = isRefreshing,\n        onRefresh = { historyViewModel.loadGroupAndUser() }\n    ) {\n\n        LazyColumn(\n            modifier = Modifier\n                .fillMaxSize()\n        ) {\n            when(val content = uiState.histories.content) {\n                is StateContent.Exist -> {\n                    val list = content.rawContent\n                    items(content.rawContent.size, key = { list[it].messagingId }) { i ->\n                        MessageHistoryCard(\n                            history = list[i],\n                            isUserNameDefault = uiState.isUserNameDefault,\n                            onAction = onAction,\n                        )\n                    }\n                }\n                is StateContent.NotExist -> {\n                    item {\n                        Column(\n                            Modifier.fillMaxSize(),\n                            verticalArrangement = Arrangement.Center,\n                            horizontalAlignment = Alignment.CenterHorizontally\n                        ) {\n                            when (val state = uiState.histories) {\n                                is ResultState.Error -> {\n                                    Text(\"Load Error\")\n                                    Text(state.throwable.toString())\n                                }\n                                is ResultState.Fixed -> {\n                                    Text(\"No content\")\n                                }\n                                is ResultState.Loading -> {\n                                    CircularProgressIndicator()\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n\n        }\n\n\n    }\n\n}"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessageScreen.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.LazyListState\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.Cloud\nimport androidx.compose.material.icons.filled.Send\nimport androidx.compose.runtime.*\nimport androidx.compose.runtime.livedata.observeAsState\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.ui.isScrolledToTheEnd\nimport net.pantasystem.milktea.messaging.viewmodel.MessageEditorViewModel\nimport net.pantasystem.milktea.messaging.viewmodel.MessageViewModel\nimport net.pantasystem.milktea.model.messaging.MessageRelation\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun MessageScreen(\n    messageViewModel: MessageViewModel,\n    messageActionViewModel: MessageEditorViewModel,\n    onOpenDriveToSelect: () -> Unit,\n    onNavigateUp: () -> Unit\n) {\n\n    val messages by messageViewModel.messages.collectAsState()\n    val scrollState = rememberLazyListState()\n    val account by messageViewModel.account.collectAsState()\n\n    val title by messageViewModel.title.observeAsState()\n\n    LaunchedEffect(key1 = messages) {\n        if (messageViewModel.latestReceivedMessageId != null && scrollState.layoutInfo.visibleItemsInfo.firstOrNull()?.index == 1) {\n            scrollState.animateScrollToItem(0)\n        }\n    }\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeContent,\n        topBar = {\n            TopAppBar(\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = \"Back\")\n                    }\n                },\n                title = {\n                    Text(title ?: \"\")\n                }\n            )\n        },\n        modifier = Modifier\n    ) {\n        Column(\n            Modifier\n                .padding(it)\n                .fillMaxSize()\n        ) {\n\n            Messages(\n                messageState = messages,\n                scrollState = scrollState,\n                accountHost = account?.getHost(),\n                modifier = Modifier\n                    .fillMaxSize()\n                    .weight(1f),\n                onLoad = {\n                    messageViewModel.loadOld()\n                },\n            )\n            MessageForm(messageActionViewModel = messageActionViewModel, onOpenDriveToSelect)\n        }\n    }\n}\n\n\n@Composable\n@Stable\nfun Messages(\n    modifier: Modifier = Modifier,\n    messageState: PageableState<List<MessageRelation>>,\n    accountHost: String?,\n    scrollState: LazyListState,\n    onLoad: () -> Unit\n) {\n\n\n    LaunchedEffect(key1 = scrollState) {\n        snapshotFlow {\n            scrollState.isScrolledToTheEnd()\n        }.distinctUntilChanged().collect {\n            if (it) {\n                onLoad.invoke()\n            }\n        }\n    }\n    when (val content = messageState.content) {\n        is StateContent.Exist -> {\n            LazyColumn(\n                modifier = modifier,\n                reverseLayout = true,\n                state = scrollState\n            ) {\n                items(content.rawContent.size) { index ->\n                    val message = content.rawContent[index]\n\n                    Box(Modifier.padding(4.dp)) {\n                        if (message.isMine()) {\n                            SelfMessageBubble(message = message.message, accountHost = accountHost)\n                        } else {\n                            RecipientMessageBubble(\n                                user = message.user,\n                                message = message.message,\n                                accountHost = accountHost,\n                            )\n                        }\n                    }\n                }\n            }\n        }\n        is StateContent.NotExist -> {\n            Box(\n                modifier,\n                contentAlignment = Alignment.Center,\n            ) {\n                CircularProgressIndicator()\n            }\n        }\n    }\n\n}\n\n@Composable\nfun MessageForm(\n    messageActionViewModel: MessageEditorViewModel,\n    onOpenDriveToSelect: () -> Unit,\n) {\n    Column(\n        Modifier\n            .fillMaxWidth()\n            .padding(4.dp)\n    ) {\n        val uiState by messageActionViewModel.uiState.collectAsState()\n        OutlinedTextField(\n            value = uiState.text,\n            onValueChange = { text ->\n                messageActionViewModel.setText(text)\n            },\n            modifier = Modifier.fillMaxWidth(),\n            placeholder = {\n                Text(stringResource(id = R.string.messaging_input_message))\n            }\n        )\n        Row(\n            horizontalArrangement = Arrangement.SpaceBetween,\n            modifier = Modifier.fillMaxWidth(),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            IconButton(onClick = onOpenDriveToSelect) {\n                Icon(Icons.Default.Cloud, contentDescription = \"Pick a File\")\n            }\n            if (uiState.file != null) {\n                Text(uiState.file?.name ?: \"\")\n            }\n            IconButton(onClick = {\n                messageActionViewModel.send()\n            }) {\n                Icon(Icons.Default.Send, contentDescription = \"Send\")\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessagingHistoryFragment.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.messaging.databinding.FragmentMessagingHistoryBinding\nimport net.pantasystem.milktea.messaging.viewmodel.MessageHistoryViewModel\nimport net.pantasystem.milktea.model.messaging.messagingId\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n\n@AndroidEntryPoint\nclass MessagingHistoryFragment : Fragment(R.layout.fragment_messaging_history) {\n\n    private val historyViewModel: MessageHistoryViewModel by viewModels()\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n\n    val binding: FragmentMessagingHistoryBinding by dataBinding()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        historyViewModel.loadGroupAndUser()\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        binding.composeBase.apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    MessageHistoryScreen(\n                        historyViewModel = historyViewModel,\n                        onAction = { action ->\n                            when (action) {\n                                is Action.OnAvatarIconClick -> {\n                                    val intent = userDetailNavigation.newIntent(\n                                        UserDetailNavigationArgs.UserId(action.user.id)\n                                    )\n                                    startActivity(intent)\n                                }\n                                is Action.OnClick -> {\n                                    val intent = Intent(activity, MessageActivity::class.java)\n                                    intent.putExtra(\n                                        MessageActivity.EXTRA_MESSAGING_ID,\n                                        action.history.messagingId\n                                    )\n                                    startActivity(intent)\n                                }\n                            }\n                        }\n                    )\n                }\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/MessagingListActivity.kt",
    "content": "package net.pantasystem.milktea.messaging\n\nimport android.os.Bundle\nimport android.view.MenuItem\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.messaging.databinding.ActivityMessagingListBinding\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n@AndroidEntryPoint\nclass MessagingListActivity : AppCompatActivity() {\n\n    lateinit var mBinding: ActivityMessagingListBinding\n\n    @Inject\n    lateinit var setTheme: ApplyTheme\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        setTheme.invoke()\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_messaging_list)\n        setSupportActionBar(mBinding.messagingListToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(mBinding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            mBinding.messagingListToolbar.updatePadding(top = insets.top)\n            mBinding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        val ft = supportFragmentManager.beginTransaction()\n        ft.replace(R.id.messagingListBase,\n            MessagingHistoryFragment()\n        )\n    }\n\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when(item.itemId){\n            android.R.id.home -> finish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n}\n"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/di/NavigationModule.kt",
    "content": "package net.pantasystem.milktea.messaging.di\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.common_navigation.MessageNavigation\nimport net.pantasystem.milktea.messaging.MessageNavigationImpl\n\n@Module\n@InstallIn(ActivityComponent::class)\nabstract class NavigationModule {\n    @Binds\n    abstract fun bindMessageActivityNavigation(impl: MessageNavigationImpl): MessageNavigation\n}"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/viewmodel/MessageEditorViewModel.kt",
    "content": "package net.pantasystem.milktea.messaging.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.update\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.messaging.CreateMessage\nimport net.pantasystem.milktea.model.messaging.MessageRepository\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MessageEditorViewModel @Inject constructor(\n\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val messageRepository: MessageRepository,\n    loggerFactory: Logger.Factory\n\n) : ViewModel() {\n\n\n    private val logger = loggerFactory.create(\"MessageActionViewModel\")\n\n    private val _uiState = MutableStateFlow(MessageEditorUiState(\"\", null))\n    val uiState: StateFlow<MessageEditorUiState> = _uiState\n\n    private val mErrors = MutableStateFlow<Throwable?>(null)\n\n    private val messagingId = MutableStateFlow<MessagingId?>(null)\n\n    fun setFilePropertyFromId(filePropertyId: FileProperty.Id) {\n        viewModelScope.launch {\n            _uiState.update { uiState ->\n                uiState.copy(file = filePropertyDataSource.find(filePropertyId).getOrNull())\n            }\n        }\n    }\n\n    fun send() {\n\n        val tmpText = uiState.value.text\n        val tmpFile = uiState.value.file\n        val msgId = messagingId.value\n\n        require(msgId != null)\n        viewModelScope.launch {\n            val createMessage = CreateMessage.Factory.create(msgId, tmpText, tmpFile?.id?.fileId)\n            runCancellableCatching { messageRepository.create(createMessage) }.onFailure {\n                logger.error(\"メッセージ作成中にエラー発生\", e = it)\n                mErrors.value = it\n            }.onSuccess {\n                _uiState.update { state ->\n                    state.copy(file = null, text = \"\")\n                }\n            }\n        }\n    }\n\n    fun setMessagingId(messagingId: MessagingId) {\n        this.messagingId.update {\n            messagingId\n        }\n    }\n\n    fun setText(text: String) {\n        _uiState.update { state ->\n            state.copy(text = text)\n        }\n    }\n\n}\n\ndata class MessageEditorUiState(\n    val text: String,\n    val file: FileProperty?,\n)"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/viewmodel/MessageHistoryViewModel.kt",
    "content": "package net.pantasystem.milktea.messaging.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.group.GroupRepository\nimport net.pantasystem.milktea.model.messaging.*\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@HiltViewModel\nclass MessageHistoryViewModel @Inject constructor(\n    accountStore: AccountStore,\n    loggerFactory: Logger.Factory,\n    private val userRepository: UserRepository,\n    private val accountRepository: AccountRepository,\n    private val groupRepository: GroupRepository,\n    private val messageObserver: MessageObserver,\n    private val messagingRepository: MessagingRepository,\n) : ViewModel() {\n\n\n    private val logger = loggerFactory.create(\"MessageHistoryViewModel\")\n\n    private val _actionFetchMessageHistories = MutableSharedFlow<Long>(\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n        extraBufferCapacity = 100\n    )\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val fetchUserMsgHistories = _actionFetchMessageHistories.map {\n        logger.debug { \"読み込み命令を検出\" }\n        accountRepository.getCurrentAccount().getOrThrow()\n    }.filterNotNull().flatMapLatest {\n        fetchHistory(false, it)\n    }.catch { e ->\n        emit(ResultState.Error(StateContent.NotExist(), e))\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState()\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val fetchGroupMsgHistories = _actionFetchMessageHistories.map {\n        logger.debug { \"読み込み命令を検出\" }\n        accountRepository.getCurrentAccount().getOrThrow()\n    }.filterNotNull().flatMapLatest {\n        fetchHistory(true, it)\n    }.catch { e ->\n        emit(ResultState.Error(StateContent.NotExist(), e))\n    }.flowOn(Dispatchers.IO).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(),\n        ResultState.initialState(),\n    ).stateIn(viewModelScope, SharingStarted.Eagerly, ResultState.initialState())\n\n    private val usersAndGroups =\n        combine(fetchUserMsgHistories, fetchGroupMsgHistories) { users, groups ->\n            logger.debug { \"users($users), groups($groups)\" }\n            val content =\n                if (users.content is StateContent.Exist || groups.content is StateContent.Exist) {\n                    val userList = (users.content as? StateContent.Exist)?.rawContent ?: emptyList()\n                    val groupList =\n                        (groups.content as? StateContent.Exist)?.rawContent ?: emptyList()\n                    StateContent.Exist(groupList + userList)\n                } else {\n                    StateContent.NotExist()\n                }\n            if (users is ResultState.Loading && groups is ResultState.Loading) {\n                ResultState.Loading(content)\n            } else if (users is ResultState.Error && groups is ResultState.Error) {\n                ResultState.Error(content, users.throwable)\n            } else {\n                ResultState.Fixed(content)\n            }\n        }.map {\n            it.convert { list ->\n                list.distinctBy { msg ->\n                    msg.messagingId\n                }\n            }\n        }.flowOn(Dispatchers.IO)\n\n    private val histories = usersAndGroups.stateIn(\n        viewModelScope,\n        SharingStarted.Lazily,\n        ResultState.initialState(),\n    )\n\n    private val isUserNameDefault = MutableStateFlow(false)\n\n    val uiState = combine(histories, isUserNameDefault) { histories, configState ->\n        MessageHistoryScreenUiState(configState, histories)\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(),\n        MessageHistoryScreenUiState()\n    )\n\n    val isRefreshing = combine(fetchUserMsgHistories, fetchGroupMsgHistories) { users, groups ->\n        users is ResultState.Loading || groups is ResultState.Loading\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(),\n        false\n    )\n\n\n    init {\n        viewModelScope.launch(Dispatchers.IO) {\n            accountStore.observeCurrentAccount.filterNotNull().flatMapLatest {\n                messageObserver.observeAccountMessages(it)\n            }.collect {\n                _actionFetchMessageHistories.tryEmit(Clock.System.now().toEpochMilliseconds())\n            }\n        }\n        viewModelScope.launch {\n            accountStore.observeCurrentAccount.distinctUntilChanged().collect {\n                loadGroupAndUser()\n            }\n        }\n    }\n\n    fun loadGroupAndUser() {\n        val result = _actionFetchMessageHistories.tryEmit(Clock.System.now().toEpochMilliseconds())\n        logger.debug { \"メッセージ一覧読み込み pub :$result\" }\n    }\n\n\n    private suspend fun fetchHistory(\n        isGroup: Boolean,\n        account: Account\n    ): Flow<ResultState<List<MessageHistoryRelation>>> {\n        logger.debug { \"fetchHistory\" }\n        return suspend {\n            messagingRepository.findMessageSummaries(account.accountId, isGroup).map { list ->\n                list.map {\n                    it.toHistory(groupRepository, userRepository)\n                }\n            }.onFailure {\n                logger.error(\"fetchMessagingHistory error\", e = it)\n            }.getOrThrow()\n        }.asLoadingStateFlow()\n\n    }\n\n\n}\n\ndata class MessageHistoryScreenUiState(\n    val isUserNameDefault: Boolean = true,\n    val histories: ResultState<List<MessageHistoryRelation>> = ResultState.initialState()\n)"
  },
  {
    "path": "modules/features/messaging/src/main/java/net/pantasystem/milktea/messaging/viewmodel/MessageViewModel.kt",
    "content": "package net.pantasystem.milktea.messaging.viewmodel\n\nimport androidx.lifecycle.LiveData\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.messaging.MessagePagingStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.group.GroupRepository\nimport net.pantasystem.milktea.model.messaging.Message\nimport net.pantasystem.milktea.model.messaging.MessageObserver\nimport net.pantasystem.milktea.model.messaging.MessageRelationGetter\nimport net.pantasystem.milktea.model.messaging.MessagingId\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass MessageViewModel @Inject constructor(\n    private val messagePagingStore: MessagePagingStore,\n    private val messageRelationGetter: MessageRelationGetter,\n    private val messageObserver: MessageObserver,\n    private val accountStore: AccountStore,\n    private val groupRepository: GroupRepository,\n    private val userRepository: UserRepository,\n    loggerFactory: Logger.Factory,\n) : ViewModel() {\n\n\n    private val logger by lazy {\n        loggerFactory.create(\"MessageViewModel\")\n    }\n\n    val latestReceivedMessageId: Message.Id?\n        get() = messagePagingStore.latestReceivedMessageId()\n\n    val messages = messagePagingStore.state.map { state ->\n        state.pageState.suspendConvert { list ->\n            list.mapNotNull { id ->\n                runCancellableCatching {\n                    messageRelationGetter.get(id)\n                }.getOrNull()\n            }.asReversed()\n        }\n    }.flowOn(Dispatchers.IO).catch {\n        logger.debug(e = it) { \"message error\" }\n    }.stateIn(viewModelScope, SharingStarted.Lazily, PageableState.Loading.Init())\n\n\n    val title: LiveData<String> = MutableLiveData(\"\")\n\n    val account = accountStore.observeCurrentAccount.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null\n    )\n\n    init {\n        @OptIn(ExperimentalCoroutinesApi::class)\n        viewModelScope.launch(Dispatchers.IO) {\n            accountStore.observeCurrentAccount.filterNotNull().flatMapLatest {\n                messageObserver.observeAccountMessages(it)\n            }.collect {\n                messagePagingStore.onReceiveMessage(it.id)\n            }\n        }\n\n        viewModelScope.launch(Dispatchers.IO) {\n            messagePagingStore.collectReceivedMessageQueue()\n        }\n    }\n\n\n    fun loadOld() {\n        viewModelScope.launch {\n            messagePagingStore.loadPrevious()\n        }\n    }\n\n    fun setMessagingId(messagingId: MessagingId) {\n        viewModelScope.launch {\n            messagePagingStore.setMessagingId(messagingId)\n            messagePagingStore.clear()\n            messagePagingStore.loadPrevious()\n            (title as MutableLiveData).postValue(loadMessageTitle(messagingId).getOrNull() ?: \"\")\n        }\n    }\n\n    private suspend fun loadMessageTitle(messagingId: MessagingId): Result<String> {\n        return runCancellableCatching {\n            when (messagingId) {\n                is MessagingId.Direct -> {\n                    userRepository.find(messagingId.userId).displayUserName\n                }\n                is MessagingId.Group -> {\n                    groupRepository.syncOne(messagingId.groupId).name\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "modules/features/messaging/src/main/res/layout/activity_message.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.messaging.MessageActivity\">\n\n\n        <FrameLayout\n                android:id=\"@+id/content_main\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"0.0\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintVertical_bias=\"0.0\">\n\n        </FrameLayout>\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/messaging/src/main/res/layout/activity_messaging_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.messaging.MessagingListActivity\">\n        <com.google.android.material.appbar.AppBarLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/messaging_list_toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:title=\"@string/message\"/>\n        </com.google.android.material.appbar.AppBarLayout>\n        <FrameLayout\n                android:id=\"@+id/messagingListBase\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"/>\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/messaging/src/main/res/layout/fragment_messaging_history.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        >\n\n    <androidx.compose.ui.platform.ComposeView\n            android:id=\"@+id/composeBase\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n</layout>\n"
  },
  {
    "path": "modules/features/note/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/note/CustomEmojiCompleteAdapter.kt",
    "content": ""
  },
  {
    "path": "modules/features/note/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'dagger.hilt.android.plugin'\n    id 'kotlin-kapt'\n    alias libs.plugins.kotlin.serialization.plugin\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n\n    buildFeatures {\n        compose true\n        dataBinding true\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n\n    viewBinding {\n        enabled = true\n    }\n    namespace 'net.pantasystem.milktea.note'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_android_ui')\n\n    implementation libs.androidx.constraintlayout\n    implementation project(path: ':modules:worker')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n\n    //Kotlin coroutines用ライブラリ(async, await)\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n    implementation libs.recyclerview\n    implementation libs.flexbox\n    implementation libs.androidx.swiperefreshlayout\n    implementation libs.androidx.viewpager2\n    implementation libs.kotlin.datetime\n    implementation libs.lifecycle.livedata\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    implementation libs.coil.svg\n    implementation libs.compose.constraintlayout\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.fragment.ktx\n    implementation libs.wada811.databinding\n    implementation libs.activity.ktx\n\n    implementation libs.glide.glide\n    kapt libs.glide.compiler\n    implementation libs.accompanist.glide\n    implementation libs.retrofit\n\n    implementation 'jp.wasabeef:glide-transformations:4.3.0'\n    // If you want to use the GPU Filters\n    implementation 'jp.co.cyberagent.android:gpuimage:2.1.0'\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n    implementation 'io.github.ahmad-hamwi:tabsync:1.0.1'\n\n    implementation (\"com.github.bumptech.glide:recyclerview-integration:4.14.2\") {\n        // Excludes the support library because it's already included by Glide.\n        transitive = false\n    }\n}"
  },
  {
    "path": "modules/features/note/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/note/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/note/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.VIBRATE\" />\n\n</manifest>"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/DraftNotesActivity.kt",
    "content": "package net.pantasystem.milktea.note\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.note.databinding.ActivityDraftNotesBinding\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass DraftNotesActivity : AppCompatActivity() {\n\n    companion object {\n        const val EXTRA_DRAFT_NOTE_ID = \"DraftNotesActivity.EXTRA_DRAFT_NOTE_ID\"\n    }\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    private lateinit var mBinding: ActivityDraftNotesBinding\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_draft_notes)\n        mBinding.lifecycleOwner = this\n\n    }\n\n\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/EmojiPickerUiState.kt",
    "content": "package net.pantasystem.milktea.note\n\nimport androidx.lifecycle.SavedStateHandle\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.coroutines.combine\nimport net.pantasystem.milktea.common.text.LevenshteinDistance\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfig\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfigRepository\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistory\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryCount\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryRepository\n\n\nclass EmojiPickerUiStateService(\n    accountStore: AccountStore,\n    private val customEmojiRepository: CustomEmojiRepository,\n    private val reactionHistoryRepository: ReactionHistoryRepository,\n    private val userEmojiConfigRepository: UserEmojiConfigRepository,\n    private val logger: Logger,\n    savedStateHandle: SavedStateHandle,\n    coroutineScope: CoroutineScope,\n) {\n    companion object {\n        const val EXTRA_ACCOUNT_ID = \"EmojiPickerViewModel.EXTRA_ACCOUNT_ID\"\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val account = savedStateHandle.getStateFlow<Long>(EXTRA_ACCOUNT_ID, -1L).map {\n        it.takeIf {\n            it > 0\n        }\n    }.flatMapLatest { specifiedId ->\n        accountStore.getOrCurrent(specifiedId)\n    }.stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val emojis = account\n        .filterNotNull()\n        .flatMapLatest { ac ->\n            customEmojiRepository.observeBy(ac.getHost(), withAliases = true)\n        }.catch {\n            logger.error(\"絵文字の取得に失敗\", it)\n        }.flowOn(Dispatchers.IO)\n        .stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val reactionCount = account\n        .filterNotNull()\n        .flatMapLatest { ac ->\n            reactionHistoryRepository.observeSumReactions(ac.normalizedInstanceUri)\n        }.catch {\n            logger.error(\"リアクション履歴の取得に失敗\", it)\n        }.flowOn(Dispatchers.IO)\n        .stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val userSetting = account\n        .filterNotNull()\n        .flatMapLatest { ac ->\n            userEmojiConfigRepository.observeByInstanceDomain(ac.normalizedInstanceUri)\n        }.catch {\n            logger.error(\"ユーザーリアクション設定情報の取得に失敗\", it)\n        }.stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val recentlyUsedReactions =\n        account.filterNotNull().flatMapLatest {\n            reactionHistoryRepository.observeRecentlyUsedBy(it.normalizedInstanceUri, limit = 20)\n        }.catch {\n            logger.error(\"絵文字の直近使用履歴の取得に失敗\", it)\n        }.stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    val searchWord = MutableStateFlow(\"\")\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val filteredEmojis = searchWord\n        .debounce(300L)\n        .flatMapLatest { keyword ->\n        account.filterNotNull().map { account ->\n            keyword to account\n        }\n    }.flatMapLatest { (word, ac) ->\n        customEmojiRepository.observeWithSearch(\n            host = ac.getHost(),\n            keyword = word.replace(\":\", \"\")\n        ).map {\n            it.sortedBy { emoji ->\n                LevenshteinDistance(emoji.name, word)\n            }\n        }\n    }.stateIn(\n        coroutineScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n\n    // 検索時の候補\n    val uiState: StateFlow<EmojiPickerUiState> = combine(\n        searchWord,\n        filteredEmojis,\n        account,\n        emojis,\n        reactionCount, userSetting,\n        recentlyUsedReactions\n    ) { word,\n        filtered,\n        ac,\n        emojis,\n        counts,\n        settings,\n        recentlyUsed ->\n        val map = ac?.getHost()?.let {\n            customEmojiRepository.findAndConvertToMap(it).getOrElse { emptyMap() }\n        }\n        EmojiPickerUiState(\n            keyword = word,\n            account = ac,\n            customEmojis = emojis,\n            reactionHistoryCounts = counts,\n            userSettingReactions = settings,\n            recentlyUsedReactions = recentlyUsed,\n            filteredEmojis = filtered,\n            customEmojiNameMap = map ?: emptyMap()\n        )\n    }.stateIn(\n        coroutineScope,\n        SharingStarted.Eagerly,\n        EmojiPickerUiState(\n            \"\",\n            null, emptyList(),\n            emptyList(),\n            emptyList(),\n            emptyList(),\n            emptyList(),\n            emptyMap(),\n        )\n    )\n\n}\n\ndata class EmojiPickerUiState(\n    val keyword: String,\n    val account: Account?,\n    val customEmojis: List<CustomEmoji>,\n    val filteredEmojis: List<CustomEmoji>,\n    val reactionHistoryCounts: List<ReactionHistoryCount>,\n    val userSettingReactions: List<UserEmojiConfig>,\n    val recentlyUsedReactions: List<ReactionHistory>,\n    val customEmojiNameMap: Map<String, CustomEmoji>,\n) {\n\n    val isSearchMode = keyword.isNotBlank()\n\n\n    private val frequencyUsedReactionsV2: List<EmojiType> by lazy {\n        reactionHistoryCounts.map {\n            it.reaction\n        }.mapNotNull { reaction ->\n            EmojiType.from(customEmojiNameMap, reaction)\n        }.distinct()\n    }\n\n    private val userSettingEmojis: List<EmojiType> by lazy {\n        userSettingReactions.mapNotNull { setting ->\n            EmojiType.from(customEmojiNameMap, setting.reaction)\n        }.ifEmpty {\n            LegacyReaction.defaultReaction.map {\n                EmojiType.Legacy(it)\n            }\n        }\n    }\n\n    private val otherEmojis = customEmojis.filter {\n        it.category.isNullOrBlank()\n    }.map {\n        EmojiType.CustomEmoji(it)\n    }\n\n    private fun getCategoryBy(category: String): List<EmojiType> {\n        return customEmojis.filter {\n            it.category == category\n\n        }.map {\n            EmojiType.CustomEmoji(it)\n        }\n    }\n\n    private val categories = customEmojis.filterNot {\n        it.category.isNullOrBlank()\n    }.mapNotNull {\n        it.category\n    }.distinct()\n\n    private val recentlyUsed = recentlyUsedReactions.mapNotNull {\n        EmojiType.from(customEmojiNameMap, it.reaction)\n    }\n\n\n    val emojiListItems: List<EmojiListItemType> = generateEmojiListItems()\n\n\n    val tabHeaderLabels = emojiListItems.mapNotNull {\n        (it as? EmojiListItemType.Header)?.label\n    }\n\n    fun isExistsConfig(emojiType: EmojiType): Boolean {\n        return userSettingEmojis.any {\n            emojiType.areItemsTheSame(it)\n        }\n    }\n\n    private fun generateEmojiListItems(): List<EmojiListItemType> {\n        return if (keyword.isBlank()) {\n            listOf(\n                EmojiListItemType.Header(StringSource.invoke(R.string.user)),\n            ) + userSettingEmojis.map {\n                EmojiListItemType.EmojiItem(it)\n            } + EmojiListItemType.Header(StringSource.invoke(R.string.often_use)) + frequencyUsedReactionsV2.map {\n                EmojiListItemType.EmojiItem(it)\n            } + EmojiListItemType.Header(StringSource(R.string.recently_used)) + recentlyUsed.map {\n                EmojiListItemType.EmojiItem(it)\n            } + EmojiListItemType.Header(StringSource.invoke(R.string.other)) + otherEmojis.map {\n                EmojiListItemType.EmojiItem(it)\n            } + categories.map { category ->\n                listOf(EmojiListItemType.Header(StringSource.invoke(category))) + getCategoryBy(\n                    category\n                ).map {\n                    EmojiListItemType.EmojiItem(it)\n                }\n            }.flatten()\n        } else {\n            filteredEmojis.map {\n                EmojiType.CustomEmoji(it)\n            }.sortedBy {\n                LevenshteinDistance(it.emoji.name, keyword)\n            }.map {\n                EmojiListItemType.EmojiItem(it)\n            }\n        }\n    }\n}\n\n\nsealed interface EmojiListItemType {\n    data class EmojiItem(val emoji: EmojiType) : EmojiListItemType\n\n    data class Header(val label: StringSource) : EmojiListItemType\n}\n\nsealed interface EmojiType {\n    data class Legacy(val type: String) : EmojiType\n    data class CustomEmoji(val emoji: net.pantasystem.milktea.model.emoji.CustomEmoji) : EmojiType\n    data class UtfEmoji(val code: String) : EmojiType\n    companion object\n\n    fun areItemsTheSame(other: EmojiType): Boolean {\n        if (this === other) {\n            return true\n        }\n        if (this.javaClass != other.javaClass) {\n            return false\n        }\n        return when (this) {\n            is CustomEmoji -> {\n                emoji == (other as? CustomEmoji)?.emoji\n            }\n\n            is Legacy -> {\n                type == (other as? Legacy)?.type\n            }\n\n            is UtfEmoji -> {\n                code == (other as? UtfEmoji)?.code\n            }\n        }\n    }\n\n    fun areContentsTheSame(other: EmojiType): Boolean {\n        return areItemsTheSame(other) && this == other\n    }\n}\n\nfun EmojiType.toTextReaction(): String {\n    return when (val type = this) {\n        is EmojiType.CustomEmoji -> {\n            \":${type.emoji.name}:\"\n        }\n\n        is EmojiType.Legacy -> {\n            type.type\n        }\n\n        is EmojiType.UtfEmoji -> {\n            type.code\n        }\n    }\n}\n\n\nfun EmojiType.Companion.from(emojis: Map<String, CustomEmoji>, reaction: String): EmojiType? {\n    return if (reaction.codePointCount(0, reaction.length) == 1) {\n        EmojiType.UtfEmoji(reaction)\n    } else if (reaction.startsWith(\":\") && reaction.endsWith(\":\") && reaction.contains(\n            \"@\"\n        )\n    ) {\n        val nameOnly = reaction.replace(\":\", \"\")\n        (emojis[nameOnly] ?: (nameOnly.split(\"@\")[0]).let { name ->\n            emojis[name]\n        })?.let {\n            EmojiType.CustomEmoji(it)\n        }\n    } else if (LegacyReaction.reactionMap[reaction] != null) {\n        EmojiType.Legacy(reaction)\n    } else {\n        emojis[reaction.replace(\":\", \"\")]?.let {\n            EmojiType.CustomEmoji(it)\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/NoteDetailActivity.kt",
    "content": "package net.pantasystem.milktea.note\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.app.TaskStackBuilder\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.getParentActivity\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_navigation.MainNavigation\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.databinding.ActivityNoteDetailBinding\nimport net.pantasystem.milktea.note.detail.NoteDetailAccountSwitchDialog\nimport net.pantasystem.milktea.note.detail.NoteDetailPagerFragment\nimport net.pantasystem.milktea.note.detail.viewmodel.NoteDetailPagerViewModel\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n@AndroidEntryPoint\nclass NoteDetailActivity : AppCompatActivity() {\n    companion object {\n\n        private const val TAG = \"NoteDetailActivity\"\n\n        const val EXTRA_IS_MAIN_ACTIVE = \"jp.panta.misskeyandroidclient.EXTRA_IS_MAIN_ACTIVE\"\n\n        fun newIntent(context: Context, noteId: Note.Id, fromPageable: Pageable? = null): Intent {\n            return Intent(context, NoteDetailActivity::class.java).apply {\n                putExtra(NoteDetailPagerViewModel.EXTRA_NOTE_ID, noteId.noteId)\n                putExtra(NoteDetailPagerViewModel.EXTRA_ACCOUNT_ID, noteId.accountId)\n                putExtra(NoteDetailPagerViewModel.EXTRA_FROM_PAGEABLE, fromPageable)\n            }\n        }\n    }\n\n    private var mNoteId: String? = null\n    private var mAccountId: Long? = null\n\n    private var mIsMainActive: Boolean = true\n\n    private var mParentActivity: Activities? = null\n\n    private val binding: ActivityNoteDetailBinding by dataBinding()\n    val notesViewModel: NotesViewModel by viewModels()\n\n    @Inject\n    internal lateinit var settingStore: SettingStore\n\n    @Inject\n    internal lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n\n    private val accountViewModel: AccountViewModel by viewModels()\n\n    @Inject\n    internal lateinit var setTheme: ApplyTheme\n\n    @Inject\n    lateinit var mainNavigation: MainNavigation\n\n    @Inject\n    lateinit var setMenuTint: ApplyMenuTint\n\n    @Suppress(\"DEPRECATION\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setTheme()\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_note_detail)\n\n        setSupportActionBar(binding.noteDetailToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.noteDetailToolbar.updatePadding(top = insets.top)\n            binding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        mParentActivity = intent.getParentActivity()\n\n        val noteId = intent.getStringExtra(NoteDetailPagerViewModel.EXTRA_NOTE_ID)\n            ?: intent.data?.path?.split(\"/notes/\")?.lastOrNull()\n        Log.d(TAG, \"受け取ったnoteId: $noteId\")\n        mNoteId = noteId\n        mAccountId = intent.getLongExtra(NoteDetailPagerViewModel.EXTRA_ACCOUNT_ID, -1).let {\n            if (it == -1L) null else it\n        }\n\n        mIsMainActive = intent.getBooleanExtra(EXTRA_IS_MAIN_ACTIVE, true)\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n        val ft = supportFragmentManager.beginTransaction()\n\n        val fragment = NoteDetailPagerFragment.newInstance(noteId!!,\n            intent.getSerializableExtra(NoteDetailPagerViewModel.EXTRA_FROM_PAGEABLE) as? Pageable, mAccountId)\n        ft.replace(\n            R.id.fragment_base,\n            fragment\n        )\n        ft.commit()\n\n\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.note_detail_menu, menu)\n        setMenuTint(this, menu)\n        return super.onCreateOptionsMenu(menu)\n    }\n\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> {\n                finishAndGoToMainActivity()\n            }\n            R.id.nav_add_to_tab -> {\n                addToTab()\n            }\n            R.id.nav_switch_account -> {\n                NoteDetailAccountSwitchDialog().show(supportFragmentManager, NoteDetailAccountSwitchDialog.FRAGMENT_TAG)\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    private fun finishAndGoToMainActivity() {\n        when (mParentActivity) {\n            Activities.ACTIVITY_OUT_APP -> {\n                val upIntent = mainNavigation.newIntent(Unit)\n                upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)\n                if (shouldUpRecreateTask(upIntent)) {\n                    TaskStackBuilder.create(this)\n                        .addNextIntentWithParentStack(upIntent)\n                        .startActivities()\n                    finish()\n                } else {\n                    navigateUpTo(upIntent)\n                }\n            }\n            Activities.ACTIVITY_IN_APP -> {\n                finish()\n            }\n\n            else -> {}\n        }\n        if (!mIsMainActive) {\n\n            startActivity(mainNavigation.newIntent(Unit))\n        }\n        finish()\n    }\n\n\n    private fun addToTab() {\n        val title = getString(R.string.detail)\n\n        accountViewModel.addPage(\n            Page(\n                -1,\n                title,\n                pageable = Pageable.Show(mNoteId!!),\n                weight = 0\n            )\n        )\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/NoteEditorActivity.kt",
    "content": "\npackage net.pantasystem.milktea.note\n\nimport android.Manifest\nimport android.app.AlarmManager\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Parcelable\nimport android.provider.Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM\nimport android.widget.Toast\nimport androidx.activity.compose.setContent\nimport androidx.activity.enableEdgeToEdge\nimport androidx.activity.result.PickVisualMediaRequest\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.app.TaskStackBuilder\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android.platform.PermissionUtil\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.putActivity\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.ChangedDiffResult\nimport net.pantasystem.milktea.common_navigation.DriveNavigation\nimport net.pantasystem.milktea.common_navigation.DriveNavigationArgs\nimport net.pantasystem.milktea.common_navigation.EXTRA_SELECTED_FILE_PROPERTY_IDS\nimport net.pantasystem.milktea.common_navigation.MainNavigation\nimport net.pantasystem.milktea.common_navigation.MediaNavigation\nimport net.pantasystem.milktea.common_navigation.MediaNavigationArgs\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigationArgs\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.editor.ConfirmSaveAsDraftDialog\nimport net.pantasystem.milktea.note.editor.NoteEditorFileSizeWarningDialog\nimport net.pantasystem.milktea.note.editor.NoteEditorScreen\nimport net.pantasystem.milktea.note.editor.ReservationPostDatePickerDialog\nimport net.pantasystem.milktea.note.editor.ReservationPostTimePickerDialog\nimport net.pantasystem.milktea.note.editor.account.NoteEditorSwitchAccountDialog\nimport net.pantasystem.milktea.note.editor.file.EditFileCaptionDialog\nimport net.pantasystem.milktea.note.editor.file.EditFileNameDialog\nimport net.pantasystem.milktea.note.editor.poll.PollDatePickerDialog\nimport net.pantasystem.milktea.note.editor.poll.PollTimePickerDialog\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorFocusEditTextType\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorSavedStateKey\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport net.pantasystem.milktea.note.editor.viewmodel.TextWithCursorPos\nimport net.pantasystem.milktea.note.editor.visibility.VisibilitySelectionDialogV2\nimport net.pantasystem.milktea.note.emojis.CustomEmojiPickerDialog\nimport net.pantasystem.milktea.note.emojis.viewmodel.EmojiSelection\nimport javax.inject.Inject\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass NoteEditorActivity : AppCompatActivity(), EmojiSelection {\n\n    companion object {\n        private const val EXTRA_REPLY_TO_NOTE_ID =\n            \"jp.panta.misskeyandroidclient.EXTRA_REPLY_TO_NOTE_ID\"\n        private const val EXTRA_QUOTE_TO_NOTE_ID =\n            \"jp.panta.misskeyandroidclient.EXTRA_QUOTE_TO_NOTE_ID\"\n        private const val EXTRA_DRAFT_NOTE_ID = \"jp.panta.misskeyandroidclient.EXTRA_DRAFT_NOTE\"\n        private const val EXTRA_ACCOUNT_ID = \"jp.panta.misskeyandroidclient.EXTRA_ACCOUNT_ID\"\n        private const val EXTRA_MENTIONS = \"EXTRA_MENTIONS\"\n        private const val EXTRA_CHANNEL_ID = \"EXTRA_CHANNEL_ID\"\n        private const val EXTRA_SPECIFIED_ACCOUNT_ID = \"EXTRA_SPECIFIED_ACCOUNT_ID\"\n\n        fun newBundle(\n            context: Context,\n            replyTo: Note.Id? = null,\n            quoteTo: Note.Id? = null,\n            draftNoteId: Long? = null,\n            mentions: List<String>? = null,\n            channelId: Channel.Id? = null,\n            accountId: Long? = null,\n            text: String? = null,\n        ): Intent {\n            return Intent(context, NoteEditorActivity::class.java).apply {\n                replyTo?.let {\n                    putExtra(EXTRA_REPLY_TO_NOTE_ID, replyTo.noteId)\n                    putExtra(EXTRA_ACCOUNT_ID, replyTo.accountId)\n                }\n                quoteTo?.let {\n                    putExtra(EXTRA_QUOTE_TO_NOTE_ID, quoteTo.noteId)\n                    putExtra(EXTRA_ACCOUNT_ID, quoteTo.accountId)\n                }\n                draftNoteId?.let {\n                    putExtra(EXTRA_DRAFT_NOTE_ID, it)\n                }\n                mentions?.let {\n                    putExtra(EXTRA_MENTIONS, it.toTypedArray())\n                }\n                channelId?.let {\n                    putExtra(EXTRA_CHANNEL_ID, it.channelId)\n                    putExtra(EXTRA_ACCOUNT_ID, it.accountId)\n                }\n                accountId?.let {\n                    putExtra(EXTRA_SPECIFIED_ACCOUNT_ID, it)\n                }\n                text?.let {\n                    putExtra(NoteEditorSavedStateKey.Text.name, it)\n                }\n            }\n        }\n    }\n\n    val mViewModel: NoteEditorViewModel by viewModels()\n    private val accountViewModel: AccountViewModel by viewModels()\n\n    @Inject internal lateinit var applyTheme: ApplyTheme\n    @Inject internal lateinit var accountStore: AccountStore\n    @Inject internal lateinit var settingStore: SettingStore\n    @Inject internal lateinit var driveNavigation: DriveNavigation\n    @Inject internal lateinit var authorizationNavigation: AuthorizationNavigation\n    @Inject lateinit var mediaNavigation: MediaNavigation\n    @Inject lateinit var searchAndUserNavigation: SearchAndSelectUserNavigation\n    @Inject lateinit var mainNavigation: MainNavigation\n    @Inject lateinit var userDetailNavigation: UserDetailNavigation\n    @Inject lateinit var loggerFactory: Logger.Factory\n    @Inject internal lateinit var configRepository: LocalConfigRepository\n    @Inject internal lateinit var customEmojiRepository: CustomEmojiRepository\n\n    private val logger by lazy { loggerFactory.create(\"NoteEditorActivity\") }\n\n    // テキストフィールドのカーソル位置（絵文字・メンション挿入位置の決定に使う）\n    private var textCursorPosition: Int = 0\n    private var cwCursorPosition: Int = 0\n\n    private val accountId: Long? by lazy(LazyThreadSafetyMode.NONE) {\n        intent.getLongExtra(EXTRA_ACCOUNT_ID, -1).takeIf { it != -1L }\n    }\n    private val replyToNoteId by lazy(LazyThreadSafetyMode.NONE) {\n        intent.getStringExtra(EXTRA_REPLY_TO_NOTE_ID)?.let {\n            Note.Id(requireNotNull(accountId), it)\n        }\n    }\n    private val quoteToNoteId by lazy(LazyThreadSafetyMode.NONE) {\n        intent.getStringExtra(EXTRA_QUOTE_TO_NOTE_ID)?.let {\n            Note.Id(requireNotNull(accountId), it)\n        }\n    }\n    private val channelId by lazy(LazyThreadSafetyMode.NONE) {\n        intent.getStringExtra(EXTRA_CHANNEL_ID)?.let {\n            Channel.Id(requireNotNull(accountId), it)\n        }\n    }\n    private val draftNoteId by lazy(LazyThreadSafetyMode.NONE) {\n        intent.getLongExtra(EXTRA_DRAFT_NOTE_ID, -1).takeIf { it != -1L }\n    }\n    private val mentions by lazy(LazyThreadSafetyMode.NONE) {\n        intent.getStringArrayExtra(EXTRA_MENTIONS)?.toList()\n    }\n    private val specifiedAccountId by lazy(LazyThreadSafetyMode.NONE) {\n        intent.getLongExtra(EXTRA_SPECIFIED_ACCOUNT_ID, -1).takeIf { it > 0 }\n    }\n\n    // EmojiSelection: CustomEmojiPickerDialog からのコールバック\n    override fun onSelect(emoji: CustomEmoji) = onSelect(\":${emoji.name}:\")\n\n    override fun onSelect(emoji: String) {\n        when (mViewModel.focusType) {\n            NoteEditorFocusEditTextType.Cw -> {\n                mViewModel.addEmoji(emoji, cwCursorPosition)\n            }\n            NoteEditorFocusEditTextType.Text -> {\n                val newPos = mViewModel.addEmoji(emoji, textCursorPosition)\n                mViewModel.textCursorPos.tryEmit(\n                    TextWithCursorPos(mViewModel.text.value, newPos)\n                )\n            }\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n        applyTheme()\n\n        // ACTION_SEND で共有されたコンテンツの処理\n        var sharedText: String? = null\n        when {\n            intent?.action == Intent.ACTION_SEND -> {\n                if (intent.type?.startsWith(\"text/\") == true) {\n                    sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)\n                }\n                if (intent.type?.startsWith(\"image/\") == true) {\n                    handleSendImage(intent)\n                }\n            }\n            intent.action == Intent.ACTION_SEND_MULTIPLE &&\n                    intent.type?.startsWith(\"image/\") == true -> {\n                handleSendImages(intent)\n            }\n        }\n\n        // ViewModel の初期化（savedInstanceState == null のときのみ）\n        if (savedInstanceState == null) {\n            mViewModel.setReplyTo(replyToNoteId)\n            mViewModel.setRenoteTo(quoteToNoteId)\n            if (channelId != null) mViewModel.setChannelId(channelId)\n            if (draftNoteId != null) mViewModel.setDraftNoteId(requireNotNull(draftNoteId))\n            mViewModel.setAccountId(specifiedAccountId)\n            if (!sharedText.isNullOrBlank()) mViewModel.changeText(sharedText)\n            if (!mentions.isNullOrEmpty()) addMentionUserNames(requireNotNull(mentions))\n        }\n\n        setupSideEffects()\n\n        setContent {\n            val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                NoteEditorScreen(\n                    viewModel = mViewModel,\n                    accountViewModel = accountViewModel,\n                    customEmojiRepository = customEmojiRepository,\n                    isPostButtonAtTheBottom = settingStore.isPostButtonAtTheBottom,\n                    onNavigateUp = ::upTo,\n                    onPickFileFromDrive = ::showDriveFileSelector,\n                    onPickFileFromLocal = ::showFileManager,\n                    onPickImageFromLocal = ::showMultipleImagePicker,\n                    onSelectMentionUsers = ::startMentionToSearchAndSelectUser,\n                    onSelectAddressUsers = ::startSearchAndSelectUser,\n                    onShowEmojiPicker = {\n                        CustomEmojiPickerDialog.newInstance(\n                            mViewModel.currentAccount.value?.accountId\n                        ).show(supportFragmentManager, CustomEmojiPickerDialog.FRAGMENT_TAG)\n                    },\n                    onShowDraftPicker = {\n                        pickDraftNoteActivityResult.launch(\n                            Intent(this, DraftNotesActivity::class.java).apply {\n                                action = Intent.ACTION_PICK\n                            }\n                        )\n                    },\n                    onShowAlarmPermissionDescriptionDialogIfPermissionDenied = {\n                        if (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n                                !alarmManager.canScheduleExactAlarms()\n                            } else {\n                                // TODO: 正しい実装をする\n                                return@NoteEditorScreen false\n                            }\n                        ) {\n                            MaterialAlertDialogBuilder(this)\n                                .setTitle(R.string.alarm_permission_description_title)\n                                .setMessage(R.string.alarm_permission_description_message)\n                                .setPositiveButton(android.R.string.ok) { _, _ ->\n                                    startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))\n                                }\n                                .setNegativeButton(android.R.string.cancel) { _, _ -> }\n                                .show()\n                            return@NoteEditorScreen true\n                        }\n                        false\n                    },\n                    onShowMediaPreview = {\n                        startActivity(mediaNavigation.newIntent(MediaNavigationArgs.AFile(it)))\n                    },\n                    onEditFileCaption = {\n                        EditFileCaptionDialog.newInstance(it.file, it.comment ?: \"\")\n                            .show(supportFragmentManager, EditFileCaptionDialog.FRAGMENT_TAG)\n                    },\n                    onEditFileName = {\n                        EditFileNameDialog.newInstance(it.file, it.name)\n                            .show(supportFragmentManager, EditFileNameDialog.FRAGMENT_TAG)\n                    },\n                    onShowVisibilityDialog = {\n                        VisibilitySelectionDialogV2()\n                            .show(supportFragmentManager, VisibilitySelectionDialogV2.FRAGMENT_TAG)\n                    },\n                    onShowReservationDatePicker = {\n                        ReservationPostDatePickerDialog()\n                            .show(\n                                supportFragmentManager,\n                                ReservationPostDatePickerDialog.FRAGMENT_TAG\n                            )\n                    },\n                    onShowReservationTimePicker = {\n                        ReservationPostTimePickerDialog()\n                            .show(\n                                supportFragmentManager,\n                                ReservationPostTimePickerDialog.FRAGMENT_TAG\n                            )\n                    },\n                    onShowPollDatePicker = {\n                        PollDatePickerDialog()\n                            .show(supportFragmentManager, PollDatePickerDialog.FRAGMENT_TAG)\n                    },\n                    onShowPollTimePicker = {\n                        PollTimePickerDialog()\n                            .show(supportFragmentManager, PollTimePickerDialog.FRAGMENT_TAG)\n                    },\n                    onShowConfirmSaveAsDraftDialog = {\n                        if (supportFragmentManager.findFragmentByTag(ConfirmSaveAsDraftDialog.FRAGMENT_TAG) == null) {\n                            ConfirmSaveAsDraftDialog()\n                                .show(\n                                    supportFragmentManager,\n                                    ConfirmSaveAsDraftDialog.FRAGMENT_TAG\n                                )\n                        }\n                    },\n                    onTextCursorPositionChanged = { textCursorPosition = it },\n                    onCwCursorPositionChanged = { cwCursorPosition = it },\n                )\n            }\n        }\n    }\n\n    // ---- サイドエフェクト ----\n\n    private fun setupSideEffects() {\n        // アカウント切り替えダイアログ\n        accountViewModel.switchAccountEvent.onEach {\n            NoteEditorSwitchAccountDialog()\n                .show(supportFragmentManager, NoteEditorSwitchAccountDialog.FRAGMENT_TAG)\n        }.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(lifecycleScope)\n\n        // ユーザー詳細への遷移\n        accountViewModel.showProfileEvent.onEach {\n            val intent = userDetailNavigation.newIntent(\n                UserDetailNavigationArgs.UserId(User.Id(it.accountId, it.remoteId))\n            )\n            intent.putActivity(Activities.ACTIVITY_IN_APP)\n            startActivity(intent)\n        }.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(lifecycleScope)\n\n        // 未認証状態の検知\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.STARTED) {\n                accountStore.state.collect {\n                    if (it.isUnauthorized) {\n                        finish()\n                        startActivity(authorizationNavigation.newIntent(AuthorizationArgs.New))\n                    }\n                }\n            }\n        }\n\n        // ファイルサイズ超過ダイアログ\n        mViewModel.fileSizeInvalidEvent\n            .flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)\n            .onEach {\n                NoteEditorFileSizeWarningDialog.newInstance(\n                    it.account.getHost(),\n                    it.instanceInfo.clientMaxBodyByteSize ?: 0,\n                    it.file\n                ).show(supportFragmentManager, NoteEditorFileSizeWarningDialog.FRAGMENT_TAG)\n            }.launchIn(lifecycleScope)\n    }\n\n    // ---- ファイル操作 ----\n\n    private fun showDriveFileSelector() {\n        val selectedSize = mViewModel.uiState.value.totalFilesCount\n        val selectableMaxSize = mViewModel.maxFileCount.value - selectedSize\n        val intent = driveNavigation.newIntent(\n            DriveNavigationArgs(\n                selectableFileMaxSize = selectableMaxSize,\n                accountId = mViewModel.currentAccount.value?.accountId,\n            )\n        ).apply { action = Intent.ACTION_OPEN_DOCUMENT }\n        openDriveActivityResult.launch(intent)\n    }\n\n    private fun checkPermission(): Boolean = PermissionUtil.checkReadStoragePermission(this)\n\n    private fun requestPermission() {\n        if (!checkPermission()) {\n            if (Build.VERSION.SDK_INT >= 33) {\n                requestReadMediasPermissionResult.launch(\n                    PermissionUtil.getReadMediaPermissions().toTypedArray()\n                )\n            } else {\n                requestReadStoragePermissionResult.launch(Manifest.permission.READ_EXTERNAL_STORAGE)\n            }\n        }\n    }\n\n    private fun showFileManager() {\n        if (checkPermission()) {\n            openLocalStorageResult.launch(arrayOf(\"*/*\"))\n        } else {\n            requestPermission()\n        }\n    }\n\n    private fun showMultipleImagePicker() {\n        if (checkPermission()) {\n            if (ActivityResultContracts.PickVisualMedia.isPhotoPickerAvailable()) {\n                pickMultipleMedia.launch(\n                    PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo)\n                )\n            } else {\n                openLocalStorageResult.launch(arrayOf(\"image/*\", \"video/*\"))\n            }\n        } else {\n            requestPermission()\n        }\n    }\n\n    private fun appendFile(uri: Uri) {\n        val takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION\n        contentResolver.takePersistableUriPermission(uri, takeFlags)\n        mViewModel.addFile(uri)\n    }\n\n    @Suppress(\"DEPRECATION\")\n    private fun handleSendImage(intent: Intent) {\n        (intent.getParcelableExtra(Intent.EXTRA_STREAM) as? Uri)?.let { appendFile(it) }\n    }\n\n    @Suppress(\"DEPRECATION\")\n    private fun handleSendImages(intent: Intent) {\n        intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)\n            ?.mapNotNull { it as? Uri }\n            ?.distinct()\n            ?.forEach { appendFile(it) }\n    }\n\n    // ---- ユーザー選択 ----\n\n    private fun startSearchAndSelectUser() {\n        val selectedUserIds = mViewModel.address.value.mapNotNull { it.userId }\n        val intent = searchAndUserNavigation.newIntent(\n            SearchAndSelectUserNavigationArgs(\n                selectedUserIds = selectedUserIds,\n                accountId = mViewModel.currentAccount.value?.accountId,\n            )\n        )\n        selectUserResult.launch(intent)\n    }\n\n    private fun startMentionToSearchAndSelectUser() {\n        val intent = searchAndUserNavigation.newIntent(\n            SearchAndSelectUserNavigationArgs(\n                accountId = mViewModel.currentAccount.value?.accountId,\n            )\n        )\n        selectMentionToUserResult.launch(intent)\n    }\n\n    private fun addMentionUserNames(userNames: List<String>) {\n        val newPos = mViewModel.addMentionUserNames(userNames, textCursorPosition)\n        mViewModel.textCursorPos.tryEmit(\n            TextWithCursorPos(mViewModel.text.value, newPos)\n        )\n    }\n\n    // ---- ナビゲーション ----\n\n    private fun upTo() {\n        val initialText = intent.getStringExtra(NoteEditorSavedStateKey.Text.name)\n        if (initialText.isNullOrEmpty()) {\n            finish()\n        } else {\n            val upIntent = mainNavigation.newIntent(Unit)\n            upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)\n            if (shouldUpRecreateTask(upIntent)) {\n                TaskStackBuilder.create(this)\n                    .addNextIntentWithParentStack(upIntent)\n                    .startActivities()\n                finish()\n            } else {\n                navigateUpTo(upIntent)\n            }\n        }\n    }\n\n    // ---- ActivityResultLaunchers ----\n\n    private val openDriveActivityResult = registerForActivityResult(\n        ActivityResultContracts.StartActivityForResult()\n    ) { result ->\n        val ids = (result?.data?.getSerializableExtra(EXTRA_SELECTED_FILE_PROPERTY_IDS) as List<*>?)\n            ?.mapNotNull { it as? FileProperty.Id }\n        logger.debug(\"result:$ids\")\n        val size = mViewModel.fileTotal()\n        if (!ids.isNullOrEmpty() && size + ids.size <= mViewModel.maxFileCount.value) {\n            mViewModel.addFilePropertyFromIds(ids)\n        }\n    }\n\n    private val pickDraftNoteActivityResult = registerForActivityResult(\n        ActivityResultContracts.StartActivityForResult()\n    ) { result ->\n        val draftNoteId = result.data\n            ?.getLongExtra(DraftNotesActivity.EXTRA_DRAFT_NOTE_ID, -1)\n            ?.takeIf { it > 0L }\n        if (draftNoteId != null) {\n            mViewModel.setDraftNoteId(draftNoteId)\n        }\n    }\n\n    private val openLocalStorageResult =\n        registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { uris ->\n            uris?.forEach { appendFile(it) }\n        }\n\n    private val requestReadStoragePermissionResult = registerForActivityResult(\n        ActivityResultContracts.RequestPermission()\n    ) {\n        if (it) showFileManager()\n        else Toast.makeText(\n            this, \"ストレージへのアクセスを許可しないとファイルを読み込めないぽよ\", Toast.LENGTH_LONG\n        ).show()\n    }\n\n    private val requestReadMediasPermissionResult = registerForActivityResult(\n        ActivityResultContracts.RequestMultiplePermissions()\n    ) { results ->\n        if (results.any { it.value }) showFileManager()\n        else Toast.makeText(\n            this, \"ストレージへのアクセスを許可しないとファイルを読み込めないぽよ\", Toast.LENGTH_LONG\n        ).show()\n    }\n\n    private val selectUserResult = registerForActivityResult(\n        ActivityResultContracts.StartActivityForResult()\n    ) { result ->\n        if (result.resultCode == RESULT_OK && result.data != null) {\n            val changed = result.data\n                ?.getSerializableExtra(SearchAndSelectUserNavigation.EXTRA_SELECTED_USER_CHANGED_DIFF)\n                as? ChangedDiffResult\n            if (changed != null) {\n                mViewModel.setAddress(changed.added, changed.removed)\n            }\n        }\n    }\n\n    private val selectMentionToUserResult = registerForActivityResult(\n        ActivityResultContracts.StartActivityForResult()\n    ) { result ->\n        if (result.resultCode == RESULT_OK && result.data != null) {\n            val changed = result.data\n                ?.getSerializableExtra(SearchAndSelectUserNavigation.EXTRA_SELECTED_USER_CHANGED_DIFF)\n                as? ChangedDiffResult\n            if (changed != null) {\n                addMentionUserNames(changed.selectedUserNames)\n            }\n        }\n    }\n\n    private val pickMultipleMedia = registerForActivityResult(\n        ActivityResultContracts.PickMultipleVisualMedia()\n    ) { uris ->\n        uris?.forEach { appendFile(it) }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/clip/ToggleAddNoteToClipDialog.kt",
    "content": "package net.pantasystem.milktea.note.clip\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.viewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ToggleAddNoteToClipDialog : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"ToggleAddNoteToClipDialog\"\n        fun newInstance(noteId: Note.Id): ToggleAddNoteToClipDialog {\n            return ToggleAddNoteToClipDialog().apply {\n                arguments = Bundle().apply {\n                    putSerializable(ToggleAddNoteToClipDialogViewModel.EXTRA_NOTE_ID, noteId)\n                }\n            }\n        }\n    }\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val viewModel: ToggleAddNoteToClipDialogViewModel by viewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return ComposeView(\n            requireContext()\n        ).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val uiState by viewModel.uiState.collectAsState()\n                    ToggleAddNoteToClipDialogLayout(\n                        uiState = uiState,\n                        onAddNoteToClip = viewModel::onAddToClip,\n                        onRemoveNoteToClip = viewModel::onRemoveToClip\n                    )\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/clip/ToggleAddNoteToClipDialogLayout.kt",
    "content": "package net.pantasystem.milktea.note.clip\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.model.clip.Clip\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.R\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun ToggleAddNoteToClipDialogLayout(\n    uiState: ToggleAddNoteToClipDialogUiState,\n    onAddNoteToClip: (Note.Id, Clip) -> Unit,\n    onRemoveNoteToClip: (Note.Id, Clip) -> Unit,\n) {\n    Surface(\n        modifier = Modifier.fillMaxWidth()\n    ) {\n        Column(\n            modifier = Modifier.fillMaxWidth().padding(vertical = 16.dp),\n            horizontalAlignment = Alignment.CenterHorizontally\n        ) {\n            Box(\n                modifier = Modifier.fillMaxWidth(),\n                contentAlignment = Alignment.Center\n            ) {\n                Text(stringResource(id = R.string.clip), fontWeight = FontWeight.Bold, fontSize = 24.sp)\n            }\n            LazyColumn(\n                Modifier\n                    .fillMaxWidth()\n                    .height(300.dp)\n                    .nestedScroll(rememberNestedScrollInteropConnection())\n            ) {\n                when(val state = uiState.clips) {\n                    is ResultState.Error -> {\n                        item {\n                            Text(\"load error\")\n                        }\n                    }\n                    is ResultState.Fixed -> {\n                        when (val content = state.content) {\n                            is StateContent.Exist -> {\n                                items(content.rawContent) { clip ->\n                                    ToggleAddNoteToClipTile(\n                                        clip = clip.clip,\n                                        state = clip.addState,\n                                        onClick = {\n                                            when(clip.addState) {\n                                                ClipAddState.Added -> {\n                                                    uiState.noteId?.let {\n                                                        onRemoveNoteToClip(it, clip.clip)\n                                                    }\n                                                }\n                                                ClipAddState.Unknown, ClipAddState.NotAdded -> {\n                                                    uiState.noteId?.let {\n                                                        onAddNoteToClip(it, clip.clip)\n                                                    }\n                                                }\n                                                ClipAddState.Progress -> {}\n                                            }\n                                        }\n                                    )\n                                }\n                            }\n                            is StateContent.NotExist -> {\n                                item {\n                                    Text(\"clip is not exists\")\n                                }\n                            }\n                        }\n                    }\n                    is ResultState.Loading -> {\n                        item {\n                            Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {\n                                CircularProgressIndicator()\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/clip/ToggleAddNoteToClipDialogViewModel.kt",
    "content": "package net.pantasystem.milktea.note.clip\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.model.clip.Clip\nimport net.pantasystem.milktea.model.clip.ClipId\nimport net.pantasystem.milktea.model.clip.ClipRepository\nimport net.pantasystem.milktea.model.note.Note\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ToggleAddNoteToClipDialogViewModel @Inject constructor(\n    private val clipRepository: ClipRepository,\n    savedStateHandle: SavedStateHandle,\n    private val loggerFactory: Logger.Factory,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_NOTE_ID = \"ToggleAddNoteToClipDialogViewModel.EXTRA_NOTE_ID\"\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"TANTDViewModel\")\n    }\n\n    val noteId = savedStateHandle.getStateFlow<Note.Id?>(EXTRA_NOTE_ID, null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val myClipsState = noteId.filterNotNull().distinctUntilChanged().flatMapLatest {\n        suspend {\n            clipRepository.getMyClips(it.accountId).getOrThrow()\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState(),\n    )\n\n\n    private val _relatedClips = MutableStateFlow<List<Clip>>(emptyList())\n\n    private val clipActionState = MutableStateFlow<Map<ClipId, ClipOptionalActionState>>(mapOf())\n    private val clipActionStateQueue =\n        MutableSharedFlow<Pair<ClipId, ClipOptionalActionState>>(extraBufferCapacity = 20)\n\n    private val clipStatuses: StateFlow<ResultState<List<ClipWithAddedState>>> =\n        combine(myClipsState, _relatedClips, clipActionState) { own, related, optionStatuses ->\n\n            own.convert { list ->\n                list.map { clip ->\n                    val status = optionStatuses.get(clip.id)\n                    val isAdded = related.any {\n                        it.id == clip.id\n                    }\n                    ClipWithAddedState(\n                        clip,\n                        if (clip.isPublic) {\n                            if (status is ClipOptionalActionState.Adding || status is ClipOptionalActionState.Removing) {\n                                ClipAddState.Progress\n                            } else if (isAdded) {\n                                ClipAddState.Added\n                            } else {\n                                ClipAddState.NotAdded\n                            }\n                        } else {\n                            when(status) {\n                                is ClipOptionalActionState.Added -> ClipAddState.Added\n                                is ClipOptionalActionState.Adding -> ClipAddState.Progress\n                                is ClipOptionalActionState.AlreadyAdded -> ClipAddState.Added\n                                is ClipOptionalActionState.AlreadyRemoved -> ClipAddState.NotAdded\n                                is ClipOptionalActionState.Removed -> ClipAddState.NotAdded\n                                is ClipOptionalActionState.Removing -> ClipAddState.Progress\n                                null -> ClipAddState.Unknown\n                            }\n                        }\n                    )\n                }\n            }\n        }.stateIn(\n            viewModelScope,\n            SharingStarted.WhileSubscribed(5_000),\n            ResultState.initialState(),\n        )\n\n    val uiState = combine(noteId, clipStatuses) { noteId, clipStatuses ->\n        ToggleAddNoteToClipDialogUiState(\n            noteId,\n            clipStatuses\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ToggleAddNoteToClipDialogUiState()\n    )\n\n    init {\n        noteId.filterNotNull().onEach {\n            loadRelatedClips(it)\n        }.launchIn(viewModelScope)\n\n        clipActionStateQueue.onEach { (clipId, state) ->\n            clipActionState.value = clipActionState.value.toMutableMap().also { map ->\n                map[clipId] = state\n            }\n        }.launchIn(viewModelScope)\n    }\n\n    fun onAddToClip(noteId: Note.Id, clip: Clip) {\n        viewModelScope.launch {\n            clipActionStateQueue.emit(clip.id to ClipOptionalActionState.Adding(clip, noteId))\n            clipRepository.appendNote(clip.id, noteId).onSuccess {\n                clipActionStateQueue.emit(clip.id to ClipOptionalActionState.Added(clip, noteId))\n            }.onFailure {\n                logger.error(\"クリップへの追加に失敗\", it)\n                if (it is APIError.ClientException) {\n                    clipActionStateQueue.emit(\n                        clip.id to ClipOptionalActionState.AlreadyAdded(\n                            clip,\n                            noteId\n                        )\n                    )\n                }\n            }\n            loadRelatedClips(noteId)\n        }\n    }\n\n    fun onRemoveToClip(noteId: Note.Id, clip: Clip) {\n        viewModelScope.launch {\n            clipActionStateQueue.emit(clip.id to ClipOptionalActionState.Removing(clip, noteId))\n            clipRepository.removeNote(clip.id, noteId).onSuccess {\n                clipActionStateQueue.emit(clip.id to ClipOptionalActionState.Removed(clip, noteId))\n            }.onFailure {\n                logger.error(\"クリップからの削除に失敗\", it)\n                if (it is APIError.ClientException) {\n                    clipActionStateQueue.emit(clip.id to ClipOptionalActionState.AlreadyRemoved(clip, noteId))\n                }\n            }\n            loadRelatedClips(noteId)\n        }\n    }\n\n    private suspend fun loadRelatedClips(noteId: Note.Id) {\n        clipRepository.findBy(noteId).onSuccess {\n            _relatedClips.value = it\n        }.onFailure {\n            logger.error(\"関連しているクリップの取得に失敗\", it)\n        }\n    }\n\n}\n\ndata class ToggleAddNoteToClipDialogUiState(\n    val noteId: Note.Id? = null,\n    val clips: ResultState<List<ClipWithAddedState>> = ResultState.initialState(),\n)\n\ndata class ClipWithAddedState(\n    val clip: Clip,\n    val addState: ClipAddState,\n)\n\nsealed interface ClipOptionalActionState {\n    data class Adding(val clip: Clip, val noteId: Note.Id) : ClipOptionalActionState\n    data class Removing(val clip: Clip, val noteId: Note.Id) : ClipOptionalActionState\n    data class Added(val clip: Clip, val noteId: Note.Id) : ClipOptionalActionState\n    data class Removed(val clip: Clip, val noteId: Note.Id) : ClipOptionalActionState\n    data class AlreadyAdded(val clip: Clip, val noteId: Note.Id) : ClipOptionalActionState\n    data class AlreadyRemoved(val clip: Clip, val noteId: Note.Id) : ClipOptionalActionState\n}\n\nsealed interface ClipAddState {\n    object Added : ClipAddState\n    object NotAdded : ClipAddState\n    object Unknown : ClipAddState\n    object Progress : ClipAddState\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/clip/ToggleAddNoteToClipTile.kt",
    "content": "package net.pantasystem.milktea.note.clip\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.QuestionMark\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common_compose.CircleCheckbox\nimport net.pantasystem.milktea.model.clip.Clip\nimport net.pantasystem.milktea.model.clip.ClipId\nimport net.pantasystem.milktea.model.user.User\n\n@Composable\nfun ToggleAddNoteToClipTile(\n    modifier: Modifier = Modifier,\n    clip: Clip,\n    state: ClipAddState,\n    onClick: () -> Unit\n) {\n    Surface(\n        modifier\n            .fillMaxWidth()\n            .clickable { onClick() },\n        color = MaterialTheme.colorScheme.surface,\n    ) {\n        Row(\n            modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Text(\n                clip.name,\n                modifier = Modifier\n                    .weight(1f)\n                    .padding(vertical = 8.dp),\n                fontSize = 18.sp\n            )\n\n            when (state) {\n                ClipAddState.Added -> CircleCheckbox(selected = true)\n                ClipAddState.NotAdded -> CircleCheckbox(selected = false)\n                ClipAddState.Progress -> CircularProgressIndicator(\n                    modifier = Modifier.size(24.dp),\n                    strokeWidth = 2.dp\n                )\n                ClipAddState.Unknown -> Icon(\n                    Icons.Default.QuestionMark,\n                    contentDescription = \"unknown added status\"\n                )\n            }\n\n        }\n    }\n\n\n}\n\n@Preview\n@Composable\nfun Preview_ToggleAddNoteToClipTile() {\n    ToggleAddNoteToClipTile(\n        clip = Clip(\n            id = ClipId(accountId = 0, clipId = \"\"),\n            createdAt = Clock.System.now(),\n            userId = User.Id(accountId = 0, id = \"\"),\n            name = \"なんかいろいろ追加した\",\n            description = null,\n            isPublic = false\n        ),\n        state = ClipAddState.Added,\n        onClick = {}\n    )\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/compose/AutoCollapsingLayout.kt",
    "content": "package net.pantasystem.milktea.note.compose\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TextButton\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clipToBounds\nimport androidx.compose.ui.graphics.Brush\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.SubcomposeLayout\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.note.R\n\n/**\n * コンテンツが [maxHeight] を超えた場合に折り畳み、展開ボタンを下部中央に表示する。\n * 展開ボタンがタップされると [onExpand] が呼ばれる。\n * 既存の AutoCollapsingLayout (View) の Compose 版。\n *\n * [expanded] / [onExpand] を PlaneNoteViewData.expanded / expand() に繋ぐことで、\n * スクロールによる再コンポーズ後も展開状態が保持される。\n *\n * 実装は SubcomposeLayout による2スロット構成:\n *   1. \"content\" — 高さ無制限で計測しオーバーフロー判定\n *   2. \"overlay\" — オーバーフロー時のみグラデーションスクリム + 展開ボタンを計測・配置\n */\n@Composable\nfun AutoCollapsingLayout(\n    expanded: Boolean,\n    onExpand: () -> Unit,\n    modifier: Modifier = Modifier,\n    maxHeight: Dp = 300.dp,\n    content: @Composable () -> Unit,\n) {\n    val maxHeightPx = with(LocalDensity.current) { maxHeight.roundToPx() }\n    val overlayHeightDp = 56.dp\n    val overlayHeightPx = with(LocalDensity.current) { overlayHeightDp.roundToPx() }\n    val surfaceColor = MaterialTheme.colorScheme.surface\n\n    SubcomposeLayout(\n        modifier = modifier.clipToBounds(),\n    ) { constraints ->\n        // 1. コンテンツを高さ無制限で計測してオーバーフローを検出\n        val contentPlaceables = subcompose(\"content\", content).map {\n            it.measure(constraints.copy(maxHeight = Int.MAX_VALUE))\n        }\n        val naturalHeight = contentPlaceables.maxOfOrNull { it.height } ?: 0\n        val overflows = !expanded && naturalHeight > maxHeightPx\n        val layoutHeight = if (overflows) maxHeightPx else naturalHeight\n\n        // 2. オーバーフロー時のみグラデーションスクリム + 展開ボタンを計測\n        val overlayPlaceables = if (overflows) {\n            subcompose(\"overlay\") {\n                Box(\n                    modifier = Modifier\n                        .fillMaxWidth()\n                        .height(overlayHeightDp),\n                ) {\n                    // グラデーションスクリム（コンテンツが途中で途切れる感を和らげる）\n                    Box(\n                        modifier = Modifier\n                            .matchParentSize()\n                            .background(\n                                Brush.verticalGradient(\n                                    colors = listOf(Color.Transparent, surfaceColor),\n                                )\n                            )\n                    )\n                    // 展開ボタン\n                    TextButton(\n                        onClick = onExpand,\n                        modifier = Modifier.align(Alignment.BottomCenter),\n                    ) {\n                        Text(\n                            text = stringResource(R.string.expand),\n                            style = MaterialTheme.typography.labelMedium,\n                        )\n                    }\n                }\n            }.map {\n                it.measure(\n                    constraints.copy(minHeight = 0, maxHeight = overlayHeightPx)\n                )\n            }\n        } else {\n            emptyList()\n        }\n\n        layout(constraints.maxWidth, layoutHeight) {\n            contentPlaceables.forEach { it.placeRelative(0, 0) }\n            // オーバーレイをレイアウト下端に貼り付ける\n            overlayPlaceables.forEach {\n                it.placeRelative(x = 0, y = layoutHeight - it.height)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/compose/ComposeTimeline.kt",
    "content": "package net.pantasystem.milktea.note.compose\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.wrapContentSize\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.FilledTonalButton\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.snapshotFlow\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filter\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimelineListItem\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimelineViewModel\nimport net.pantasystem.milktea.note.view.NoteCardAction\n\n/**\n * Compose 製タイムライン。\n * TimelineViewModel の StateFlow を直接収集し、NoteCard で各ノートを描画する。\n *\n * 既存の RecyclerView + TimelineListAdapter の代替として開発検証用に使用する。\n * DebugFeatureFlags.isComposeTimelineEnabled() が true のとき TimelineFragment から呼ばれる。\n */\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun ComposeTimeline(\n    viewModel: TimelineViewModel,\n    onAction: (NoteCardAction) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val items by viewModel.timelineListState.collectAsState()\n    val isLoading by viewModel.isLoading.collectAsState()\n    val config by viewModel.configState.collectAsState()\n    val isVisibleNewPostsButton by viewModel.isVisibleNewPostsButton.collectAsState(initial = false)\n    val nestedScrollInterop = rememberNestedScrollInteropConnection()\n    val listState = rememberLazyListState()\n\n\n//    // ── 末尾付近に達したら追加ロード（loadOld） ───────────────────────\n//    val shouldLoadMore by remember {\n//        derivedStateOf {\n//            val lastVisible = listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index ?: 0\n//            val total = listState.layoutInfo.totalItemsCount\n//            Log.d(\"ComposeTimeline\", \"lastVisible=$lastVisible, total=$total, calc=${total > 1 && lastVisible >= total - 5}\")\n//            // 修正: total > 0 ではなく total > 1 にする\n//            // （Loadingアイテム1件だけの時は false になり、Noteが追加されると true に遷移する）\n//            canLoadMore && total > 1 && lastVisible >= total - 5\n//        }\n//    }\n//\n//    LaunchedEffect(listState) {\n//        snapshotFlow { shouldLoadMore }\n////            .distinctUntilChanged()\n//            .collect { reachedEnd ->\n//                Log.d(\"ComposeTimeline\", \"reachedEnd=$reachedEnd\")\n//                if (reachedEnd) viewModel.loadOld()\n//            }\n//    }\n\n    // ── 末尾付近に達したら追加ロード（loadOld） ───────────────────────\n    LaunchedEffect(listState) {\n        // 「画面に見えている最後のアイテムのインデックス」だけをシンプルに監視する\n        snapshotFlow { listState.layoutInfo.visibleItemsInfo.lastOrNull()?.index }\n            .collect { lastVisibleIndex ->\n                val total = listState.layoutInfo.totalItemsCount\n\n                // データが1件以上あり、最後のアイテムが末端（付近）ならとにかく関数を呼ぶ\n                if (lastVisibleIndex != null && total > 0 && lastVisibleIndex >= total - 3) {\n                    viewModel.loadOld()\n                }\n            }\n    }\n\n    // ── スクロール停止時に onScrollStateChanged を通知 ─────────────────\n    // 先頭付近 (<=3) では loadFuture + streaming 再開、それ以外は streaming 停止。\n    // releaseUnusedPages と scroll 位置保存も ViewModel 側で実施される。\n    LaunchedEffect(listState) {\n        snapshotFlow { listState.isScrollInProgress }\n            .distinctUntilChanged()\n            .filter { !it }\n            .collect {\n                viewModel.onScrollStateChanged(listState.firstVisibleItemIndex)\n            }\n    }\n\n    // ── スクロール量を onScrolled で通知 ──────────────────────────────\n    // ・position / offset を ViewModel に保存（スクロール位置復元用）\n    // ・下方向スクロール (dy > 16) で新着ボタンを非表示\n    // ・isScrollInProgress が false のとき（データ更新によるリスト再構成など）は\n    //   dy=0 を渡してボタンが誤って消えないようにする\n    LaunchedEffect(listState) {\n        var prevIndex = 0\n        var prevOffset = 0\n        snapshotFlow {\n            Triple(\n                listState.firstVisibleItemIndex,\n                listState.firstVisibleItemScrollOffset,\n                listState.isScrollInProgress,\n            )\n        }.collect { (index, offset, isScrollInProgress) ->\n                val dy = if (isScrollInProgress) {\n                    when {\n                        index > prevIndex -> 100   // アイテム境界を超えて下スクロール\n                        index < prevIndex -> -100  // アイテム境界を超えて上スクロール\n                        else -> offset - prevOffset\n                    }\n                } else {\n                    0  // ユーザー操作なし（データ更新等）: 位置だけ保存、ボタンは消さない\n                }\n                prevIndex = index\n                prevOffset = offset\n                viewModel.onScrolled(\n                    dy = dy,\n                    firstVisibleItemPosition = index,\n                    offset = offset,\n                )\n            }\n    }\n\n    // ── ストリーミングで先頭に 1 件挿入されたとき自動スクロール ──────────\n    // RecyclerView 版 AdapterDataObserver の onItemRangeInserted と同等のロジック:\n    //   positionStart==0 && itemCount==1 && firstVisiblePosition==0 && streaming\n    LaunchedEffect(listState) {\n        var prevFirstKey: Any? = null\n        var prevNoteCount = 0\n        snapshotFlow { items }\n            .collect { currentItems ->\n                val noteCount = currentItems.count { it is TimelineListItem.Note }\n                val firstKey = (currentItems.firstOrNull() as? TimelineListItem.Note)?.note?.uuid\n\n                val isStreamingInsert =\n                    firstKey != null\n                        && firstKey != prevFirstKey\n                        && prevFirstKey != null\n                        && noteCount == prevNoteCount + 1                     // 1 件だけ増えた\n                        && listState.firstVisibleItemIndex == 0               // 先頭を表示中\n                        && viewModel.timelineStore.latestReceiveNoteId() != null  // streaming 由来\n\n                if (isStreamingInsert) {\n                    listState.scrollToItem(0)\n                }\n\n                prevFirstKey = firstKey\n                prevNoteCount = noteCount\n            }\n    }\n\n    Box(modifier = modifier.fillMaxSize()) {\n        PullToRefreshBox(\n            isRefreshing = isLoading,\n            onRefresh = { viewModel.loadNew() },\n            modifier = Modifier\n                .fillMaxSize()\n                .nestedScroll(nestedScrollInterop),\n        ) {\n            LazyColumn(\n                state = listState,\n                modifier = Modifier.fillMaxSize(),\n            ) {\n                items(\n                    items = items,\n                    key = { item ->\n                        when (item) {\n                            is TimelineListItem.Note -> item.note.uuid\n                            is TimelineListItem.Loading -> \"loading\"\n                            is TimelineListItem.Error -> \"error_${item.hashCode()}\"\n                            TimelineListItem.Empty -> \"empty\"\n                        }\n                    },\n                ) { item ->\n                    when (item) {\n                        is TimelineListItem.Note -> {\n                            NoteCard(\n                                note = item.note,\n                                onAction = onAction,\n                                modifier = Modifier.fillMaxWidth(),\n                            )\n                            if (config.isEnableNoteDivider) {\n                                HorizontalDivider(\n                                    thickness = 0.5.dp,\n                                    color = MaterialTheme.colorScheme.outlineVariant,\n                                )\n                            }\n                        }\n\n                        TimelineListItem.Loading -> {\n                            Box(\n                                modifier = Modifier\n                                    .fillMaxWidth()\n                                    .padding(16.dp)\n                                    .wrapContentSize(Alignment.Center),\n                            ) {\n                                CircularProgressIndicator()\n                            }\n                        }\n\n                        is TimelineListItem.Error -> {\n                            Text(\n                                text = item.throwable.localizedMessage ?: \"Error\",\n                                color = MaterialTheme.colorScheme.error,\n                                style = MaterialTheme.typography.bodySmall,\n                                modifier = Modifier.padding(16.dp),\n                            )\n                        }\n\n                        TimelineListItem.Empty -> {\n                            Text(\n                                text = \"No notes\",\n                                style = MaterialTheme.typography.bodyMedium,\n                                color = MaterialTheme.colorScheme.onSurfaceVariant,\n                                modifier = Modifier.padding(16.dp),\n                            )\n                        }\n                    }\n                }\n            }\n        }\n\n        // ── 新着ノートボタン ───────────────────────────────────────────\n        // loadFuture で 10 件以上の新着があるときに表示。\n        // タップで loadInit(ignoreSavedScrollPosition=true) を呼び先頭に戻る。\n        if (isVisibleNewPostsButton) {\n            FilledTonalButton(\n                onClick = { viewModel.loadInit(ignoreSavedScrollPosition = true) },\n                modifier = Modifier\n                    .align(Alignment.TopCenter)\n                    .padding(top = 8.dp),\n            ) {\n                Text(text = stringResource(R.string.jump_to_new_post))\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/compose/NoteCard.kt",
    "content": "package net.pantasystem.milktea.note.compose\n\nimport android.annotation.SuppressLint\nimport android.text.format.DateUtils\nimport androidx.compose.animation.core.animateFloatAsState\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.BoxWithConstraints\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.ExperimentalLayoutApi\nimport androidx.compose.foundation.layout.FlowRow\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.aspectRatio\nimport androidx.compose.foundation.layout.fillMaxHeight\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.CheckCircle\nimport androidx.compose.material.icons.filled.Favorite\nimport androidx.compose.material.icons.filled.FavoriteBorder\nimport androidx.compose.material.icons.filled.MoreVert\nimport androidx.compose.material.icons.filled.PlayArrow\nimport androidx.compose.material.icons.filled.RadioButtonUnchecked\nimport androidx.compose.material.icons.filled.Repeat\nimport androidx.compose.material.icons.filled.Reply\nimport androidx.compose.material.icons.filled.SentimentSatisfied\nimport androidx.compose.material.icons.filled.Tag\nimport androidx.compose.material.icons.filled.VisibilityOff\nimport androidx.compose.material3.ButtonDefaults\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.LocalTextStyle\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.OutlinedButton\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TextButton\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontStyle\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.core.graphics.ColorUtils\nimport androidx.core.text.HtmlCompat\nimport coil.compose.AsyncImage\nimport dagger.hilt.android.EntryPointAccessors\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.common_android.platform.isWifiConnected\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.BindingProvider\nimport net.pantasystem.milktea.common_android_ui.EmojiText\nimport net.pantasystem.milktea.common_android_ui.MfmText\nimport net.pantasystem.milktea.common_android_ui.TextType\nimport net.pantasystem.milktea.common_compose.rememberBlurhashPainter\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.media.viewmodel.MediaViewData\nimport net.pantasystem.milktea.note.media.viewmodel.PreviewAbleFile\nimport net.pantasystem.milktea.note.reaction.ImageAspectRatioCache\nimport net.pantasystem.milktea.note.reaction.ReactionViewData\nimport net.pantasystem.milktea.note.view.NoteCardAction\nimport net.pantasystem.milktea.note.viewmodel.NoteStatusMessageTextGenerator\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\n/**\n * ノートカード（Renote / Reply ステータス行を含む）\n * item_note.xml に相当する Composable。\n */\n@Composable\nfun NoteCard(\n    note: PlaneNoteViewData,\n    onAction: (NoteCardAction) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val context = LocalContext.current\n    val statusMessage = remember(note.note) {\n        NoteStatusMessageTextGenerator(note.note, isUserNameDefault = true)?.getString(context)\n    }\n\n    Surface(\n        modifier = modifier,\n        color = MaterialTheme.colorScheme.surface,\n    ) {\n        Column {\n            if (statusMessage != null) {\n                Row(\n                    modifier = Modifier\n                        .fillMaxWidth()\n                        .padding(start = 52.dp, top = 4.dp, bottom = 0.dp),\n                    verticalAlignment = Alignment.CenterVertically,\n                ) {\n                    Icon(\n                        imageVector = Icons.Default.Repeat,\n                        contentDescription = null,\n                        modifier = Modifier.size(14.dp),\n                        tint = MaterialTheme.colorScheme.onSurfaceVariant,\n                    )\n                    Spacer(modifier = Modifier.width(4.dp))\n                    Text(\n                        text = statusMessage,\n                        style = MaterialTheme.typography.labelMedium,\n                        color = MaterialTheme.colorScheme.onSurfaceVariant,\n                    )\n                }\n            }\n            SimpleNoteCardAsMain(note = note, onAction = onAction)\n        }\n    }\n}\n\n@Composable\nfun SimpleNoteCardAsMain(\n    note: PlaneNoteViewData,\n    onAction: (NoteCardAction) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val currentNote by note.currentNote.collectAsState()\n    val isFolding by note.contentFolding.collectAsState()\n    val mediaFiles by note.media.files.collectAsState()\n    val reactions by note.reactionCountsViewData.collectAsState()\n    val reactionCountsExpanded by note.reactionCountsExpanded.collectAsState()\n    val isExpanded by note.expanded.collectAsState()\n    val config by note.config.collectAsState()\n\n    val paddingH = 12.dp\n    val paddingV = 8.dp\n\n    Column(\n        modifier = modifier\n            .fillMaxWidth()\n            .padding(horizontal = paddingH, vertical = paddingV),\n    ) {\n        Row(\n            modifier = Modifier.fillMaxWidth(),\n        ) {\n            // AvatarIcon\n            val avatarPlaceholder = rememberBlurhashPainter(note.toShowNote.user.avatarBlurhash)\n            val instance = note.toShowNote.user.instance\n            AsyncImage(\n                model = note.avatarUrl,\n                contentDescription = null,\n                modifier = Modifier\n                    .size(44.dp)\n                    .clip(CircleShape)\n                    .clickable { onAction(NoteCardAction.OnUserClicked(note.toShowNote.user)) },\n                placeholder = avatarPlaceholder,\n                contentScale = ContentScale.Crop,\n            )\n\n            Spacer(Modifier.width(8.dp))\n            Column(\n                Modifier.fillMaxWidth()\n            ) {\n                Header(\n                    note = note,\n                    userName = note.userName,\n                    timestamp = note.toShowNote.note.createdAt,\n                    modifier = Modifier.fillMaxWidth(),\n                    onTimestampClick = {\n                        onAction(\n                            NoteCardAction.OnNoteCardClicked(\n                                note.toShowNote.note,\n                            )\n                        )\n                    }\n                )\n                if (config.isEnableInstanceTicker\n                    && instance?.name != null\n                    && instance.faviconUrl != null\n                ) {\n                    Spacer(Modifier.height(2.dp))\n                    InstanceInfoLabel(\n                        instance = instance,\n                        modifier = Modifier.fillMaxWidth(),\n                    )\n                }\n\n                AutoCollapsingLayout(\n                    expanded = isExpanded,\n                    onExpand = { note.expand() },\n                ) {\n                    Column {\n                        NoteBodySection(\n                            note = note,\n                            isFolding = isFolding,\n                            onToggleFolding = { note.changeContentFolding() },\n                            onUrlClick = {\n                                onAction(NoteCardAction.OnUrlClick(it))\n                            },\n                            onLinkClick = {\n                                onAction(NoteCardAction.OnLinkClick(it))\n                            },\n                            onHashtagClick = {\n                                onAction(NoteCardAction.OnHashtagClick(it))\n                            },\n                            onMentionClick = {\n                                onAction(NoteCardAction.OnMentionClick(it))\n                            },\n                        )\n\n                        val poll = currentNote.poll\n                        if (!isFolding && poll != null) {\n                            Spacer(modifier = Modifier.height(6.dp))\n                            NotePollSection(\n                                poll = poll,\n                                noteId = currentNote.id,\n                                onAction = onAction,\n                            )\n                        }\n\n                        if (!isFolding && mediaFiles.isNotEmpty()) {\n                            Spacer(modifier = Modifier.height(6.dp))\n                            NoteMediaGrid(\n                                mediaViewData = note.media,\n                                files = mediaFiles,\n                                onAction = onAction,\n                            )\n                        }\n\n                        if (note.subNote != null && !isFolding) {\n                            Spacer(modifier = Modifier.height(6.dp))\n                            SubNoteCard(note = note, onAction = onAction)\n                        }\n                    }\n                }\n\n                val channel = note.channelInfo\n                if (channel != null) {\n                    Spacer(modifier = Modifier.height(4.dp))\n                    NoteChannelChip(channel = channel, onAction = onAction)\n                }\n\n                if (reactions.isNotEmpty()) {\n                    Spacer(modifier = Modifier.height(4.dp))\n                    NoteReactions(\n                        note = note,\n                        reactions = reactions,\n                        expanded = reactionCountsExpanded,\n                        onAction = onAction,\n                    )\n                }\n\n                NoteActionBar(note = note, currentNote = currentNote, onAction = onAction)\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun Header(\n    note: PlaneNoteViewData,\n    userName: String,\n    timestamp: Instant,\n    modifier: Modifier = Modifier,\n    onTimestampClick: () -> Unit = {},\n) {\n    Row(\n        modifier = modifier,\n        verticalAlignment = Alignment.CenterVertically, // 垂直方向の中央揃えも追加しておくと綺麗です\n        horizontalArrangement = Arrangement.SpaceBetween,\n    ) {\n        // 1. 名前（長すぎる場合は省略）\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            modifier = Modifier.weight(1f, fill = false),\n        ) {\n            EmojiText(\n                parsedResult = note.toShowNote.user.parsedResult,\n                accountHost = note.account.getHost(),\n                style = MaterialTheme.typography.bodyMedium,\n                fontWeight = FontWeight.Bold,\n                maxLines = 1,\n                overflow = TextOverflow.Ellipsis,\n                // 名前も長すぎると時間を圧迫するので、ここにもweightを入れるのが一般的です\n//                modifier = Modifier.weight(1f, fill = false)\n            )\n\n            Spacer(Modifier.width(4.dp))\n\n            // 2. ユーザー名（ここが可変領域）\n            Text(\n                text = userName,\n                style = MaterialTheme.typography.bodyMedium,\n                color = MaterialTheme.colorScheme.onSurfaceVariant,\n                fontStyle = FontStyle.Italic,\n                maxLines = 1,\n                overflow = TextOverflow.Ellipsis,\n                // fill = false を指定することで、中身が短いときはその分だけ、\n                // 長いときは他の要素を押し出さない範囲で最大まで広がります\n//                modifier = Modifier.weight(1f)\n            )\n\n        }\n        Spacer(Modifier.width(8.dp))\n\n        // 3. タイムスタンプ（絶対表示したい要素）\n        val createdAtMs = timestamp.toEpochMilliseconds()\n        Text(\n            text = remember(createdAtMs) {\n                DateUtils.getRelativeTimeSpanString(\n                    createdAtMs,\n                    System.currentTimeMillis(),\n                    DateUtils.MINUTE_IN_MILLIS,\n                    DateUtils.FORMAT_ABBREV_RELATIVE,\n                ).toString()\n            },\n            style = MaterialTheme.typography.bodyMedium,\n            color = MaterialTheme.colorScheme.primary,\n            maxLines = 1,\n            modifier = Modifier.clickable {\n                onTimestampClick()\n            }\n        )\n    }\n}\n\n// ─────────────────────────────────────────────────\n// NoteBodySection\n// ─────────────────────────────────────────────────\n\n@Composable\nprivate fun NoteBodySection(\n    note: PlaneNoteViewData,\n    isFolding: Boolean,\n    onToggleFolding: () -> Unit,\n    onUrlClick: (String) -> Unit,\n    onLinkClick: (String) -> Unit,\n    onHashtagClick: (String) -> Unit,\n    onMentionClick: (String) -> Unit,\n) {\n    val cw = note.cw\n\n    if (cw != null) {\n        MfmText(\n            text = cw,\n            emojiNameMap = note.toShowNote.note.emojiNameMap ?: emptyMap(),\n            style = MaterialTheme.typography.bodyMedium,\n        )\n        TextButton(onClick = onToggleFolding) {\n            Text(\n                text = if (isFolding) stringResource(R.string.show)\n                else stringResource(R.string.hide)\n            )\n        }\n    }\n\n    if (!isFolding) {\n        NoteBodyText(\n            note = note,\n            onUrlClick = onUrlClick,\n            onLinkClick = onLinkClick,\n            onHashtagClick = onHashtagClick,\n            onMentionClick = onMentionClick,\n        )\n    }\n}\n\n@Composable\nprivate fun NoteBodyText(\n    note: PlaneNoteViewData,\n    onUrlClick: (String) -> Unit,\n    onLinkClick: (String) -> Unit,\n    onHashtagClick: (String) -> Unit,\n    onMentionClick: (String) -> Unit,\n) {\n    when (val textType = note.textNode) {\n        is TextType.Misskey -> MfmText(\n            nodes = textType.nodes,\n            emojiNameMap = note.toShowNote.note.emojiNameMap ?: emptyMap(),\n            style = MaterialTheme.typography.bodyMedium,\n            onUrlClick = onUrlClick,\n            onLinkClick = onLinkClick,\n            onHashtagClick = onHashtagClick,\n            onMentionClick = onMentionClick,\n        )\n\n        is TextType.Mastodon -> {\n            val rawHtml = note.text\n            if (!rawHtml.isNullOrBlank()) {\n                // Mastodon HTML をプレーンテキストに変換して表示（書式は今後対応）\n                val plainText = remember(rawHtml) {\n                    HtmlCompat.fromHtml(rawHtml, HtmlCompat.FROM_HTML_MODE_COMPACT).toString()\n                }\n                Text(text = plainText, style = MaterialTheme.typography.bodyMedium)\n            }\n        }\n\n        null -> {\n            val text = note.text\n            if (!text.isNullOrBlank()) {\n                Text(text = text, style = MaterialTheme.typography.bodyMedium)\n            }\n        }\n    }\n}\n\n// ─────────────────────────────────────────────────\n// NoteMediaGrid\n// MediaLayout と同じレイアウトアルゴリズムを Compose で再現する。\n// アスペクト比 16:10、2カラム固定、枚数制限なし。\n//\n// 配置ルール（MediaLayout と同一）:\n//   N=1         : 全幅\n//   N=2         : 左右各1枚、高さ = 全幅 / aspect\n//   N=奇数(≥3) : 奇数インデックス + 最後のアイテム → 右カラム、残り → 左カラム\n//   N=偶数(≥4) : 奇数インデックス → 右カラム、偶数インデックス → 左カラム\n// ─────────────────────────────────────────────────\n\n@SuppressLint(\"UnusedBoxWithConstraintsScope\")\n@Composable\nprivate fun NoteMediaGrid(\n    mediaViewData: MediaViewData,\n    files: List<PreviewAbleFile>,\n    onAction: (NoteCardAction) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val n = files.size\n    if (n == 0) return\n\n    val gap = 4.dp          // MediaLayout の spaceMargin 相当\n    val aspect = 16f / 10f  // MediaLayout: aspectRatio = 16.0 / 10.0\n\n    BoxWithConstraints(modifier = modifier.fillMaxWidth()) {\n        val totalW = maxWidth\n\n        // N=1: 全幅\n        if (n == 1) {\n            MediaItem(\n                file = files[0],\n                index = 0,\n                files = files,\n                mediaViewData = mediaViewData,\n                onAction = onAction,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .height(totalW / aspect),\n            )\n            return@BoxWithConstraints\n        }\n\n        val halfW = (totalW - gap) / 2\n        val isOdd = n % 2 == 1\n\n        // MediaLayout の isRight ロジックと同一\n        val leftFiles = mutableListOf<Pair<Int, PreviewAbleFile>>()\n        val rightFiles = mutableListOf<Pair<Int, PreviewAbleFile>>()\n        for (i in 0 until n) {\n            val isRight = if (isOdd) {\n                i == n - 1 || i % 2 == 1\n            } else {\n                i % 2 == 1\n            }\n            if (isRight) rightFiles.add(i to files[i])\n            else leftFiles.add(i to files[i])\n        }\n\n        // MediaLayout と同じ高さ計算\n        // N=2: totalH = totalW / aspect（全幅基準）\n        // N≥3: totalH = max(左行数, 右行数) × (halfW / aspect)\n        val totalH = if (n == 2) {\n            totalW / aspect\n        } else {\n            (halfW / aspect) * maxOf(leftFiles.size, rightFiles.size)\n        }\n\n        Row(\n            modifier = Modifier\n                .fillMaxWidth()\n                .height(totalH),\n            horizontalArrangement = Arrangement.spacedBy(gap),\n        ) {\n            Column(\n                modifier = Modifier\n                    .width(halfW)\n                    .fillMaxHeight(),\n                verticalArrangement = Arrangement.spacedBy(gap),\n            ) {\n                leftFiles.forEach { (idx, file) ->\n                    MediaItem(\n                        file = file,\n                        index = idx,\n                        files = files,\n                        mediaViewData = mediaViewData,\n                        onAction = onAction,\n                        modifier = Modifier\n                            .fillMaxWidth()\n                            .weight(1f),\n                    )\n                }\n            }\n            Column(\n                modifier = Modifier\n                    .width(halfW)\n                    .fillMaxHeight(),\n                verticalArrangement = Arrangement.spacedBy(gap),\n            ) {\n                rightFiles.forEach { (idx, file) ->\n                    MediaItem(\n                        file = file,\n                        index = idx,\n                        files = files,\n                        mediaViewData = mediaViewData,\n                        onAction = onAction,\n                        modifier = Modifier\n                            .fillMaxWidth()\n                            .weight(1f),\n                    )\n                }\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun MediaItem(\n    file: PreviewAbleFile,\n    index: Int,\n    files: List<PreviewAbleFile>,\n    mediaViewData: MediaViewData,\n    onAction: (NoteCardAction) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val context = LocalContext.current\n    val mediaDisplayMode = remember(mediaViewData.config) {\n        mediaViewData.config?.mediaDisplayMode\n            ?: net.pantasystem.milktea.model.setting.DefaultConfig.config.mediaDisplayMode\n    }\n\n    Box(\n        modifier = modifier\n            .clip(RoundedCornerShape(4.dp))\n            .background(MaterialTheme.colorScheme.surfaceVariant)\n            .clickable {\n                when {\n                    file.visibleType == PreviewAbleFile.VisibleType.SensitiveHide ->\n                        onAction(\n                            NoteCardAction.OnSensitiveMediaPreviewClicked(\n                                mediaViewData,\n                                index\n                            )\n                        )\n\n                    file.isHiding ->\n                        mediaViewData.show(index)\n\n                    else ->\n                        onAction(\n                            NoteCardAction.OnMediaPreviewClicked(\n                                previewAbleFile = file,\n                                files = files,\n                                index = index,\n                                thumbnailView = java.lang.ref.WeakReference(null),\n                            )\n                        )\n                }\n            },\n        contentAlignment = Alignment.Center,\n    ) {\n        val blurhashPainter = rememberBlurhashPainter(\n            blurhash = file.source.blurhash,\n            width = 64,\n            height = 64,\n        )\n\n        if (file.isHiding && blurhashPainter != null) {\n            // 隠し状態 + blurhash あり → blurhash のみ表示（サムネイル読み込みなし）\n            Image(\n                painter = blurhashPainter,\n                contentDescription = file.source.comment,\n                modifier = Modifier.fillMaxSize(),\n                contentScale = ContentScale.Crop,\n            )\n        } else {\n            // 通常表示 or blurhash なし → サムネイルを読み込む（隠し状態は薄く表示）\n            val thumbnailUrl = file.source.thumbnailUrl ?: file.source.path\n            AsyncImage(\n                model = thumbnailUrl,\n                contentDescription = file.source.comment,\n                modifier = Modifier.fillMaxSize(),\n                placeholder = blurhashPainter,\n                contentScale = ContentScale.Crop,\n                alpha = if (file.isHiding) 0.25f else 1f,\n            )\n        }\n\n        if (file.isHiding) {\n            // 半透明スクリム\n            Box(\n                modifier = Modifier\n                    .fillMaxSize()\n                    .background(MaterialTheme.colorScheme.surface.copy(alpha = 0.55f)),\n            )\n            // 中央: アイコン + メッセージ\n            Column(\n                horizontalAlignment = Alignment.CenterHorizontally,\n                modifier = Modifier.padding(horizontal = 8.dp),\n            ) {\n                Icon(\n                    imageVector = Icons.Default.VisibilityOff,\n                    contentDescription = null,\n                    tint = MaterialTheme.colorScheme.onSurface,\n                    modifier = Modifier.size(24.dp),\n                )\n                Spacer(Modifier.height(4.dp))\n                Text(\n                    text = stringResource(\n                        if (file.visibleType == PreviewAbleFile.VisibleType.SensitiveHide)\n                            R.string.sensitive_content\n                        else\n                            R.string.notes_media_click_to_load_image\n                    ),\n                    style = MaterialTheme.typography.labelSmall,\n                    color = MaterialTheme.colorScheme.onSurface,\n                    textAlign = TextAlign.Center,\n                )\n            }\n        } else if (file.isVisiblePlayButton) {\n            // 動画再生ボタン\n            Box(\n                modifier = Modifier\n                    .size(48.dp)\n                    .background(Color.Black.copy(alpha = 0.5f), CircleShape),\n                contentAlignment = Alignment.Center,\n            ) {\n                Icon(\n                    imageVector = Icons.Default.PlayArrow,\n                    contentDescription = null,\n                    tint = Color.White,\n                    modifier = Modifier.size(32.dp),\n                )\n            }\n        }\n\n        // 右上: 表示 / 非表示トグルボタン\n        IconButton(\n            onClick = {\n                mediaViewData.toggleVisibility(\n                    index = index,\n                    isMobileNetwork = !context.isWifiConnected(),\n                    mediaDisplayMode = mediaDisplayMode,\n                )\n            },\n            modifier = Modifier\n                .align(Alignment.TopEnd)\n                .padding(16.dp)\n                .size(32.dp)\n                .background(Color.Black.copy(alpha = 0.4f), CircleShape),\n        ) {\n            Icon(\n                painter = painterResource(\n                    if (file.isHiding) R.drawable.ic_baseline_image_24\n                    else R.drawable.ic_baseline_hide_image_24\n                ),\n                contentDescription = stringResource(\n                    if (file.isHiding) R.string.show else R.string.hide\n                ),\n                tint = Color.White,\n                modifier = Modifier.size(18.dp),\n            )\n        }\n    }\n}\n\n// ─────────────────────────────────────────────────\n// SubNoteCard (引用 Renote)\n// ─────────────────────────────────────────────────\n\n@Composable\nprivate fun SubNoteCard(\n    note: PlaneNoteViewData,\n    onAction: (NoteCardAction) -> Unit,\n) {\n    val subNote = note.subNote ?: return\n    val isSubFolding by note.subContentFolding.collectAsState()\n    val subMediaFiles by note.subNoteMedia.files.collectAsState()\n\n    Surface(\n        modifier = Modifier\n            .fillMaxWidth()\n            .clip(RoundedCornerShape(8.dp)),\n        shape = RoundedCornerShape(8.dp),\n        color = MaterialTheme.colorScheme.surfaceVariant,\n        tonalElevation = 2.dp,\n    ) {\n        Column(modifier = Modifier.padding(horizontal = 8.dp, vertical = 6.dp)) {\n            Row(verticalAlignment = Alignment.CenterVertically) {\n                val subAvatarPlaceholder = rememberBlurhashPainter(subNote.user.avatarBlurhash)\n                AsyncImage(\n                    model = subNote.user.avatarUrl,\n                    contentDescription = null,\n                    modifier = Modifier\n                        .size(20.dp)\n                        .clip(CircleShape),\n                    placeholder = subAvatarPlaceholder,\n                    contentScale = ContentScale.Crop,\n                )\n                Spacer(modifier = Modifier.width(4.dp))\n                Text(\n                    text = subNote.user.displayName,\n                    style = MaterialTheme.typography.labelMedium,\n                    fontWeight = FontWeight.SemiBold,\n                    maxLines = 1,\n                    overflow = TextOverflow.Ellipsis,\n                )\n            }\n\n            Spacer(modifier = Modifier.height(4.dp))\n\n            val subCw = note.subCw\n            if (subCw != null) {\n                MfmText(\n                    text = subCw,\n                    emojiNameMap = subNote.note.emojiNameMap ?: emptyMap(),\n                    style = MaterialTheme.typography.bodySmall,\n                )\n                TextButton(onClick = { note.changeSubContentFolding() }) {\n                    Text(\n                        text = if (isSubFolding) stringResource(R.string.show)\n                        else stringResource(R.string.hide),\n                        style = MaterialTheme.typography.labelSmall,\n                    )\n                }\n            }\n\n            if (!isSubFolding) {\n                when (val textType = note.subNoteTextNode) {\n                    is TextType.Misskey -> MfmText(\n                        nodes = textType.nodes,\n                        emojiNameMap = subNote.note.emojiNameMap ?: emptyMap(),\n                        style = MaterialTheme.typography.bodySmall,\n                        maxLines = 5,\n                        overflow = TextOverflow.Ellipsis,\n                    )\n\n                    is TextType.Mastodon -> {\n                        val rawHtml = subNote.note.text\n                        if (!rawHtml.isNullOrBlank()) {\n                            val plainText = remember(rawHtml) {\n                                HtmlCompat.fromHtml(rawHtml, HtmlCompat.FROM_HTML_MODE_COMPACT)\n                                    .toString()\n                            }\n                            Text(\n                                text = plainText,\n                                style = MaterialTheme.typography.bodySmall,\n                                maxLines = 5,\n                                overflow = TextOverflow.Ellipsis,\n                            )\n                        }\n                    }\n\n                    null -> {\n                        val text = subNote.note.text\n                        if (!text.isNullOrBlank()) {\n                            Text(\n                                text = text,\n                                style = MaterialTheme.typography.bodySmall,\n                                maxLines = 5,\n                                overflow = TextOverflow.Ellipsis,\n                            )\n                        }\n                    }\n                }\n\n                if (subMediaFiles.isNotEmpty()) {\n                    Spacer(modifier = Modifier.height(4.dp))\n                    NoteMediaGrid(\n                        mediaViewData = note.subNoteMedia,\n                        files = subMediaFiles,\n                        onAction = onAction,\n                    )\n                }\n            }\n        }\n    }\n}\n\n// ─────────────────────────────────────────────────\n// NoteChannelChip\n// ─────────────────────────────────────────────────\n\n@Composable\nprivate fun NoteChannelChip(\n    channel: Note.Type.Misskey.SimpleChannelInfo,\n    onAction: (NoteCardAction) -> Unit,\n) {\n    OutlinedButton(\n        onClick = { onAction(NoteCardAction.OnChannelButtonClicked(channel.id)) },\n        shape = RoundedCornerShape(50),\n        contentPadding = ButtonDefaults.TextButtonContentPadding,\n        modifier = Modifier.height(28.dp),\n    ) {\n        Icon(\n            imageVector = Icons.Default.Tag,\n            contentDescription = null,\n            modifier = Modifier.size(14.dp),\n        )\n        Spacer(modifier = Modifier.width(4.dp))\n        Text(\n            text = channel.name,\n            style = MaterialTheme.typography.labelSmall,\n            maxLines = 1,\n            overflow = TextOverflow.Ellipsis,\n        )\n    }\n}\n\n// ─────────────────────────────────────────────────\n// NoteReactions\n// ─────────────────────────────────────────────────\n\n@OptIn(ExperimentalLayoutApi::class)\n@Composable\nprivate fun NoteReactions(\n    note: PlaneNoteViewData,\n    reactions: List<ReactionViewData>,\n    expanded: Boolean,\n    onAction: (NoteCardAction) -> Unit,\n) {\n    val isMisskey = note.toShowNote.note.isMisskey\n    FlowRow(\n        modifier = Modifier.fillMaxWidth(),\n        horizontalArrangement = Arrangement.spacedBy(4.dp),\n        verticalArrangement = Arrangement.spacedBy(4.dp),\n    ) {\n        reactions.forEach { reaction ->\n            ReactionChip(\n                reaction = reaction,\n                isReactionable = !isMisskey || Reaction(reaction.reaction).isLocal(),\n                onClicked = { onAction(NoteCardAction.OnReactionClicked(note, reaction.reaction)) },\n            )\n        }\n\n        if (!expanded) {\n            TextButton(\n                onClick = { note.expandReactions() },\n                modifier = Modifier.height(32.dp),\n            ) {\n                Text(text = \"…\", style = MaterialTheme.typography.labelSmall)\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun ReactionChip(\n    reaction: ReactionViewData,\n    isReactionable: Boolean,\n    onClicked: () -> Unit,\n) {\n    val isMyReaction = reaction.isMyReaction\n    val emoji: CustomEmoji? = reaction.emoji\n\n    Surface(\n        modifier = Modifier\n            .clip(RoundedCornerShape(50))\n            .clickable(onClick = onClicked),\n        shape = RoundedCornerShape(50),\n        color = if (isMyReaction) MaterialTheme.colorScheme.primaryContainer\n        else if (!isReactionable) MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.25f)\n        else MaterialTheme.colorScheme.surfaceVariant,\n    ) {\n        Row(\n            modifier = Modifier.padding(horizontal = 8.dp, vertical = 4.dp),\n            verticalAlignment = Alignment.CenterVertically,\n        ) {\n            if (emoji != null) {\n                val context = LocalContext.current\n                AsyncImage(\n                    model = emoji.url ?: emoji.uri,\n                    contentDescription = reaction.reaction,\n                    modifier = Modifier\n                        .height(20.dp)\n                        .aspectRatio(reaction.emoji?.aspectRatio ?: 1f),\n                    onSuccess = { state ->\n                        val drawable = state.result.drawable\n                        val imageAspectRatio =\n                            drawable.intrinsicWidth.toFloat() / drawable.intrinsicHeight\n                        val ep = EntryPointAccessors.fromApplication(\n                            context.applicationContext,\n                            BindingProvider::class.java,\n                        )\n                        ep.customEmojiAspectRatioStore().save(emoji, imageAspectRatio)\n                        if (emoji.aspectRatio == null || emoji.aspectRatio != imageAspectRatio) {\n                            ImageAspectRatioCache.put(emoji.url ?: emoji.uri, imageAspectRatio)\n                        }\n                        ep.emojiImageCacheStore().save(emoji)\n                    },\n                )\n            } else {\n                Text(\n                    text = reaction.reaction,\n                    style = LocalTextStyle.current.copy(fontSize = 14.sp),\n                )\n            }\n            Spacer(modifier = Modifier.width(4.dp))\n            Text(\n                text = reaction.reactionCount.count.toString(),\n                style = MaterialTheme.typography.labelSmall,\n                color = if (isMyReaction) MaterialTheme.colorScheme.onPrimaryContainer\n                else MaterialTheme.colorScheme.onSurfaceVariant,\n            )\n        }\n    }\n}\n\n// ─────────────────────────────────────────────────\n// NoteActionBar\n// ─────────────────────────────────────────────────\n\n@Composable\nprivate fun NoteActionBar(\n    note: PlaneNoteViewData,\n    currentNote: Note,\n    onAction: (NoteCardAction) -> Unit,\n) {\n    val favoriteCount by note.favoriteCount.collectAsState()\n    val isMastodon = currentNote.type is Note.Type.Mastodon\n\n    Row(\n        modifier = Modifier\n            .fillMaxWidth()\n            .padding(top = 4.dp),\n        horizontalArrangement = Arrangement.SpaceBetween,\n        verticalAlignment = Alignment.CenterVertically,\n    ) {\n        NoteActionButton(\n            icon = { Icon(Icons.Default.Reply, contentDescription = null) },\n            count = currentNote.repliesCount.takeIf { it > 0 },\n            onClick = { onAction(NoteCardAction.OnReplyButtonClicked(note)) },\n        )\n\n        NoteActionButton(\n            icon = { Icon(Icons.Default.Repeat, contentDescription = null) },\n            count = currentNote.renoteCount.takeIf { it > 0 },\n            onClick = { onAction(NoteCardAction.OnRenoteButtonClicked(note)) },\n        )\n\n        if (isMastodon) {\n            val isFavorited = (currentNote.type as? Note.Type.Mastodon)?.favorited == true\n            NoteActionButton(\n                icon = {\n                    Icon(\n                        imageVector = if (isFavorited) Icons.Default.Favorite else Icons.Default.FavoriteBorder,\n                        contentDescription = null,\n                        tint = if (isFavorited) MaterialTheme.colorScheme.error\n                        else MaterialTheme.colorScheme.onSurfaceVariant,\n                    )\n                },\n                count = favoriteCount?.takeIf { it > 0 },\n                onClick = { onAction(NoteCardAction.OnFavoriteButtonClicked(currentNote)) },\n            )\n        } else {\n            NoteActionButton(\n                icon = { Icon(Icons.Default.SentimentSatisfied, contentDescription = null) },\n                count = null,\n                onClick = { onAction(NoteCardAction.OnReactionButtonClicked(note)) },\n            )\n        }\n\n        IconButton(\n            onClick = { onAction(NoteCardAction.OnOptionButtonClicked(note)) },\n            modifier = Modifier.size(36.dp).padding(6.dp),\n        ) {\n            Icon(\n                imageVector = Icons.Default.MoreVert,\n                contentDescription = null,\n                tint = MaterialTheme.colorScheme.onSurfaceVariant,\n            )\n        }\n    }\n}\n\n@Composable\nprivate fun NoteActionButton(\n    icon: @Composable () -> Unit,\n    count: Int?,\n    onClick: () -> Unit,\n) {\n    Row(verticalAlignment = Alignment.CenterVertically) {\n        IconButton(\n            onClick = onClick,\n            modifier = Modifier.size(36.dp).padding(6.dp),\n        ) {\n            Box(contentAlignment = Alignment.Center) {\n                icon()\n            }\n        }\n        if (count != null) {\n            Text(\n                text = count.toString(),\n                style = MaterialTheme.typography.labelSmall,\n                color = MaterialTheme.colorScheme.onSurfaceVariant,\n            )\n        }\n    }\n}\n\n// ─────────────────────────────────────────────────\n// NotePollSection\n// ─────────────────────────────────────────────────\n\n/**\n * 投票セクション。\n * - 投票可能 (poll.canVote) な選択肢はタップで投票できる。\n * - 投票済み / 期限切れの場合は結果バーのみ表示する。\n * - 複数選択 (poll.multiple) の場合は未投票の選択肢を個別にタップできる。\n */\n@Composable\nprivate fun NotePollSection(\n    poll: Poll,\n    noteId: Note.Id,\n    onAction: (NoteCardAction) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val totalVotes = poll.totalVoteCount\n\n    Column(modifier = modifier.fillMaxWidth()) {\n        poll.choices.forEach { choice ->\n            val fraction = if (totalVotes > 0) choice.votes.toFloat() / totalVotes else 0f\n            val animatedFraction by animateFloatAsState(\n                targetValue = fraction,\n                label = \"poll_bar_${choice.index}\",\n            )\n            // 複数選択は未投票のものに限り個別タップ可能、単一選択は canVote に従う\n            val isClickable = poll.canVote && !choice.isVoted\n\n            Box(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .height(40.dp)\n                    .clip(RoundedCornerShape(6.dp))\n                    .background(MaterialTheme.colorScheme.surfaceVariant)\n                    .then(\n                        if (isClickable) Modifier.clickable {\n                            onAction(NoteCardAction.OnPollChoiceClicked(noteId, poll, choice))\n                        } else Modifier\n                    ),\n            ) {\n                // 票数に応じた色付き背景（プログレスバー代わり）\n                Box(\n                    modifier = Modifier\n                        .fillMaxWidth(animatedFraction)\n                        .fillMaxHeight()\n                        .background(\n                            if (choice.isVoted) MaterialTheme.colorScheme.primary.copy(alpha = 0.35f)\n                            else MaterialTheme.colorScheme.primary.copy(alpha = 0.12f)\n                        ),\n                )\n\n                Row(\n                    modifier = Modifier\n                        .fillMaxSize()\n                        .padding(horizontal = 10.dp),\n                    verticalAlignment = Alignment.CenterVertically,\n                ) {\n                    // 投票状態アイコン\n                    when {\n                        choice.isVoted -> Icon(\n                            imageVector = Icons.Default.CheckCircle,\n                            contentDescription = null,\n                            tint = MaterialTheme.colorScheme.primary,\n                            modifier = Modifier.size(16.dp),\n                        )\n\n                        poll.canVote -> Icon(\n                            imageVector = Icons.Default.RadioButtonUnchecked,\n                            contentDescription = null,\n                            tint = MaterialTheme.colorScheme.onSurfaceVariant,\n                            modifier = Modifier.size(16.dp),\n                        )\n\n                        else -> Spacer(Modifier.size(16.dp))\n                    }\n\n                    Spacer(Modifier.width(6.dp))\n\n                    Text(\n                        text = choice.text,\n                        style = MaterialTheme.typography.bodySmall,\n                        fontWeight = if (choice.isVoted) FontWeight.SemiBold else FontWeight.Normal,\n                        maxLines = 2,\n                        overflow = TextOverflow.Ellipsis,\n                        modifier = Modifier.weight(1f),\n                    )\n\n                    Spacer(Modifier.width(8.dp))\n\n                    val percentage = if (totalVotes > 0)\n                        (choice.votes.toFloat() / totalVotes * 100 + 0.5f).toInt()\n                    else 0\n                    Text(\n                        text = \"$percentage%\",\n                        style = MaterialTheme.typography.bodySmall,\n                        color = MaterialTheme.colorScheme.onSurfaceVariant,\n                    )\n                }\n            }\n\n            Spacer(Modifier.height(4.dp))\n        }\n\n        // フッター: 総投票数 ＋ 期限\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            horizontalArrangement = Arrangement.spacedBy(8.dp),\n        ) {\n            Text(\n                text = stringResource(R.string.poll_votes_count, totalVotes),\n                style = MaterialTheme.typography.labelSmall,\n                color = MaterialTheme.colorScheme.onSurfaceVariant,\n            )\n\n            val expiresAt = poll.expiresAt\n            if (expiresAt != null) {\n                val now = Clock.System.now()\n                if (expiresAt <= now) {\n                    Text(\n                        text = stringResource(R.string.poll_ended),\n                        style = MaterialTheme.typography.labelSmall,\n                        color = MaterialTheme.colorScheme.onSurfaceVariant,\n                    )\n                } else {\n                    Text(\n                        text = stringResource(\n                            R.string.poll_expires_in,\n                            DateUtils.getRelativeTimeSpanString(\n                                expiresAt.toEpochMilliseconds(),\n                                System.currentTimeMillis(),\n                                DateUtils.MINUTE_IN_MILLIS,\n                            ),\n                        ),\n                        style = MaterialTheme.typography.labelSmall,\n                        color = MaterialTheme.colorScheme.onSurfaceVariant,\n                    )\n                }\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun InstanceInfoLabel(\n    instance: User.InstanceInfo,\n    modifier: Modifier = Modifier,\n) {\n    val bgAndText = remember(instance.themeColor) {\n        instance.themeColor?.let { colorStr ->\n            runCatching {\n                val rawColor = android.graphics.Color.parseColor(colorStr)\n                val alpha = (255 * 0.42f).toInt()\n                val withAlpha = Color((alpha shl 24) or (rawColor and 0x00FFFFFF))\n                val textColor =\n                    if (ColorUtils.calculateLuminance(rawColor) < 0.5) Color.White else Color.Black\n                withAlpha to textColor\n            }.getOrNull()\n        }\n    }\n\n    Row(\n        modifier = modifier\n            .clip(RoundedCornerShape(3.dp))\n            .then(bgAndText?.let { (bg, _) -> Modifier.background(bg) } ?: Modifier)\n            .padding(horizontal = 2.dp, vertical = 1.dp),\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.spacedBy(2.dp),\n    ) {\n        AsyncImage(\n            model = instance.faviconUrl,\n            contentDescription = null,\n            modifier = Modifier.size(10.dp),\n        )\n        Text(\n            text = instance.name ?: \"\",\n            style = MaterialTheme.typography.labelSmall.copy(fontSize = 9.sp),\n            color = bgAndText?.second ?: Color.Unspecified,\n            maxLines = 1,\n            overflow = TextOverflow.Ellipsis,\n        )\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/NoteChildConversationAdapter.kt",
    "content": "package net.pantasystem.milktea.note.detail\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.flexbox.FlexboxLayout\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemSimpleNoteBinding\nimport net.pantasystem.milktea.note.timeline.NoteFontSizeBinder\nimport net.pantasystem.milktea.note.timeline.ReactionCountItemsFlexboxLayoutBinder\nimport net.pantasystem.milktea.note.timeline.ViewRecycler\nimport net.pantasystem.milktea.note.view.NoteCardAction\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\nclass NoteChildConversationAdapter(\n    val configRepository: LocalConfigRepository,\n    val lifecycleOwner: LifecycleOwner,\n    val onAction: (NoteCardAction) -> Unit,\n) : ListAdapter<PlaneNoteViewData, NoteChildConversationAdapter.SimpleNoteHolder>(object : DiffUtil.ItemCallback<PlaneNoteViewData>(){\n    override fun areContentsTheSame(\n        oldItem: PlaneNoteViewData,\n        newItem: PlaneNoteViewData\n    ): Boolean {\n        return oldItem.id == newItem.id\n    }\n\n    override fun areItemsTheSame(oldItem: PlaneNoteViewData, newItem: PlaneNoteViewData): Boolean {\n        return oldItem.id == newItem.id\n    }\n}){\n\n    class SimpleNoteHolder(val binding: ItemSimpleNoteBinding) : RecyclerView.ViewHolder(binding.root)\n\n    private val actionAdapter = NoteCardActionListenerAdapter(onAction)\n\n    private val reactionCountBinder = ReactionCountItemsFlexboxLayoutBinder(\n        ViewRecycler()\n    ) {\n        actionAdapter.onReactionCountAction(it)\n    }\n\n    override fun onBindViewHolder(holder: SimpleNoteHolder, position: Int) {\n        holder.binding.note = getItem(position)\n        holder.binding.noteCardActionListener = actionAdapter\n\n        setReactionCounter(getItem(position), holder.binding.reactionView)\n        holder.binding.executePendingBindings()\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SimpleNoteHolder {\n        val binding = DataBindingUtil.inflate<ItemSimpleNoteBinding>(LayoutInflater.from(parent.context), R.layout.item_simple_note, parent, false)\n        val config = configRepository.get().getOrNull() ?: DefaultConfig.config\n        NoteFontSizeBinder.from(binding).bind(\n            headerFontSize = config.noteHeaderFontSize,\n            contentFontSize = config.noteContentFontSize,\n        )\n        return SimpleNoteHolder(binding)\n    }\n\n    private var job: Job? = null\n\n    private fun setReactionCounter(note: PlaneNoteViewData, reactionView: FlexboxLayout){\n\n        val reactionList = note.reactionCountsViewData.value\n\n        job?.cancel()\n        job = note.reactionCountsViewData.onEach {\n            reactionCountBinder.bindReactionCounts(reactionView, note, it)\n        }.flowWithLifecycle(lifecycleOwner.lifecycle).launchIn(lifecycleOwner.lifecycleScope)\n\n\n        if(reactionList.isNotEmpty()){\n            reactionView.visibility = View.VISIBLE\n        } else {\n            reactionView.visibility = View.GONE\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/NoteDetailAccountSwitchDialog.kt",
    "content": "package net.pantasystem.milktea.note.detail\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_android_ui.account.AccountSwitchingDialogLayout\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.AccountSettingNavigation\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.detail.viewmodel.NoteDetailPagerViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass NoteDetailAccountSwitchDialog : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"NoteDetailAccountSwitchDialog\"\n    }\n\n    @Inject\n    lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    lateinit var accountSettingNavigation: AccountSettingNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n\n    private val noteDetailPagerViewModel: NoteDetailPagerViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return super.onCreateDialog(savedInstanceState).apply {\n            val view = ComposeView(requireContext()).apply {\n                setContent {\n                    MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                        val uiState by noteDetailPagerViewModel.accountUiState.collectAsState()\n                        AccountSwitchingDialogLayout(\n                            uiState = uiState,\n                            onSettingButtonClicked = {\n                                startActivity(accountSettingNavigation.newIntent(Unit))\n                                dismiss()\n                            },\n                            onAvatarIconClicked = { accountInfo ->\n                                startActivity(\n                                    userDetailNavigation.newIntent(UserDetailNavigationArgs.UserName(accountInfo.user?.let {\n                                        \"@${it.userName}@${it.host}\"\n                                    } ?: \"@${accountInfo.account.userName}@${accountInfo.account.getHost()}\"))\n                                )\n                                dismiss()\n                            },\n                            onAccountClicked = {\n                                noteDetailPagerViewModel.setCurrentAccount(it.account.accountId)\n                                dismiss()\n                            },\n                            onAddAccountButtonClicked = {\n                                requireActivity().startActivity(authorizationNavigation.newIntent(\n                                    AuthorizationArgs.New))\n                                dismiss()\n                            }\n                        )\n                    }\n                }\n            }\n            setContentView(view)\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/NoteDetailAdapter.kt",
    "content": "package net.pantasystem.milktea.note.detail\n\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.flexbox.FlexboxLayout\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemConversationBinding\nimport net.pantasystem.milktea.note.databinding.ItemDetailNoteBinding\nimport net.pantasystem.milktea.note.databinding.ItemNoteBinding\nimport net.pantasystem.milktea.note.detail.viewmodel.NoteConversationViewData\nimport net.pantasystem.milktea.note.detail.viewmodel.NoteDetailViewData\nimport net.pantasystem.milktea.note.detail.viewmodel.NoteDetailViewModel\nimport net.pantasystem.milktea.note.timeline.NoteFontSizeBinder\nimport net.pantasystem.milktea.note.timeline.ReactionCountItemsFlexboxLayoutBinder\nimport net.pantasystem.milktea.note.timeline.ViewRecycler\nimport net.pantasystem.milktea.note.view.NoteCardAction\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\nclass NoteDetailAdapter(\n    private val configRepository: LocalConfigRepository,\n    private val noteDetailViewModel: NoteDetailViewModel,\n    private val viewLifecycleOwner: LifecycleOwner,\n    diffUtil: DiffUtil.ItemCallback<PlaneNoteViewData> = object :\n        DiffUtil.ItemCallback<PlaneNoteViewData>() {\n        override fun areContentsTheSame(\n            oldItem: PlaneNoteViewData,\n            newItem: PlaneNoteViewData,\n        ): Boolean {\n            return oldItem.id == newItem.id\n        }\n\n        override fun areItemsTheSame(\n            oldItem: PlaneNoteViewData,\n            newItem: PlaneNoteViewData,\n        ): Boolean {\n            return oldItem.id == newItem.id\n        }\n    },\n    val onAction: (NoteCardAction) -> Unit,\n) : ListAdapter<PlaneNoteViewData, NoteDetailAdapter.ViewHolder>(diffUtil) {\n\n    companion object {\n        const val NOTE = 0\n        const val DETAIL = 1\n        const val CONVERSATION = 2\n    }\n\n    abstract class ViewHolder(view: View) : RecyclerView.ViewHolder(view)\n    class NoteHolder(val binding: ItemNoteBinding) : ViewHolder(binding.root)\n    class DetailNoteHolder(val binding: ItemDetailNoteBinding) : ViewHolder(binding.root)\n    class ConversationHolder(val binding: ItemConversationBinding) : ViewHolder(binding.root)\n\n    val noteCardActionListenerAdapter = NoteCardActionListenerAdapter(onAction)\n\n    val binder = ReactionCountItemsFlexboxLayoutBinder(\n        ViewRecycler()\n    ) {\n        noteCardActionListenerAdapter.onReactionCountAction(it)\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return when (getItem(position)) {\n            is NoteConversationViewData -> CONVERSATION\n            is NoteDetailViewData -> DETAIL\n            else -> NOTE\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {\n        val config = configRepository.get().getOrNull() ?: DefaultConfig.config\n        return when (viewType) {\n            NOTE -> {\n                val binding = DataBindingUtil.inflate<ItemNoteBinding>(\n                    LayoutInflater.from(parent.context),\n                    R.layout.item_note,\n                    parent,\n                    false\n                )\n                NoteFontSizeBinder.from(binding.simpleNote).bind(\n                    headerFontSize = config.noteHeaderFontSize,\n                    contentFontSize = config.noteContentFontSize,\n                )\n                NoteHolder(binding)\n            }\n            DETAIL -> {\n                val binding = DataBindingUtil.inflate<ItemDetailNoteBinding>(\n                    LayoutInflater.from(parent.context),\n                    R.layout.item_detail_note,\n                    parent,\n                    false\n                )\n                NoteFontSizeBinder(\n                    contentViews = NoteFontSizeBinder.ContentViews(\n                        cwView = binding.cw,\n                        textView = binding.text,\n                    ),\n                    userInfoViews = NoteFontSizeBinder.HeaderViews(\n                        nameView = binding.mainName,\n                        userNameView = binding.subName,\n                        elapsedTimeView = null,\n                    ),\n                    quoteToContentViews = NoteFontSizeBinder.ContentViews(\n                        cwView = binding.subCw,\n                        textView = binding.subNoteText,\n                    ),\n                    quoteToUserInfoViews = NoteFontSizeBinder.HeaderViews(\n                        nameView = binding.subNoteMainName,\n                        userNameView = binding.subNoteSubName,\n                        elapsedTimeView = null,\n                    )\n                ).bind(\n                    headerFontSize = config.noteHeaderFontSize,\n                    contentFontSize = config.noteContentFontSize\n                )\n                DetailNoteHolder(binding)\n            }\n            CONVERSATION -> {\n                val binding = DataBindingUtil.inflate<ItemConversationBinding>(\n                    LayoutInflater.from(parent.context),\n                    R.layout.item_conversation,\n                    parent,\n                    false\n                )\n                ConversationHolder(binding)\n            }\n            else -> throw IllegalArgumentException(\"NOTE, DETAIL, CONVERSATIONしか許可されていません\")\n\n        }\n    }\n\n    override fun onBindViewHolder(holder: ViewHolder, position: Int) {\n        val note = getItem(position)\n        //val reactionAdapter = createReactionAdapter(note)\n        //val layoutManager = LinearLayoutManager(holder.itemView.context)\n        when (holder) {\n            is NoteHolder -> {\n                holder.binding.note = note\n                setReactionCounter(note, holder.binding.simpleNote.reactionView)\n\n                holder.binding.lifecycleOwner = viewLifecycleOwner\n                holder.binding.noteCardActionListener = noteCardActionListenerAdapter\n                holder.binding.executePendingBindings()\n            }\n            is DetailNoteHolder -> {\n                holder.binding.note = note as NoteDetailViewData\n                holder.binding.noteCardActionListener = noteCardActionListenerAdapter\n                setReactionCounter(note, holder.binding.reactionView)\n                holder.binding.lifecycleOwner = viewLifecycleOwner\n                holder.binding.executePendingBindings()\n            }\n            is ConversationHolder -> {\n                Log.d(\n                    \"NoteDetailAdapter\",\n                    \"conversation: ${(note as NoteConversationViewData).conversation.value?.size}\"\n                )\n                holder.binding.childrenViewData = note\n                setReactionCounter(note, holder.binding.childNote.reactionView)\n\n                holder.binding.noteDetailViewModel = noteDetailViewModel\n                val adapter = NoteChildConversationAdapter(configRepository, viewLifecycleOwner, onAction)\n                holder.binding.conversationView.adapter = adapter\n                holder.binding.conversationView.layoutManager =\n                    LinearLayoutManager(holder.itemView.context)\n                holder.binding.noteCardActionListener = noteCardActionListenerAdapter\n                note.conversation.observe(viewLifecycleOwner) {\n                    adapter.submitList(it)\n                }\n\n                holder.binding.lifecycleOwner = viewLifecycleOwner\n\n                holder.binding.executePendingBindings()\n            }\n        }\n\n    }\n\n    private var job: Job? = null\n\n    private fun setReactionCounter(note: PlaneNoteViewData, reactionView: FlexboxLayout) {\n\n        val reactionList = note.reactionCountsViewData.value\n\n\n\n        job?.cancel()\n        job = note.reactionCountsViewData.onEach {\n            binder.bindReactionCounts(reactionView, note,  it.toList())\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle)\n            .launchIn(viewLifecycleOwner.lifecycleScope)\n\n        if (reactionList.isNotEmpty()) {\n            reactionView.visibility = View.VISIBLE\n        }\n\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/NoteDetailFragment.kt",
    "content": "package net.pantasystem.milktea.note.detail\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.view.View\nimport androidx.annotation.MainThread\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.FragmentNoteDetailBinding\nimport net.pantasystem.milktea.note.detail.viewmodel.NoteDetailViewModel\nimport net.pantasystem.milktea.note.view.NoteCardActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\n\n\n@AndroidEntryPoint\nclass NoteDetailFragment : Fragment(R.layout.fragment_note_detail) {\n\n    companion object {\n        private const val EXTRA_NOTE_ID =\n            \"jp.panta.misskeyandroidclinet.view.notes.detail.EXTRA_NOTE_ID\"\n        private const val EXTRA_ACCOUNT_ID =\n            \"jp.panta.misskeyandroidclient.view.notes.detail.EXTRA_ACCOUNT_ID\"\n\n        fun newInstance(noteId: String, accountId: Long? = null): NoteDetailFragment {\n            return NoteDetailFragment().apply {\n                arguments = Bundle().apply {\n                    putString(EXTRA_NOTE_ID, noteId)\n                    putLong(EXTRA_ACCOUNT_ID, accountId ?: -1)\n                }\n            }\n        }\n\n        fun newInstance(\n            page: Page\n        ): NoteDetailFragment {\n            page.pageable() as? Pageable.Show ?: throw IllegalArgumentException(\"Not Pageable.Show\")\n            return newInstance(\n                requireNotNull(page.pageParams.noteId),\n                page.accountId,\n            )\n        }\n\n        fun newInstance(noteId: Note.Id): NoteDetailFragment {\n            return newInstance(noteId.noteId, noteId.accountId)\n        }\n    }\n\n\n    val notesViewModel: NotesViewModel by activityViewModels()\n\n    private val currentPageableTimelineViewModel: CurrentPageableTimelineViewModel by activityViewModels()\n\n    @Inject\n    internal lateinit var settingStore: SettingStore\n\n    @Inject\n    internal lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var channelDetailNavigation: ChannelDetailNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var searchNavigation: SearchNavigation\n\n    private val noteDetailViewModel: NoteDetailViewModel by viewModels()\n\n    val binding: FragmentNoteDetailBinding by dataBinding()\n\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val adapter = NoteDetailAdapter(\n            configRepository = configRepository,\n            noteDetailViewModel = noteDetailViewModel,\n            viewLifecycleOwner = viewLifecycleOwner\n        ) {\n            NoteCardActionHandler(\n                requireActivity() as AppCompatActivity,\n                notesViewModel,\n                settingStore,\n                userDetailNavigation,\n                channelDetailNavigation,\n                searchNavigation,\n            ).onAction(it)\n        }\n        viewLifecycleOwner.lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                noteDetailViewModel.notes.collect {\n                    adapter.submitList(it)\n                }\n            }\n        }\n\n\n\n        binding.notesView.adapter = adapter\n        binding.notesView.layoutManager = LinearLayoutManager(context)\n\n        binding.showInBrowser.setOnClickListener {\n            viewLifecycleOwner.lifecycleScope.launch {\n                noteDetailViewModel.getUrl().onSuccess { url ->\n                    showShareLink(url)\n                }\n\n            }\n        }\n\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        currentPageableTimelineViewModel.setCurrentPageable(noteDetailViewModel.accountId, noteDetailViewModel.pageable)\n    }\n\n    @MainThread\n    private fun showShareLink(url: String) {\n        val uri = Uri.parse(url)\n        startActivity(\n            Intent(Intent.ACTION_VIEW, uri)\n        )\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/NoteDetailPagerFragment.kt",
    "content": "package net.pantasystem.milktea.note.detail\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.viewpager2.widget.ViewPager2\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.FragmentNoteDetailPagerBinding\nimport net.pantasystem.milktea.note.detail.pager.NoteDetailViewPagerAdapter\nimport net.pantasystem.milktea.note.detail.viewmodel.NoteDetailPagerViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass NoteDetailPagerFragment : Fragment(R.layout.fragment_note_detail_pager) {\n\n    companion object {\n        fun newInstance(noteId: String, fromPageable: Pageable?, accountId: Long?): Fragment {\n            return NoteDetailPagerFragment().apply {\n                arguments = Bundle().apply {\n                    putString(NoteDetailPagerViewModel.EXTRA_NOTE_ID, noteId)\n                    if (accountId != null) {\n                        putLong(NoteDetailPagerViewModel.EXTRA_ACCOUNT_ID, accountId)\n                    }\n                    if (fromPageable != null) {\n                        putSerializable(NoteDetailPagerViewModel.EXTRA_FROM_PAGEABLE, fromPageable)\n                    }\n                }\n            }\n        }\n    }\n\n    @Inject\n    internal lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    private val binding by dataBinding<FragmentNoteDetailPagerBinding>()\n\n    val viewModel: NoteDetailPagerViewModel by activityViewModels()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val viewPager = NoteDetailViewPagerAdapter(this, pageableFragmentFactory)\n\n        binding.viewPager.adapter = viewPager\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                viewModel.noteIds.collect { noteIds ->\n                    viewPager.submitList(noteIds)\n                }\n            }\n        }\n\n        binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {\n            override fun onPageSelected(position: Int) {\n                super.onPageSelected(position)\n                if (position == 0) {\n                    viewModel.loadFuture()\n                    return\n                }\n                val ids = viewModel.noteIds.value\n                if (position == ids.size - 1) {\n                    viewModel.loadPrevious()\n                }\n            }\n        })\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/pager/NoteDetailViewPagerAdapter.kt",
    "content": "package net.pantasystem.milktea.note.detail.pager\n\nimport androidx.fragment.app.Fragment\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\n\nclass NoteDetailViewPagerAdapter(activity: Fragment, val factory: PageableFragmentFactory) : FragmentStateAdapter(activity) {\n    private var _list: List<Note.Id> = emptyList()\n\n    override fun createFragment(position: Int): Fragment {\n        return factory.create(accountId = _list[position].accountId, Pageable.Show(noteId = _list[position].noteId))\n    }\n\n    override fun getItemCount(): Int {\n        return _list.size\n    }\n\n    fun submitList(newList: List<Note.Id>) {\n        val oldList = _list\n        _list = newList\n        val callback = object : DiffUtil.Callback() {\n            override fun getOldListSize(): Int {\n                return oldList.size\n            }\n\n            override fun getNewListSize(): Int {\n                return newList.size\n            }\n\n            override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return oldList[oldItemPosition] == newList[newItemPosition]\n            }\n\n            override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return oldList[oldItemPosition] == newList[newItemPosition]\n            }\n        }\n        val result = DiffUtil.calculateDiff(callback)\n        result.dispatchUpdatesTo(this)\n    }\n\n    override fun containsItem(itemId: Long): Boolean {\n        return _list.map {\n            it.hashCode().toLong()\n        }.contains(itemId)\n    }\n\n    override fun getItemId(position: Int): Long {\n        return _list[position].hashCode().toLong()\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/viewmodel/NoteConversationViewData.kt",
    "content": "package net.pantasystem.milktea.note.detail.viewmodel\n\nimport androidx.lifecycle.MutableLiveData\nimport kotlinx.coroutines.CoroutineScope\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\n//viewはRecyclerView\nclass NoteConversationViewData(\n    noteRelation: NoteRelation,\n    account: Account,\n    translationStore: NoteTranslationStore,\n    coroutineScope: CoroutineScope,\n    noteDataSource: NoteDataSource,\n    configRepository: LocalConfigRepository,\n) : PlaneNoteViewData(\n    noteRelation,\n    account,\n    translationStore,\n    noteDataSource,\n    configRepository,\n    coroutineScope\n) {\n    val conversation = MutableLiveData<List<PlaneNoteViewData>>()\n    val hasConversation = MutableLiveData<Boolean>()\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/viewmodel/NoteDetailNotesFlowBuilder.kt",
    "content": "package net.pantasystem.milktea.note.detail.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.model.account.CurrentAccountWatcher\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.filter.WordFilterService\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteCaptureAPIAdapter\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRelationGetter\nimport net.pantasystem.milktea.model.note.NoteThreadContext\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\nimport javax.inject.Inject\n\nclass NoteDetailNotesFlowBuilder(\n    private val cache: PlaneNoteViewDataCache,\n    private val noteWordFilterService: WordFilterService,\n    private val noteRelationGetter: NoteRelationGetter,\n    private val currentAccountWatcher: CurrentAccountWatcher,\n    private val noteTranslationStore: NoteTranslationStore,\n    private val viewModelScope: CoroutineScope,\n    private val noteDataSource: NoteDataSource,\n    private val configRepository: LocalConfigRepository,\n    private val noteCaptureAPIAdapter: NoteCaptureAPIAdapter,\n    ) {\n\n    class Factory @Inject constructor(\n        private val noteWordFilterService: WordFilterService,\n        private val noteRelationGetter: NoteRelationGetter,\n        private val configRepository: LocalConfigRepository,\n        private val noteCaptureAPIAdapter: NoteCaptureAPIAdapter,\n        private val noteDataSource: NoteDataSource,\n        private val noteTranslationStore: NoteTranslationStore,\n\n        ) {\n        fun create(\n            cache: PlaneNoteViewDataCache,\n            currentAccountWatcher: CurrentAccountWatcher,\n            scope: CoroutineScope,\n        ): NoteDetailNotesFlowBuilder {\n            return NoteDetailNotesFlowBuilder(\n                cache,\n                noteWordFilterService,\n                noteRelationGetter,\n                currentAccountWatcher,\n                noteTranslationStore,\n                scope,\n                noteDataSource,\n                configRepository,\n                noteCaptureAPIAdapter,\n            )\n        }\n    }\n\n    fun build(\n        show: Pageable.Show,\n        noteFlow: Flow<Note?>,\n        threadContext: StateFlow<NoteThreadContext>\n    ): Flow<List<PlaneNoteViewData>> {\n        return combine(noteFlow, threadContext) { note, thread ->\n            val relatedConversation = noteRelationGetter.getIn(thread.ancestors.map { it.id }).filterNot {\n                noteWordFilterService.isShouldFilterNote(show, it)\n            }.map {\n                NoteType.Conversation(it)\n            }\n            val repliesMap = thread.descendants.groupBy {\n                it.replyId\n            }\n            val relatedChildren = noteRelationGetter.getIn((repliesMap[note?.id] ?: emptyList()).map {\n                it.id\n            }).filterNot {\n                noteWordFilterService.isShouldFilterNote(show, it)\n            }.map { childNote ->\n                NoteType.Children(childNote,\n                    noteRelationGetter.getIn(repliesMap[childNote.note.id]?.map { it.id }\n                        ?: emptyList())\n                )\n            }\n            val relatedNote =\n                noteRelationGetter.getIn(if (note == null) emptyList() else listOf(note.id)).filterNot {\n                    noteWordFilterService.isShouldFilterNote(show, it)\n                }.map {\n                    NoteType.Detail(it)\n                }\n            relatedConversation + relatedNote + relatedChildren\n        }.map { notes ->\n            notes.map { note ->\n                when (note) {\n                    is NoteType.Children -> {\n                        NoteConversationViewData(\n                            note.note,\n                            currentAccountWatcher.getAccount(),\n                            noteTranslationStore,\n                            viewModelScope,\n                            noteDataSource,\n                            configRepository,\n                        ).also {\n                            it.capture()\n                            cache.put(it)\n                        }.apply {\n                            this.hasConversation.postValue(false)\n                            this.conversation.postValue(note.getReplies().map {\n                                cache.get(it)\n                            })\n                        }\n                    }\n                    is NoteType.Conversation -> {\n                        cache.get(note.note)\n                    }\n                    is NoteType.Detail -> {\n                        NoteDetailViewData(\n                            note.note,\n                            currentAccountWatcher.getAccount(),\n                            noteTranslationStore,\n                            noteDataSource,\n                            configRepository,\n                            viewModelScope,\n                        ).also {\n                            it.capture()\n                            cache.put(it)\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun <T : PlaneNoteViewData> T.capture(): T {\n        val self = this\n        self.capture(noteCaptureAPIAdapter) {\n            it.launchIn(viewModelScope + Dispatchers.IO)\n        }\n        return this\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/viewmodel/NoteDetailPagerViewModel.kt",
    "content": "package net.pantasystem.milktea.note.detail.viewmodel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.notes.InitialLoadQuery\nimport net.pantasystem.milktea.app_store.notes.TimelineStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModelUiStateHelper\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.ap.ApResolverService\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass NoteDetailPagerViewModel @Inject constructor(\n    timelineStoreFactory: TimelineStore.Factory,\n    private val savedStateHandle: SavedStateHandle,\n    private val apResolverService: ApResolverService,\n    private val accountStore: AccountStore,\n    private val accountRepository: AccountRepository,\n    instanceInfoService: InstanceInfoService,\n    userRepository: UserRepository,\n    loggerFactory: Logger.Factory,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_FROM_PAGEABLE = \"NoteDetailPagerViewModel.EXTRA_FROM_PAGEABLE\"\n        const val EXTRA_NOTE_ID = \"NoteDetailPagerViewModel.EXTRA_NOTE_ID\"\n        const val EXTRA_ACCOUNT_ID = \"NoteDetailPagerViewModel.EXTRA_ACCOUNT_ID\"\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"NoteDetailPagerViewModel\")\n    }\n\n    private val noteIdStr = savedStateHandle.getStateFlow<String?>(EXTRA_NOTE_ID, null)\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val currentAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n\n    private val timelineStoreHolder = TimelineStoreHolder(\n        savedStateHandle.get<Pageable>(EXTRA_FROM_PAGEABLE) ?: Pageable.Show(getNoteId() ?: \"\"),\n        timelineStoreFactory,\n        viewModelScope,\n    ) {\n        (savedStateHandle[EXTRA_ACCOUNT_ID]\n            ?: accountStore.state.value.currentAccount?.accountId)?.let {\n            accountRepository.get(it).getOrThrow()\n        } ?: throw IllegalStateException(\"Account is not set\")\n    }\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val timelineState = savedStateHandle.getStateFlow<Pageable?>(EXTRA_FROM_PAGEABLE, null).flatMapLatest {\n        if (it != null) {\n            timelineStoreHolder.setPageable(it)\n        }\n        timelineStoreHolder.timelineStore.timelineState\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init(),\n    )\n    val noteIds = combine(\n        timelineState,\n        noteIdStr.filterNotNull(),\n        currentAccount.filterNotNull()\n    ) { state, noteId, account ->\n        when (val content = state.content) {\n            is StateContent.Exist -> listOf(Note.Id(account.accountId, noteId)) + content.rawContent\n            is StateContent.NotExist -> listOf(Note.Id(account.accountId, noteId))\n        }.distinct().sortedBy {\n            it.noteId\n        }.reversed()\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    val accountUiState = AccountViewModelUiStateHelper(\n        currentAccount,\n        accountStore,\n        userRepository,\n        instanceInfoService,\n        viewModelScope,\n    ).uiState\n\n    init {\n        load()\n    }\n\n    fun load() {\n        viewModelScope.launch {\n            runCancellableCatching {\n                timelineStoreHolder.timelineStore.clear(\n                    InitialLoadQuery.UntilId(\n                        Note.Id(getAccount().accountId, requireNotNull(getNoteId()))\n                    )\n                )\n                timelineStoreHolder.timelineStore.loadPrevious()\n                timelineStoreHolder.timelineStore.loadFuture()\n            }.onFailure {\n                logger.error(\"Failed to load timeline\", it)\n            }\n        }\n    }\n\n    fun loadPrevious() {\n        viewModelScope.launch {\n            timelineStoreHolder.timelineStore.loadPrevious().onFailure {\n                logger.error(\"Failed to load previous timeline\", it)\n            }\n        }\n    }\n\n    fun loadFuture() {\n        viewModelScope.launch {\n            timelineStoreHolder.timelineStore.loadFuture().onFailure {\n                logger.error(\"Failed to load future timeline\", it)\n            }\n        }\n    }\n\n    fun setCurrentAccount(accountId: Long) {\n        viewModelScope.launch {\n            try {\n                val noteId = getNoteId()\n                val currentAccountId = requireNotNull(savedStateHandle.get<Long>(EXTRA_ACCOUNT_ID))\n                val resolvedNote =\n                    apResolverService.resolve(Note.Id(currentAccountId, requireNotNull(noteId)), accountId)\n                        .getOrThrow()\n                savedStateHandle[EXTRA_ACCOUNT_ID] = accountId\n                savedStateHandle[EXTRA_NOTE_ID] = resolvedNote.id.noteId\n                savedStateHandle[EXTRA_FROM_PAGEABLE] = Pageable.Show(resolvedNote.id.noteId)\n                timelineStoreHolder.setPageable(Pageable.Show(resolvedNote.id.noteId))\n                accountStore.setCurrent(accountRepository.get(accountId).getOrThrow())\n            } catch (e: Exception) {\n                logger.error(\"Failed to resolve note\", e)\n            }\n        }\n    }\n\n    private fun getNoteId(): String? {\n        return savedStateHandle.get<String>(EXTRA_NOTE_ID)\n    }\n\n    private suspend fun getAccount(): Account {\n        return (savedStateHandle[EXTRA_ACCOUNT_ID]\n            ?: accountStore.state.value.currentAccount?.accountId)?.let {\n            accountRepository.get(it).getOrThrow()\n        } ?: throw IllegalStateException(\"Account is not set\")\n    }\n}\n\nclass TimelineStoreHolder(\n    pageable: Pageable,\n    private val timelineStoreFactory: TimelineStore.Factory,\n    private val scope: CoroutineScope,\n    private val getAccount: suspend () -> Account,\n) {\n    var timelineStore = timelineStoreFactory.create(pageable, scope,  {\n        getAccount()\n    })\n        private set\n\n    fun setPageable(pageable: Pageable) {\n        timelineStore = timelineStoreFactory.create(pageable, scope, getAccount = getAccount)\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/viewmodel/NoteDetailViewData.kt",
    "content": "package net.pantasystem.milktea.note.detail.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\n/**\n * ノートの詳細表示となる一つのオブジェクト\n * 基本的にはPlaneNoteViewDataとは変わらないが\n * ListAdapterで詳細ビューの対象か判定する\n */\nclass NoteDetailViewData(\n    note: NoteRelation,\n    account: Account,\n    translationStore: NoteTranslationStore,\n    noteDataSource: NoteDataSource,\n    configRepository: LocalConfigRepository,\n    coroutineScope: CoroutineScope,\n) : PlaneNoteViewData(\n    note,\n    account,\n    translationStore,\n    noteDataSource,\n    configRepository,\n    coroutineScope\n) {\n    init {\n        super.reactionCountsExpanded.value = true\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/detail/viewmodel/NoteDetailViewModel.kt",
    "content": "package net.pantasystem.milktea.note.detail.viewmodel\n\nimport android.util.Log\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.collect\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.flow.onStart\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.CurrentAccountWatcher\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.GetShareNoteUrlUseCase\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.NoteThreadContext\nimport net.pantasystem.milktea.model.note.ReplyStreaming\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\nimport javax.inject.Inject\n\n@HiltViewModel\nclass NoteDetailViewModel @Inject constructor(\n    accountRepository: AccountRepository,\n    private val noteRepository: NoteRepository,\n    private val noteDataSource: NoteDataSource,\n    planeNoteViewDataCacheFactory: PlaneNoteViewDataCache.Factory,\n    private val loggerFactory: Logger.Factory,\n    private val noteReplyStreaming: ReplyStreaming,\n    noteDetailNotesBuilderFactory: NoteDetailNotesFlowBuilder.Factory,\n    private val savedStateHandle: SavedStateHandle,\n    private val getShareNoteUrl: GetShareNoteUrlUseCase,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_NOTE_ID =\n            \"jp.panta.misskeyandroidclinet.view.notes.detail.EXTRA_NOTE_ID\"\n        const val EXTRA_ACCOUNT_ID =\n            \"jp.panta.misskeyandroidclient.view.notes.detail.EXTRA_ACCOUNT_ID\"\n    }\n\n    val pageable by lazy {\n        Pageable.Show(\n            requireNotNull(savedStateHandle[EXTRA_NOTE_ID]),\n        )\n    }\n\n    val accountId: Long? by lazy {\n        savedStateHandle[EXTRA_ACCOUNT_ID]\n    }\n\n\n    private val logger by lazy {\n        loggerFactory.create(\"NoteDetailVM\")\n    }\n\n\n    private val currentAccountWatcher: CurrentAccountWatcher =\n        CurrentAccountWatcher(savedStateHandle[EXTRA_ACCOUNT_ID], accountRepository)\n\n    private val cache =\n        planeNoteViewDataCacheFactory.create(currentAccountWatcher::getAccount, viewModelScope)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val note = suspend {\n        currentAccountWatcher.getAccount()\n    }.asFlow().flatMapLatest {\n        noteRepository.observeOne(Note.Id(it.accountId, pageable.noteId))\n    }.onStart {\n        emit(null)\n    }\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val threadContext = note.filterNotNull().flatMapLatest {\n        noteRepository.observeThreadContext(it.id)\n    }.catch {\n        logger.error(\"ThreadContextの取得に失敗\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), NoteThreadContext(emptyList(), emptyList()))\n\n    val notes = noteDetailNotesBuilderFactory.create(\n        cache,\n        currentAccountWatcher,\n        viewModelScope,\n    ).build(\n        Pageable.Show(requireNotNull(savedStateHandle[EXTRA_NOTE_ID])),\n        note,\n        threadContext,\n    ).flowOn(Dispatchers.IO)\n        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n\n    init {\n        viewModelScope.launch {\n            try {\n                val account = currentAccountWatcher.getAccount()\n                val note = noteRepository.find(Note.Id(account.accountId, pageable.noteId))\n                    .getOrThrow()\n//                noteRepository.syncConversation(note.id).getOrThrow()\n                noteRepository.syncThreadContext(note.id).getOrThrow()\n//                recursiveSync(note.id).getOrThrow()\n                noteRepository.sync(note.id).getOrThrow()\n            } catch (e: Exception) {\n                Log.w(\"NoteDetailViewModel\", \"loadDetail失敗\", e)\n            }\n        }\n\n        viewModelScope.launch {\n            noteReplyStreaming.connect { currentAccountWatcher.getAccount() }.catch {\n                logger.error(\"observe reply error\", it)\n            }.collect()\n        }\n\n    }\n\n    suspend fun getUrl(): Result<String> = runCancellableCatching {\n        val account = currentAccountWatcher.getAccount()\n        val note = noteRepository.find(Note.Id(account.accountId, pageable.noteId))\n            .getOrThrow()\n        getShareNoteUrl(note.id).getOrThrow()\n    }\n}\n\nsealed interface NoteType {\n    data class Detail(val note: NoteRelation) : NoteType\n    data class Conversation(val note: NoteRelation) : NoteType\n    data class Children(val note: NoteRelation, val nextChildren: List<NoteRelation>) : NoteType {\n\n\n        fun getReplies(): List<NoteRelation> {\n            return nextChildren.filter {\n                it.note.replyId == note.note.id\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/dialog/ConfirmDeleteAndEditNoteDialog.kt",
    "content": "package net.pantasystem.milktea.note.dialog\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\n\nclass ConfirmDeleteAndEditNoteDialog : DialogFragment() {\n\n    companion object {\n        private const val ACCOUNT_ID = \"account_id\"\n        private const val NOTE_ID = \"note_id\"\n\n        const val FRAGMENT_TAG = \"ConfirmDeleteAndDeleteNoteDialog\"\n        fun newInstance(noteId: Note.Id): ConfirmDeleteAndEditNoteDialog {\n            return ConfirmDeleteAndEditNoteDialog().apply {\n                arguments = Bundle().apply {\n                    putString(NOTE_ID, noteId.noteId)\n                    putLong(ACCOUNT_ID, noteId.accountId)\n                }\n            }\n        }\n    }\n\n    private val noteId: Note.Id by lazy {\n        Note.Id(\n            requireArguments().getLong(ACCOUNT_ID),\n            requireNotNull(requireArguments().getString(NOTE_ID))\n        )\n    }\n\n    private val notesViewModel by activityViewModels<NotesViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setMessage(R.string.confirm_delete_and_edit_note_description)\n            .setPositiveButton(R.string.delete_and_edit) { _, _ ->\n                notesViewModel.removeAndEditNote(noteId)\n                dismiss()\n            }\n            .setNegativeButton(R.string.cancel) { _, _ ->\n                dismiss()\n            }\n            .create()\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/dialog/ConfirmDeleteNoteDialog.kt",
    "content": "package net.pantasystem.milktea.note.dialog\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\n\n@AndroidEntryPoint\nclass ConfirmDeleteNoteDialog : DialogFragment() {\n\n    companion object {\n        private const val ACCOUNT_ID = \"account_id\"\n        private const val NOTE_ID = \"note_id\"\n        const val FRAGMENT_TAG = \"ConfirmDeleteNoteDialog\"\n        fun newInstance(noteId: Note.Id): ConfirmDeleteNoteDialog {\n            return ConfirmDeleteNoteDialog().apply {\n                arguments = Bundle().apply {\n                    putString(NOTE_ID, noteId.noteId)\n                    putLong(ACCOUNT_ID, noteId.accountId)\n                }\n            }\n        }\n    }\n\n    private val notesViewModel by activityViewModels<NotesViewModel>()\n\n    private val noteId: Note.Id by lazy {\n        Note.Id(\n            requireArguments().getLong(ACCOUNT_ID),\n            requireNotNull(requireArguments().getString(NOTE_ID))\n        )\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.confirm_deletion)\n            .setPositiveButton(R.string.delete) { _, _ ->\n                notesViewModel.removeNote(noteId)\n                dismiss()\n            }\n            .setNegativeButton(R.string.cancel) { _, _ ->\n                dismiss()\n            }\n            .create()\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/draft/DraftNoteCard.kt",
    "content": "package net.pantasystem.milktea.note.draft\n\nimport androidx.compose.animation.AnimatedVisibility\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Delete\nimport androidx.compose.material.icons.filled.Edit\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_compose.HorizontalFilePreviewList\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport net.pantasystem.milktea.note.R\n\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun DraftNoteCard(\n    draftNote: DraftNote,\n    isVisibleContent: Boolean,\n    isPickMode: Boolean,\n    onAction: (DraftNoteCardAction) -> Unit,\n    onDetach: (DraftNoteFile) -> Unit,\n    onShow: (DraftNoteFile) -> Unit,\n    onToggleSensitive: (DraftNoteFile) -> Unit,\n    onSelect: (DraftNote) -> Unit,\n) {\n\n    var confirmDeleteDraftNoteId: Long? by remember {\n        mutableStateOf(null)\n    }\n\n    fun onConfirmDelete() {\n        confirmDeleteDraftNoteId = null\n        onAction(DraftNoteCardAction.DeleteDraftNote(draftNote))\n    }\n\n    if (confirmDeleteDraftNoteId != null) {\n        ConfirmDeleteDraftNoteDialog(\n            onDismiss = {\n                confirmDeleteDraftNoteId = null\n            },\n            onConfirmed = {\n                onConfirmDelete()\n            }\n        )\n    }\n    Card(\n        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),\n        modifier = Modifier\n            .padding(8.dp)\n            .fillMaxWidth(),\n        shape = RoundedCornerShape(8.dp),\n        onClick = {\n            if (isPickMode) {\n                onSelect(draftNote)\n            }\n        }\n    ) {\n\n        Column(\n            Modifier.padding(16.dp)\n        ) {\n            if (!draftNote.cw.isNullOrBlank()) {\n                Text(text = draftNote.cw ?: \"\")\n\n            }\n            AnimatedVisibility(\n                visible = isVisibleContent\n            ) {\n                if (draftNote.text != null) {\n                    Text(draftNote.text!!)\n                }\n            }\n\n            if (draftNote.draftPoll != null) {\n                DraftNotePollChoices(choices = draftNote.draftPoll?.choices ?: emptyList())\n            }\n\n            if (draftNote.appFiles.isNotEmpty()) {\n                HorizontalFilePreviewList(\n                    files = draftNote.filePreviewSources,\n//                    onAction = {\n//                        onAction(DraftNoteCardAction.FileAction(draftNote, it))\n//                    },\n                    onDetach = {\n                        val index = draftNote.filePreviewSources.indexOf(it)\n                        onDetach(draftNote.draftFiles!![index])\n                    },\n                    onShow = {\n                        val index = draftNote.filePreviewSources.indexOf(it)\n                        onShow(draftNote.draftFiles!![index])\n                    },\n                    onToggleSensitive = {\n                        val index = draftNote.filePreviewSources.indexOf(it)\n                        onToggleSensitive(draftNote.draftFiles!![index])\n                    }\n                )\n            }\n\n            if (!isPickMode) {\n                Row(\n                    horizontalArrangement = Arrangement.End,\n                    verticalAlignment = Alignment.CenterVertically,\n                    modifier = Modifier.fillMaxWidth()\n                ) {\n                    IconButton(onClick = { confirmDeleteDraftNoteId = draftNote.draftNoteId }) {\n                        Icon(\n                            Icons.Default.Delete,\n                            contentDescription = stringResource(id = R.string.delete_draft_note)\n                        )\n                    }\n                    Spacer(modifier = Modifier.width(4.dp))\n                    IconButton(onClick = {\n                        onAction(DraftNoteCardAction.Edit(draftNote))\n                    }) {\n                        Icon(\n                            Icons.Default.Edit,\n                            contentDescription = stringResource(id = R.string.edit)\n                        )\n                    }\n                }\n            }\n\n        }\n\n    }\n}\n\n\n@Composable\nfun DraftNotePollChoices(choices: List<String>) {\n    Column {\n        choices.forEachIndexed { index, s ->\n            DraftNotePollChoice(text = s)\n            if (index < choices.size - 1) {\n                Spacer(modifier = Modifier.height(4.dp))\n            }\n        }\n    }\n}\n\n@Composable\nfun DraftNotePollChoice(text: String) {\n    Box(\n        modifier = Modifier\n            .padding(4.dp)\n    ) {\n        Surface(\n            Modifier.fillMaxWidth(),\n            color = MaterialTheme.colorScheme.primary,\n            shape = RoundedCornerShape(8.dp),\n        ) {\n            Text(\n                text = text,\n                modifier = Modifier.padding(4.dp),\n            )\n        }\n\n    }\n\n}\n\n@Composable\nfun ConfirmDeleteDraftNoteDialog(onDismiss: () -> Unit, onConfirmed: () -> Unit) {\n    AlertDialog(\n        onDismissRequest = { onDismiss.invoke() },\n        title = {\n            Text(stringResource(id = R.string.confirm_deletion))\n        },\n        confirmButton = {\n            TextButton(onClick = { onConfirmed.invoke() }) {\n                Text(stringResource(R.string.delete))\n            }\n        },\n        dismissButton = {\n            TextButton(onClick = { onDismiss.invoke() }) {\n                Text(stringResource(R.string.cancel))\n            }\n        }\n    )\n}\n\nsealed interface DraftNoteCardAction {\n    val draftNote: DraftNote\n\n    data class DeleteDraftNote(override val draftNote: DraftNote) : DraftNoteCardAction\n    data class Edit(override val draftNote: DraftNote) : DraftNoteCardAction\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/draft/DraftNotesFragment.kt",
    "content": "package net.pantasystem.milktea.note.draft\n\nimport android.app.Activity.RESULT_OK\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.MediaNavigation\nimport net.pantasystem.milktea.common_navigation.MediaNavigationArgs\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.file.from\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.DraftNotesActivity\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport net.pantasystem.milktea.note.draft.viewmodel.DraftNotesViewModel\nimport javax.inject.Inject\n\n/**\n * NOTE: 直接的なコードによる参照はないが、activity_draft_notesから参照されているので削除しないこと。\n */\n@AndroidEntryPoint\nclass DraftNotesFragment : Fragment() {\n\n    val viewModel: DraftNotesViewModel by viewModels()\n\n    @Inject\n    lateinit var mediaNavigation: MediaNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?,\n    ): View {\n        val action = activity?.intent?.action\n        val isSelectMode = action == Intent.ACTION_PICK\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    DraftNotesScreen(\n                        isPickMode = isSelectMode,\n                        viewModel = viewModel,\n                        onNavigateUp = {\n                            requireActivity().finish()\n                        },\n                        onEdit = {\n                            val intent = NoteEditorActivity.newBundle(\n                                requireContext(),\n                                draftNoteId = it.draftNoteId\n                            )\n                            requireActivity().startActivityFromFragment(\n                                this@DraftNotesFragment,\n                                intent,\n                                300\n                            )\n                        },\n                        onShowFile = {\n                            val intent = mediaNavigation.newIntent(\n                                MediaNavigationArgs.AFile(\n                                    when (it) {\n                                        is DraftNoteFile.Local -> FilePreviewSource.Local(\n                                            AppFile.from(\n                                                it\n                                            ) as AppFile.Local\n                                        )\n                                        is DraftNoteFile.Remote -> FilePreviewSource.Remote(\n                                            AppFile.Remote(\n                                                it.fileProperty.id\n                                            ), it.fileProperty\n                                        )\n                                    }\n                                )\n                            )\n                            startActivity(intent)\n                        },\n                        onSelect = {\n                            val intent = Intent()\n                            intent.putExtra(DraftNotesActivity.EXTRA_DRAFT_NOTE_ID, it.draftNoteId)\n                            requireActivity().setResult(RESULT_OK, intent)\n                            requireActivity().finish()\n                        }\n                    )\n                }\n            }\n        }.rootView\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/draft/DraftNotesScreen.kt",
    "content": "package net.pantasystem.milktea.note.draft\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport net.pantasystem.milktea.note.draft.viewmodel.DraftNotesViewModel\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun DraftNotesScreen(\n    isPickMode: Boolean,\n    viewModel: DraftNotesViewModel,\n    onShowFile: (DraftNoteFile) -> Unit,\n    onNavigateUp: () -> Unit,\n    onEdit: (DraftNote) -> Unit,\n    onSelect: (DraftNote) -> Unit,\n) {\n    val state by viewModel.uiState.collectAsState()\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            TopAppBar(\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = null)\n                    }\n                },\n                title = {\n                    if (isPickMode) {\n                        Text(text = stringResource(id = net.pantasystem.milktea.common_resource.R.string.select_draft_post))\n                    } else {\n                        Text(text = stringResource(id = net.pantasystem.milktea.common_resource.R.string.draft_notes))\n                    }\n                },\n                colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface)\n            )\n        }\n    ) { paddingValues ->\n        Box(\n            Modifier\n                .padding(paddingValues)\n                .fillMaxSize(),\n            contentAlignment = Alignment.Center\n        ) {\n            if (state.draftNotes is ResultState.Loading) {\n                CircularProgressIndicator()\n            } else {\n                when (val content = state.draftNoteUiStateList.content) {\n                    is StateContent.Exist -> {\n                        LazyColumn(Modifier.fillMaxSize()) {\n                            items(\n                                content.rawContent,\n                                key = { item -> item.draftNote.draftNoteId }) { item ->\n                                DraftNoteCard(\n                                    draftNote = item.draftNote,\n                                    isVisibleContent = item.isVisibleContent,\n                                    isPickMode = isPickMode,\n                                    onAction = { action ->\n                                        when (action) {\n                                            is DraftNoteCardAction.DeleteDraftNote -> {\n                                                viewModel.deleteDraftNote(action.draftNote)\n                                            }\n                                            is DraftNoteCardAction.Edit -> {\n                                                onEdit(action.draftNote)\n                                            }\n\n                                        }\n                                    },\n                                    onShow = onShowFile,\n                                    onDetach = { e ->\n                                        viewModel.detachFile(item.draftNote, e)\n                                    },\n                                    onToggleSensitive = { e ->\n                                        viewModel.toggleSensitive(e)\n                                    },\n                                    onSelect = onSelect\n                                )\n                            }\n                        }\n                    }\n                    is StateContent.NotExist -> Text(\"Not exists\")\n                }\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/draft/viewmodel/DraftNotesViewModel.kt",
    "content": "package net.pantasystem.milktea.note.draft.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNoteService\nimport javax.inject.Inject\n\n@HiltViewModel\nclass DraftNotesViewModel @Inject constructor(\n    accountStore: AccountStore,\n    loggerFactory: Logger.Factory,\n    private val draftNoteRepository: DraftNoteRepository,\n    private val driveFileRepository: DriveFileRepository,\n    private val draftNoteService: DraftNoteService,\n) : ViewModel() {\n\n\n    val logger = loggerFactory.create(\"DraftNotesVM\")\n\n    private val visibleContentDraftNoteIds: StateFlow<Set<Long>> = MutableStateFlow(emptySet())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val draftNotesState: StateFlow<ResultState<List<DraftNote>>> = accountStore.state.mapNotNull {\n        it.currentAccountId\n    }.flatMapLatest { currentAccountId ->\n        draftNoteRepository.observeByAccountId(currentAccountId).map {\n            @Suppress(\"USELESS_CAST\")\n            ResultState.Fixed(StateContent.Exist(it)) as ResultState<List<DraftNote>>\n        }\n    }.catch { e ->\n        this.emit(ResultState.Error(StateContent.NotExist(), e))\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(),\n        ResultState.initialState()\n    )\n\n    val uiState = combine(visibleContentDraftNoteIds, draftNotesState) { ids, state ->\n        DraftNotesPageUiState(\n            visibleContentDraftNoteIds = ids,\n            draftNotes = state\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(),\n        DraftNotesPageUiState(emptySet(), ResultState.initialState())\n    )\n\n\n    fun detachFile(draftNote: DraftNote, file: DraftNoteFile) {\n        viewModelScope.launch {\n            draftNoteRepository.save(\n                draftNote.copy(\n                    draftFiles = draftNote.draftFiles?.filterNot {\n                        it == file\n                    }\n                )\n            ).onFailure {\n                logger.error(\"detach file error\", it)\n            }\n        }\n    }\n\n    fun toggleSensitive(file: DraftNoteFile) {\n        viewModelScope.launch {\n            when (file) {\n                is DraftNoteFile.Remote -> {\n                    driveFileRepository.update(\n                        file.fileProperty.update(\n                            isSensitive = !file.fileProperty.isSensitive\n                        )\n                    )\n                }\n                is DraftNoteFile.Local -> {\n                    draftNoteService.save(\n                        file.copy(isSensitive = file.isSensitive?.not())\n                    )\n                }\n            }.onFailure {\n                logger.error(\"toggle sensitiveに失敗\", it)\n            }\n\n        }\n    }\n//    fun detachFile(file: File?) {\n//\n//        // TODO: 実装する\n//        file?.localFileId?.let{\n//            val notes = ArrayList(draftNotes.value?: emptyList())\n//            val targetNote = (notes.firstOrNull { dNote ->\n//                dNote.note.value?.files?.any {\n//                    it.localFileId == file.localFileId\n//                }?: false\n//            }?: return).note.value ?: return\n//\n//            val updatedFiles = ArrayList(targetNote.files?: emptyList())\n//            updatedFiles.remove(file)\n//\n//            viewModelScope.launch(Dispatchers.IO){\n//                try{\n//                    draftNoteDao.deleteFile(targetNote.draftNoteId!!, file.localFileId!!)\n//\n//                    loadDraftNotes()\n//                }catch(e: Exception){\n//                    Log.e(\"DraftNotesViewModel\", \"更新に失敗した\", e)\n//                }\n//            }\n//        }\n//    }\n\n    fun deleteDraftNote(draftNote: DraftNote) {\n        viewModelScope.launch {\n            draftNoteRepository.delete(draftNote.draftNoteId).onFailure {\n                logger.error(\"下書きノートの削除に失敗しました\", it)\n            }\n        }\n    }\n\n}\n\n\ndata class DraftNotesPageUiState(\n    val visibleContentDraftNoteIds: Set<Long>,\n    val draftNotes: ResultState<List<DraftNote>>,\n) {\n    val draftNoteUiStateList\n        get() = draftNotes.convert { list ->\n            list.map { note ->\n                DraftNoteUiState(\n                    note,\n                    note.cw == null || visibleContentDraftNoteIds.contains(note.draftNoteId)\n                )\n            }\n        }\n}\n\ndata class DraftNoteUiState(\n    val draftNote: DraftNote,\n    val isVisibleContent: Boolean,\n)"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/ConfirmSaveAsDraftDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\n\nclass ConfirmSaveAsDraftDialog : DialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"ConfirmSaveAsDraftDialog\"\n    }\n\n    private val noteEditorViewModel by activityViewModels<NoteEditorViewModel>()\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.save_draft)\n            .setMessage(R.string.save_the_note_as_a_draft)\n            .setPositiveButton(R.string.save) { _, _ ->\n                noteEditorViewModel.saveDraft()\n                dismiss()\n            }\n            .setNegativeButton(R.string.delete) { _, _ ->\n                requireActivity().finish()\n                dismiss()\n            }\n            .create()\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/CustomEmojiCompleteAdapter.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.BaseAdapter\nimport android.widget.Filter\nimport android.widget.Filterable\nimport androidx.databinding.DataBindingUtil\nimport kotlinx.coroutines.runBlocking\nimport net.pantasystem.milktea.common_android_ui.databinding.ItemReactionPreviewBinding\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.note.R\n\nclass CustomEmojiCompleteAdapter(\n    private val account: Account,\n    private val context: Context,\n    private val customEmojiRepository: CustomEmojiRepository,\n) : BaseAdapter(), Filterable {\n\n    var suggestions = listOf<String>()\n        private set\n\n    /**\n     * 入力中のテキスト\n     */\n    var constraint: CharSequence? = null\n        private set\n\n\n\n    override fun getCount(): Int {\n        return suggestions.size\n    }\n\n    override fun getItem(position: Int): String {\n        return suggestions[position]\n    }\n\n    override fun getItemId(position: Int): Long {\n        return position.toLong()\n    }\n\n    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {\n        var view = convertView\n        val binding: ItemReactionPreviewBinding\n        if(view == null){\n            val inflater = LayoutInflater.from(context)\n            binding = DataBindingUtil.inflate(inflater, R.layout.item_reaction_preview, parent, false)\n            view = binding.root\n            view.tag = binding\n        }else{\n            binding = view.tag as ItemReactionPreviewBinding\n        }\n\n        binding.reaction = getItem(position)\n\n        return binding.root\n    }\n\n    private val mFilter = object : Filter(){\n        override fun performFiltering(constraint: CharSequence?): FilterResults {\n            this@CustomEmojiCompleteAdapter.constraint = constraint\n\n            val text = constraint?.toString()\n            val suggestions = if(text != null){\n                runBlocking {\n                    customEmojiRepository.search(account.getHost(), text.replace(\":\", \"\"))\n                }.getOrElse { emptyList() }.map {\n                    \":${it.name}:\"\n                }\n            } else {\n                emptyList()\n            }\n\n            val results = FilterResults()\n            results.values = suggestions\n            results.count = suggestions.size\n            return results\n        }\n\n        override fun publishResults(constraint: CharSequence?, results: FilterResults?) {\n            val resultCount = results?.count?: 0\n            if(resultCount > 0){\n                suggestions = (results?.values as? List<*>?)?.mapNotNull {\n                    it as? String?\n                } ?: emptyList()\n                notifyDataSetChanged()\n            }else{\n                notifyDataSetInvalidated()\n            }\n        }\n    }\n    override fun getFilter(): Filter {\n        return mFilter\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/EmojiAutoCompleteTextField.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.text.InputType\nimport android.widget.MultiAutoCompleteTextView\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberUpdatedState\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.viewinterop.AndroidView\nimport androidx.core.widget.addTextChangedListener\nimport kotlinx.coroutines.flow.SharedFlow\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiTokenizer\nimport net.pantasystem.milktea.common.text.UrlPatternChecker\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.note.editor.viewmodel.TextWithCursorPos\n\n/**\n * カスタム絵文字補完対応のテキスト入力フィールド。\n *\n * MultiAutoCompleteTextView を AndroidView でラップし、既存の CustomEmojiCompleteAdapter +\n * CustomEmojiTokenizer をそのまま活用する。\n *\n * NOTE: 将来的には BasicTextField + カスタムドロップダウンに置き換え可能だが、\n *       初期移行ではこの AndroidView ブリッジを使う。\n *\n * @param value 現在のテキスト（Compose 側の状態）\n * @param onValueChange テキストが変化したときのコールバック\n * @param onFocused このフィールドがフォーカスを得たときのコールバック\n * @param account 絵文字補完に使うアカウント。null の場合は補完なし\n * @param customEmojiRepository 絵文字補完用リポジトリ\n * @param hint プレースホルダーテキスト\n * @param minLines 最小行数\n * @param inputType android.text.InputType の値\n * @param textCursorPosFlow ViewModel から流れてくるカーソル位置更新イベント（絵文字挿入後など）\n * @param onUrlPasted URL が貼り付けられたときのコールバック。null の場合は検出しない\n * @param onCursorPositionChanged テキスト変化後のカーソル位置を通知するコールバック。\n *   絵文字ピッカーから挿入位置を決める際に使う\n */\n@Composable\nfun EmojiAutoCompleteTextField(\n    value: String,\n    onValueChange: (String) -> Unit,\n    onFocused: () -> Unit,\n    account: Account?,\n    customEmojiRepository: CustomEmojiRepository,\n    modifier: Modifier = Modifier,\n    hint: String = \"\",\n    minLines: Int = 1,\n    inputType: Int = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE,\n    textCursorPosFlow: SharedFlow<TextWithCursorPos>? = null,\n    onUrlPasted: ((text: String, start: Int, beforeText: String, count: Int) -> Unit)? = null,\n    onCursorPositionChanged: (Int) -> Unit = {},\n) {\n    // MultiAutoCompleteTextView への参照を保持して LaunchedEffect からアクセスできるようにする\n    val viewRef = remember { mutableStateOf<MultiAutoCompleteTextView?>(null) }\n\n    // アダプターの再セットが必要かどうかを判定するために前回のアカウント ID を記憶する\n    val lastAdapterAccountId = remember { mutableStateOf<Long?>(null) }\n\n    // onValueChange / onFocused は最新の参照を保持（クロージャのキャプチャ問題を防ぐ）\n    val currentOnValueChange by rememberUpdatedState(onValueChange)\n    val currentOnFocused by rememberUpdatedState(onFocused)\n    val currentOnUrlPasted by rememberUpdatedState(onUrlPasted)\n    val currentOnCursorPositionChanged by rememberUpdatedState(onCursorPositionChanged)\n\n    // ViewModel から流れるカーソル位置更新を監視し、View に反映する\n    LaunchedEffect(textCursorPosFlow) {\n        textCursorPosFlow?.collect { cursorData ->\n            val view = viewRef.value ?: return@collect\n            try {\n                val newText = cursorData.text ?: \"\"\n                // text を更新しつつカーソル位置を設定する\n                // テキスト変更リスナーが反応しないよう setText の前後で一時的に抑制はしない\n                // （onValueChange のループ防止は update ブロック側で行う）\n                view.setText(newText)\n                val safePos = cursorData.cursorPos.coerceIn(0, newText.length)\n                view.setSelection(safePos)\n            } catch (_: Exception) {\n                // テキストが空などの境界ケースでクラッシュしないよう握りつぶす\n            }\n        }\n    }\n\n    AndroidView(\n        factory = { ctx ->\n            MultiAutoCompleteTextView(ctx).apply {\n                this.hint = hint\n                this.inputType = inputType\n                this.minLines = minLines\n                // 背景を透明にして OutlinedTextField 的な枠線を出さない\n                setBackgroundColor(android.graphics.Color.TRANSPARENT)\n                // Material3 テーマのデフォルトスタイルが paddingTop ~16dp を持つため、\n                // TYPE_TEXT_FLAG_MULTI_LINE 設定後に gravity が TOP になると\n                // テキスト上部に余分な空白として現れる。\n                // 外側の Compose modifier で padding を管理するため内部は 0 にリセットする。\n                setPadding(0, 0, 0, 0)\n\n                if (account != null) {\n                    setAdapter(\n                        CustomEmojiCompleteAdapter(account, ctx, customEmojiRepository)\n                    )\n                    setTokenizer(CustomEmojiTokenizer())\n                }\n\n                addTextChangedListener(\n                    onTextChanged = { text, start, _, count ->\n                        // テキスト変化後のカーソル位置を通知\n                        currentOnCursorPositionChanged(start + count)\n\n                        // URL 貼り付け検出（コールバックが設定されている場合のみ）\n                        if (currentOnUrlPasted != null && text != null && count > 0) {\n                            val inputText = try {\n                                text.substring(start, start + count)\n                            } catch (_: Exception) { \"\" }\n                            if (UrlPatternChecker.isMatch(inputText)) {\n                                currentOnUrlPasted?.invoke(\n                                    text.toString(),\n                                    start,\n                                    text.removeRange(start, start + count).toString(),\n                                    count,\n                                )\n                            }\n                        }\n                    },\n                ) { editable ->\n                    val newText = editable?.toString() ?: \"\"\n                    currentOnValueChange(newText)\n                }\n\n                setOnFocusChangeListener { _, hasFocus ->\n                    if (hasFocus) currentOnFocused()\n                }\n            }.also { viewRef.value = it }\n        },\n        update = { view ->\n            // アカウントが変わったらアダプターを更新する\n            if (account != null && account.accountId != lastAdapterAccountId.value) {\n                lastAdapterAccountId.value = account.accountId\n                view.setAdapter(\n                    CustomEmojiCompleteAdapter(account, view.context, customEmojiRepository)\n                )\n                view.setTokenizer(CustomEmojiTokenizer())\n            }\n\n            // テキストを同期する（ループ防止のため内容が変わった場合のみ更新）\n            if (view.text.toString() != value) {\n                view.setText(value)\n                // カーソルを末尾に移動（単純な setText 後のデフォルト動作）\n                try { view.setSelection(value.length) } catch (_: Exception) {}\n            }\n        },\n        modifier = modifier,\n    )\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorAddressSection.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport androidx.compose.foundation.layout.ExperimentalLayoutApi\nimport androidx.compose.foundation.layout.FlowRow\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.AssistChip\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TextButton\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_viewmodel.UserViewData\nimport net.pantasystem.milktea.note.R\n\n@OptIn(ExperimentalLayoutApi::class)\n@Composable\nfun NoteEditorAddressSection(\n    addressUsers: List<UserViewData>,\n    onAddAddressClicked: () -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    FlowRow(modifier = modifier.padding(horizontal = 8.dp)) {\n        for (userViewData in addressUsers) {\n            val user by userViewData.user.collectAsState()\n            val displayName = user?.displayName ?: userViewData.userName ?: \"\"\n            AssistChip(\n                onClick = {},\n                label = { Text(displayName) },\n                modifier = Modifier.padding(end = 4.dp),\n            )\n        }\n        TextButton(onClick = onAddAddressClicked) {\n            Text(stringResource(id = R.string.add_address))\n        }\n    }\n}\n\n@Preview\n@Composable\nprivate fun Preview_NoteEditorAddressSection() {\n    MaterialTheme {\n        Surface {\n            NoteEditorAddressSection(\n                addressUsers = emptyList(),\n                onAddAddressClicked = {},\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorFileSizeWarningDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.convertToHumanReadable\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass NoteEditorFileSizeWarningDialog : AppCompatDialogFragment() {\n\n    private val noteEditorViewModel: NoteEditorViewModel by activityViewModels()\n\n    companion object {\n        const val FRAGMENT_TAG = \"NoteEditorFileSizeWarningDialog\"\n        private const val EXTRA_APP_FILE_LOCAL = \"NoteEditorFileSizeWarningDialog.EXTRA_APP_FILE_LOCAL\"\n        private const val EXTRA_HOST = \"NoteEditorFileSizeWarningDialog.EXTRA_HOST\"\n        private const val EXTRA_ALLOW_MAX_SIZE = \"NoteEditorFileSizeWarningDialog.EXTRA_ALLOW_MAX_SIZE\"\n        fun newInstance(host: String, allowFileMaxSize: Long, file: AppFile.Local): NoteEditorFileSizeWarningDialog {\n            return NoteEditorFileSizeWarningDialog().apply {\n                arguments = Bundle().apply {\n                    putSerializable(EXTRA_APP_FILE_LOCAL, file)\n                    putString(EXTRA_HOST, host)\n                    putLong(EXTRA_ALLOW_MAX_SIZE, allowFileMaxSize)\n                }\n            }\n        }\n    }\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val appFile = requireNotNull(requireArguments().getSerializable(EXTRA_APP_FILE_LOCAL) as AppFile.Local)\n        val host = requireNotNull(requireArguments().getString(EXTRA_HOST))\n        val allowSize = requireNotNull(requireArguments().getLong(EXTRA_ALLOW_MAX_SIZE))\n\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.file_size_warning_dialog_title)\n            .setMessage(getString(R.string.file_size_warning_dialog_message, host, convertHumanFriendly(allowSize)))\n            .setPositiveButton(R.string.file_size_warning_dialo_positive_button) { _, _ ->\n                dismiss()\n            }.setNegativeButton(R.string.file_size_warning_dialog_negative_button) { _, _ ->\n                noteEditorViewModel.removeFileNoteEditorData(appFile)\n                dismiss()\n            }.create()\n\n    }\n\n    private fun convertHumanFriendly(size: Long?): String {\n        size ?: return \"0B\"\n\n        return size.convertToHumanReadable()\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorReplyPreview.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_android_ui.MfmText\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\n@Composable\nfun NoteEditorReplyPreview(\n    replyTo: PlaneNoteViewData,\n    modifier: Modifier = Modifier,\n) {\n    val note by replyTo.currentNote.collectAsState()\n\n    Column(modifier = modifier.fillMaxWidth()) {\n        Row(\n            modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)\n        ) {\n            AvatarIcon(\n                url = replyTo.avatarUrl,\n                onAvatarClick = {},\n                size = 32.dp,\n                borderStrokeWidth = 1.dp,\n                borderStrokeColor = Color.Gray,\n            )\n            Spacer(modifier = Modifier.width(8.dp))\n            Column(modifier = Modifier.weight(1f)) {\n                Text(\n                    text = replyTo.name,\n                    style = MaterialTheme.typography.labelMedium,\n                    maxLines = 1,\n                    overflow = TextOverflow.Ellipsis,\n                )\n                val text = note.text\n                if (!text.isNullOrEmpty()) {\n                    MfmText(\n                        text = text,\n                        emojiNameMap = replyTo.toShowNote.note.emojiNameMap ?: emptyMap(),\n                        style = MaterialTheme.typography.bodySmall,\n                        maxLines = 3,\n                        overflow = TextOverflow.Ellipsis,\n                        color = MaterialTheme.colorScheme.onSurfaceVariant,\n                    )\n                }\n            }\n        }\n        HorizontalDivider()\n    }\n}\n\n@Preview\n@Composable\nprivate fun Preview_NoteEditorReplyPreview() {\n    MaterialTheme {\n        Surface {\n            Text(\n                text = \"Reply preview placeholder\",\n                modifier = Modifier.padding(16.dp),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorScheduleSection.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Close\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.OutlinedButton\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_resource.R\nimport java.text.SimpleDateFormat\nimport java.util.Date\nimport java.util.Locale\n\n@Composable\nfun NoteEditorScheduleSection(\n    scheduleDate: Date,\n    onPickDateClicked: () -> Unit,\n    onPickTimeClicked: () -> Unit,\n    onClearClicked: () -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val dateFormat = SimpleDateFormat(\"yyyy/MM/dd\", Locale.getDefault())\n    val timeFormat = SimpleDateFormat(\"HH:mm\", Locale.getDefault())\n\n    Column(modifier = modifier.padding(horizontal = 16.dp, vertical = 4.dp)) {\n        Row(verticalAlignment = Alignment.CenterVertically) {\n            Text(\n                text = stringResource(id = R.string.reservation_at),\n                style = MaterialTheme.typography.labelMedium,\n                modifier = Modifier.weight(1f),\n            )\n            IconButton(onClick = onClearClicked) {\n                Icon(\n                    Icons.Default.Close,\n                    contentDescription = stringResource(id = R.string.remove),\n                )\n            }\n        }\n        Text(\n            text = stringResource(id = R.string.warning_reservation_msg),\n            style = MaterialTheme.typography.bodySmall,\n            color = MaterialTheme.colorScheme.error,\n        )\n        Row {\n            OutlinedButton(\n                onClick = onPickDateClicked,\n                modifier = Modifier.padding(end = 4.dp),\n            ) {\n                Text(dateFormat.format(scheduleDate))\n            }\n            OutlinedButton(onClick = onPickTimeClicked) {\n                Text(timeFormat.format(scheduleDate))\n            }\n        }\n    }\n}\n\n@Preview\n@Composable\nprivate fun Preview_NoteEditorScheduleSection() {\n    MaterialTheme {\n        Surface {\n            NoteEditorScheduleSection(\n                scheduleDate = Date(),\n                onPickDateClicked = {},\n                onPickTimeClicked = {},\n                onClearClicked = {},\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorScreen.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport androidx.activity.compose.BackHandler\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.height\nimport androidx.compose.foundation.layout.imePadding\nimport androidx.compose.foundation.layout.navigationBarsPadding\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.safeDrawing\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_compose.haptic.rememberHapticFeedback\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.note.PollExpiresAt\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.note.editor.poll.ExpireAtType\nimport net.pantasystem.milktea.note.editor.poll.PollEditorLayout\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorFocusEditTextType\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport kotlin.time.Duration.Companion.days\n\n/**\n * NoteEditor の最上位 Composable。\n *\n * ViewModel の状態収集とコールバックの受け渡しを担当する。\n * ダイアログの表示・ActivityResultLauncher の起動は全てラムダで上位（Fragment/Activity）に委譲する。\n *\n * Phase 3 で NoteEditorFragment.onCreateView からこの Composable をホストする。\n * Phase 4 で NoteEditorActivity が直接 setContent でこの Composable をホストする。\n */\n@OptIn(ExperimentalCoroutinesApi::class)\n@Composable\nfun NoteEditorScreen(\n    viewModel: NoteEditorViewModel,\n    accountViewModel: AccountViewModel,\n    customEmojiRepository: CustomEmojiRepository,\n    isPostButtonAtTheBottom: Boolean,\n    onNavigateUp: () -> Unit,\n    onPickFileFromDrive: () -> Unit,\n    onPickFileFromLocal: () -> Unit,\n    onPickImageFromLocal: () -> Unit,\n    onSelectMentionUsers: () -> Unit,\n    onSelectAddressUsers: () -> Unit,\n    onShowEmojiPicker: () -> Unit,\n    onShowDraftPicker: () -> Unit,\n    onShowAlarmPermissionDescriptionDialogIfPermissionDenied: () -> Boolean,\n    onShowMediaPreview: (FilePreviewSource) -> Unit,\n    onEditFileCaption: (FilePreviewSource) -> Unit,\n    onEditFileName: (FilePreviewSource) -> Unit,\n    onShowVisibilityDialog: () -> Unit,\n    onShowReservationDatePicker: () -> Unit,\n    onShowReservationTimePicker: () -> Unit,\n    onShowPollDatePicker: () -> Unit,\n    onShowPollTimePicker: () -> Unit,\n    onShowConfirmSaveAsDraftDialog: () -> Unit,\n    onTextCursorPositionChanged: (Int) -> Unit = {},\n    onCwCursorPositionChanged: (Int) -> Unit = {},\n) {\n    val uiState by viewModel.uiState.collectAsState()\n    val replyTo by viewModel.replyTo.collectAsState()\n    val addressUsers by viewModel.address.collectAsState()\n    val enableFeatures by viewModel.enableFeatures.collectAsState()\n    val currentAccount by viewModel.currentAccount.collectAsState()\n\n    // フォーカスされているテキストフィールドを追跡（絵文字挿入先の判定に使う）\n    var focusedField by remember { mutableStateOf(NoteEditorFocusEditTextType.Text) }\n    // focusedField を ViewModel にも同期させる（EmojiPickerDialog のコールバックが ViewModel 経由のため）\n    viewModel.focusType = focusedField\n\n    // 投稿完了で画面を閉じる\n    LaunchedEffect(Unit) {\n        viewModel.isPost.collect { posted ->\n            if (posted) onNavigateUp()\n        }\n    }\n    // 下書き保存完了で画面を閉じる\n    LaunchedEffect(Unit) {\n        viewModel.isSaveNoteAsDraft.collect { draftId ->\n            if (draftId != null) onNavigateUp()\n        }\n    }\n\n    // 投票日時ピッカーの表示イベント\n    LaunchedEffect(Unit) {\n        viewModel.showPollDatePicker.collect { onShowPollDatePicker() }\n    }\n    LaunchedEffect(Unit) {\n        viewModel.showPollTimePicker.collect { onShowPollTimePicker() }\n    }\n\n    // バックプレス：下書きが保存できる状態なら確認ダイアログを出す\n    BackHandler {\n        if (viewModel.canSaveDraft()) {\n            onShowConfirmSaveAsDraftDialog()\n        } else {\n            onNavigateUp()\n        }\n    }\n\n    val feedback = rememberHapticFeedback()\n    val scheduleDate = uiState.sendToState.schedulePostAtAsDate\n\n    val toolbarContent: @Composable () -> Unit = {\n        NoteEditorToolbarBinding(\n            noteEditorViewModel = viewModel,\n            accountViewModel = accountViewModel,\n            onShowAlarmPermissionDescriptionDialogIfPermissionDenied = onShowAlarmPermissionDescriptionDialogIfPermissionDenied,\n            onFinishOrConfirmSaveAsDraftOrDelete = {\n                if (viewModel.canSaveDraft()) onShowConfirmSaveAsDraftDialog()\n                else onNavigateUp()\n            },\n            onShowVisibilitySelectionDialog = onShowVisibilityDialog,\n        )\n    }\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            if (!isPostButtonAtTheBottom) {\n                toolbarContent()\n            }\n        },\n        bottomBar = {\n            Column(modifier = Modifier.navigationBarsPadding().imePadding()) {\n                NoteFilePreview(\n                    noteEditorViewModel = viewModel,\n                    onShow = { feedback.performClickHapticFeedback(); onShowMediaPreview(it) },\n                    onEditFileCaptionSelectionClicked = {\n                        feedback.performClickHapticFeedback()\n                        onEditFileCaption(it)\n                    },\n                    onEditFileNameSelectionClicked = {\n                        feedback.performClickHapticFeedback()\n                        onEditFileName(it)\n                    },\n                )\n                if (isPostButtonAtTheBottom) {\n                    toolbarContent()\n                }\n                NoteEditorUserActionMenuLayout(\n                    modifier = Modifier.fillMaxWidth(),\n                    isEnableDrive = enableFeatures.contains(FeatureType.Drive),\n                    iconColor = getColor(color = net.pantasystem.milktea.note.R.attr.normalIconTint),\n                    isCw = uiState.formState.hasCw,\n                    isPoll = uiState.poll != null,\n                    onPickFileFromDriveButtonClicked = {\n                        feedback.performClickHapticFeedback()\n                        onPickFileFromDrive()\n                    },\n                    onPickFileFromLocalButtonCLicked = {\n                        feedback.performClickHapticFeedback()\n                        onPickFileFromLocal()\n                    },\n                    onPickImageFromLocalButtonClicked = {\n                        feedback.performClickHapticFeedback()\n                        onPickImageFromLocal()\n                    },\n                    onTogglePollButtonClicked = {\n                        feedback.performClickHapticFeedback()\n                        viewModel.enablePoll()\n                    },\n                    onSelectMentionUsersButtonClicked = {\n                        feedback.performClickHapticFeedback()\n                        onSelectMentionUsers()\n                    },\n                    onSelectEmojiButtonClicked = {\n                        feedback.performClickHapticFeedback()\n                        onShowEmojiPicker()\n                    },\n                    onToggleCwButtonClicked = {\n                        feedback.performClickHapticFeedback()\n                        viewModel.changeCwEnabled()\n                    },\n                    onSelectDraftNoteButtonClicked = {\n                        feedback.performClickHapticFeedback()\n                        onShowDraftPicker()\n                    },\n                )\n                HorizontalDivider()\n            }\n        },\n    ) { paddingValues ->\n        Column(\n            modifier = Modifier\n                .fillMaxSize()\n                .padding(paddingValues)\n                .verticalScroll(rememberScrollState()),\n        ) {\n            // リプライ先プレビュー\n            replyTo?.let { reply ->\n                NoteEditorReplyPreview(replyTo = reply)\n            }\n\n            // 予約投稿セクション\n            if (scheduleDate != null) {\n                NoteEditorScheduleSection(\n                    scheduleDate = scheduleDate,\n                    onPickDateClicked = onShowReservationDatePicker,\n                    onPickTimeClicked = onShowReservationTimePicker,\n                    onClearClicked = { viewModel.toggleReservationAt() },\n                )\n            }\n\n            // 宛先ユーザーセクション（Specified visibility のみ表示）\n            if (uiState.sendToState.visibility is Visibility.Specified) {\n                NoteEditorAddressSection(\n                    addressUsers = addressUsers,\n                    onAddAddressClicked = {\n                        feedback.performClickHapticFeedback()\n                        onSelectAddressUsers()\n                    },\n                )\n            }\n\n            // テキスト入力エリア\n            NoteEditorTextInputSection(\n                text = uiState.formState.text ?: \"\",\n                cw = uiState.formState.cw,\n                hasCw = uiState.formState.hasCw,\n                account = currentAccount,\n                customEmojiRepository = customEmojiRepository,\n                textCursorPosFlow = viewModel.textCursorPos,\n                onTextChanged = { viewModel.setText(it) },\n                onCwChanged = { viewModel.setCw(it) },\n                onFocusChanged = { focusedField = it },\n                onUrlPasted = { text, start, beforeText, count ->\n                    viewModel.onPastePostUrl(text, start, beforeText, count)\n                },\n                onTextCursorPositionChanged = onTextCursorPositionChanged,\n                onCwCursorPositionChanged = onCwCursorPositionChanged,\n            )\n\n            // 投票エディタ\n            val pollState = uiState.poll\n            if (pollState != null) {\n                PollEditorLayout(\n                    modifier = Modifier.padding(8.dp),\n                    uiState = pollState,\n                    onInput = { id, value -> viewModel.changePollChoice(id, value) },\n                    onAddAnswerButtonClicked = { viewModel.addPollChoice() },\n                    onRemove = { viewModel.removePollChoice(it) },\n                    onExpireAtTypeChanged = { type ->\n                        when (type) {\n                            ExpireAtType.IndefinitePeriod ->\n                                viewModel.setPollExpiresAt(PollExpiresAt.Infinity)\n                            ExpireAtType.SpecificDateAndTime ->\n                                viewModel.setPollExpiresAt(\n                                    PollExpiresAt.DateAndTime(Clock.System.now().plus(1.days))\n                                )\n                        }\n                    },\n                    onExpireAtChangeDateButtonClicked = viewModel::onExpireAtChangeDateButtonClicked,\n                    onExpireAtChangeTimeButtonClicked = viewModel::onExpireAtChangeTimeButtonClicked,\n                    onMultipleAnswerTypeChanged = { viewModel.togglePollMultiple() },\n                )\n            }\n\n            Spacer(modifier = Modifier.height(16.dp))\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorTextInputSection.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.text.InputType\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.flow.SharedFlow\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorFocusEditTextType\nimport net.pantasystem.milktea.note.editor.viewmodel.TextWithCursorPos\n\n/**\n * テキスト入力エリア（CW フィールド + 本文フィールド + 文字数カウント）\n *\n * 内部で EmojiAutoCompleteTextField（AndroidView ラッパー）を使用する。\n *\n * @param onFocusChanged どちらのフィールドがフォーカスされたかを通知するコールバック。\n *   NoteEditorScreen で focusedField 状態の更新に使う。\n * @param textCursorPosFlow ViewModel から流れるカーソル位置更新イベント。本文フィールドのみに渡す。\n * @param onUrlPasted 本文フィールドへの URL 貼り付けを検出したときのコールバック。\n */\n@Composable\nfun NoteEditorTextInputSection(\n    text: String,\n    cw: String?,\n    hasCw: Boolean,\n    account: Account?,\n    customEmojiRepository: CustomEmojiRepository,\n    textCursorPosFlow: SharedFlow<TextWithCursorPos>,\n    onTextChanged: (String) -> Unit,\n    onCwChanged: (String) -> Unit,\n    onFocusChanged: (NoteEditorFocusEditTextType) -> Unit,\n    onUrlPasted: (text: String, start: Int, beforeText: String, count: Int) -> Unit,\n    onTextCursorPositionChanged: (Int) -> Unit = {},\n    onCwCursorPositionChanged: (Int) -> Unit = {},\n    modifier: Modifier = Modifier,\n) {\n    Column(modifier = modifier) {\n        if (hasCw) {\n            EmojiAutoCompleteTextField(\n                value = cw ?: \"\",\n                onValueChange = onCwChanged,\n                onFocused = { onFocusChanged(NoteEditorFocusEditTextType.Cw) },\n                account = account,\n                customEmojiRepository = customEmojiRepository,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(horizontal = 8.dp, vertical = 4.dp),\n                hint = stringResource(id = R.string.cw_hint),\n                inputType = InputType.TYPE_CLASS_TEXT,\n                minLines = 1,\n                onCursorPositionChanged = onCwCursorPositionChanged,\n            )\n            HorizontalDivider(modifier = Modifier.padding(horizontal = 8.dp))\n        }\n\n        EmojiAutoCompleteTextField(\n            value = text,\n            onValueChange = onTextChanged,\n            onFocused = { onFocusChanged(NoteEditorFocusEditTextType.Text) },\n            account = account,\n            customEmojiRepository = customEmojiRepository,\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(horizontal = 8.dp, vertical = 4.dp),\n            hint = stringResource(id = R.string.please_speak),\n            inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE,\n            minLines = 1,\n            textCursorPosFlow = textCursorPosFlow,\n            onUrlPasted = onUrlPasted,\n            onCursorPositionChanged = onTextCursorPositionChanged,\n        )\n    }\n}\n\n@Preview\n@Composable\nprivate fun Preview_NoteEditorTextInputSection() {\n    MaterialTheme {\n        Surface {\n            Text(\n                text = \"EmojiAutoCompleteTextField preview requires Android context\",\n                modifier = Modifier.padding(16.dp),\n                style = MaterialTheme.typography.bodySmall,\n                color = MaterialTheme.colorScheme.onSurfaceVariant,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorToolbar.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.model.note.CanLocalOnly\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.editor.visibility.painterVisibilityIconResource\nimport net.pantasystem.milktea.note.editor.visibility.stringVisibilityText\n\n@Composable\nfun NoteEditorToolbar(\n    currentUser: User?,\n    visibility: Visibility,\n    textCount: Int = 0,\n    validInputs: Boolean = false,\n    onNavigateUpButtonClicked: () -> Unit,\n    onAvatarIconClicked: () -> Unit,\n    onVisibilityButtonClicked: () -> Unit,\n    onScheduleButtonClicked: () -> Unit,\n    onPostButtonClicked: () -> Unit,\n) {\n    val title = stringVisibilityText(visibility = visibility)\n\n    val iconDrawable = painterVisibilityIconResource(visibility = visibility)\n    val color = getColor(color = R.attr.normalIconTint)\n\n    Row(\n        Modifier\n            .padding(4.dp)\n            .fillMaxWidth(),\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.SpaceBetween,\n    ) {\n        Row(\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            IconButton(onClick = onNavigateUpButtonClicked) {\n                Icon(\n                    Icons.Default.ArrowBack,\n                    contentDescription = null,\n                    Modifier.size(24.dp),\n                    tint = color,\n                )\n            }\n\n            AvatarIcon(\n                url = currentUser?.avatarUrl,\n                onAvatarClick = onAvatarIconClicked,\n                borderStrokeWidth = 1.dp,\n                borderStrokeColor = Color.Gray,\n                size = 30.dp\n            )\n        }\n\n        Row(\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            if (visibility is CanLocalOnly && visibility.isLocalOnly) {\n                Text(stringResource(id = R.string.local))\n            }\n\n            IconButton(\n                onClick = onVisibilityButtonClicked,\n            ) {\n                Icon(\n                    iconDrawable,\n                    contentDescription = title,\n                    Modifier.size(24.dp),\n                    tint = color,\n                )\n            }\n\n            Spacer(modifier = Modifier.width(4.dp))\n\n            IconButton(\n                onClick = onScheduleButtonClicked,\n            ) {\n                // schedule icon\n                Icon(\n                    painterResource(id = R.drawable.ic_baseline_edit_calendar_24),\n                    contentDescription = null,\n                    Modifier.size(24.dp),\n                    tint = color,\n                )\n            }\n            Spacer(modifier = Modifier.width(4.dp))\n            Text(\"$textCount\")\n            Spacer(modifier = Modifier.width(4.dp))\n            Button(onClick = onPostButtonClicked, enabled = validInputs) {\n                Text(stringResource(id = R.string.post))\n            }\n        }\n\n    }\n}\n\n@Preview\n@Composable\nfun Preview_NoteEditorToolbar() {\n    MaterialTheme {\n        Surface {\n            NoteEditorToolbar(\n                currentUser = null,\n                Visibility.Public(true),\n                onAvatarIconClicked = {},\n                onNavigateUpButtonClicked = {},\n                onVisibilityButtonClicked = {},\n                onScheduleButtonClicked = {},\n                onPostButtonClicked = {},\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorToolbarBinding.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.os.Build\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_compose.haptic.rememberHapticFeedback\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\n\n@Composable\nfun NoteEditorToolbarBinding(\n    noteEditorViewModel: NoteEditorViewModel,\n    accountViewModel: AccountViewModel,\n    onShowAlarmPermissionDescriptionDialogIfPermissionDenied: () -> Boolean,\n    onFinishOrConfirmSaveAsDraftOrDelete: () -> Unit,\n    onShowVisibilitySelectionDialog: () -> Unit,\n) {\n    val currentUser by noteEditorViewModel.user.collectAsState()\n    val uiState by noteEditorViewModel.uiState.collectAsState()\n    val isPostAvailable by noteEditorViewModel.isPostAvailable.collectAsState()\n    val feedback = rememberHapticFeedback()\n    NoteEditorToolbar(\n        currentUser = currentUser,\n        visibility = uiState.sendToState.visibility,\n        validInputs = isPostAvailable,\n        textCount = uiState.formState.text?.let {\n            it.codePointCount(0, it.length)\n        } ?: 0,\n        onNavigateUpButtonClicked = {\n            feedback.performClickHapticFeedback()\n            onFinishOrConfirmSaveAsDraftOrDelete()\n        },\n        onAvatarIconClicked = {\n            feedback.performClickHapticFeedback()\n            accountViewModel.showSwitchDialog()\n        },\n        onVisibilityButtonClicked = {\n            feedback.performClickHapticFeedback()\n            onShowVisibilitySelectionDialog()\n        },\n        onScheduleButtonClicked = {\n            feedback.performClickHapticFeedback()\n            if (uiState.sendToState.schedulePostAt == null) {\n                // check alarm permission\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n                    if (onShowAlarmPermissionDescriptionDialogIfPermissionDenied()) {\n                        return@NoteEditorToolbar\n                    }\n                }\n            }\n            noteEditorViewModel.toggleReservationAt()\n        },\n        onPostButtonClicked = {\n            feedback.performClickHapticFeedback()\n            noteEditorViewModel.post()\n        },\n    )\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteEditorUserActionMenuLayout.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.content.Context\nimport android.util.TypedValue\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.*\nimport androidx.compose.material.icons.outlined.EditNote\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.res.colorResource\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.note.R\n\n@Composable\nfun NoteEditorUserActionMenuLayout(\n    modifier: Modifier = Modifier,\n    isEnableDrive: Boolean,\n    iconColor: Color,\n    isCw: Boolean,\n    isPoll: Boolean,\n    onPickFileFromDriveButtonClicked: () -> Unit,\n    onPickFileFromLocalButtonCLicked: () -> Unit,\n    onPickImageFromLocalButtonClicked: () -> Unit,\n    onTogglePollButtonClicked: () -> Unit,\n    onSelectMentionUsersButtonClicked: () -> Unit,\n    onSelectEmojiButtonClicked: () -> Unit,\n    onToggleCwButtonClicked: () -> Unit,\n    onSelectDraftNoteButtonClicked: () -> Unit,\n) {\n    var isShowFilePickerDropDownMenu: Boolean by remember {\n        mutableStateOf(false)\n    }\n\n    Row(\n        verticalAlignment = Alignment.CenterVertically,\n        horizontalArrangement = Arrangement.SpaceBetween,\n        modifier = modifier\n            .fillMaxWidth()\n            .padding(horizontal = 16.dp, vertical = 4.dp)\n    ) {\n        MenuItemLayout {\n            DropdownMenu(\n                expanded = isShowFilePickerDropDownMenu,\n                onDismissRequest = { isShowFilePickerDropDownMenu = false }\n            ) {\n                DropdownMenuItem(\n                    text = { Text(stringResource(id = R.string.pick_image)) },\n                    leadingIcon = { Icon(Icons.Default.Image, contentDescription = null) },\n                    onClick = {\n                        isShowFilePickerDropDownMenu = false\n                        onPickImageFromLocalButtonClicked()\n                    }\n                )\n                DropdownMenuItem(\n                    text = { Text(stringResource(id = R.string.pick_file_from_device)) },\n                    leadingIcon = { Icon(Icons.Default.UploadFile, contentDescription = null) },\n                    onClick = {\n                        isShowFilePickerDropDownMenu = false\n                        onPickFileFromLocalButtonCLicked()\n                    }\n                )\n                if (isEnableDrive) {\n                    DropdownMenuItem(\n                        text = { Text(stringResource(id = R.string.pick_image_from_drive)) },\n                        leadingIcon = { Icon(Icons.Default.Cloud, contentDescription = null) },\n                        onClick = {\n                            isShowFilePickerDropDownMenu = false\n                            onPickFileFromDriveButtonClicked()\n                        }\n                    )\n                }\n            }\n            IconButton(\n                onClick = {\n                    isShowFilePickerDropDownMenu = true\n                }\n            ) {\n                Icon(\n                    Icons.Default.AttachFile,\n                    contentDescription = null,\n                    tint = iconColor\n                )\n            }\n        }\n        MenuItemLayout {\n            IconButton(onClick = onTogglePollButtonClicked) {\n                Icon(\n                    Icons.Default.Poll,\n                    contentDescription = null,\n                    tint = if (isPoll) {\n                        MaterialTheme.colorScheme.primary\n                    } else {\n                        iconColor\n                    }\n                )\n            }\n        }\n        MenuItemLayout {\n            IconButton(onClick = onToggleCwButtonClicked) {\n                Icon(\n                    Icons.Default.VisibilityOff,\n                    contentDescription = null,\n                    tint = if (isCw) {\n                        MaterialTheme.colorScheme.primary\n                    } else {\n                        iconColor\n                    }\n                )\n            }\n        }\n        MenuItemLayout {\n            IconButton(onClick = onSelectMentionUsersButtonClicked) {\n                Icon(\n                    painterResource(id = R.drawable.ic_mention),\n                    contentDescription = null,\n                    modifier = Modifier.size(20.dp),\n                    tint = iconColor\n                )\n            }\n        }\n\n        MenuItemLayout {\n            IconButton(onClick = onSelectDraftNoteButtonClicked) {\n                Icon(\n                    Icons.Outlined.EditNote,\n                    contentDescription = null,\n                    tint = iconColor\n                )\n            }\n        }\n\n        MenuItemLayout {\n            IconButton(onClick = onSelectEmojiButtonClicked) {\n                Icon(\n                    Icons.Default.EmojiEmotions,\n                    contentDescription = null,\n                    tint = iconColor\n                )\n            }\n        }\n\n    }\n}\n\n@Composable\nfun MenuItemLayout(\n    modifier: Modifier = Modifier,\n    children: @Composable BoxScope.() -> Unit,\n) {\n    Box(\n        modifier,\n        contentAlignment = Alignment.Center\n    ) {\n        children()\n    }\n}\n\n@Preview\n@Composable\nfun Preview_NoteEditorUserActionMenuLayout() {\n    MaterialTheme {\n        NoteEditorUserActionMenuLayout(\n            modifier = Modifier.height(56.dp),\n            isEnableDrive = true,\n            iconColor = Color.Gray,\n            isCw = true,\n            isPoll = true,\n            onPickFileFromDriveButtonClicked = {},\n            onPickFileFromLocalButtonCLicked = {},\n            onPickImageFromLocalButtonClicked = {},\n            onTogglePollButtonClicked = {},\n            onSelectMentionUsersButtonClicked = {},\n            onSelectEmojiButtonClicked = {},\n            onToggleCwButtonClicked = {},\n            onSelectDraftNoteButtonClicked = {}\n        )\n    }\n}\n\n@Composable\nfun getColor(color: Int): Color {\n    return colorResource(LocalContext.current.getColorFromAttrs(color).resourceId)\n}\n\nfun Context.getColorFromAttrs(attr: Int): TypedValue {\n    return TypedValue().apply {\n        theme.resolveAttribute(attr, this, true)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/NoteVisibilityIconHelper.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.widget.ImageView\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.note.R\n\nobject NoteVisibilityIconHelper {\n\n    @BindingAdapter(\"noteVisibility\")\n    @JvmStatic\n    fun ImageView.setVisibilityIcon(noteVisibility: Visibility?){\n        when(noteVisibility){\n            is Visibility.Public -> this.setImageResource(R.drawable.ic_language_black_24dp)\n            is Visibility.Home -> this.setImageResource(R.drawable.ic_home_black_24dp)\n            is Visibility.Followers -> this.setImageResource(R.drawable.ic_lock_black_24dp)\n            is Visibility.Specified -> this.setImageResource(R.drawable.ic_email_black_24dp)\n            else -> return\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/ReservationPostDatePickerDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.app.DatePickerDialog\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.widget.DatePicker\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.lifecycle.ViewModelProvider\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport java.util.Calendar\nimport java.util.Date\n\nclass ReservationPostDatePickerDialog : AppCompatDialogFragment(), DatePickerDialog.OnDateSetListener {\n    companion object {\n        const val FRAGMENT_TAG = \"ReservationPostDatePickerDialog\"\n    }\n\n    private var mViewModel: NoteEditorViewModel? = null\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n\n        val viewModel  = ViewModelProvider(requireActivity())[NoteEditorViewModel::class.java]\n        mViewModel = viewModel\n        val date = viewModel.uiState.value.sendToState.schedulePostAt ?: Clock.System.now()\n        val local = date.toLocalDateTime(TimeZone.currentSystemDefault())\n\n        return DatePickerDialog(requireActivity(), this, local.year, local.monthNumber - 1, local.dayOfMonth)\n\n    }\n\n    override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int) {\n        val date = mViewModel?.uiState?.value?.sendToState?.schedulePostAtAsDate ?: Date()\n\n        val c = Calendar.getInstance()\n        c.time = date\n\n        c.set(Calendar.YEAR, p1)\n        c.set(Calendar.MONTH, p2)\n        c.set(Calendar.DAY_OF_MONTH, p3)\n\n        mViewModel?.setSchedulePostAt(Instant.fromEpochMilliseconds(c.time.time))\n    }\n\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/ReservationPostTimePickerDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.app.Dialog\nimport android.app.TimePickerDialog\nimport android.os.Bundle\nimport android.widget.TimePicker\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport java.util.Calendar\nimport java.util.Date\n\n\n@AndroidEntryPoint\nclass ReservationPostTimePickerDialog : AppCompatDialogFragment(),\n    TimePickerDialog.OnTimeSetListener {\n\n    companion object {\n        const val FRAGMENT_TAG = \"ReservationPostTimePickerDialog\"\n    }\n\n    private val mViewModel: NoteEditorViewModel by activityViewModels()\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val viewModel = mViewModel\n        val local = (viewModel.uiState.value.sendToState.schedulePostAt ?: Clock.System.now()).toLocalDateTime(TimeZone.currentSystemDefault())\n        return TimePickerDialog(requireActivity(), this, local.hour, local.minute, true)\n    }\n\n    override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {\n        val date = mViewModel.uiState.value.sendToState.schedulePostAtAsDate ?: Date()\n        val c = Calendar.getInstance()\n        c.time = date\n        c.set(Calendar.HOUR_OF_DAY, p1)\n        c.set(Calendar.MINUTE, p2)\n        mViewModel.setSchedulePostAt(Instant.fromEpochMilliseconds(c.time.time))\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/SimpleEditorFragment.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.Manifest\nimport android.app.Activity.RESULT_OK\nimport android.content.Intent\nimport android.content.pm.PackageManager\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.View\nimport android.widget.Toast\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.core.content.ContextCompat\nimport androidx.core.widget.addTextChangedListener\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.*\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common_android.ui.listview.applyFlexBoxLayout\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiTokenizer\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.*\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageType\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNoteService\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.FragmentSimpleEditorBinding\nimport net.pantasystem.milktea.note.editor.file.EditFileCaptionDialog\nimport net.pantasystem.milktea.note.editor.file.EditFileNameDialog\nimport net.pantasystem.milktea.note.editor.poll.PollDatePickerDialog\nimport net.pantasystem.milktea.note.editor.poll.PollEditorFragment\nimport net.pantasystem.milktea.note.editor.poll.PollTimePickerDialog\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport net.pantasystem.milktea.note.editor.viewmodel.toCreateNote\nimport net.pantasystem.milktea.note.editor.visibility.VisibilitySelectionDialogV2\nimport net.pantasystem.milktea.note.emojis.CustomEmojiPickerDialog\nimport javax.inject.Inject\n\n\ninterface SimpleEditor {\n\n    val isShowEditorMenu: MutableLiveData<Boolean>\n    fun goToNormalEditor()\n\n    fun closeMenu()\n    fun openMenu()\n}\n\n@AndroidEntryPoint\nclass SimpleEditorFragment : Fragment(R.layout.fragment_simple_editor), SimpleEditor {\n\n\n    val accountViewModel: AccountViewModel by activityViewModels()\n\n    val mViewModel: NoteEditorViewModel by activityViewModels()\n    private val currentPageableTimelineViewModel: CurrentPageableTimelineViewModel by activityViewModels()\n\n    private val mBinding: FragmentSimpleEditorBinding by dataBinding()\n\n    override val isShowEditorMenu: MutableLiveData<Boolean> = MutableLiveData(false)\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    internal lateinit var customEmojiRepository: CustomEmojiRepository\n\n\n    @Inject\n    internal lateinit var filePropertyDataSource: FilePropertyDataSource\n\n    @Inject\n    internal lateinit var fileRepository: DriveFileRepository\n\n    @Inject\n    internal lateinit var draftNoteService: DraftNoteService\n\n    @Inject\n    internal lateinit var driveNavigation: DriveNavigation\n\n    @Inject\n    internal lateinit var mediaNavigation: MediaNavigation\n\n    @Inject\n    internal lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var searchAndSelectUserNavigation: SearchAndSelectUserNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n\n        mBinding.simpleEditor = this\n\n        mBinding.lifecycleOwner = viewLifecycleOwner\n        mBinding.noteEditorViewModel = mViewModel\n\n        val userChipAdapter =\n            net.pantasystem.milktea.common_android_ui.user.UserChipListAdapter(viewLifecycleOwner)\n        mBinding.addressUsersView.adapter = userChipAdapter\n        mBinding.addressUsersView.applyFlexBoxLayout(requireContext())\n\n\n        mBinding.accountViewModel = accountViewModel\n\n        accountViewModel.showProfileEvent.onEach {\n            val intent = userDetailNavigation.newIntent(\n                UserDetailNavigationArgs.UserId(\n                    User.Id(it.accountId, it.remoteId)\n                )\n            )\n\n            startActivity(intent)\n        }.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED).launchIn(lifecycleScope)\n\n        mViewModel.currentAccount.filterNotNull().distinctUntilChanged().onEach { account ->\n            mBinding.inputMainText.setAdapter(\n                CustomEmojiCompleteAdapter(\n                    account,\n                    requireContext(),\n                    customEmojiRepository,\n                )\n            )\n            mBinding.inputMainText.setTokenizer(CustomEmojiTokenizer())\n\n            mBinding.inputCw.setAdapter(\n                CustomEmojiCompleteAdapter(\n                    account,\n                    requireContext(),\n                    customEmojiRepository,\n                )\n            )\n            mBinding.inputCw.setTokenizer(CustomEmojiTokenizer())\n        }.launchIn(lifecycleScope)\n\n\n        val viewModel = mViewModel\n        mBinding.noteEditorViewModel = viewModel\n        mBinding.filePreview.apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    NoteFilePreview(\n                        noteEditorViewModel = viewModel,\n                        onShow = {\n                            val intent = mediaNavigation.newIntent(MediaNavigationArgs.Files(\n                                listOf(it),\n                                0\n                            ))\n                            requireActivity().startActivity(intent)\n                        },\n                        onEditFileCaptionSelectionClicked = {\n                            EditFileCaptionDialog.newInstance(it.file, it.comment).show(childFragmentManager, EditFileCaptionDialog.FRAGMENT_TAG)\n                        },\n                        onEditFileNameSelectionClicked = {\n                            EditFileNameDialog.newInstance(it.file, it.name).show(childFragmentManager, EditFileNameDialog.FRAGMENT_TAG)\n                        }\n                    )\n                }\n            }\n        }\n\n\n\n        lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                viewModel.uiState.collect { uiState ->\n                    val poll = uiState.poll\n                    if (poll == null) {\n                        removePollFragment()\n                    } else {\n                        setPollFragment()\n                    }\n                }\n            }\n        }\n\n        viewModel.isPost.onEach {\n            viewModel.clear()\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(viewLifecycleOwner.lifecycleScope)\n\n        mBinding.noteVisibility.setOnClickListener {\n            val dialog = VisibilitySelectionDialogV2()\n            dialog.show(childFragmentManager, VisibilitySelectionDialogV2.FRAGMENT_TAG)\n        }\n\n        lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                viewModel.address.collect {\n                    userChipAdapter.submitList(it)\n                }\n            }\n        }\n\n        viewModel.showPollDatePicker.onEach {\n            PollTimePickerDialog().show(childFragmentManager, PollTimePickerDialog.FRAGMENT_TAG)\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(viewLifecycleOwner.lifecycleScope)\n\n        viewModel.showPollDatePicker.onEach {\n            PollDatePickerDialog().show(childFragmentManager, PollDatePickerDialog.FRAGMENT_TAG)\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n        mBinding.inputCw.addTextChangedListener { e ->\n            viewModel.setCw((e?.toString() ?: \"\"))\n        }\n\n        mBinding.inputMainText.addTextChangedListener { e ->\n            viewModel.setText((e?.toString() ?: \"\"))\n        }\n\n\n\n\n        mBinding.selectFileFromDrive.setOnClickListener {\n            showDriveFileSelector()\n        }\n\n        mBinding.selectFileFromLocal.setOnClickListener {\n            showFileManager()\n        }\n\n        mBinding.addAddress.setOnClickListener {\n            startSearchAndSelectUser()\n        }\n\n        mBinding.mentionButton.setOnClickListener {\n            startMentionToSearchAndSelectUser()\n        }\n\n        mBinding.showEmojisButton.setOnClickListener {\n            CustomEmojiPickerDialog.newInstance(null).show(childFragmentManager, CustomEmojiPickerDialog.FRAGMENT_TAG)\n        }\n\n\n        mBinding.postButton.setOnClickListener {\n            viewModel.post()\n        }\n\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            accountViewModel.currentAccount.collect {\n                viewModel.setAccountId(it?.accountId)\n            }\n        }\n        viewLifecycleOwner.lifecycleScope.launch {\n            currentPageableTimelineViewModel.currentType.collect {\n                when(it) {\n                    CurrentPageType.Account -> Unit\n                    is CurrentPageType.Page -> {\n                        viewModel.setAccountId(it.accountId)\n                    }\n                }\n            }\n        }\n    }\n\n\n    private fun setPollFragment() {\n        val ft = childFragmentManager.beginTransaction()\n        ft.replace(R.id.edit_poll, PollEditorFragment(), \"pollFragment\")\n        ft.commit()\n    }\n\n    private fun removePollFragment() {\n        val fragment = childFragmentManager.findFragmentByTag(\"pollFragment\")\n        if (fragment != null) {\n            val ft = childFragmentManager.beginTransaction()\n            ft.remove(fragment)\n            ft.commit()\n        }\n    }\n\n    private fun showFileManager() {\n        if (checkPermission()) {\n            val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)\n            intent.type = \"*/*\"\n            intent.addCategory(Intent.CATEGORY_OPENABLE)\n            openLocalStorageResult.launch(intent)\n        } else {\n            requestPermission()\n        }\n\n    }\n\n    private fun showDriveFileSelector() {\n        val selectedSize = mViewModel.uiState.value.totalFilesCount\n\n        //Directoryは既に選択済みのファイルの数も含めてしまうので選択済みの数も合わせる\n        val selectableMaxSize = 4 - selectedSize\n        Log.d(\"\", \"選択済みのサイズ:$selectedSize\")\n        val intent = driveNavigation.newIntent(DriveNavigationArgs(\n            selectableFileMaxSize = selectableMaxSize\n        ))\n        intent.action = Intent.ACTION_OPEN_DOCUMENT\n        registerForOpenDriveActivityResult.launch(intent)\n    }\n\n    private fun checkPermission(): Boolean {\n        val permissionCheck = ContextCompat.checkSelfPermission(\n            requireContext(),\n            Manifest.permission.READ_EXTERNAL_STORAGE\n        )\n        return permissionCheck == PackageManager.PERMISSION_GRANTED\n    }\n\n    private fun requestPermission() {\n        //val permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)\n        if (!checkPermission()) {\n            requestReadStoragePermissionResult.launch(Manifest.permission.READ_EXTERNAL_STORAGE)\n        }\n    }\n\n    private fun startSearchAndSelectUser() {\n        val selectedUserIds = mViewModel.address.value.mapNotNull {\n            it.userId ?: it.user.value?.id\n        }\n\n        val intent = searchAndSelectUserNavigation.newIntent(\n            SearchAndSelectUserNavigationArgs(selectedUserIds = selectedUserIds)\n        )\n        selectUserResult.launch(intent)\n    }\n\n    private fun startMentionToSearchAndSelectUser() {\n        val intent = searchAndSelectUserNavigation.newIntent(SearchAndSelectUserNavigationArgs())\n        selectMentionToUserResult.launch(intent)\n    }\n\n    override fun closeMenu() {\n        isShowEditorMenu.value = false\n    }\n\n    override fun openMenu() {\n        isShowEditorMenu.value = true\n    }\n\n\n    override fun goToNormalEditor() {\n\n        viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) {\n\n            accountStore.currentAccount?.let {\n                draftNoteService.save(mViewModel.uiState.value.toCreateNote(it)).onSuccess {\n                    withContext(Dispatchers.Main) {\n                        val intent = NoteEditorActivity.newBundle(requireContext(), draftNoteId = it.draftNoteId)\n                        startActivity(intent)\n                        mViewModel.clear()\n                    }\n                }\n            }\n        }\n\n    }\n\n    @Suppress(\"DEPRECATION\")\n    private val registerForOpenDriveActivityResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n            if (result.resultCode == RESULT_OK) {\n                val selectedFilePropertyIds =\n                    (result.data?.getSerializableExtra(EXTRA_SELECTED_FILE_PROPERTY_IDS) as List<*>).map {\n                        it as FileProperty.Id\n                    }\n                mViewModel.addFilePropertyFromIds(selectedFilePropertyIds)\n            }\n\n        }\n\n    private val openLocalStorageResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n\n            val uri = result?.data?.data\n            if (uri != null) {\n                mViewModel.addFile(uri)\n                Log.d(\"NoteEditorActivity\", \"成功しました\")\n\n            }\n        }\n\n    private val requestReadStoragePermissionResult =\n        registerForActivityResult(ActivityResultContracts.RequestPermission()) {\n            if (it) {\n                showFileManager()\n            } else {\n                Toast.makeText(\n                    requireContext(),\n                    \"ストレージへのアクセスを許可しないとファイルを読み込めないぽよ\",\n                    Toast.LENGTH_LONG\n                ).show()\n            }\n        }\n\n    @Suppress(\"DEPRECATION\")\n    private val selectUserResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n            if (result.resultCode == RESULT_OK && result.data != null) {\n                val changed =\n                    result.data?.getSerializableExtra(SearchAndSelectUserNavigation.EXTRA_SELECTED_USER_CHANGED_DIFF) as? ChangedDiffResult\n                if (changed != null) {\n                    mViewModel.setAddress(changed.added, changed.removed)\n                }\n            }\n        }\n\n    @Suppress(\"DEPRECATION\")\n    private val selectMentionToUserResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n            if (result.resultCode == RESULT_OK && result.data != null) {\n                val changed =\n                    result.data?.getSerializableExtra(SearchAndSelectUserNavigation.EXTRA_SELECTED_USER_CHANGED_DIFF) as? ChangedDiffResult\n\n                if (changed != null) {\n                    val pos = mBinding.inputMainText.selectionEnd\n                    mViewModel.addMentionUserNames(changed.selectedUserNames, pos).let { newPos ->\n                        mBinding.inputMainText.setText(mViewModel.text.value ?: \"\")\n                        mBinding.inputMainText.setSelection(newPos)\n                    }\n                }\n\n            }\n        }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/UriImageHelper.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport android.widget.ImageView\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\n\nobject UriImageHelper {\n    @JvmStatic\n    @BindingAdapter(\"setSimpleImageUri\")\n    fun ImageView.setSimpleImageUri(uri: String?){\n        Glide.with(this)\n            .load(uri)\n            .centerCrop()\n            .into(this)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/account/NoteEditorSwitchAccountDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor.account\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_android_ui.account.AccountSwitchingDialogLayout\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.AccountSettingNavigation\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass NoteEditorSwitchAccountDialog : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"NoteEditorSwitchAccountDialog\"\n    }\n\n    @Inject\n    lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    lateinit var accountSettingNavigation: AccountSettingNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel: NoteEditorViewModel by activityViewModels()\n\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return super.onCreateDialog(savedInstanceState).apply {\n            val view = ComposeView(requireContext()).apply {\n                setContent {\n                    MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                        val uiState by viewModel.accountUiState.collectAsState()\n                        AccountSwitchingDialogLayout(\n                            uiState = uiState,\n                            onSettingButtonClicked = {\n                                startActivity(accountSettingNavigation.newIntent(Unit))\n                                dismiss()\n                            },\n                            onAvatarIconClicked = { accountInfo ->\n                                startActivity(\n                                    userDetailNavigation.newIntent(UserDetailNavigationArgs.UserName(accountInfo.user?.let {\n                                        \"@${it.userName}@${it.host}\"\n                                    } ?: \"@${accountInfo.account.userName}@${accountInfo.account.getHost()}\"))\n                                )\n                                dismiss()\n                            },\n                            onAccountClicked = {\n                                viewModel.setAccountIdAndSwitchCurrentAccount(it.account.accountId)\n                                dismiss()\n                            },\n                            onAddAccountButtonClicked = {\n                                requireActivity().startActivity(authorizationNavigation.newIntent(\n                                    AuthorizationArgs.New))\n                                dismiss()\n                            }\n                        )\n                    }\n                }\n            }\n            setContentView(view)\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/file/EditFileCaptionDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor.file\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_compose.drive.EditCaptionDialogLayout\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport javax.inject.Inject\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass EditFileCaptionDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"EditFileCaptionDialog\"\n        fun newInstance(appFile: AppFile, comment: String?): EditFileCaptionDialog {\n            return EditFileCaptionDialog().apply {\n                arguments = Bundle().apply {\n                    putSerializable(\"EXTRA_APP_FILE\", appFile)\n                    putString(\"EXTRA_COMMENT\", comment)\n                }\n            }\n        }\n    }\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val noteEditorViewModel by activityViewModels<NoteEditorViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n\n        val appFile = requireArguments().getSerializable(\"EXTRA_APP_FILE\") as AppFile\n\n        val comment = requireArguments().getString(\"EXTRA_COMMENT\") ?: \"\"\n        val view = ComposeView(requireContext()).apply {\n            setContent {\n                var text: String by remember(comment) {\n                    mutableStateOf(comment)\n                }\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    EditCaptionDialogLayout(\n                        value = text,\n                        onCancelButtonClicked = {\n                            dismiss()\n                        },\n                        onTextChanged = {\n                            text = it\n                        },\n                        onSaveButtonClicked = {\n                            noteEditorViewModel.updateFileComment(appFile, text)\n                            dismiss()\n                        }\n                    )\n                }\n            }\n        }\n        dialog.setContentView(view)\n        return dialog\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/file/EditFileNameDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor.file\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_compose.drive.EditFileNameDialogLayout\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport javax.inject.Inject\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass EditFileNameDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"EditFileNameDialog\"\n        fun newInstance(appFile: AppFile, name: String?): EditFileNameDialog {\n            return EditFileNameDialog().apply {\n                arguments = Bundle().apply {\n                    putSerializable(\"EXTRA_APP_FILE\", appFile)\n                    putString(\"EXTRA_NAME\", name)\n                }\n            }\n        }\n    }\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val noteEditorViewModel by activityViewModels<NoteEditorViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n\n        val appFile = requireArguments().getSerializable(\"EXTRA_APP_FILE\") as AppFile\n\n        val view = ComposeView(requireContext()).apply {\n            setContent {\n                var text: String by remember {\n                    mutableStateOf(requireArguments().getString(\"EXTRA_NAME\") ?: \"\")\n                }\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n\n                    EditFileNameDialogLayout(\n                        value = text,\n                        onTextChanged = {\n                            text = it\n                        },\n                        onSaveButtonClicked = {\n                            noteEditorViewModel.updateFileName(appFile, text)\n                            dismiss()\n                        },\n                        onCancelButtonClicked = {\n                            dismiss()\n                        }\n                    )\n                }\n            }\n        }\n        dialog.setContentView(view)\n        return dialog\n    }\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/note_file_preview.kt",
    "content": "package net.pantasystem.milktea.note.editor\n\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport net.pantasystem.milktea.common_compose.HorizontalFilePreviewList\nimport net.pantasystem.milktea.common_compose.SwitchTile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\n\n@ExperimentalCoroutinesApi\n@Composable\nfun NoteFilePreview(\n    noteEditorViewModel: NoteEditorViewModel,\n    onShow: (FilePreviewSource) -> Unit,\n    onEditFileNameSelectionClicked: (FilePreviewSource) -> Unit,\n    onEditFileCaptionSelectionClicked: (FilePreviewSource) -> Unit,\n) {\n    val uiState by noteEditorViewModel.uiState.collectAsState()\n    val maxFileCount by noteEditorViewModel.maxFileCount.collectAsState()\n//    val instanceInfo by noteEditorViewModel.instanceInfo.collectAsState()\n    val instanceInfoType by noteEditorViewModel.instanceInfoType.collectAsState()\n\n    Column {\n        if (uiState.files.size > maxFileCount) {\n            Text(\n                stringResource(\n                    id = R.string.note_editor_file_max_size_validation_error_message,\n                    maxFileCount\n                ),\n                color = MaterialTheme.colorScheme.error,\n                modifier = Modifier.padding(horizontal = 4.dp),\n                fontSize = 18.sp\n            )\n        }\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n        ) {\n            HorizontalFilePreviewList(\n                files = uiState.files,\n                modifier = Modifier.weight(1f),\n                isMisskey = instanceInfoType is InstanceInfoType.Misskey,\n                allowMaxFileSize = null/* instanceInfo?.clientMaxBodyByteSize */,\n                onToggleSensitive = {\n                    noteEditorViewModel.toggleNsfw(it.file)\n                },\n                onDetach = {\n                    noteEditorViewModel.removeFileNoteEditorData(it.file)\n                },\n                onShow = onShow,\n                onEditFileName = onEditFileNameSelectionClicked,\n                onEditFileCaption = onEditFileCaptionSelectionClicked\n            )\n            if (uiState.files.isNotEmpty())\n                Text(\n                    \"${uiState.files.size}/${maxFileCount}\",\n                    color = if (uiState.files.size > maxFileCount) {\n                        MaterialTheme.colorScheme.error\n                    } else {\n                        Color.Unspecified\n                    }\n                )\n        }\n        if (instanceInfoType is InstanceInfoType.Mastodon && uiState.files.isNotEmpty()) {\n            SwitchTile(\n                modifier = Modifier.padding(horizontal = 16.dp),\n                checked = uiState.formState.isSensitive,\n                onChanged = {\n                    noteEditorViewModel.toggleSensitive()\n                }\n            ) {\n                Text(stringResource(id = R.string.mark_media_as_sensitive))\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/poll/PollDatePickerDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor.poll\n\nimport android.app.DatePickerDialog\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.widget.DatePicker\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport net.pantasystem.milktea.model.note.PollExpiresAt\nimport net.pantasystem.milktea.model.note.expiresAt\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport java.util.Calendar\nimport java.util.Date\n\n@AndroidEntryPoint\nclass PollDatePickerDialog : AppCompatDialogFragment(), DatePickerDialog.OnDateSetListener{\n\n    companion object {\n        const val FRAGMENT_TAG = \"PollDatePickerDialog\"\n    }\n\n    private val mViewModel: NoteEditorViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n\n        val viewModel = mViewModel\n        val date = viewModel.poll.value?.expiresAt?.expiresAt()?: Clock.System.now()\n        val local = date.toLocalDateTime(TimeZone.currentSystemDefault())\n\n        return DatePickerDialog(requireActivity(), this, local.year, local.monthNumber - 1, local.dayOfMonth)\n\n    }\n\n    override fun onDateSet(p0: DatePicker?, p1: Int, p2: Int, p3: Int) {\n        val date = mViewModel.poll.value?.expiresAt?.expiresAt()?: Clock.System.now()\n\n        val c = Calendar.getInstance()\n        c.time = Date(date.toEpochMilliseconds())\n\n        c.set(Calendar.YEAR, p1)\n        c.set(Calendar.MONTH, p2)\n        c.set(Calendar.DAY_OF_MONTH, p3)\n\n        mViewModel.setPollExpiresAt(\n            PollExpiresAt.DateAndTime(Instant.fromEpochMilliseconds(c.time.time))\n        )\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/poll/PollEditorFragment.kt",
    "content": "package net.pantasystem.milktea.note.editor.poll\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.note.PollExpiresAt\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport javax.inject.Inject\nimport kotlin.time.Duration.Companion.days\n\n@AndroidEntryPoint\nclass PollEditorFragment : Fragment() {\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel: NoteEditorViewModel by activityViewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val uiState by viewModel.uiState.collectAsState()\n                    when (val pollState = uiState.poll) {\n                        null -> {}\n                        else -> {\n                            PollEditorLayout(\n                                uiState = pollState,\n                                onInput = { id, value ->\n                                    viewModel.changePollChoice(id, value)\n                                },\n                                onAddAnswerButtonClicked = {\n                                    viewModel.addPollChoice()\n                                },\n                                onRemove = {\n                                    viewModel.removePollChoice(it)\n                                },\n                                onExpireAtTypeChanged = {\n                                    when(it) {\n                                        ExpireAtType.IndefinitePeriod -> {\n                                            viewModel.setPollExpiresAt(PollExpiresAt.Infinity)\n                                        }\n                                        ExpireAtType.SpecificDateAndTime -> {\n                                            viewModel.setPollExpiresAt(PollExpiresAt.DateAndTime(\n                                                Clock.System.now().plus(1.days)\n                                            ))\n                                        }\n                                    }\n                                },\n                                onExpireAtChangeDateButtonClicked = viewModel::onExpireAtChangeDateButtonClicked,\n                                onExpireAtChangeTimeButtonClicked = viewModel::onExpireAtChangeTimeButtonClicked,\n                                onMultipleAnswerTypeChanged = {\n                                    viewModel.togglePollMultiple()\n                                }\n                            )\n                        }\n                    }\n\n                }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/poll/PollEditorLayout.kt",
    "content": "package net.pantasystem.milktea.note.editor.poll\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowDropDown\nimport androidx.compose.material.icons.filled.Close\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common_compose.Spinner\nimport net.pantasystem.milktea.common_compose.SwitchTile\nimport net.pantasystem.milktea.common_resource.R\nimport net.pantasystem.milktea.model.note.PollChoiceState\nimport net.pantasystem.milktea.model.note.PollEditingState\nimport net.pantasystem.milktea.model.note.PollExpiresAt\nimport java.util.*\n\n@Composable\nfun PollEditorLayout(\n    modifier: Modifier = Modifier,\n    uiState: PollEditingState,\n    onInput: (id: UUID, value: String) -> Unit,\n    onAddAnswerButtonClicked: () -> Unit,\n    onRemove: (id: UUID) -> Unit,\n    onExpireAtTypeChanged: (type: ExpireAtType) -> Unit,\n    onExpireAtChangeDateButtonClicked: () -> Unit,\n    onExpireAtChangeTimeButtonClicked: () -> Unit,\n    onMultipleAnswerTypeChanged: (Boolean) -> Unit,\n) {\n    Column(modifier) {\n        Column(Modifier.fillMaxWidth()) {\n            for (i in 0 until uiState.choices.size) {\n                val element = uiState.choices[i]\n                OutlinedTextField(\n                    modifier = Modifier.fillMaxWidth(),\n                    value = element.text,\n                    onValueChange = {\n                        onInput(element.id, it)\n                    },\n                    trailingIcon = {\n                        IconButton(onClick = {\n                            onRemove(element.id)\n                        }) {\n                            Icon(Icons.Default.Close, contentDescription = null)\n                        }\n                    },\n                    label = {\n                        Text(text = stringResource(id = R.string.note_editor_poll_choice_n, i + 1))\n                    }\n                )\n                if (i < (uiState.choices.size - 1)) {\n                    Spacer(modifier = Modifier.height(8.dp))\n                }\n            }\n        }\n        TextButton(onClick = onAddAnswerButtonClicked) {\n            Text(stringResource(id = R.string.add_choice))\n        }\n        SwitchTile(checked = uiState.multiple, onChanged = onMultipleAnswerTypeChanged) {\n            Text(text = stringResource(id = R.string.multiple_answer))\n        }\n        Spinner(\n            items = listOf(ExpireAtType.IndefinitePeriod, ExpireAtType.SpecificDateAndTime),\n            selectedItem = when (uiState.expiresAt) {\n                is PollExpiresAt.DateAndTime -> ExpireAtType.SpecificDateAndTime\n                PollExpiresAt.Infinity -> ExpireAtType.IndefinitePeriod\n            },\n            onItemSelected = onExpireAtTypeChanged,\n            selectedItemFactory = { modifier, item ->\n                Row(\n                    modifier = modifier\n                        .fillMaxWidth()\n                        .padding(16.dp),\n                    horizontalArrangement = Arrangement.SpaceBetween\n                ) {\n                    Text(\n                        when (item) {\n                            ExpireAtType.IndefinitePeriod -> stringResource(id = R.string.indefinite_period)\n                            ExpireAtType.SpecificDateAndTime -> stringResource(id = R.string.date_and_time_specification)\n                        },\n                        fontSize = 16.sp\n                    )\n                    Icon(Icons.Default.ArrowDropDown, contentDescription = null)\n                }\n\n            },\n        ) { item, _ ->\n            when (item) {\n                ExpireAtType.IndefinitePeriod -> ExpireAtTypeLayout(\n                    Modifier.fillMaxWidth(),\n                    stringResource(id = R.string.indefinite_period)\n                )\n                ExpireAtType.SpecificDateAndTime -> ExpireAtTypeLayout(\n                    Modifier.fillMaxWidth(),\n                    stringResource(id = R.string.date_and_time_specification)\n                )\n            }\n        }\n        when (val expireAt = uiState.expiresAt) {\n            is PollExpiresAt.DateAndTime -> {\n                Row(Modifier.fillMaxWidth()) {\n                    Button(onClick = onExpireAtChangeDateButtonClicked) {\n                        Text(\"${expireAt.year}/${expireAt.month}/${expireAt.dayOfMonth}\")\n                    }\n                    Spacer(modifier = Modifier.width(2.dp))\n                    Button(onClick = onExpireAtChangeTimeButtonClicked) {\n                        Text(\"${expireAt.hour}:${expireAt.minutes}\")\n                    }\n                }\n            }\n            PollExpiresAt.Infinity -> Unit\n        }\n    }\n}\n\n@Composable\nfun ExpireAtTypeLayout(modifier: Modifier, text: String) {\n    Row(\n        modifier = modifier.padding(vertical = 8.dp, horizontal = 16.dp),\n        horizontalArrangement = Arrangement.SpaceBetween\n    ) {\n        Text(text = text, fontSize = 16.sp)\n    }\n}\n\n@Preview\n@Composable\nfun Preview_PollEditorLayout() {\n    Surface {\n        PollEditorLayout(\n            uiState = PollEditingState(\n                choices = listOf(\n                    PollChoiceState(\n                        \"test1\",\n                        UUID.randomUUID(),\n                    ),\n                    PollChoiceState(\n                        \"test2\",\n                        UUID.randomUUID(),\n                    ),\n                    PollChoiceState(\n                        \"test3\",\n                        UUID.randomUUID(),\n                    )\n                ),\n                multiple = false,\n                expiresAt = PollExpiresAt.DateAndTime(Clock.System.now())\n            ),\n            onInput = { _, _ -> },\n            onRemove = {},\n            onAddAnswerButtonClicked = {},\n            onExpireAtChangeDateButtonClicked = {},\n            onExpireAtChangeTimeButtonClicked = {},\n            onExpireAtTypeChanged = {},\n            onMultipleAnswerTypeChanged = {}\n        )\n    }\n}\n\n\nenum class ExpireAtType {\n    IndefinitePeriod, SpecificDateAndTime,\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/poll/PollTimePickerDialog.kt",
    "content": "package net.pantasystem.milktea.note.editor.poll\n\nimport android.app.Dialog\nimport android.app.TimePickerDialog\nimport android.os.Bundle\nimport android.widget.TimePicker\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport net.pantasystem.milktea.model.note.PollExpiresAt\nimport net.pantasystem.milktea.model.note.expiresAt\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport java.util.Calendar\nimport java.util.Date\n\nclass PollTimePickerDialog : AppCompatDialogFragment(), TimePickerDialog.OnTimeSetListener {\n\n    companion object {\n        const val FRAGMENT_TAG = \"PollTimePickerDialog\"\n    }\n\n    private val mViewModel: NoteEditorViewModel by activityViewModels()\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val viewModel = mViewModel\n        val date = viewModel.poll.value?.expiresAt?.expiresAt() ?: Clock.System.now()\n        val local = date.toLocalDateTime(TimeZone.currentSystemDefault())\n        return TimePickerDialog(requireActivity(), this, local.hour, local.minute, true)\n    }\n\n    override fun onTimeSet(p0: TimePicker?, p1: Int, p2: Int) {\n        val date = mViewModel.poll.value?.expiresAt?.asDate() ?: Date()\n        val c = Calendar.getInstance()\n        c.time = date\n        c.set(Calendar.HOUR_OF_DAY, p1)\n        c.set(Calendar.MINUTE, p2)\n        mViewModel.setPollExpiresAt(\n            PollExpiresAt.DateAndTime(\n                Instant.fromEpochMilliseconds(c.time.time)\n            )\n        )\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorFilePreviewSourcesMapper.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\n\nclass NoteEditorFilePreviewSourcesMapper(\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val driveFileRepository: DriveFileRepository,\n    private val logger: Logger,\n    private val viewModelScope: CoroutineScope,\n) {\n\n    fun create(filesFlow: StateFlow<List<AppFile>>): StateFlow<List<FilePreviewSource>> {\n        @OptIn(ExperimentalCoroutinesApi::class)\n        val driveFilesFlow = filesFlow.flatMapLatest { files ->\n            val fileIds = files.mapNotNull {\n                it as? AppFile.Remote\n            }.map {\n                it.id\n            }\n            filePropertyDataSource.observeIn(fileIds)\n        }.catch {\n            logger.error(\"drive fileの取得に失敗\", it)\n        }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n        return combine(filesFlow, driveFilesFlow) { files, driveFiles ->\n            files.mapNotNull { appFile ->\n                when (appFile) {\n                    is AppFile.Local -> {\n                        FilePreviewSource.Local(appFile)\n                    }\n\n                    is AppFile.Remote -> {\n                        runCancellableCatching {\n                            driveFiles.firstOrNull {\n                                it.id == appFile.id\n                            } ?: driveFileRepository.find(appFile.id)\n                        }.getOrNull()?.let {\n                            FilePreviewSource.Remote(appFile, it)\n                        }\n                    }\n                }\n            }\n        }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorSavedHandlerHelper.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport androidx.lifecycle.SavedStateHandle\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.PollEditingState\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.note.Visibility\nimport java.util.Date\n\nenum class NoteEditorSavedStateKey() {\n    Text, Cw, PickedFiles, Visibility, ChannelId, ReplyId, RenoteId, ScheduleAt, DraftNoteId, HasCW, Poll, IsSensitive, ReactionAcceptance,\n}\n\n\nfun SavedStateHandle.setText(text: String?) {\n    this[NoteEditorSavedStateKey.Text.name] = text\n}\n\nfun SavedStateHandle.getText(): String? {\n    return this[NoteEditorSavedStateKey.Text.name]\n}\n\nfun SavedStateHandle.getCw(): String? {\n    return this[NoteEditorSavedStateKey.Cw.name]\n}\n\nfun SavedStateHandle.setCw(text: String?) {\n    this[NoteEditorSavedStateKey.Cw.name] = text\n}\n\nfun SavedStateHandle.setFiles(files: List<AppFile>) {\n    this[NoteEditorSavedStateKey.PickedFiles.name] = files\n}\n\nfun SavedStateHandle.getFiles(): List<AppFile> {\n    return this[NoteEditorSavedStateKey.PickedFiles.name] ?: emptyList()\n}\n\nfun SavedStateHandle.setChannelId(channelId: Channel.Id?) {\n    this[NoteEditorSavedStateKey.ChannelId.name] = channelId\n}\n\nfun SavedStateHandle.setSensitive(value: Boolean?) {\n    this[NoteEditorSavedStateKey.IsSensitive.name] = value\n}\n\nfun SavedStateHandle.getChannelId(): Channel.Id? {\n    return this[NoteEditorSavedStateKey.ChannelId.name]\n}\n\n\nfun SavedStateHandle.setReplyId(noteId: Note.Id?) {\n    this[NoteEditorSavedStateKey.ReplyId.name] = noteId\n}\n\nfun SavedStateHandle.setRenoteId(noteId: Note.Id?) {\n    this[NoteEditorSavedStateKey.RenoteId.name] = noteId\n}\n\nfun SavedStateHandle.getRenoteId(): Note.Id? {\n    return this[NoteEditorSavedStateKey.RenoteId.name]\n}\n\nfun SavedStateHandle.getReplyId(): Note.Id? {\n    return this[NoteEditorSavedStateKey.ReplyId.name]\n}\n\nfun SavedStateHandle.setScheduleAt(date: Date?) {\n    this[NoteEditorSavedStateKey.ScheduleAt.name] = date\n}\n\nfun SavedStateHandle.getScheduleAt(): Date? {\n    return this[NoteEditorSavedStateKey.ScheduleAt.name]\n}\n\nfun SavedStateHandle.setHasCw(hasCw: Boolean) {\n    this[NoteEditorSavedStateKey.HasCW.name] = hasCw\n}\n\nfun SavedStateHandle.getHasCw(): Boolean {\n    return this[NoteEditorSavedStateKey.HasCW.name] ?: false\n}\n\nfun SavedStateHandle.getPoll(): PollEditingState? {\n    return this[NoteEditorSavedStateKey.Poll.name]\n}\n\nfun SavedStateHandle.setPoll(value: PollEditingState?) {\n    this[NoteEditorSavedStateKey.Poll.name] = value\n}\n\nfun SavedStateHandle.setReactionAcceptanceType(value: ReactionAcceptanceType?) {\n    this[NoteEditorSavedStateKey.ReactionAcceptance.name] = value?.name\n}\nfun SavedStateHandle.setVisibility(visibility: Visibility?) {\n    this[NoteEditorSavedStateKey.Visibility.name] = visibility\n}\n\nfun SavedStateHandle.getVisibility(): Visibility? {\n    return this[NoteEditorSavedStateKey.Visibility.name]\n}\n\nfun SavedStateHandle.setDraftNoteId(id: Long?) {\n    this[NoteEditorSavedStateKey.DraftNoteId.name] = id\n}\n\nfun SavedStateHandle.getDraftNoteId(): Long? {\n    return this[NoteEditorSavedStateKey.DraftNoteId.name]\n}\n\nfun SavedStateHandle.getSensitive(): Boolean {\n    return this[NoteEditorSavedStateKey.IsSensitive.name] ?: false\n}\n\nfun SavedStateHandle.getReactionAcceptance(): ReactionAcceptanceType? {\n    return this.get<String?>(NoteEditorSavedStateKey.ReactionAcceptance.name).let { type ->\n        ReactionAcceptanceType.values().find { it.name == type }\n    }\n}\n\nfun SavedStateHandle.applyBy(note: NoteEditorUiState) {\n    setVisibility(note.sendToState.visibility)\n    setText(note.formState.text)\n    setCw(note.formState.cw)\n    setHasCw(note.formState.hasCw)\n    setFiles(note.files.map { it.file })\n    setReplyId(note.sendToState.replyId)\n    setRenoteId(note.sendToState.renoteId)\n    setPoll(note.poll)\n    setDraftNoteId(note.sendToState.draftNoteId)\n    setChannelId(note.sendToState.channelId)\n    setScheduleAt(\n        note.sendToState.schedulePostAt?.let {\n            Date(it.toEpochMilliseconds())\n        }\n    )\n    setSensitive(\n        note.formState.isSensitive,\n    )\n    setReactionAcceptanceType(note.sendToState.reactionAcceptanceType)\n}\n\nsuspend fun SavedStateHandle.getNoteEditingUiState(account: Account?, visibility: Visibility?, fileRepository: DriveFileRepository): NoteEditorUiState {\n    return NoteEditorUiState(\n        formState = NoteEditorFormState(\n            text = getText(),\n            cw = getCw(),\n            hasCw = getHasCw(),\n            isSensitive = getSensitive(),\n        ),\n        sendToState = NoteEditorSendToState(\n            visibility = visibility ?: getVisibility() ?: Visibility.Public(false),\n            channelId = getChannelId(),\n            renoteId = getRenoteId(),\n            replyId = getReplyId(),\n            schedulePostAt = getScheduleAt()?.let {\n                Instant.fromEpochMilliseconds(it.time)\n            },\n            draftNoteId = getDraftNoteId(),\n            reactionAcceptanceType = getReactionAcceptance()\n        ),\n        poll = getPoll(),\n        files = getFiles().mapNotNull { appFile ->\n            when(appFile) {\n                is AppFile.Local -> FilePreviewSource.Local(appFile)\n                is AppFile.Remote -> runCancellableCatching {\n                    FilePreviewSource.Remote(appFile, fileRepository.find(appFile.id))\n                }.getOrNull()\n            }\n        },\n        currentAccount = account,\n    )\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorSwitchAccountExecutor.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.ap.ApResolver\nimport net.pantasystem.milktea.model.ap.ApResolverRepository\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\n@Singleton\nclass NoteEditorSwitchAccountExecutor @Inject constructor(\n    private val resolverRepository: ApResolverRepository,\n    private val noteRepository: NoteRepository,\n    private val userRepository: UserRepository,\n    private val userDataSource: UserDataSource,\n    private val accountRepository: AccountRepository,\n) {\n\n    suspend operator fun invoke(\n        fromAccount: Account?,\n        sendToState: NoteEditorSendToState,\n        switchToAccount: Account\n    ): NoteEditorSwitchAccountExecutorResult {\n        var convertTo = NoteEditorSwitchAccountExecutorResult(\n            replyId = sendToState.replyId,\n            renoteId = sendToState.renoteId,\n            visibility = sendToState.visibility,\n            channelId = sendToState.channelId\n        )\n\n\n        if (convertTo.replyId != null) {\n            convertTo = resolveReply(fromAccount, convertTo, switchToAccount).getOrElse {\n                convertTo.copy(replyId = null)\n            }\n        }\n\n        if (convertTo.renoteId != null) {\n            convertTo = resolveRenote(fromAccount, convertTo, switchToAccount).getOrElse {\n                convertTo.copy(renoteId = null)\n            }\n        }\n\n        if (convertTo.visibility is Visibility.Specified) {\n            convertTo =\n                resolveVisibility(convertTo, from = fromAccount, to = switchToAccount).getOrElse {\n                    convertTo.copy(visibility = Visibility.Specified(emptyList()))\n                }\n        }\n\n        if (convertTo.channelId != null) {\n            val ac = accountRepository.get(convertTo.channelId!!.accountId).getOrElse {\n                fromAccount\n            }\n            if (ac?.getHost() != switchToAccount.getHost()) {\n                convertTo = convertTo.copy(\n                    channelId = null,\n                )\n            }\n        }\n\n        return convertTo\n    }\n\n    private suspend fun resolveRenote(\n        fromAccount: Account?,\n        noteEditingState: NoteEditorSwitchAccountExecutorResult,\n        account: Account\n    ): Result<NoteEditorSwitchAccountExecutorResult> = runCancellableCatching {\n        if (noteEditingState.renoteId != null) {\n            val renote = noteRepository.find(noteEditingState.renoteId).getOrThrow()\n            val url = renote.url ?: renote.uri ?: \"${fromAccount?.normalizedInstanceUri}/notes/${renote.id.noteId}\"\n            val toRenoteNote = resolverRepository.resolve(account.accountId, url)\n                .getOrThrow() as ApResolver.TypeNote\n            noteEditingState.copy(renoteId = toRenoteNote.note.id)\n        } else {\n            noteEditingState\n        }\n    }\n\n    private suspend fun resolveReply(\n        fromAccount: Account?,\n        noteEditingState: NoteEditorSwitchAccountExecutorResult,\n        account: Account\n    ): Result<NoteEditorSwitchAccountExecutorResult> = runCancellableCatching {\n        if (noteEditingState.replyId != null) {\n            val reply = noteRepository.find(noteEditingState.replyId).getOrThrow()\n            val url = reply.url ?: reply.uri ?: \"${fromAccount?.normalizedInstanceUri}/notes/${reply.id.noteId}\"\n            val toReplyNote = resolverRepository.resolve(account.accountId, url)\n                .getOrThrow() as ApResolver.TypeNote\n            noteEditingState.copy(replyId = toReplyNote.note.id)\n        } else {\n            noteEditingState\n        }\n    }\n\n    private suspend fun resolveVisibility(\n        noteEditingState: NoteEditorSwitchAccountExecutorResult,\n        from: Account?,\n        to: Account\n    ): Result<NoteEditorSwitchAccountExecutorResult> = runCancellableCatching {\n        coroutineScope {\n            when (val visibility = noteEditingState.visibility) {\n                is Visibility.Specified -> {\n                    val userIds = visibility.visibleUserIds\n                    if (userIds.isNotEmpty()) {\n                        userRepository.syncIn(userIds)\n\n                    }\n                    val fromUsers =\n                        userDataSource.getIn(from!!.accountId, userIds.map { it.id }).getOrThrow()\n                    val toUsers = fromUsers.map {\n                        async {\n                            userRepository.findByUserName(\n                                to.accountId,\n                                userName = it.userName,\n                                host = it.host\n                            )\n                        }\n                    }.awaitAll()\n\n                    noteEditingState.copy(visibility = Visibility.Specified(\n                        toUsers.map { it.id }\n                    ))\n                }\n                else -> noteEditingState\n            }\n        }\n\n    }\n\n\n}\n\ndata class NoteEditorSwitchAccountExecutorResult(\n    val replyId: Note.Id? = null,\n    val renoteId: Note.Id? = null,\n    val visibility: Visibility,\n    val channelId: Channel.Id?,\n)"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorUiState.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.file.from\nimport net.pantasystem.milktea.model.note.CreateNote\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.PollChoiceState\nimport net.pantasystem.milktea.model.note.PollEditingState\nimport net.pantasystem.milktea.model.note.PollExpiresAt\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport net.pantasystem.milktea.model.note.toCreatePoll\nimport net.pantasystem.milktea.model.user.User\nimport java.util.Date\n\n\ndata class NoteEditorFormState(\n    val text: String? = null,\n    val cw: String? = null,\n    val hasCw: Boolean = false,\n    val isSensitive: Boolean = false,\n)\n\ndata class VisibilityAndChannelId(\n    val visibility: Visibility = Visibility.Public(false),\n    val channelId: Channel.Id? = null,\n)\n\ndata class NoteEditorSendToState(\n    val visibility: Visibility = Visibility.Public(false),\n    val channelId: Channel.Id? = null,\n    val renoteId: Note.Id? = null,\n    val replyId: Note.Id? = null,\n    val schedulePostAt: Instant? = null,\n    val draftNoteId: Long? = null,\n    val reactionAcceptanceType: ReactionAcceptanceType? = null,\n) {\n    val schedulePostAtAsDate: Date? by lazy {\n        schedulePostAt?.let {\n            Date(it.toEpochMilliseconds())\n        }\n    }\n}\n\ndata class NoteEditorUiState(\n    val formState: NoteEditorFormState = NoteEditorFormState(),\n    val sendToState: NoteEditorSendToState = NoteEditorSendToState(),\n    val poll: PollEditingState? = null,\n    val files: List<FilePreviewSource> = emptyList(),\n    val currentAccount: Account? = null,\n) {\n    val totalFilesCount: Int\n        get() = this.files.size\n\n    fun checkValidate(textMaxLength: Int = 3000, maxFileCount: Int = 4, isCwAllowBlank: Boolean = true): Boolean {\n        if (this.files.size > maxFileCount) {\n            return false\n        }\n\n        if (!isCwAllowBlank && formState.hasCw && formState.cw.isNullOrEmpty()) {\n            return false\n        }\n\n        if ((this.formState.text?.codePointCount(0, this.formState.text.length)\n                ?: 0) > textMaxLength\n        ) {\n            return false\n        }\n\n        if (sendToState.channelId != null && sendToState.visibility != Visibility.Public(true)) {\n            return false\n        }\n\n        if (this.sendToState.renoteId != null && (\n                    currentAccount?.instanceType == Account.InstanceType.MISSKEY\n                            || currentAccount?.instanceType == Account.InstanceType.FIREFISH\n                    )\n        ) {\n            return true\n        }\n        if (this.poll != null && this.poll.checkValidate()) {\n            return true\n        }\n        return !(\n                this.formState.text.isNullOrBlank()\n                        && this.files.isEmpty()\n                )\n    }\n\n    fun shouldDiscardingConfirmation(): Boolean {\n        val address = (sendToState.visibility as? Visibility.Specified)?.visibleUserIds\n            ?: emptyList()\n        return !formState.text.isNullOrBlank()\n                || files.isNotEmpty()\n                || !poll?.choices.isNullOrEmpty()\n                || address.isNotEmpty()\n    }\n}\n\n\nfun NoteEditorUiState.toCreateNote(account: Account): CreateNote {\n    return CreateNote(\n        author = account,\n        visibility = sendToState.visibility,\n        text = formState.text,\n        cw = if (formState.hasCw) (formState.cw ?: \"\") else null,\n        viaMobile = false,\n        files = files.map {\n            it.file\n        },\n        replyId = sendToState.replyId,\n        renoteId = sendToState.renoteId,\n        poll = poll?.toCreatePoll(),\n        draftNoteId = sendToState.draftNoteId,\n        channelId = sendToState.channelId,\n        scheduleWillPostAt = sendToState.schedulePostAt,\n        isSensitive = formState.isSensitive,\n        reactionAcceptance = sendToState.reactionAcceptanceType\n    )\n}\n\n\nfun DraftNote.toNoteEditingState(): NoteEditorUiState {\n    return NoteEditorUiState(\n        formState = NoteEditorFormState(\n            text = this.text,\n            cw = this.cw,\n            hasCw = this.cw != null,\n            isSensitive = this.isSensitive ?: false,\n        ),\n        sendToState = NoteEditorSendToState(\n            draftNoteId = this.draftNoteId,\n            visibility = Visibility(\n                type = this.visibility,\n                isLocalOnly = this.localOnly ?: false,\n                visibleUserIds = this.visibleUserIds?.map {\n                    User.Id(accountId = accountId, id = it)\n                }),\n            replyId = this.replyId?.let {\n                Note.Id(accountId = accountId, noteId = it)\n            },\n            renoteId = this.renoteId?.let {\n                Note.Id(accountId = accountId, noteId = it)\n            },\n            channelId = channelId,\n            schedulePostAt = reservationPostingAt?.let {\n                Instant.fromEpochMilliseconds(it.time)\n            },\n            reactionAcceptanceType = reactionAcceptanceType,\n        ),\n        poll = this.draftPoll?.let {\n            PollEditingState(\n                choices = it.choices.map { choice ->\n                    PollChoiceState(choice)\n                },\n                expiresAt = it.expiresAt?.let { ex ->\n                    PollExpiresAt.DateAndTime(\n                        Instant.fromEpochMilliseconds(ex)\n                    )\n                } ?: PollExpiresAt.Infinity,\n                multiple = it.multiple\n            )\n        },\n        files = draftFiles?.map {\n            when (it) {\n                is DraftNoteFile.Local -> {\n                    FilePreviewSource.Local(AppFile.from(it) as AppFile.Local)\n                }\n\n                is DraftNoteFile.Remote -> {\n                    FilePreviewSource.Remote(AppFile.from(it) as AppFile.Remote, it.fileProperty)\n                }\n            }\n\n        } ?: emptyList(),\n\n        )\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorUiStateBuilder.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.PollEditingState\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.RememberVisibility\nimport java.util.Date\nimport javax.inject.Inject\n\nclass NoteEditorUiStateBuilder @Inject constructor(\n) {\n\n    operator fun invoke(\n        textFlow: Flow<String?>,\n        cwFlow: Flow<String?>,\n        hasCwFlow: Flow<Boolean>,\n        isSensitiveMediaFlow: Flow<Boolean?>,\n        filePreviewSourcesFlow: Flow<List<FilePreviewSource>>,\n        pollFlow: Flow<PollEditingState?>,\n        currentAccountFlow: Flow<Account?>,\n        noteEditorSendToStateFlow: Flow<NoteEditorSendToState>,\n    ): Flow<NoteEditorUiState> {\n\n\n        val noteEditorFormState = combine(textFlow, cwFlow, hasCwFlow, isSensitiveMediaFlow) { text, cw, hasCw, sensitive ->\n                NoteEditorFormState(\n                    text = text,\n                    cw = cw,\n                    hasCw = hasCw,\n                    isSensitive = sensitive ?: false,\n                )\n            }\n\n\n        return combine(\n            noteEditorFormState,\n            noteEditorSendToStateFlow,\n            filePreviewSourcesFlow,\n            pollFlow,\n            currentAccountFlow,\n        ) { formState, sendToState, files, poll, account ->\n\n\n            NoteEditorUiState(\n                formState = formState,\n                sendToState = sendToState,\n                poll = poll,\n                files = files,\n                currentAccount = account,\n            )\n        }\n    }\n}\n\nclass NoteEditorSendToStateBuilder @Inject constructor(\n    private val localConfigRepository: LocalConfigRepository,\n) {\n\n    operator fun invoke(\n        visibilityFlow: StateFlow<Visibility?>,\n        currentAccountFlow: StateFlow<Account?>,\n        channelIdFlow: StateFlow<Channel.Id?>,\n        replyIdFlow: Flow<Note.Id?>,\n        renoteIdFlow: Flow<Note.Id?>,\n        reservationPostingAtFlow: Flow<Date?>,\n        draftNoteIdFlow: Flow<Long?>,\n        reactionAcceptanceType: Flow<ReactionAcceptanceType?>,\n    ): Flow<NoteEditorSendToState> {\n        val visibility = create(visibilityFlow, currentAccountFlow, channelIdFlow)\n        val visibilityAndChannelId = combine(visibility, channelIdFlow) { v, c ->\n            VisibilityAndChannelId(v, c)\n        }\n        val replyIdAndRenoteId = combine(replyIdFlow, renoteIdFlow) { replyId, renoteId ->\n            replyId to renoteId\n        }\n        return combine(\n            visibilityAndChannelId,\n            replyIdAndRenoteId,\n            reservationPostingAtFlow,\n            draftNoteIdFlow,\n            reactionAcceptanceType\n        ) { vc, (replyId, renoteId), scheduleDate, dfId, reactionAcceptance ->\n            NoteEditorSendToState(\n                visibility = vc.visibility,\n                channelId = vc.channelId,\n                replyId = replyId,\n                renoteId = renoteId,\n                schedulePostAt = scheduleDate?.let {\n                    Instant.fromEpochMilliseconds(it.time)\n                },\n                draftNoteId = dfId,\n                reactionAcceptanceType = reactionAcceptance,\n            )\n        }\n    }\n\n    private fun create(\n        visibilityFlow: StateFlow<Visibility?>,\n        currentAccountFlow: StateFlow<Account?>,\n        channelIdFlow: StateFlow<Channel.Id?>,\n    ): Flow<Visibility> {\n        return combine(visibilityFlow, currentAccountFlow.filterNotNull().map {\n            localConfigRepository.getRememberVisibility(it.accountId).getOrElse {\n                RememberVisibility.None\n            }\n        }, channelIdFlow) { formVisibilityState, settingVisibilityState, channelId ->\n            when {\n                formVisibilityState != null -> formVisibilityState\n                settingVisibilityState is RememberVisibility.None -> Visibility.Public(false)\n                settingVisibilityState is RememberVisibility.Remember -> settingVisibilityState.visibility\n                channelId != null -> Visibility.Public(true)\n                else -> Visibility.Public(false)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorViewModel.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport android.net.Uri\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.*\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.common.text.UrlPatternChecker\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModelUiStateHelper\nimport net.pantasystem.milktea.common_viewmodel.UserViewData\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.model.ap.ApResolver\nimport net.pantasystem.milktea.model.ap.ApResolverRepository\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.channel.ChannelRepository\nimport net.pantasystem.milktea.model.drive.*\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.CopyFileToAppDirUseCase\nimport net.pantasystem.milktea.model.file.UpdateAppFileSensitiveUseCase\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.instance.InstanceInfo\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.note.*\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNoteService\nimport net.pantasystem.milktea.model.note.reservation.NoteReservationPostExecutor\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\nimport net.pantasystem.milktea.worker.note.CreateNoteWorkerExecutor\nimport java.util.*\nimport javax.inject.Inject\n\n@HiltViewModel\nclass NoteEditorViewModel @Inject constructor(\n    loggerFactory: Logger.Factory,\n    planeNoteViewDataCacheFactory: PlaneNoteViewDataCache.Factory,\n    private val accountStore: AccountStore,\n    private val getAllMentionUsersUseCase: GetAllMentionUsersUseCase,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val instanceInfoService: InstanceInfoService,\n    private val driveFileRepository: DriveFileRepository,\n    private val draftNoteService: DraftNoteService,\n    private val draftNoteRepository: DraftNoteRepository,\n    private val noteReservationPostExecutor: NoteReservationPostExecutor,\n    private val userViewDataFactory: UserViewData.Factory,\n    private val noteRepository: NoteRepository,\n    private val channelRepository: ChannelRepository,\n    private val noteEditorSwitchAccountExecutor: NoteEditorSwitchAccountExecutor,\n    private val createNoteWorkerExecutor: CreateNoteWorkerExecutor,\n    private val accountRepository: AccountRepository,\n    localConfigRepository: LocalConfigRepository,\n    private val featureEnables: FeatureEnables,\n    private val noteRelationGetter: NoteRelationGetter,\n    private val updateSensitiveUseCase: UpdateAppFileSensitiveUseCase,\n    private val apResolverRepository: ApResolverRepository,\n    userRepository: UserRepository,\n    private val copyFileToAppDirUseCase: CopyFileToAppDirUseCase,\n    buildNoteEditorUiState: NoteEditorUiStateBuilder,\n    buildNoteEditorSendToStateBuilder: NoteEditorSendToStateBuilder,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n    private val dispatcher: CoroutineDispatcher = Dispatchers.IO\n\n    private val logger = loggerFactory.create(\"NoteEditorViewModel\")\n\n    private val _currentAccount = MutableStateFlow<Account?>(null)\n    val currentAccount = _currentAccount.asStateFlow()\n\n    val text = savedStateHandle.getStateFlow<String?>(NoteEditorSavedStateKey.Text.name, null)\n\n    val textCursorPos = MutableSharedFlow<TextWithCursorPos>(extraBufferCapacity = 10)\n\n    val cw = savedStateHandle.getStateFlow<String?>(NoteEditorSavedStateKey.Cw.name, null)\n    val hasCw = savedStateHandle.getStateFlow(NoteEditorSavedStateKey.HasCW.name, false)\n\n    private val files = savedStateHandle.getStateFlow<List<AppFile>>(\n        NoteEditorSavedStateKey.PickedFiles.name,\n        emptyList()\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val instanceInfoType = _currentAccount.filterNotNull().flatMapLatest {\n        instanceInfoService.observe(it.normalizedInstanceUri)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val isSensitiveMedia =\n        savedStateHandle.getStateFlow<Boolean?>(NoteEditorSavedStateKey.IsSensitive.name, null)\n\n    private val filePreviewSources = NoteEditorFilePreviewSourcesMapper(\n        filePropertyDataSource,\n        driveFileRepository,\n        logger,\n        viewModelScope\n    ).create(files)\n\n    private val channelId =\n        savedStateHandle.getStateFlow<Channel.Id?>(NoteEditorSavedStateKey.ChannelId.name, null)\n    private val replyId =\n        savedStateHandle.getStateFlow<Note.Id?>(NoteEditorSavedStateKey.ReplyId.name, null)\n    private val renoteId =\n        savedStateHandle.getStateFlow<Note.Id?>(NoteEditorSavedStateKey.RenoteId.name, null)\n\n    val maxTextLength = instanceInfoType.map {\n        it?.maxNoteTextLength ?: 3000\n    }.stateIn(\n            viewModelScope + Dispatchers.IO,\n            started = SharingStarted.Lazily,\n            initialValue = 3000\n        )\n\n\n    val enableFeatures = _currentAccount.filterNotNull().map {\n        featureEnables.enableFeatures(it.normalizedInstanceUri)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptySet())\n\n    val maxFileCount = instanceInfoType.map {\n        it?.maxFileCount?: 4\n    }.stateIn(viewModelScope + Dispatchers.IO, started = SharingStarted.Eagerly, initialValue = 4)\n\n    private val _visibility = savedStateHandle.getStateFlow<Visibility?>(\n        NoteEditorSavedStateKey.Visibility.name,\n        null\n    )\n\n    private val visibility = NoteEditorVisibilityCombiner(\n        viewModelScope,\n        localConfigRepository,\n    ).create(\n        _visibility,\n        _currentAccount,\n        channelId,\n    )\n\n    private val reactionAcceptanceType = savedStateHandle.getStateFlow<String?>(\n        NoteEditorSavedStateKey.ReactionAcceptance.name,\n        null\n    ).map { strType ->\n        ReactionAcceptanceType.values().find {\n            it.name == strType\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val reservationPostingAt =\n        savedStateHandle.getStateFlow<Date?>(NoteEditorSavedStateKey.ScheduleAt.name, null)\n\n    val poll = savedStateHandle.getStateFlow<PollEditingState?>(\n        NoteEditorSavedStateKey.Poll.name,\n        null\n    )\n\n    val address = visibility.map {\n        it as? Visibility.Specified\n    }.map {\n        it?.visibleUserIds?.map { uId ->\n            setUpUserViewData(uId)\n        } ?: emptyList()\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, emptyList())\n\n    val isSpecified = visibility.map {\n        it is Visibility.Specified\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, false)\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val channels = _currentAccount.filterNotNull().flatMapLatest {\n        suspend {\n            channelRepository.findFollowedChannels(it.accountId).onFailure {\n                logger.error(\"load channel error\", it)\n            }.getOrThrow()\n        }.asLoadingStateFlow().onEach {\n            logger.debug(\"Channel state:${it}\")\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.Eagerly,\n        initialValue = ResultState.initialState()\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val user = currentAccount.filterNotNull().flatMapLatest { account ->\n        userRepository.observe(User.Id(account.accountId, account.remoteId)).map {\n            it.castAndPartiallyFill()\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null,\n    )\n\n    private val draftNoteId =\n        savedStateHandle.getStateFlow<Long?>(NoteEditorSavedStateKey.DraftNoteId.name, null)\n\n    private val _isPosting = MutableStateFlow(false)\n    val isPosting = _isPosting.asStateFlow()\n\n    private val noteEditorSendToState = buildNoteEditorSendToStateBuilder(\n        visibilityFlow = _visibility,\n        currentAccountFlow = _currentAccount,\n        channelIdFlow = channelId,\n        replyIdFlow = replyId,\n        renoteIdFlow = renoteId,\n        reservationPostingAtFlow = reservationPostingAt,\n        draftNoteIdFlow = draftNoteId,\n        reactionAcceptanceType = reactionAcceptanceType,\n    ).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        NoteEditorSendToState()\n    )\n\n    val uiState = buildNoteEditorUiState(\n        textFlow = text,\n        cwFlow = cw,\n        hasCwFlow = hasCw,\n        isSensitiveMediaFlow = isSensitiveMedia,\n        filePreviewSourcesFlow = filePreviewSources,\n        pollFlow = poll,\n        currentAccountFlow = _currentAccount,\n        noteEditorSendToStateFlow = noteEditorSendToState,\n    ).stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), NoteEditorUiState())\n\n    val textRemaining = combine(maxTextLength, uiState) { max, uiState ->\n        val t = uiState.formState.text\n        max - (t?.codePointCount(0, t.length) ?: 0)\n    }.catch {\n        logger.error(\"observe meta error\", it)\n    }.stateIn(viewModelScope + Dispatchers.IO, started = SharingStarted.Lazily, initialValue = 1500)\n\n    val isPostAvailable = combine(instanceInfoType, uiState) { instanceInfo, uiState ->\n        val isCwAllowBlank = instanceInfo?.isCwAllowBlank ?: true\n        uiState.checkValidate(textMaxLength = maxTextLength.value, maxFileCount = maxFileCount.value, isCwAllowBlank = isCwAllowBlank)\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        false,\n    )\n\n    private val cache = planeNoteViewDataCacheFactory.create({\n        requireNotNull(_currentAccount.value)\n    }, viewModelScope)\n\n    val replyTo = replyId.map { id ->\n        noteRelationGetter.get(id ?: throw UnauthorizedException()).getOrThrow()?.let {\n            cache.get(it)\n        }\n    }.catch {\n        emit(null)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val accountUiState = AccountViewModelUiStateHelper(\n        _currentAccount,\n        accountStore,\n        userRepository,\n        instanceInfoService,\n        viewModelScope,\n    ).uiState\n\n    private val _fileSizeInvalidEvent =\n        MutableSharedFlow<FileSizeInvalidEvent>(extraBufferCapacity = 10)\n    val fileSizeInvalidEvent = _fileSizeInvalidEvent.asSharedFlow()\n\n    private val _isPost = MutableSharedFlow<Boolean>(extraBufferCapacity = 10)\n    val isPost = _isPost.asSharedFlow()\n\n    private val _showPollDatePicker = MutableSharedFlow<Unit>(extraBufferCapacity = 10)\n    val showPollDatePicker = _showPollDatePicker.asSharedFlow()\n\n    private val _showPollTimePicker = MutableSharedFlow<Unit>(extraBufferCapacity = 10)\n    val showPollTimePicker = _showPollTimePicker.asSharedFlow()\n\n    private val _isSaveNoteAsDraft = MutableSharedFlow<Long?>(extraBufferCapacity = 10)\n    val isSaveNoteAsDraft = _isSaveNoteAsDraft.asSharedFlow()\n\n    var focusType: NoteEditorFocusEditTextType = NoteEditorFocusEditTextType.Text\n\n\n    fun setRenoteTo(noteId: Note.Id?) {\n        savedStateHandle.setRenoteId(noteId)\n        if (noteId == null) {\n            return\n        }\n        viewModelScope.launch {\n            noteRepository.find(noteId).onSuccess { note ->\n                savedStateHandle.setVisibility(note.visibility)\n                savedStateHandle.setChannelId(note.channelId)\n            }\n        }\n    }\n\n    fun setReplyTo(noteId: Note.Id?) {\n        savedStateHandle.setReplyId(noteId)\n        if (noteId == null) {\n            return\n        }\n        viewModelScope.launch {\n\n            // NOTE: リプライ先のcwの状態をフォームに反映するようにする\n            noteRepository.find(noteId).onSuccess { note ->\n                savedStateHandle.setHasCw(note.cw != null)\n                savedStateHandle.setCw(note.cw)\n                savedStateHandle.setVisibility(note.visibility)\n                savedStateHandle.setChannelId(note.channelId)\n            }\n\n            getAllMentionUsersUseCase(noteId).onSuccess { users ->\n                val (text, pos) = savedStateHandle.getText()\n                    .addMentionUserNames(\n                        users.map { it.displayUserName }, 0\n                    )\n                savedStateHandle.setText(text)\n                textCursorPos.tryEmit(TextWithCursorPos(text, pos))\n            }\n        }\n    }\n\n    fun setDraftNoteId(id: Long) {\n        viewModelScope.launch {\n            draftNoteRepository.findOne(id).mapCancellableCatching {\n                val account = accountRepository.get(it.accountId).getOrThrow()\n                it.toNoteEditingState().copy(\n                    currentAccount = account\n                )\n            }.onSuccess { note ->\n                _currentAccount.value = note.currentAccount\n                savedStateHandle.applyBy(note)\n            }\n        }\n\n    }\n\n\n    fun changeText(text: String) {\n        savedStateHandle[NoteEditorSavedStateKey.Text.name] = text\n    }\n\n    fun addPollChoice() {\n        savedStateHandle.setPoll(savedStateHandle.getPoll().addPollChoice())\n    }\n\n    fun changePollChoice(id: UUID, text: String) {\n        savedStateHandle.setPoll(\n            savedStateHandle.getPoll().updatePollChoice(id, text)\n        )\n    }\n\n    fun removePollChoice(id: UUID) {\n        savedStateHandle.setPoll(\n            savedStateHandle.getPoll().removePollChoice(id)\n        )\n    }\n\n\n    fun togglePollMultiple() {\n        savedStateHandle.setPoll(savedStateHandle.getPoll()?.toggleMultiple())\n    }\n\n    fun setPollExpiresAt(expiresAt: PollExpiresAt) {\n        val state = savedStateHandle.getPoll()\n        savedStateHandle.setPoll(\n            state?.copy(\n                expiresAt = expiresAt\n            )\n        )\n    }\n\n\n    fun post() {\n        _currentAccount.value?.let { account ->\n            viewModelScope.launch {\n                if (isPosting.value) {\n                    return@launch\n                }\n                _isPosting.value = true\n                val reservationPostingAt =\n                    savedStateHandle.getNoteEditingUiState(\n                        account,\n                        visibility.value,\n                        driveFileRepository\n                    ).sendToState.schedulePostAt\n                draftNoteService.save(\n                    savedStateHandle.getNoteEditingUiState(\n                        account,\n                        visibility.value,\n                        driveFileRepository\n                    )\n                        .toCreateNote(account)\n                ).mapCancellableCatching { dfNote ->\n                    if (reservationPostingAt == null || reservationPostingAt <= Clock.System.now()) {\n                        createNoteWorkerExecutor.enqueue(dfNote.draftNoteId)\n                    } else {\n                        noteReservationPostExecutor.register(dfNote)\n                    }\n                }.onSuccess {\n                    _isPost.tryEmit(true)\n                }.onFailure {\n                    logger.error(\"登録失敗\", it)\n                }\n                _isPosting.value = false\n            }\n        }\n\n    }\n\n    fun toggleNsfw(appFile: AppFile) {\n        if (!enableFeatures.value.contains(FeatureType.Drive)) {\n            return\n        }\n        when (appFile) {\n            is AppFile.Local -> {\n                savedStateHandle.setFiles(files.value.toggleFileSensitiveStatus(appFile))\n                savedStateHandle[NoteEditorSavedStateKey.PickedFiles.name] =\n                    files.value.toggleFileSensitiveStatus(appFile)\n            }\n\n            is AppFile.Remote -> {\n                viewModelScope.launch {\n                    runCancellableCatching {\n                        driveFileRepository.toggleNsfw(appFile.id)\n                    }\n                }\n            }\n        }\n\n    }\n\n    fun toggleSensitive() {\n        val sensitive = savedStateHandle.getSensitive()\n        if (_currentAccount.value?.instanceType == Account.InstanceType.MASTODON) {\n            viewModelScope.launch {\n                savedStateHandle.setFiles(\n                    savedStateHandle.getFiles().mapNotNull { appFile ->\n                        updateSensitiveUseCase(appFile, !sensitive).onFailure {\n                            logger.error(\"ファイルのセンシティブの状態の更新に失敗しました\", it)\n                        }.getOrNull()\n                    }\n                )\n            }\n        }\n        savedStateHandle.setSensitive(!sensitive)\n    }\n\n    fun updateFileName(appFile: AppFile, name: String) {\n        when (appFile) {\n            is AppFile.Local -> {\n                savedStateHandle.setFiles(files.value.updateFileName(appFile, name))\n            }\n\n            is AppFile.Remote -> {\n                viewModelScope.launch {\n                    driveFileRepository.update(\n                        UpdateFileProperty(\n                            fileId = appFile.id,\n                            name = ValueType.Some(name)\n                        )\n                    ).onFailure {\n                        logger.error(\"update file name failed\", it)\n                    }\n\n                }\n            }\n        }\n    }\n\n    fun updateFileComment(appFile: AppFile, comment: String) {\n        when (appFile) {\n            is AppFile.Local -> {\n                savedStateHandle.setFiles(files.value.updateFileComment(appFile, comment))\n            }\n\n            is AppFile.Remote -> {\n                viewModelScope.launch {\n                    driveFileRepository.update(\n                        UpdateFileProperty(\n                            fileId = appFile.id,\n                            comment = ValueType.Some(comment),\n                        )\n                    ).onFailure {\n                        logger.error(\"update file comment failed\", it)\n                    }\n                }\n            }\n        }\n    }\n\n    fun addFile(uri: Uri) = viewModelScope.launch {\n        copyFileToAppDirUseCase(uri).onSuccess { file ->\n            val files = files.value.toMutableList()\n            files.add(\n                file\n            )\n            savedStateHandle.setFiles(files)\n        }.onFailure {\n            logger.error(\"ファイルのコピーに失敗しました\", it)\n        }\n    }\n\n\n    private fun addAllFileProperty(fpList: List<FileProperty>) {\n        val files = savedStateHandle.getFiles().toMutableList()\n        files.addAll(fpList.map {\n            AppFile.Remote(it.id)\n        })\n        savedStateHandle.setFiles(files)\n\n    }\n\n    fun addFilePropertyFromIds(ids: List<FileProperty.Id>) {\n        viewModelScope.launch {\n            filePropertyDataSource.findIn(ids).onSuccess {\n                addAllFileProperty(it)\n            }\n        }\n    }\n\n    fun removeFileNoteEditorData(file: AppFile) = viewModelScope.launch {\n        savedStateHandle.setFiles(\n            savedStateHandle.getFiles().removeFile(file)\n        )\n    }\n\n\n    fun fileTotal(): Int {\n        return files.value.size\n    }\n\n\n    fun enablePoll() {\n        val poll =\n            if (savedStateHandle.getPoll() == null) PollEditingState.EMPTY_POLL_EDITING_STATE else null\n        savedStateHandle.setPoll(poll)\n    }\n\n    fun setText(text: String) {\n        savedStateHandle.setText(text)\n    }\n\n    fun changeCwEnabled() {\n        savedStateHandle.setHasCw(!savedStateHandle.getHasCw())\n    }\n\n    fun setCw(text: String?) {\n        savedStateHandle.setCw(text)\n        focusType = NoteEditorFocusEditTextType.Text\n    }\n\n    fun setVisibility(visibility: Visibility) {\n        logger.debug(\"公開範囲がセットされた:$visibility\")\n        savedStateHandle.setChannelId(null)\n        savedStateHandle.setVisibility(visibility)\n    }\n\n    fun setChannelId(channelId: Channel.Id?) {\n        savedStateHandle.setChannelId(channelId)\n        if (channelId == null) {\n            return\n        } else {\n            savedStateHandle.setVisibility(Visibility.Public(true))\n        }\n    }\n\n    fun toggleReservationAt() {\n        savedStateHandle.setScheduleAt(\n            if (reservationPostingAt.value == null) Date(\n                Clock.System.now().toEpochMilliseconds()\n            ) else null\n        )\n    }\n\n\n    fun setAddress(added: List<User.Id>, removed: List<User.Id>) {\n        val list = ((visibility.value as? Visibility.Specified)?.visibleUserIds\n            ?: emptyList()).toMutableList()\n        list.addAll(\n            added\n        )\n\n        list.removeAll {\n            removed.any()\n        }\n\n        savedStateHandle.setVisibility(Visibility.Specified(list))\n    }\n\n\n    fun addMentionUserNames(userNames: List<String>, pos: Int): Int {\n        val (text, nextPos) = savedStateHandle.getText()\n            .addMentionUserNames(userNames, pos)\n        savedStateHandle.setText(text)\n        return nextPos\n    }\n\n    fun addEmoji(emoji: CustomEmoji, pos: Int): Int {\n        return addEmoji(\":${emoji.name}:\", pos)\n    }\n\n    fun addEmoji(emoji: String, pos: Int): Int {\n        when (focusType) {\n            NoteEditorFocusEditTextType.Cw -> {\n                val builder = StringBuilder(savedStateHandle.getCw() ?: \"\")\n                logger.debug(\"pos:$pos\")\n                builder.insert(pos, emoji)\n                savedStateHandle.setCw(builder.toString())\n                logger.debug(\"position:${pos + emoji.length - 1}\")\n                return pos + emoji.length\n            }\n\n            NoteEditorFocusEditTextType.Text -> {\n                val builder = StringBuilder(savedStateHandle.getText() ?: \"\")\n                builder.insert(pos, emoji)\n                savedStateHandle.setText(builder.toString())\n                logger.debug(\"position:${pos + emoji.length - 1}\")\n                return pos + emoji.length\n            }\n        }\n\n    }\n\n    fun setSchedulePostAt(instant: Instant?) {\n        savedStateHandle.setScheduleAt(instant?.let {\n            Date(it.toEpochMilliseconds())\n        })\n    }\n\n\n    fun saveDraft() {\n        if (!canSaveDraft()) {\n            return\n        }\n        viewModelScope.launch {\n            when (val account = _currentAccount.value) {\n                null -> Result.failure(UnauthorizedException())\n                else -> Result.success(account)\n            }.mapCancellableCatching { account ->\n                draftNoteService.save(uiState.value.toCreateNote(account)).getOrThrow()\n            }.onSuccess { result ->\n                _isSaveNoteAsDraft.tryEmit(result.draftNoteId)\n            }.onFailure { e ->\n                logger.error(\"下書き保存に失敗した\", e)\n            }\n        }\n    }\n\n    fun onPastePostUrl(text: String, start: Int, beforeText: String, count: Int) =\n        viewModelScope.launch {\n            val urlText = text.substring(start, start + count)\n            val ca = _currentAccount.value ?: return@launch\n            val canQuote = canQuote()\n\n            if (!canQuote) {\n                return@launch\n            }\n\n            if (UrlPatternChecker.isMatch(urlText)) {\n                apResolverRepository.resolve(ca.accountId, urlText).onSuccess {\n                    when (it) {\n                        is ApResolver.TypeNote -> {\n                            setRenoteTo(it.note.id)\n                            setText(beforeText)\n                        }\n\n                        is ApResolver.TypeUser -> return@launch\n                    }\n                }\n            }\n        }\n\n    fun canSaveDraft(): Boolean {\n        return uiState.value.shouldDiscardingConfirmation()\n    }\n\n\n    fun clear() {\n        savedStateHandle.applyBy(NoteEditorUiState())\n    }\n\n    suspend fun canQuote(): Boolean {\n        val ca = _currentAccount.value ?: return false\n        return instanceInfoService.find(ca.normalizedInstanceUri).map {\n            it.canQuote\n        }.getOrElse { false }\n    }\n\n    fun setAccountId(accountId: Long?) {\n        viewModelScope.launch {\n            (accountId?.let {\n                accountRepository.get(accountId)\n            } ?: accountRepository.getCurrentAccount()).onSuccess {\n                setAccount(it)\n            }.onFailure {\n                logger.error(\"アカウントの取得に失敗した\", it)\n            }\n        }\n    }\n\n    fun setAccountIdAndSwitchCurrentAccount(accountId: Long?) {\n        viewModelScope.launch {\n            (accountId?.let {\n                accountRepository.get(accountId)\n            } ?: accountRepository.getCurrentAccount()).onSuccess {\n                setAccount(it)\n                accountStore.setCurrent(it)\n            }.onFailure {\n                logger.error(\"アカウントの取得に失敗した\", it)\n            }\n        }\n    }\n\n    fun onReactionAcceptanceSelected(type: ReactionAcceptanceType?) {\n        savedStateHandle.setReactionAcceptanceType(type)\n    }\n\n    fun onExpireAtChangeDateButtonClicked() {\n        _showPollDatePicker.tryEmit(Unit)\n    }\n    fun onExpireAtChangeTimeButtonClicked(){\n        _showPollTimePicker.tryEmit(Unit)\n    }\n    private fun setUpUserViewData(userId: User.Id): UserViewData {\n        return userViewDataFactory.create(userId, viewModelScope, dispatcher)\n    }\n\n    private suspend fun setAccount(account: Account) = runCancellableCatching<Unit> {\n        val result = noteEditorSwitchAccountExecutor(\n            _currentAccount.value,\n            uiState.value.sendToState,\n            account,\n        )\n\n        if (account.accountId != _currentAccount.value?.accountId && _currentAccount.value != null) {\n            savedStateHandle.setReplyId(result.replyId)\n            savedStateHandle.setRenoteId(result.renoteId)\n            savedStateHandle.setChannelId(result.channelId)\n        }\n        if (_currentAccount.value != null) {\n            savedStateHandle.setVisibility(null)\n        }\n        logger.debug {\n            \"currentAccount:${account.userName}@${account.getHost()}\"\n        }\n        _currentAccount.value = account\n    }\n\n}\n\ndata class TextWithCursorPos(val text: String?, val cursorPos: Int)\ndata class FileSizeInvalidEvent(\n    val file: AppFile.Local,\n    val instanceInfo: InstanceInfo,\n    val account: Account,\n)\n\nenum class NoteEditorFocusEditTextType {\n    Cw, Text\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorVisibilityCombiner.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.RememberVisibility\n\nclass NoteEditorVisibilityCombiner(\n    private val scope: CoroutineScope,\n    private val localConfigRepository: LocalConfigRepository,\n) {\n\n    fun create(\n        visibilityFlow: StateFlow<Visibility?>,\n        currentAccountFlow: StateFlow<Account?>,\n        channelIdFlow: StateFlow<Channel.Id?>,\n    ): StateFlow<Visibility> {\n        return combine(visibilityFlow, currentAccountFlow.filterNotNull().map {\n            localConfigRepository.getRememberVisibility(it.accountId).getOrElse {\n                RememberVisibility.None\n            }\n        }, channelIdFlow) { formVisibilityState, settingVisibilityState, channelId ->\n            when {\n                formVisibilityState != null -> formVisibilityState\n                settingVisibilityState is RememberVisibility.None -> Visibility.Public(false)\n                settingVisibilityState is RememberVisibility.Remember -> settingVisibilityState.visibility\n                channelId != null -> Visibility.Public(true)\n                else -> Visibility.Public(false)\n            }\n        }.stateIn(scope, SharingStarted.WhileSubscribed(5_000), Visibility.Public(false))\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/visibility/ReactionAcceptanceSelection.kt",
    "content": "package net.pantasystem.milktea.note.editor.visibility\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.note.R\n\n@Composable\nfun ReactionAcceptanceSelection(\n    type: ReactionAcceptanceType?,\n    isSelected: Boolean,\n    onSelected: (ReactionAcceptanceType?) -> Unit,\n) {\n    val title = remember(type) {\n        when(type) {\n            ReactionAcceptanceType.LikeOnly -> R.string.reaction_acceptance_only_likes\n            ReactionAcceptanceType.LikeOnly4Remote -> R.string.reaction_acceptance_like_only_for_remote\n            ReactionAcceptanceType.NonSensitiveOnly -> R.string.reaction_acceptance_non_sensitive_only\n            ReactionAcceptanceType.NonSensitiveOnly4LocalOnly4Remote -> R.string.reaction_acceptance_non_sensitive_only_likes_from_remote\n            null -> R.string.reaction_acceptance_all\n        }\n    }\n    Surface(\n        Modifier.clickable {\n            onSelected(type)\n        },\n        color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface,\n    ) {\n        Row(\n            Modifier\n                .fillMaxWidth()\n                .padding(horizontal = 16.dp, vertical = 16.dp),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Text(stringResource(id = title))\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/visibility/VisibilityChannelSelection.kt",
    "content": "package net.pantasystem.milktea.note.editor.visibility\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.model.channel.Channel\n\n\n@Composable\ninternal fun VisibilityChannelSelection(\n    item: Channel,\n    isSelected: Boolean,\n    onClick: (Channel) -> Unit,\n) {\n    val color = remember {\n        item.rgpFromName\n    }\n    Surface(\n        Modifier.clickable {\n            onClick(item)\n        },\n        color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface,\n    ) {\n        Row(\n            Modifier\n                .fillMaxWidth()\n                .padding(horizontal = 16.dp, vertical = 8.dp),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Image(\n                rememberAsyncImagePainter(item.bannerUrl),\n                contentDescription = null,\n                contentScale = ContentScale.Crop,\n                modifier = Modifier\n                    .size(48.dp)\n                    .clip(RoundedCornerShape(8.dp))\n                    .background(Color(red = color.first, green = color.second, blue = color.third))\n            )\n            Spacer(Modifier.width(4.dp))\n\n            Column {\n                Text(item.name, fontWeight = FontWeight.Bold)\n                Text(item.description ?: \"\", maxLines = 2)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/visibility/VisibilityDialogSectionTitles.kt",
    "content": "package net.pantasystem.milktea.note.editor.visibility\n\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.note.R\n\n@Composable\ninternal fun VisibilityChannelTitle() {\n    Text(\n        stringResource(R.string.channel),\n        fontSize = 20.sp,\n        modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp),\n        fontWeight = FontWeight.ExtraBold\n    )\n}\n\n@Composable\ninternal fun ReactionAcceptanceTitle() {\n    Text(\n        stringResource(R.string.reaction_acceptance),\n        fontSize = 20.sp,\n        modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp, bottom = 8.dp),\n        fontWeight = FontWeight.ExtraBold\n    )\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/visibility/VisibilityResource.kt",
    "content": "package net.pantasystem.milktea.note.editor.visibility\n\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.graphics.painter.Painter\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.note.R\n\n@Composable\nfun painterVisibilityIconResource(visibility: Visibility): Painter {\n    return painterResource(\n        id = when (visibility) {\n            is Visibility.Followers -> R.drawable.ic_lock_black_24dp\n            is Visibility.Home -> R.drawable.ic_home_black_24dp\n            is Visibility.Public -> R.drawable.ic_language_black_24dp\n            is Visibility.Specified -> R.drawable.ic_email_black_24dp\n            is Visibility.Limited -> net.pantasystem.milktea.common_android.R.drawable.ic_groups\n            Visibility.Mutual -> net.pantasystem.milktea.common_android.R.drawable.ic_sync_alt_24px\n            Visibility.Personal -> net.pantasystem.milktea.common_android.R.drawable.ic_person_black_24dp\n        }\n    )\n}\n\n@Composable\nfun stringVisibilityText(visibility: Visibility): String {\n    return when (visibility) {\n        is Visibility.Followers -> stringResource(id = R.string.visibility_follower)\n        is Visibility.Home -> stringResource(id = R.string.visibility_home)\n        is Visibility.Public -> stringResource(id = R.string.visibility_public)\n        is Visibility.Specified -> stringResource(id = R.string.visibility_specified)\n        is Visibility.Limited -> stringResource(id = R.string.visibility_limited)\n        Visibility.Mutual -> stringResource(id = R.string.visibility_mutual)\n        Visibility.Personal -> stringResource(id = R.string.visibility_personal)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/visibility/VisibilitySelectionDialogV2.kt",
    "content": "package net.pantasystem.milktea.note.editor.visibility\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.unit.dp\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialog\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.note.CanLocalOnly\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.isLocalOnly\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass VisibilitySelectionDialogV2 : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"VisibilitySelectionDialogV2\"\n    }\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel by activityViewModels<NoteEditorViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return super.onCreateDialog(savedInstanceState).apply {\n            val view = ComposeView(requireContext()).apply {\n                setContent {\n                    MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                        VisibilitySelectionDialogContent(viewModel = viewModel)\n                    }\n                }\n            }\n            setContentView(view)\n            val behavior = (this as BottomSheetDialog).behavior\n            behavior.peekHeight = (resources.displayMetrics.density * 350).toInt()\n        }\n    }\n\n\n}\n\n@Composable\nfun VisibilitySelectionDialogContent(viewModel: NoteEditorViewModel) {\n    val uiState by viewModel.uiState.collectAsState()\n    val channelsState by viewModel.channels.collectAsState()\n    val enableFeatures by viewModel.enableFeatures.collectAsState()\n    val reactionAcceptanceType = uiState.sendToState.reactionAcceptanceType\n    VisibilitySelectionDialogLayout(\n        visibility = uiState.sendToState.visibility,\n        channelsState = channelsState,\n        enableFeatures = enableFeatures,\n        onVisibilityChanged = viewModel::setVisibility,\n        onChannelSelected = {\n            viewModel.setChannelId(it.id)\n        },\n        onReactionAcceptanceSelected = {\n            viewModel.onReactionAcceptanceSelected(it)\n        },\n        channelId = uiState.sendToState.channelId,\n        reactionAcceptanceType = reactionAcceptanceType\n    )\n}\n\n@OptIn(ExperimentalComposeUiApi::class)\n@Composable\nfun VisibilitySelectionDialogLayout(\n    visibility: Visibility,\n    channelsState: ResultState<List<Channel>>,\n    enableFeatures: Set<FeatureType>,\n    onVisibilityChanged: (visibility: Visibility) -> Unit,\n    onChannelSelected: (channel: Channel) -> Unit,\n    onReactionAcceptanceSelected: (ReactionAcceptanceType?) -> Unit,\n    channelId: Channel.Id? = null,\n    reactionAcceptanceType: ReactionAcceptanceType? = null,\n) {\n    val channels =\n        (channelsState.content as? StateContent.Exist)?.rawContent ?: emptyList()\n    Surface(\n        Modifier\n            .fillMaxWidth()\n            .clip(RoundedCornerShape(topStart = 16.dp, topEnd = 16.dp))\n            .nestedScroll(rememberNestedScrollInteropConnection())\n    ) {\n        Column(\n            Modifier.padding(top = 4.dp),\n            horizontalAlignment = Alignment.CenterHorizontally,\n        ) {\n            Box(\n                Modifier\n                    .width(32.dp)\n                    .height(8.dp)\n                    .clip(RoundedCornerShape(16.dp))\n                    .background(Color.Gray),\n                content = {}\n            )\n            Spacer(Modifier.height(4.dp))\n\n            LazyColumn(\n                Modifier.fillMaxWidth()\n            ) {\n                item {\n                    VisibilitySelectionTile(\n                        item = Visibility.Public(visibility.isLocalOnly()),\n                        isSelected = visibility is Visibility.Public && channelId == null,\n                        onClick = onVisibilityChanged\n                    )\n\n                    VisibilitySelectionTile(\n                        item = Visibility.Home(visibility.isLocalOnly()),\n                        isSelected = visibility is Visibility.Home && channelId == null,\n                        onClick = onVisibilityChanged\n                    )\n                    VisibilitySelectionTile(\n                        item = Visibility.Followers(\n                            visibility.isLocalOnly()\n                        ),\n                        isSelected = visibility is Visibility.Followers && channelId == null,\n                        onClick = onVisibilityChanged\n                    )\n                    VisibilitySelectionTile(\n                        item = Visibility.Specified(\n                            emptyList()\n                        ),\n                        isSelected = visibility is Visibility.Specified && channelId == null,\n                        onClick = onVisibilityChanged\n                    )\n\n\n                    if (enableFeatures.contains(FeatureType.PostLocalOnlyVisibility)) {\n                        VisibilityLocalOnlySwitch(\n                            checked = visibility.isLocalOnly(),\n                            enabled = visibility is CanLocalOnly && channelId == null,\n                            onChanged = { result ->\n                                (visibility as? CanLocalOnly)?.changeLocalOnly(\n                                    result\n                                )?.also {\n                                    onVisibilityChanged(it as Visibility)\n                                }\n                            },\n                        )\n                    }\n                }\n\n                if (enableFeatures.contains(FeatureType.ReactionAcceptance)) {\n                    item {\n                        ReactionAcceptanceTitle()\n                    }\n                    items(listOf<ReactionAcceptanceType?>(null) + ReactionAcceptanceType.values()) { type ->\n                        ReactionAcceptanceSelection(\n                            type = type,\n                            isSelected = type == reactionAcceptanceType,\n                            onSelected = onReactionAcceptanceSelected\n                        )\n                    }\n                }\n\n                if (enableFeatures.contains(FeatureType.Channel)) {\n                    item {\n                        VisibilityChannelTitle()\n                    }\n                    items(channels) { channel ->\n                        VisibilityChannelSelection(\n                            item = channel,\n                            isSelected = channel.id == channelId,\n                            onClick = {\n                                onChannelSelected(it)\n                            }\n                        )\n                    }\n                }\n            }\n        }\n\n    }\n}\n\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/editor/visibility/VisibilitySelectionTile.kt",
    "content": "package net.pantasystem.milktea.note.editor.visibility\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Switch\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.note.R\n\n\n@Composable\ninternal fun VisibilitySelectionTile(\n    item: Visibility,\n    isSelected: Boolean,\n    onClick: (item: Visibility) -> Unit,\n) {\n\n    val title = stringVisibilityText(visibility = item)\n    val iconDrawable = painterVisibilityIconResource(visibility = item)\n    Surface(\n        Modifier.clickable {\n            onClick(item)\n        },\n        color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface,\n    ) {\n        Row(\n            Modifier\n                .fillMaxWidth()\n                .padding(horizontal = 16.dp, vertical = 16.dp),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Icon(iconDrawable, contentDescription = null)\n            Spacer(modifier = Modifier.width(4.dp))\n            Text(title)\n        }\n    }\n}\n\n\n@Composable\ninternal fun VisibilityLocalOnlySwitch(\n    modifier: Modifier = Modifier,\n    checked: Boolean,\n    onChanged: (Boolean) -> Unit,\n    enabled: Boolean = true,\n) {\n    Row(\n        modifier = modifier\n            .padding(horizontal = 16.dp)\n            .clickable {\n                onChanged.invoke(!checked)\n            },\n        horizontalArrangement = Arrangement.SpaceBetween,\n        verticalAlignment = Alignment.CenterVertically\n    ) {\n        Box(modifier = Modifier.weight(1f)) {\n            Text(stringResource(R.string.local_only))\n        }\n\n        Switch(checked = checked, onCheckedChange = onChanged, enabled = enabled)\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/emojis/AddEmojiToUserConfigDialog.kt",
    "content": "package net.pantasystem.milktea.note.emojis\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.note.EmojiType\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.emojis.viewmodel.AddEmojiToUserConfigViewModel\nimport net.pantasystem.milktea.note.emojis.viewmodel.AddEmojiToUserConfigViewModel.Companion.EXTRA_TEXT_EMOJI\nimport net.pantasystem.milktea.note.toTextReaction\n\n@AndroidEntryPoint\nclass AddEmojiToUserConfigDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"AddEmojiToUserConfigDialog\"\n\n\n        fun newInstance(emojiType: EmojiType): DialogFragment {\n            return AddEmojiToUserConfigDialog().apply {\n                arguments = Bundle().apply {\n                    putString(EXTRA_TEXT_EMOJI, emojiType.toTextReaction())\n                }\n            }\n        }\n    }\n\n    private val viewModel by activityViewModels<AddEmojiToUserConfigViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val textEmoji = requireArguments().getString(EXTRA_TEXT_EMOJI) ?: \"\"\n        return MaterialAlertDialogBuilder(requireContext())\n            .setMessage(getString(R.string.dialog_add_emoji_to_user_settings_message, textEmoji))\n            .setTitle(R.string.dialog_add_emoji_to_user_settings_title)\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                viewModel.save(textEmoji)\n            }\n            .setNegativeButton(android.R.string.cancel) { _ ,_ ->\n                dismiss()\n            }.create()\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/emojis/CustomEmojiPickerDialog.kt",
    "content": "package net.pantasystem.milktea.note.emojis\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.emojis.viewmodel.EmojiSelection\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass CustomEmojiPickerDialog : BottomSheetDialogFragment(), EmojiPickerFragment.OnEmojiSelectedListener{\n\n    companion object {\n        const val FRAGMENT_TAG = \"CustomEmojiPickerDialog\"\n        fun newInstance(accountId: Long?): CustomEmojiPickerDialog {\n            return CustomEmojiPickerDialog().apply {\n                arguments = Bundle().apply {\n                    putLong(\"ACCOUNT_ID\", accountId ?: -1)\n                }\n            }\n        }\n    }\n\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n\n    private val accountId: Long? by lazy(LazyThreadSafetyMode.NONE) {\n        arguments?.getLong(\"ACCOUNT_ID\")?.takeIf {\n            it > 0\n        }\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.dialog_custom_emoji_picker, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        if (savedInstanceState == null) {\n            childFragmentManager.beginTransaction().also {\n                it.add(R.id.fragmentBaseContainer, EmojiPickerFragment.newInstance(accountId))\n            }.commit()\n        }\n    }\n\n\n    override fun onSelect(emoji: String) {\n        val parentFr = parentFragment\n        val activity = requireActivity()\n        if(activity is EmojiSelection){\n            activity.onSelect(emoji)\n        } else if (parentFr is EmojiSelection) {\n            parentFr.onSelect(emoji)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/emojis/EmojiPickerFragment.kt",
    "content": "package net.pantasystem.milktea.note.emojis\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.View\nimport android.view.inputmethod.EditorInfo\nimport android.widget.EditText\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.flexbox.AlignItems\nimport com.google.android.flexbox.FlexboxLayoutManager\nimport com.google.android.material.tabs.TabLayout\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.distinctUntilChangedBy\nimport kotlinx.coroutines.flow.filterNot\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.tab.TabbedFlexboxListMediator\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.note.reaction.ReactionSelection\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.EmojiListItemType\nimport net.pantasystem.milktea.note.EmojiPickerUiStateService\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.FragmentEmojiPickerBinding\nimport net.pantasystem.milktea.note.emojis.viewmodel.EmojiPickerViewModel\nimport net.pantasystem.milktea.note.reaction.choices.EmojiListItemsAdapter\nimport net.pantasystem.milktea.note.toTextReaction\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass EmojiPickerFragment : Fragment(R.layout.fragment_emoji_picker), ReactionSelection {\n\n    companion object {\n        fun newInstance(accountId: Long?): EmojiPickerFragment {\n            return EmojiPickerFragment().also { fragment ->\n                fragment.arguments = Bundle().apply {\n                    putLong(EmojiPickerUiStateService.EXTRA_ACCOUNT_ID, accountId ?: -1L)\n                }\n            }\n        }\n    }\n    interface OnEmojiSelectedListener {\n        fun onSelect(emoji: String)\n    }\n\n    private val binding: FragmentEmojiPickerBinding by dataBinding()\n\n    private val emojiPickerViewModel: EmojiPickerViewModel by viewModels()\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        binding.lifecycleOwner = viewLifecycleOwner\n        binding.emojiPickerViewModel = emojiPickerViewModel\n        val binder = EmojiSelectionBinder(\n            context = requireContext(),\n            scope = viewLifecycleOwner.lifecycleScope,\n            fragmentManager = childFragmentManager,\n            lifecycleOwner = viewLifecycleOwner,\n            tabLayout = binding.reactionChoicesTab,\n            recyclerView = binding.reactionChoicesViewPager,\n            searchWordTextField = binding.searchReactionEditText,\n            onReactionSelected = {\n                val selected = if (Reaction(it).isCustomEmojiFormat()) {\n                    it\n                } else {\n                    LegacyReaction.reactionMap[it] ?: it\n                }\n                onSelect(selected)\n            },\n            onSearchEmojiTextFieldEntered = {\n                onSelect(it)\n            },\n            emojiPickerViewModel = emojiPickerViewModel,\n            emojiPickerEmojiSize = configRepository.get().getOrElse { DefaultConfig.config }.emojiPickerEmojiDisplaySize\n        )\n        binder.bind()\n\n    }\n\n    override fun selectReaction(reaction: String) {\n        onSelect(reaction)\n    }\n\n    fun onSelect(emoji: String) {\n        val activity = requireActivity()\n        val parent = parentFragment\n        if (parent is OnEmojiSelectedListener) {\n            parent.onSelect(emoji)\n        } else if (activity is OnEmojiSelectedListener) {\n            activity.onSelect(emoji)\n        }\n    }\n}\n\n\nclass EmojiSelectionBinder(\n    val context: Context,\n    val scope: CoroutineScope,\n    val fragmentManager: FragmentManager,\n    val lifecycleOwner: LifecycleOwner,\n    val tabLayout: TabLayout,\n    val recyclerView: RecyclerView,\n    val searchWordTextField: EditText,\n    val emojiPickerViewModel: EmojiPickerViewModel,\n    val onReactionSelected: (String) -> Unit,\n    val onSearchEmojiTextFieldEntered: (String) -> Unit,\n    val emojiPickerEmojiSize: Int,\n) {\n\n    fun bind() {\n\n\n        val adapter = EmojiListItemsAdapter(\n            isApplyImageAspectRatio = true,\n            onEmojiLongClicked = { emojiType ->\n                val exists = emojiPickerViewModel.uiState.value.isExistsConfig(emojiType)\n                if (!exists) {\n                    AddEmojiToUserConfigDialog.newInstance(emojiType)\n                        .show(fragmentManager, AddEmojiToUserConfigDialog.FRAGMENT_TAG)\n                    true\n                } else {\n                    false\n                }\n            },\n            onEmojiSelected = {\n                onReactionSelected(it.toTextReaction())\n            },\n            baseItemSizeDp = emojiPickerEmojiSize,\n        )\n\n\n        val layoutManager by lazy {\n            val flexBoxLayoutManager = FlexboxLayoutManager(context)\n            flexBoxLayoutManager.alignItems = AlignItems.STRETCH\n            flexBoxLayoutManager\n        }\n\n        recyclerView.layoutManager = layoutManager\n\n        recyclerView.adapter = adapter\n        recyclerView.itemAnimator = null\n\n\n        scope.launch {\n            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                emojiPickerViewModel.uiState.collect {\n                    adapter.submitList(it.emojiListItems)\n                }\n            }\n        }\n\n        var tabbedListMediator: TabbedFlexboxListMediator? = null\n        emojiPickerViewModel.uiState.filterNot {\n            it.tabHeaderLabels.isEmpty()\n        }.distinctUntilChangedBy {\n            it.emojiListItems\n        }.onEach {\n            tabLayout.removeAllTabs()\n            val labels = it.tabHeaderLabels\n            labels.forEach {\n                val tab = tabLayout.newTab().apply {\n                    text = it.getString(context)\n                }\n                tabLayout.addTab(tab, false)\n            }\n            tabbedListMediator?.detach()\n            tabbedListMediator = TabbedFlexboxListMediator(\n                recyclerView,\n                tabLayout,\n                it.emojiListItems.mapIndexedNotNull { index, emojiListItemType ->\n                    when(emojiListItemType) {\n                        is EmojiListItemType.EmojiItem -> null\n                        is EmojiListItemType.Header -> index\n                    }\n                }\n            )\n            tabbedListMediator?.attach()\n        }.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.RESUMED).launchIn(scope)\n\n\n        searchWordTextField.setOnEditorActionListener { _, actionId, _ ->\n            if (actionId == EditorInfo.IME_ACTION_SEND) {\n                onSearchEmojiTextFieldEntered(emojiPickerViewModel.searchWord.value)\n                return@setOnEditorActionListener true\n            }\n            return@setOnEditorActionListener false\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/emojis/viewmodel/AddEmojiToUserConfigViewModel.kt",
    "content": "package net.pantasystem.milktea.note.emojis.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.emoji.AddEmojiToUserConfigUseCase\nimport javax.inject.Inject\n\n@HiltViewModel\nclass AddEmojiToUserConfigViewModel @Inject constructor(\n    val addEmojiToUserConfigUseCase: AddEmojiToUserConfigUseCase,\n    loggerFactory: Logger.Factory,\n): ViewModel() {\n    companion object {\n        const val EXTRA_TEXT_EMOJI = \"AddEmojiToDeckDialog.EXTRA_TEXT_EMOJI\"\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"AddEmojiToDeckVM\")\n    }\n\n    fun save(textEmoji: String) {\n        viewModelScope.launch {\n            addEmojiToUserConfigUseCase(textEmoji).onFailure {\n                logger.error(\"絵文字のユーザ設定への追加に失敗\", it)\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/emojis/viewmodel/EmojiPickerViewModel.kt",
    "content": "package net.pantasystem.milktea.note.emojis.viewmodel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfigRepository\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryRepository\nimport net.pantasystem.milktea.note.EmojiPickerUiStateService\nimport javax.inject.Inject\n\n@HiltViewModel\nclass EmojiPickerViewModel @Inject constructor(\n    accountStore: AccountStore,\n    reactionHistoryDao: ReactionHistoryRepository,\n    userEmojiConfigRepository: UserEmojiConfigRepository,\n    customEmojiRepository: CustomEmojiRepository,\n    loggerFactory: Logger.Factory,\n    savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n\n    private val logger = loggerFactory.create(\"EmojiPickerViewModel\")\n\n    private val uiStateService = EmojiPickerUiStateService(\n        accountStore = accountStore,\n        reactionHistoryRepository = reactionHistoryDao,\n        userEmojiConfigRepository = userEmojiConfigRepository,\n        coroutineScope = viewModelScope,\n        customEmojiRepository = customEmojiRepository,\n        logger = logger,\n        savedStateHandle = savedStateHandle,\n    )\n\n    val searchWord = uiStateService.searchWord\n\n    // 検索時の候補\n    val uiState = uiStateService.uiState\n\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/emojis/viewmodel/EmojiSelection.kt",
    "content": "package net.pantasystem.milktea.note.emojis.viewmodel\n\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\n\ninterface EmojiSelection{\n\n    fun onSelect(emoji: CustomEmoji)\n    fun onSelect(emoji: String)\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/media/MediaPreviewHelper.kt",
    "content": "\npackage net.pantasystem.milktea.note.media\n\nimport android.annotation.SuppressLint\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageButton\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.core.view.isVisible\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.load.resource.bitmap.CenterCrop\nimport jp.wasabeef.glide.transformations.BlurTransformation\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common.glide.blurhash.BlurHashSource\nimport net.pantasystem.milktea.common_android.platform.isWifiConnected\nimport net.pantasystem.milktea.common_android.ui.MediaLayout\nimport net.pantasystem.milktea.common_android.ui.VisibilityHelper.setMemoVisibility\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.model.setting.Config\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemMediaPreviewBinding\nimport net.pantasystem.milktea.note.media.viewmodel.MediaViewData\nimport net.pantasystem.milktea.note.media.viewmodel.PreviewAbleFile\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\n\nobject MediaPreviewHelper {\n\n\n    @JvmStatic\n    fun FrameLayout.setClickWhenShowMediaActivityListener(\n        thumbnailView: ImageView,\n        playButton: ImageButton,\n        previewAbleFile: PreviewAbleFile?,\n        previewAbleFileList: List<PreviewAbleFile>?,\n        noteCardActionListenerAdapter: NoteCardActionListenerAdapter?,\n        config: Config?,\n    ) {\n\n        if (previewAbleFileList.isNullOrEmpty()) {\n            return\n        }\n        val listener = View.OnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            noteCardActionListenerAdapter?.onMediaPreviewClicked(\n                previewAbleFile = previewAbleFile,\n                files = previewAbleFileList,\n                index = previewAbleFileList.indexOfFirst { f ->\n                    f === previewAbleFile\n                },\n                thumbnailView = thumbnailView,\n            )\n        }\n        thumbnailView.setOnClickListener(listener)\n        playButton.setOnClickListener(listener)\n\n        val holdListener = View.OnLongClickListener {\n            noteCardActionListenerAdapter?.onMediaPreviewLongClicked(previewAbleFile)\n            true\n        }\n        thumbnailView.setOnLongClickListener(holdListener)\n\n        // NOTE: 実装の仕様上、サムネイル非表示時には親レイアウトにクリックイベントを伝播する必要がある\n\n        if (previewAbleFile?.isHidingWithNetworkStateAndConfig(\n            isMobileNetwork = !context.isWifiConnected(),\n            mediaDisplayMode = config?.mediaDisplayMode ?: DefaultConfig.config.mediaDisplayMode\n        ) == true) {\n            thumbnailView.setOnClickListener {\n                this.performClick()\n            }\n        }\n    }\n\n    @SuppressLint(\"MissingPermission\")\n    @BindingAdapter(\"thumbnailView\", \"config\")\n    @JvmStatic\n    fun ImageView.setPreview(file: PreviewAbleFile?, config: Config?) {\n        file ?: return\n        config ?: return\n        val isHiding = file.isHidingWithNetworkStateAndConfig(\n            isMobileNetwork = !context.isWifiConnected(),\n            mediaDisplayMode = config.mediaDisplayMode\n        )\n        if (isHiding) {\n            Glide.with(this)\n                .let {\n                    when (val blurhash = file.source.blurhash) {\n                        null -> it.load(file.source.thumbnailUrl)\n                            .transform(BlurTransformation(32, 4), CenterCrop())\n                        else -> it.load(\n                            BlurHashSource(blurhash)\n                        )\n                    }\n                }\n                .into(this)\n        } else {\n            Glide.with(this)\n                .load(file.source.thumbnailUrl)\n                .thumbnail(GlideApp.with(this).load(\n                    file.source.blurhash?.let {\n                        BlurHashSource(it)\n                    }\n                ))\n                .centerCrop()\n                .into(this)\n        }\n\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"hideImageMessageImageSource\", \"config\")\n    fun TextView.setHideImageMessage(src: PreviewAbleFile?, config: Config?) {\n        src ?: return\n        config ?: return\n\n        val isHiding = src.isHidingWithNetworkStateAndConfig(\n            isMobileNetwork = !context.isWifiConnected(),\n            mediaDisplayMode = config.mediaDisplayMode\n        )\n        setMemoVisibility(\n            if (isHiding) {\n                View.VISIBLE\n            } else {\n                View.GONE\n            }\n        )\n        if (isHiding) {\n            if (src.visibleType == PreviewAbleFile.VisibleType.SensitiveHide) {\n                this.text = context.getString(R.string.sensitive_content)\n            } else {\n                this.text = context.getString(R.string.notes_media_click_to_load_image)\n            }\n        }\n    }\n\n\n    @JvmStatic\n    @BindingAdapter(\"previewAbleList\", \"mediaViewData\", \"noteCardActionListenerAdapter\")\n    fun MediaLayout.setPreviewAbleList(\n        previewAbleList: List<PreviewAbleFile>?,\n        mediaViewData: MediaViewData?,\n        noteCardActionListenerAdapter: NoteCardActionListenerAdapter?,\n    ) {\n        if (previewAbleList == null || mediaViewData == null) {\n            this.visibility = View.GONE\n            return\n        }\n\n        if (previewAbleList.isEmpty()) {\n            this.visibility = View.GONE\n            return\n        }\n\n        val isWifiConnected = context.isWifiConnected()\n\n        withSuspendLayout {\n            var count = this.childCount\n            while (count > previewAbleList.size) {\n                if (this.childCount > 4) {\n                    this.removeViewAt(this.childCount - 1)\n                } else {\n                    this.getChildAt(count - 1).setMemoVisibility(View.GONE)\n                }\n                count --\n            }\n\n            val inflater = LayoutInflater.from(this.context)\n            previewAbleList.forEachIndexed { index, previewAbleFile ->\n                val existsView: View? = this.getChildAt(index)\n                val binding = if (existsView == null) {\n                    ItemMediaPreviewBinding.inflate(inflater, this, false)\n                } else {\n                    ItemMediaPreviewBinding.bind(existsView)\n                }\n                binding.root.setMemoVisibility(View.VISIBLE)\n\n                binding.baseFrame.setClickWhenShowMediaActivityListener(\n                    binding.thumbnail,\n                    binding.actionButton,\n                    previewAbleFile,\n                    previewAbleList,\n                    noteCardActionListenerAdapter,\n                    mediaViewData.config,\n                )\n                binding.baseFrame.setOnClickListener {\n                    HapticFeedbackController.performClickHapticFeedback(it)\n                    if (previewAbleFile.visibleType == PreviewAbleFile.VisibleType.SensitiveHide) {\n                        noteCardActionListenerAdapter?.onSensitiveMediaPreviewClicked(\n                            mediaViewData,\n                            index\n                        )\n                    } else {\n                        mediaViewData.show(index)\n                    }\n                }\n\n                binding.thumbnail.setPreview(previewAbleFile, mediaViewData.config)\n\n                binding.actionButton.isVisible = previewAbleFile.isVisiblePlayButton\n                binding.nsfwMessage.isVisible = previewAbleFile.isHiding\n                binding.nsfwMessage.setHideImageMessage(previewAbleFile, mediaViewData.config)\n                binding.toggleVisibilityButton.setImageResource(if (previewAbleFile.isHiding) R.drawable.ic_baseline_image_24 else R.drawable.ic_baseline_hide_image_24)\n                binding.toggleVisibilityButton.setOnClickListener {\n                    val visibleState = previewAbleFile.isHidingWithNetworkStateAndConfig(\n                        isMobileNetwork = !isWifiConnected,\n                        mediaDisplayMode = mediaViewData.config?.mediaDisplayMode ?: DefaultConfig.config.mediaDisplayMode\n                    )\n\n                    // NOTE: ここでのネットワークの状態はbind時のものを使う\n                    // なぜなら表示状態はbindされた時のネットワークの状態を使っているから\n                    mediaViewData.toggleVisibility(index, isMobileNetwork = !isWifiConnected, mediaDisplayMode = mediaViewData.config?.mediaDisplayMode ?: DefaultConfig.config.mediaDisplayMode)\n                    HapticFeedbackController.performToggledHapticFeedback(it, !visibleState)\n                }\n\n                if (existsView == null) {\n                    this.addView(binding.root)\n                }\n            }\n        }\n\n        this.visibility = View.VISIBLE\n\n    }\n\n\n}\n\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/media/viewmodel/MediaViewData.kt",
    "content": "package net.pantasystem.milktea.note.media.viewmodel\n\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.update\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.file.isSensitive\nimport net.pantasystem.milktea.model.setting.Config\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.MediaDisplayMode\n\nclass MediaViewData(\n    files: List<FilePreviewSource>,\n    val config: Config?,\n) {\n\n    // NOTE: サイズが変わることは決してない\n    private val _files = MutableStateFlow(\n        files.map {\n            PreviewAbleFile(\n                it,\n                if (it.isSensitive) {\n                    if (config?.mediaDisplayMode == MediaDisplayMode.ALWAYS_SHOW) {\n                        PreviewAbleFile.VisibleType.Visible\n                    } else {\n                        PreviewAbleFile.VisibleType.SensitiveHide\n                    }\n                } else if (when (config?.mediaDisplayMode\n                        ?: DefaultConfig.config.mediaDisplayMode) {\n                        MediaDisplayMode.AUTO -> false\n                        MediaDisplayMode.ALWAYS_HIDE -> true\n                        MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK -> true\n                        MediaDisplayMode.ALWAYS_SHOW -> false\n                    }\n                ) {\n                    PreviewAbleFile.VisibleType.HideWhenMobileNetwork\n                } else {\n                    PreviewAbleFile.VisibleType.Visible\n                }\n            )\n        },\n    )\n    val files: StateFlow<List<PreviewAbleFile>> = _files\n\n    val isOver4Files = files.size > 4\n    val isVisibleMediaPreviewArea = !(isOver4Files || files.isEmpty())\n\n    fun show(index: Int) {\n        _files.update { list ->\n            list.mapIndexed { i, previewAbleFile ->\n                if (i == index) {\n                    previewAbleFile.copy(visibleType = PreviewAbleFile.VisibleType.Visible)\n                } else {\n                    previewAbleFile\n                }\n            }\n        }\n    }\n\n    fun toggleVisibility(index: Int, isMobileNetwork: Boolean, mediaDisplayMode: MediaDisplayMode) {\n        _files.update {\n            it.toMutableList().mapIndexed { i, previewAbleFile ->\n                if (i == index) {\n                    previewAbleFile.copy(\n                        visibleType = if (previewAbleFile.isHidingWithNetworkStateAndConfig(\n                                isMobileNetwork = isMobileNetwork,\n                                mediaDisplayMode = mediaDisplayMode,\n                            )\n                        ) {\n                            PreviewAbleFile.VisibleType.Visible\n                        } else {\n                            PreviewAbleFile.VisibleType.SensitiveHide\n                        }\n                    )\n                } else {\n                    previewAbleFile\n                }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/media/viewmodel/PreviewAbleFile.kt",
    "content": "package net.pantasystem.milktea.note.media.viewmodel\n\nimport net.pantasystem.milktea.model.file.AboutMediaType\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.setting.MediaDisplayMode\n\n\ndata class PreviewAbleFile(\n    val source: FilePreviewSource,\n    val visibleType: VisibleType,\n    val initialVisibleType: VisibleType = visibleType\n) {\n\n\n    private val type = this.source.aboutMediaType\n\n\n    private val isVideo = type == AboutMediaType.VIDEO\n    val isHiding = visibleType == VisibleType.SensitiveHide\n    val isVisiblePlayButton: Boolean\n        get() = isVideo && !isHiding\n\n    fun isHidingWithNetworkStateAndConfig(isMobileNetwork: Boolean, mediaDisplayMode: MediaDisplayMode): Boolean {\n        return when(visibleType) {\n            VisibleType.Visible -> false\n            VisibleType.HideWhenMobileNetwork -> {\n                if (mediaDisplayMode == MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK) {\n                    isMobileNetwork\n                } else mediaDisplayMode == MediaDisplayMode.ALWAYS_HIDE\n            }\n            VisibleType.SensitiveHide -> true\n        }\n    }\n\n    enum class VisibleType {\n        Visible,\n        HideWhenMobileNetwork,\n        SensitiveHide,\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/option/NoteOptionDialog.kt",
    "content": "package net.pantasystem.milktea.note.option\n\nimport android.app.Dialog\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.content.Intent\nimport android.content.Intent.ACTION_SEND\nimport android.os.Bundle\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_compose.haptic.rememberHapticFeedback\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.report.toReport\nimport net.pantasystem.milktea.note.NoteDetailActivity\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.clip.ToggleAddNoteToClipDialog\nimport net.pantasystem.milktea.note.reaction.history.ReactionHistoryPagerDialog\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass NoteOptionDialog : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"NoteOptionDialog\"\n        fun newInstance(noteId: Note.Id, fromPageable: Pageable? = null): NoteOptionDialog {\n            return NoteOptionDialog().apply {\n                arguments = Bundle().apply {\n                    putSerializable(NoteOptionViewModel.NOTE_ID, noteId)\n                    putSerializable(NoteOptionViewModel.FROM_PAGEABLE, fromPageable)\n                }\n            }\n        }\n    }\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel: NoteOptionViewModel by viewModels()\n    val notesViewModel: NotesViewModel by activityViewModels()\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n        dialog.setContentView(ComposeView(requireContext()).apply {\n            setContent {\n                val uiState by viewModel.uiState.collectAsState()\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val feedback = rememberHapticFeedback()\n                    NoteOptionDialogLayout(\n                        uiState = uiState,\n                        onShowDetailButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            requireActivity().startActivity(\n                                NoteDetailActivity.newIntent(\n                                    requireActivity(),\n                                    noteId = it,\n                                    fromPageable = viewModel.fromPageable\n                                )\n                            )\n                            dismiss()\n                        },\n                        onCopyTextButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            val clipboardManager =\n                                context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?\n                            if (clipboardManager == null || uiState.note == null) {\n                                dismiss()\n                            } else {\n                                clipboardManager.setPrimaryClip(\n                                    ClipData.newPlainText(\n                                        \"\",\n                                        uiState.note?.text\n                                    )\n                                )\n                                dismiss()\n                            }\n                        },\n                        onShareButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            val url = uiState.noteOriginUrl\n                            val intent = Intent().apply {\n                                action = ACTION_SEND\n                                type = \"text/plain\"\n                                putExtra(Intent.EXTRA_TEXT, url)\n                            }\n                            startActivity(\n                                Intent.createChooser(\n                                    intent,\n                                    getString(R.string.share)\n                                )\n                            )\n                            dismiss()\n                        },\n                        onTranslateButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.translate(it)\n                            dismiss()\n                        },\n                        onDeleteFavoriteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.deleteFavorite(it)\n                            dismiss()\n                        },\n                        onCreateFavoriteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.addFavorite(uiState.noteId!!)\n                            dismiss()\n                        },\n                        onDeleteAndEditButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.confirmDeleteAndEditEvent.tryEmit(it)\n                            dismiss()\n                        },\n                        onDeleteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.confirmDeletionEvent.tryEmit(it)\n                            dismiss()\n                        },\n                        onReportButtonClicked ={\n                            if (it != null) {\n                                feedback.performClickHapticFeedback()\n                                val baseUrl = uiState.currentAccount?.normalizedInstanceUri\n                                val report = it.toReport(baseUrl!!)\n                                notesViewModel.confirmReportEvent.tryEmit(report)\n                            }\n                            dismiss()\n                        },\n                        onCreateThreadMuteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            viewModel.createThreadMute(it)\n                            dismiss()\n                        },\n                        onDeleteThreadMuteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            viewModel.deleteThreadMute(it)\n                            dismiss()\n                        },\n                        onAddBookmarkButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.addBookmark(it)\n                            dismiss()\n                        },\n                        onDeleteBookmarkButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.removeBookmark(it)\n                            dismiss()\n                        },\n                        onShowReactionHistoryButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            dismiss()\n                            ReactionHistoryPagerDialog.newInstance(it).show(parentFragmentManager, ReactionHistoryPagerDialog.FRAGMENT_TAG)\n                        },\n                        onToggleAddNoteToClipButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            dismiss()\n                            ToggleAddNoteToClipDialog.newInstance(it).show(parentFragmentManager, ToggleAddNoteToClipDialog.FRAGMENT_TAG)\n                        }\n                    )\n                }\n            }\n        })\n\n        return dialog\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/option/NoteOptionDialogLayout.kt",
    "content": "package net.pantasystem.milktea.note.option\n\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.Surface\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Attachment\nimport androidx.compose.material.icons.filled.BookmarkRemove\nimport androidx.compose.material.icons.filled.ContentCopy\nimport androidx.compose.material.icons.filled.Delete\nimport androidx.compose.material.icons.filled.Edit\nimport androidx.compose.material.icons.filled.Info\nimport androidx.compose.material.icons.filled.Mood\nimport androidx.compose.material.icons.filled.Report\nimport androidx.compose.material.icons.filled.Share\nimport androidx.compose.material.icons.filled.Star\nimport androidx.compose.material.icons.filled.Translate\nimport androidx.compose.material.icons.filled.VolumeMute\nimport androidx.compose.material.icons.outlined.BookmarkAdd\nimport androidx.compose.material.icons.outlined.Star\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.view.NormalBottomSheetDialogSelectionLayout\n\n@Composable\nfun NoteOptionDialogLayout(\n    uiState: NoteOptionUiState,\n    onShowDetailButtonClicked: (Note.Id) -> Unit,\n    onCopyTextButtonClicked: (text: Note?) -> Unit,\n    onShareButtonClicked: (note: Note?) -> Unit,\n    onTranslateButtonClicked: (noteId: Note.Id) -> Unit,\n    onDeleteFavoriteButtonClicked: (noteId: Note.Id) -> Unit,\n    onDeleteBookmarkButtonClicked: (noteId: Note.Id) -> Unit,\n    onAddBookmarkButtonClicked: (noteId: Note.Id) -> Unit,\n    onCreateFavoriteButtonClicked: (noteId: Note.Id) -> Unit,\n    onCreateThreadMuteButtonClicked: (noteId: Note.Id) -> Unit,\n    onDeleteThreadMuteButtonClicked: (noteId: Note.Id) -> Unit,\n    onDeleteAndEditButtonClicked: (NoteRelation?) -> Unit,\n    onDeleteButtonClicked: (NoteRelation?) -> Unit,\n    onReportButtonClicked: (NoteRelation?) -> Unit,\n    onShowReactionHistoryButtonClicked: (noteId: Note.Id) -> Unit,\n    onToggleAddNoteToClipButtonClicked: (noteId: Note.Id) -> Unit,\n) {\n    Surface(Modifier.fillMaxWidth()) {\n        Column(Modifier.fillMaxWidth()) {\n            if (uiState.note?.id != null) {\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = {\n                        onShowDetailButtonClicked(uiState.note.id)\n                    },\n                    icon = Icons.Default.Info,\n                    text = stringResource(id = R.string.show_detail)\n                )\n            }\n\n            if (uiState.isVisibleReactionUsersSelection) {\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = {\n                        uiState.note?.id?.let(onShowReactionHistoryButtonClicked)\n                    },\n                    icon = Icons.Default.Mood, text = stringResource(\n                        id = R.string.reaction\n                    )\n                )\n            }\n\n            NormalBottomSheetDialogSelectionLayout(\n                onClick = {\n                    onCopyTextButtonClicked(uiState.note)\n                },\n                icon = Icons.Default.ContentCopy,\n                text = stringResource(id = R.string.copy_content)\n            )\n            NormalBottomSheetDialogSelectionLayout(\n                onClick = {\n                    onShareButtonClicked(uiState.note)\n                },\n                icon = Icons.Default.Share,\n                text = stringResource(id = R.string.share)\n            )\n            HorizontalDivider()\n            if (uiState.noteId != null) {\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = {\n                        onTranslateButtonClicked(uiState.noteId)\n                    },\n                    icon = Icons.Default.Translate,\n                    text = stringResource(id = R.string.translate)\n                )\n            }\n            HorizontalDivider()\n            if (uiState.note?.isMisskey == true) {\n                if (uiState.noteState?.isFavorited == true) {\n                    if (uiState.noteId != null) {\n                        NormalBottomSheetDialogSelectionLayout(\n                            onClick = {\n                                onDeleteFavoriteButtonClicked(uiState.noteId)\n                            },\n                            icon = Icons.Filled.Star,\n                            text = stringResource(\n                                id = R.string.remove_favorite\n                            )\n                        )\n                    }\n                } else {\n                    if (uiState.noteId != null) {\n                        NormalBottomSheetDialogSelectionLayout(\n                            onClick = {\n                                onCreateFavoriteButtonClicked(uiState.noteId)\n                            },\n                            icon = Icons.Outlined.Star,\n                            text = stringResource(id = R.string.favorite)\n                        )\n                    }\n                }\n            } else {\n                when ((uiState.note?.type as? Note.Type.Mastodon)?.bookmarked) {\n                    true -> {\n                        NormalBottomSheetDialogSelectionLayout(\n                            onClick = {\n                                onDeleteBookmarkButtonClicked(uiState.note.id)\n                            },\n                            icon = Icons.Filled.BookmarkRemove,\n                            text = stringResource(\n                                id = R.string.remove_bookmark\n                            )\n                        )\n                    }\n\n                    false -> {\n                        NormalBottomSheetDialogSelectionLayout(\n                            onClick = {\n                                onAddBookmarkButtonClicked(uiState.note.id)\n                            },\n                            icon = Icons.Outlined.BookmarkAdd,\n                            text = stringResource(id = R.string.add_to_bookmark)\n                        )\n                    }\n\n                    else -> {}\n                }\n            }\n\n            if (uiState.note?.isMisskey == true) {\n                NormalBottomSheetDialogSelectionLayout(\n                    icon = Icons.Default.Attachment, text = stringResource(id = R.string.clip),\n                    onClick = {\n                        onToggleAddNoteToClipButtonClicked(\n                            uiState.note.id\n                        )\n                    },\n                )\n            }\n\n            if (uiState.noteState == null || uiState.noteState.isMutedThread != null) {\n                if (uiState.noteState?.isMutedThread == true) {\n                    if (uiState.noteId != null) {\n                        NormalBottomSheetDialogSelectionLayout(\n                            onClick = {\n                                onDeleteThreadMuteButtonClicked(uiState.noteId)\n                            },\n                            icon = Icons.Default.VolumeMute,\n                            text = stringResource(\n                                id = R.string.unmute_thread\n                            )\n                        )\n                    }\n                } else {\n                    if (uiState.noteId != null) {\n\n                        NormalBottomSheetDialogSelectionLayout(\n                            onClick = {\n                                onCreateThreadMuteButtonClicked(uiState.noteId)\n                            },\n                            icon = Icons.Default.VolumeMute,\n                            text = stringResource(\n                                id = R.string.mute_thread\n                            )\n                        )\n                    }\n                }\n            }\n\n            if (uiState.isMyNote) {\n                HorizontalDivider()\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = {\n                        onDeleteAndEditButtonClicked(uiState.noteRelation)\n                    },\n                    icon = Icons.Default.Edit,\n                    text = stringResource(id = R.string.delete_and_edit)\n                )\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = {\n                        onDeleteButtonClicked(uiState.noteRelation)\n                    },\n                    icon = Icons.Default.Delete,\n                    text = stringResource(id = R.string.remove_note)\n                )\n            }\n            if (!uiState.isMyNote) {\n                HorizontalDivider()\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = {\n                        onReportButtonClicked(uiState.noteRelation)\n                    },\n                    icon = Icons.Default.Report,\n                    text = stringResource(id = R.string.report)\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/option/NoteOptionViewModel.kt",
    "content": "package net.pantasystem.milktea.note.option\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.handler.AppGlobalError\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorAction\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.note.*\nimport javax.inject.Inject\n\n@HiltViewModel\nclass NoteOptionViewModel @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val noteRepository: NoteRepository,\n    private val noteRelationGetter: NoteRelationGetter,\n    private val loggerFactory: Logger.Factory,\n    private val featureEnables: FeatureEnables,\n    private val userActionAppGlobalErrorStore: UserActionAppGlobalErrorStore,\n    private val savedStateHandle: SavedStateHandle,\n    private val getShareNote: GetShareNoteUrlUseCase,\n) : ViewModel() {\n    companion object {\n        const val NOTE_ID = \"NoteOptionViewModel.NOTE_ID\"\n        const val FROM_PAGEABLE = \"NoteOptionViewModel.FROM_PAGEABLE\"\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"NoteOptionViewModel\")\n    }\n\n    private val noteIdFlow = savedStateHandle.getStateFlow<Note.Id?>(NOTE_ID, null)\n\n    private val noteState = noteIdFlow.filterNotNull().map { noteId ->\n        noteRepository.findNoteState(noteId).onFailure {\n            logger.error(\"noteState load error\", it)\n        }.getOrNull()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null\n    )\n\n    val fromPageable: Pageable? = savedStateHandle[FROM_PAGEABLE]\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val note = noteIdFlow.filterNotNull().flatMapLatest {\n        noteRepository.observeOne(it)\n    }.filterNotNull().map {\n        noteRelationGetter.get(it).getOrThrow()\n    }.catch {\n\n    }.flowOn(Dispatchers.IO).stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val currentAccount = noteIdFlow.filterNotNull().map { noteId ->\n        accountRepository.get(noteId.accountId).onFailure {\n            logger.error(\"get account error\", it)\n        }.getOrNull()\n    }.flowOn(Dispatchers.IO).stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val noteInfo = combine(noteIdFlow, noteState, note) { id, state, note ->\n        Triple(id, state, note)\n    }\n\n    private val enableFeatures = currentAccount.filterNotNull().map {\n        featureEnables.enableFeatures(it.normalizedInstanceUri)\n    }.distinctUntilChanged()\n\n    val noteOptionUrl = noteIdFlow.filterNotNull().map {\n        getShareNote(it).getOrNull()\n    }.distinctUntilChanged()\n\n    val uiState = combine(\n        noteInfo,\n        currentAccount,\n        enableFeatures,\n        noteOptionUrl,\n    ) { (id, state, note), ac, features, shareUrl ->\n        NoteOptionUiState(\n            noteId = id,\n            noteState = state,\n            note = note?.note,\n            isMyNote = note?.note?.userId?.id == ac?.remoteId,\n            currentAccount = ac,\n            noteRelation = note,\n            isSupportReactionUsers = features.contains(FeatureType.PostReactionUsers),\n            noteOriginUrl = shareUrl,\n        )\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), NoteOptionUiState())\n\n    init {\n        viewModelScope.launch {\n            noteIdFlow.filterNotNull().map {\n                noteRepository.sync(it)\n            }.catch {\n                logger.error(\"sync note error\", it)\n            }.collect()\n        }\n    }\n\n    fun createThreadMute(noteId: Note.Id) {\n        viewModelScope.launch {\n            noteRepository.createThreadMute(noteId).onFailure {\n                logger.error(\"create thread mute failed\", it)\n                if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"NoteOptionViewModel.createThreadMute\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"Create thread mute failed\"),\n                            it,\n                            true\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                    )\n                ) {\n                    createThreadMute(noteId)\n                }\n            }\n            savedStateHandle[NOTE_ID] = noteId\n        }\n    }\n\n    fun deleteThreadMute(noteId: Note.Id) {\n        viewModelScope.launch {\n            noteRepository.deleteThreadMute(noteId).onFailure {\n                logger.error(\"delete thread mute failed\", it)\n                if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"NoteOptionViewModel.deleteThreadMute\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"Delete thread mute failed\"),\n                            it,\n                            true\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                    )\n                ) {\n                    deleteThreadMute(noteId)\n                }\n            }\n            savedStateHandle[NOTE_ID] = noteId\n        }\n    }\n\n}\n\ndata class NoteOptionUiState(\n    val noteId: Note.Id? = null,\n    val noteState: NoteState? = null,\n    val note: Note? = null,\n    val noteRelation: NoteRelation? = null,\n    val isMyNote: Boolean = false,\n    val currentAccount: Account? = null,\n    val isSupportReactionUsers: Boolean = false,\n    val noteOriginUrl: String? = null,\n) {\n    val isVisibleReactionUsersSelection =\n        currentAccount != null && note?.id != null && isSupportReactionUsers\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/pinned/PinnedNoteFragment.kt",
    "content": "package net.pantasystem.milktea.note.pinned\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common_android_ui.UserPinnedNotesFragmentFactory\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.FragmentPinnedNotesBinding\nimport net.pantasystem.milktea.note.timeline.TimelineListAdapter\nimport net.pantasystem.milktea.note.view.NoteCardActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@AndroidEntryPoint\nclass PinnedNoteFragment : Fragment(R.layout.fragment_pinned_notes) {\n\n    companion object {\n        fun newInstance(userId: User.Id): Fragment {\n            return PinnedNoteFragment().apply {\n                arguments = Bundle().apply {\n                    putSerializable(PinnedNotesViewModel.EXTRA_USER_ID, userId)\n                }\n            }\n        }\n    }\n\n    @Inject\n    lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    lateinit var channelDetailNavigation: ChannelDetailNavigation\n\n    @Inject\n    lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var searchNavigation: SearchNavigation\n\n    val notesViewModel: NotesViewModel by activityViewModels()\n\n    val pinnedNotesViewModel: PinnedNotesViewModel by viewModels()\n\n    val binding: FragmentPinnedNotesBinding by dataBinding()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val adapter = TimelineListAdapter(\n            configRepository = configRepository,\n            viewLifecycleOwner,\n            onRefreshAction = {\n\n            },\n            onReauthenticateAction = {\n                startActivity(\n                    authorizationNavigation.newIntent(\n                        AuthorizationArgs.ReAuth(\n                            accountStore.currentAccount\n                        )\n                    )\n                )\n            },\n        ) {\n            NoteCardActionHandler(\n                requireActivity() as AppCompatActivity,\n                notesViewModel,\n                settingStore,\n                userDetailNavigation,\n                channelDetailNavigation,\n                searchNavigation,\n            ).onAction(it)\n        }\n\n        binding.listView.adapter = adapter\n        binding.listView.layoutManager = LinearLayoutManager(requireContext())\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                pinnedNotesViewModel.notes.collect {\n                    adapter.submitList(it)\n                }\n            }\n        }\n    }\n}\n\n@Singleton\nclass UserPinnedNotesFragmentFactoryImpl @Inject constructor(): UserPinnedNotesFragmentFactory {\n    override fun create(userId: User.Id): Fragment {\n        return PinnedNoteFragment.newInstance(userId)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/pinned/PinnedNotesViewModel.kt",
    "content": "package net.pantasystem.milktea.note.pinned\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_navigation.EXTRA_ACCOUNT_ID\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.CurrentAccountWatcher\nimport net.pantasystem.milktea.model.note.FindPinnedNoteUseCase\nimport net.pantasystem.milktea.model.note.NoteRelationGetter\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.user.Acct\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimelineListItem\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\nimport javax.inject.Inject\n\n@HiltViewModel\nclass PinnedNotesViewModel @Inject constructor(\n    val findPinnedNoteUseCase: FindPinnedNoteUseCase,\n    val userRepository: UserRepository,\n    val accountRepository: AccountRepository,\n    val userDataSource: UserDataSource,\n    val noteRelationGetter: NoteRelationGetter,\n    val noteRepository: NoteRepository,\n    val loggerFactory: Logger.Factory,\n    planeNoteViewDataCacheFactory: PlaneNoteViewDataCache.Factory,\n    savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_ACCT = \"PinnedNotesViewModel.EXTRA_ACCT\"\n        const val EXTRA_USER_ID = \"PinnedNotesViewModel.EXTRA_USER_ID\"\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"PinnedNotesViewModel\")\n    }\n\n    private val userId: User.Id? by lazy {\n        savedStateHandle[EXTRA_USER_ID]\n    }\n\n    private val accountId: Long? by lazy {\n        userId?.accountId\n            ?: savedStateHandle.get<Long>(EXTRA_ACCOUNT_ID).let {\n                if (it == -1L) null else it\n            }\n    }\n\n    private val acct: Acct? by lazy {\n        savedStateHandle.get<String>(EXTRA_ACCT)?.let {\n            Acct(it)\n        }\n    }\n\n    private val accountWatcher = CurrentAccountWatcher(currentAccountId = accountId, accountRepository)\n\n    private val cache = planeNoteViewDataCacheFactory.create(accountWatcher::getAccount, viewModelScope)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val notes = suspend {\n        getUserId()\n    }.asFlow().flatMapLatest {\n        userRepository.observe(it).distinctUntilChanged()\n    }.flatMapLatest {\n        suspend {\n            findPinnedNoteUseCase.invoke(getUserId()).getOrThrow()\n        }.asLoadingStateFlow()\n    }.map { resultState ->\n        resultState.suspendConvert { notes ->\n            cache.useByIds(notes.map { it.id })\n        }\n    }.map { resultState ->\n        when(val content = resultState.content) {\n            is StateContent.Exist -> {\n                content.rawContent.map {\n                    TimelineListItem.Note(it)\n                }\n            }\n            is StateContent.NotExist -> {\n                listOf(when(resultState) {\n                    is ResultState.Error -> TimelineListItem.Error(resultState.throwable)\n                    is ResultState.Fixed -> TimelineListItem.Empty\n                    is ResultState.Loading -> TimelineListItem.Loading\n                })\n            }\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), listOf(TimelineListItem.Loading))\n\n    init {\n        viewModelScope.launch {\n            runCancellableCatching {\n                getUserId()\n            }.mapCancellableCatching {\n                userRepository.find(it, true) as User.Detail\n            }.mapCancellableCatching { user ->\n                user.info.pinnedNoteIds?.map {\n                    noteRepository.sync(it)\n                }\n            }.onFailure {\n                logger.error(\"sync note error\", it)\n            }\n        }\n    }\n\n    private suspend fun getUserId(): User.Id {\n        if (userId != null) {\n            return requireNotNull(userId)\n        }\n\n        val account = accountWatcher.getAccount()\n        if (acct != null) {\n            val (userName, host) = requireNotNull(acct).let {\n                it.userName to it.host\n            }\n            return userRepository.findByUserName(account.accountId, userName, host).id\n        }\n        throw IllegalStateException()\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/poll/PollHelper.kt",
    "content": "package net.pantasystem.milktea.note.poll\n\nimport android.view.View\nimport android.widget.LinearLayout\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\n\nobject PollHelper {\n\n    @BindingAdapter(\"noteId\", \"poll\", \"noteCardActionListenerAdapter\")\n    @JvmStatic\n    fun LinearLayout.bindPollChoices(noteId: Note.Id?, poll: Poll?, noteCardActionListenerAdapter: NoteCardActionListenerAdapter?) {\n        if (noteId == null || poll == null || noteCardActionListenerAdapter == null) {\n            this.visibility = View.GONE\n            return\n        } else {\n            this.visibility = View.VISIBLE\n        }\n        PollListLinearLayoutBinder.bindPollChoices(this, noteId, poll, noteCardActionListenerAdapter)\n//        PollListLinearLayoutBinder.bindVoteResult(this, poll.totalVoteCount)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/poll/PollListAdapter.kt",
    "content": "package net.pantasystem.milktea.note.poll\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.poll.Poll\n\n\ndata class OnVoted(\n    val noteId: Note.Id,\n    val choice: Poll.Choice,\n    val poll: Poll,\n)"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/poll/PollListLinearLayoutBinder.kt",
    "content": "package net.pantasystem.milktea.note.poll\n\nimport android.view.LayoutInflater\nimport android.widget.LinearLayout\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemChoiceBinding\nimport net.pantasystem.milktea.note.databinding.ItemVoteResultBinding\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\n\nobject PollListLinearLayoutBinder {\n\n    fun bindPollChoices(\n        layout: LinearLayout,\n        noteId: Note.Id,\n        poll: Poll,\n        noteCardActionListenerAdapter: NoteCardActionListenerAdapter\n    ) {\n        while(layout.childCount > poll.choices.size) {\n            layout.removeViewAt(layout.childCount - 1)\n        }\n        poll.choices.forEachIndexed { index, choice ->\n            val existingBinding = if (index < layout.childCount) {\n                ItemChoiceBinding.bind(layout.getChildAt(index))\n            } else {\n                null\n            }\n\n            val binding = existingBinding ?: ItemChoiceBinding.inflate(LayoutInflater.from(layout.context), layout, false)\n\n            bindItem(binding, choice, noteId, poll) {\n                noteCardActionListenerAdapter.onPollChoiceClicked(it.noteId, poll, it.choice)\n            }\n\n            if (existingBinding == null) {\n                layout.addView(binding.root)\n            }\n        }\n    }\n\n    fun bindVoteResult(\n        layout: LinearLayout,\n        totalVoteCount: Int\n    ) {\n        val binding = ItemVoteResultBinding.inflate(LayoutInflater.from(layout.context), layout, false)\n\n        binding.voteResult.text = layout.context.getString(R.string.total_vote_count, totalVoteCount.toString())\n        layout.addView(binding.root)\n    }\n}\n\nprivate fun bindItem(\n    binding: ItemChoiceBinding,\n    choice: Poll.Choice,\n    noteId: Note.Id,\n    poll: Poll,\n    onVoteSelected: (OnVoted) -> Unit\n) {\n    binding.radioChoice.setOnClickListener {\n        onVoteSelected(OnVoted(noteId, choice, poll))\n    }\n\n    binding.radioChoice.text = choice.text\n    binding.radioChoice.isEnabled = poll.canVote\n    binding.radioChoice.isChecked = choice.isVoted\n\n    binding.progressBar.max = poll.totalVoteCount\n    binding.progressBar.progress = choice.votes\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/CustomEmojiImageViewSizeHelper.kt",
    "content": "@file:Suppress(\"UNCHECKED_CAST\")\n\npackage net.pantasystem.milktea.note.reaction\n\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport kotlin.math.max\n\nobject CustomEmojiImageViewSizeHelper {\n\n    fun<T: ViewGroup.LayoutParams> ImageView.applySizeByAspectRatio(baseHeightDp: Int, aspectRatio: Float?) {\n        val metrics = resources.displayMetrics\n        val heightPx = baseHeightDp * metrics.density\n        applySizeByAspectRatio<T>(heightPx, aspectRatio)\n    }\n\n    fun<T: ViewGroup.LayoutParams> ImageView.applySizeByAspectRatio(baseHeightPx: Float, aspectRatio: Float?) {\n        val (imageViewWidthPx, imageViewHeightPx) = calculateImageWidthAndHeightSize(baseHeightPx, aspectRatio)\n        val params = layoutParams as T\n        params.height = imageViewHeightPx.toInt()\n        params.width = max(imageViewWidthPx, imageViewHeightPx).toInt()\n        layoutParams = params\n    }\n\n    fun calculateImageWidthAndHeightSize(baseHeightPx: Float, aspectRatio: Float?): Pair<Float, Float> {\n        val imageViewWidthPx = if (aspectRatio == null) {\n            baseHeightPx\n        } else {\n            (baseHeightPx * aspectRatio)\n        }\n        return imageViewWidthPx to baseHeightPx\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/ImageAspectRatioCache.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport android.util.SparseArray\n\nobject ImageAspectRatioCache {\n\n    private var cache = SparseArray<Float>()\n\n    fun put(url: String?, aspect: Float) {\n        url?: return\n        synchronized(this) {\n            cache[url.hashCode()] = aspect\n        }\n    }\n\n    fun get(url: String?): Float? {\n        url ?: return null\n        return cache[url.hashCode()]\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/NoteReactionViewHelper.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport android.content.Context\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common_android.ui.FontSizeUnitConverter.setMemoFontPxSize\nimport net.pantasystem.milktea.common_android.ui.FontSizeUnitConverter.specialPointToPixel\nimport net.pantasystem.milktea.common_android.ui.VisibilityHelper.setMemoVisibility\nimport net.pantasystem.milktea.common_android_ui.BindingProvider\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.note.reaction.CustomEmojiImageViewSizeHelper.applySizeByAspectRatio\nimport net.pantasystem.milktea.note.reaction.CustomEmojiImageViewSizeHelper.calculateImageWidthAndHeightSize\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\n\nobject NoteReactionViewHelper {\n\n//    const val REACTION_IMAGE_WIDTH_SIZE_DP = 20\n\n    fun LinearLayout.bindReactionCount(\n        reactionTextTypeView: TextView,\n        reactionImageTypeView: ImageView,\n        reaction: ReactionViewData,\n        reactionBaseSizeSp: Float,\n    ) {\n        val textReaction = reaction.reaction\n\n        val emoji = reaction.emoji\n\n        val baseHeightPx = context.specialPointToPixel(reactionBaseSizeSp)\n\n\n        if (emoji == null) {\n            reactionImageTypeView.setMemoVisibility(View.GONE)\n            reactionImageTypeView.setImageDrawable(null)\n\n            reactionTextTypeView.setMemoVisibility(View.VISIBLE)\n            reactionTextTypeView.text = textReaction\n            reactionTextTypeView.setMemoFontPxSize(baseHeightPx)\n        } else {\n            reactionImageTypeView.setMemoVisibility(View.VISIBLE)\n            reactionTextTypeView.setMemoVisibility(View.GONE)\n\n            val imageAspectRatio =\n                ImageAspectRatioCache.get(emoji.url ?: emoji.uri) ?: emoji.aspectRatio\n\n            val (imageViewWidthPx, imageViewHeightPx) = calculateImageWidthAndHeightSize(\n                baseHeightPx,\n                imageAspectRatio\n            )\n            reactionImageTypeView.applySizeByAspectRatio<LinearLayout.LayoutParams>(\n                baseHeightPx * 1.2f,\n                imageAspectRatio\n            )\n\n\n            if (emoji.cachePath == null) {\n                GlideApp.with(reactionImageTypeView.context)\n                    .load(emoji.url ?: emoji.uri)\n                    .override(imageViewWidthPx.toInt(), imageViewHeightPx.toInt())\n                    .addListener(SaveImageAspectRequestListener(emoji, context))\n                    .into(reactionImageTypeView)\n            } else {\n                GlideApp.with(reactionImageTypeView.context)\n                    .load(emoji.cachePath)\n                    .error(\n                        GlideApp.with(reactionImageTypeView.context)\n                            .load(emoji.url ?: emoji.uri)\n                            .override(imageViewWidthPx.toInt(), imageViewHeightPx.toInt())\n                            .addListener(SaveImageAspectRequestListener(emoji, context))\n                    )\n                    .override(imageViewWidthPx.toInt(), imageViewHeightPx.toInt())\n                    .addListener(SaveImageAspectRequestListener(emoji, context))\n                    .into(reactionImageTypeView)\n            }\n\n        }\n    }\n\n\n    @JvmStatic\n    fun setReactionCount(\n        context: Context,\n        reactionTextTypeView: TextView,\n        reactionImageTypeView: ImageView,\n        reaction: String,\n        note: PlaneNoteViewData,\n    ) {\n        val entryPoint = EntryPointAccessors.fromApplication(\n            context.applicationContext,\n            BindingProvider::class.java\n        )\n        val cache = entryPoint.customEmojiRepository()\n\n        val textReaction = LegacyReaction.reactionMap[reaction] ?: reaction\n        val emojiMap = cache.getAndConvertToMap(note.account.getHost())\n\n        val r = Reaction(textReaction)\n        val emoji = note.currentNote.value.emojiNameMap?.get(textReaction.replace(\":\", \"\"))\n            ?: emojiMap?.get(r.getName())\n\n\n        if (emoji == null) {\n            reactionImageTypeView.setMemoVisibility(View.GONE)\n            reactionTextTypeView.setMemoVisibility(View.VISIBLE)\n            reactionTextTypeView.text = textReaction\n        } else {\n            reactionImageTypeView.setMemoVisibility(View.VISIBLE)\n            reactionTextTypeView.setMemoVisibility(View.GONE)\n\n            GlideApp.with(reactionImageTypeView.context)\n                .load(emoji.getLoadUrl())\n                .error(\n                    GlideApp.with(reactionImageTypeView.context)\n                        .load(emoji.url ?: emoji.uri)\n                )\n                .into(reactionImageTypeView)\n        }\n\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/ReactionButtonHelper.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport android.widget.ImageButton\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.note.R\n\nobject ReactionButtonHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"isReacted\", \"isAcceptingOnlyFavoriteReaction\")\n    fun ImageButton.setIsReacted(isReacted: Boolean?, isAcceptingOnlyFavoriteReaction: Boolean?){\n        if(isReacted == true){\n            this.setImageResource(R.drawable.ic_remove_black_24dp)\n        }else{\n            if (isAcceptingOnlyFavoriteReaction == true) {\n                this.setImageResource(R.drawable.ic_baseline_favorite_border_24)\n            } else {\n                this.setImageResource(R.drawable.ic_add_black_24dp)\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/ReactionCountAdapter.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\nsealed interface ReactionCountAction {\n    data class OnClicked(val note: PlaneNoteViewData, val reaction: String) : ReactionCountAction\n    data class OnLongClicked(val note: PlaneNoteViewData, val reaction: String) :\n        ReactionCountAction\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/ReactionHelper.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport android.widget.LinearLayout\nimport androidx.core.content.ContextCompat\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.note.R\n\nobject ReactionHelper {\n\n    fun LinearLayout.applyBackgroundColor(reaction: ReactionViewData, isMisskey: Boolean){\n\n        // NOTE: Misskeyはローカルに存在するカスタム絵文字しかリアクションすることができない\n        if (isMisskey) {\n            if(!Reaction(reaction.reaction).isLocal()) {\n                this.background = ContextCompat.getDrawable(context, R.drawable.shape_normal_reaction_backgruond)?.apply {\n                    alpha = 75\n                }\n                return\n            }\n        }\n\n        if(reaction.isMyReaction){\n            this.background = ContextCompat.getDrawable(context, R.drawable.shape_selected_reaction_background)\n        }else{\n            this.background = ContextCompat.getDrawable(context, R.drawable.shape_normal_reaction_backgruond)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/ReactionSelectionDialog.kt",
    "content": "\npackage net.pantasystem.milktea.note.reaction\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.ReactionSelection\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.DialogSelectReactionBinding\nimport net.pantasystem.milktea.note.emojis.EmojiPickerFragment\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ReactionSelectionDialog : BottomSheetDialogFragment(),\n    ReactionSelection, EmojiPickerFragment.OnEmojiSelectedListener {\n\n    companion object {\n        const val FRAGMENT_TAG = \"ReactionSelectionDialog\"\n        fun newInstance(noteId: Note.Id): ReactionSelectionDialog {\n            return ReactionSelectionDialog().apply {\n                arguments = Bundle().apply {\n                    putLong(\"ACCOUNT_ID\", noteId.accountId)\n                    putString(\"NOTE_ID\", noteId.noteId)\n                }\n            }\n        }\n    }\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    val notesViewModel by activityViewModels<NotesViewModel>()\n\n\n\n    private val noteId: Note.Id by lazy {\n        Note.Id(\n            requireArguments().getLong(\"ACCOUNT_ID\"),\n            requireArguments().getString(\"NOTE_ID\")!!\n        )\n    }\n\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        Log.d(\"ReactionSelectionDialog\", \"ReactionSelectionDialog#onCreateView\")\n        return inflater.inflate(R.layout.dialog_select_reaction, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val binding = DialogSelectReactionBinding.bind(view)\n        binding.lifecycleOwner = this\n\n        if (savedInstanceState == null) {\n            val fragment = EmojiPickerFragment.newInstance(noteId.accountId)\n            childFragmentManager.beginTransaction().also { ft ->\n                ft.add(R.id.fragmentBaseContainer, fragment)\n            }.commit()\n        }\n\n    }\n\n    override fun selectReaction(reaction: String) {\n        notesViewModel.toggleReaction(noteId, reaction)\n        dismiss()\n    }\n\n    override fun onSelect(emoji: String) {\n        notesViewModel.toggleReaction(noteId, emoji)\n        dismiss()\n    }\n\n\n\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/ReactionViewData.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\n\ndata class ReactionViewData(\n    val noteId: Note.Id,\n    val reaction: String,\n    val reactionCount: ReactionCount,\n    val isMyReaction: Boolean,\n    val emoji: CustomEmoji?\n) {\n    companion object {\n        fun from(\n            reactions: List<ReactionCount>,\n            note: Note,\n        ): List<ReactionViewData> {\n            val noteEmojis = note.emojiNameMap\n            return reactions.map { reactionCount ->\n\n                val textReaction = LegacyReaction.reactionMap[reactionCount.reaction] ?: reactionCount.reaction\n                val r = Reaction(textReaction)\n                val emoji = noteEmojis?.get(textReaction.replace(\":\", \"\"))\n                    ?: noteEmojis?.get(r.getName())\n                ReactionViewData(\n                    noteId = note.id,\n                    reaction = textReaction,\n                    reactionCount = reactionCount,\n                    isMyReaction = reactionCount.me,\n                    emoji = emoji\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/RemoteReactionEmojiSuggestionDialog.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.flexbox.AlignItems\nimport com.google.android.flexbox.FlexboxLayoutManager\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common_android_ui.reaction.ReactionChoicesAdapter\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.DialogRemoteReactionEmojiSuggestionBinding\nimport net.pantasystem.milktea.note.reaction.viewmodel.RemoteReactionEmojiSuggestionViewModel\n\nprivate const val EXTRA_REACTION = \"EXTRA_REACTION\"\nprivate const val EXTRA_ACCOUNT_ID = \"EXTRA_ACCOUNT_ID\"\nprivate const val EXTRA_NOTE_ID = \"EXTRA_NOTE_ID\"\n\n@AndroidEntryPoint\nclass RemoteReactionEmojiSuggestionDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"RemoteReactionEmojiSuggestionDialog\"\n        fun newInstance(accountId: Long, noteId: String, reaction: String): RemoteReactionEmojiSuggestionDialog {\n            return RemoteReactionEmojiSuggestionDialog().also { fragment ->\n                fragment.arguments = Bundle().also { bundle ->\n                    bundle.putString(EXTRA_REACTION, reaction)\n                    bundle.putLong(EXTRA_ACCOUNT_ID, accountId)\n                    bundle.putString(EXTRA_NOTE_ID, noteId)\n                }\n            }\n        }\n    }\n\n\n    val viewModel: RemoteReactionEmojiSuggestionViewModel by activityViewModels()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.dialog_remote_reaction_emoji_suggestion, container, false)\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val binding = DialogRemoteReactionEmojiSuggestionBinding.bind(view)\n\n        val reaction = requireArguments().getString(EXTRA_REACTION)!!\n        val noteId = requireArguments().getString(EXTRA_NOTE_ID)!!\n        val accountId = requireArguments().getLong(EXTRA_ACCOUNT_ID)\n        viewModel.setReaction(accountId, reaction = reaction, noteId = noteId)\n\n        val adapter = ReactionChoicesAdapter {\n            viewModel.send()\n            dismiss()\n        }\n        binding.suggestedEmojis.adapter = adapter\n        val flexBoxLayoutManager = FlexboxLayoutManager(binding.suggestedEmojis.context)\n        flexBoxLayoutManager.alignItems = AlignItems.STRETCH\n        binding.suggestedEmojis.layoutManager = flexBoxLayoutManager\n        viewLifecycleOwner.lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                viewModel.filteredEmojis.collect { state ->\n                    when (state) {\n                        is ResultState.Loading -> {\n                            binding.progressBar.visibility = View.VISIBLE\n                            binding.suggestedEmojis.visibility = View.GONE\n                            binding.errorMessage.visibility = View.GONE\n                        }\n                        is ResultState.Fixed -> {\n                            binding.progressBar.visibility = View.GONE\n                            binding.suggestedEmojis.visibility = View.VISIBLE\n                            val emojis = (state.content as? StateContent.Exist)?.rawContent?: emptyList()\n                            if (emojis.isEmpty()) {\n                                binding.errorMessage.visibility = View.VISIBLE\n                                binding.errorMessage.text = getString(R.string.the_remote_emoji_does_not_exist_in_this_instance)\n                            } else {\n                                binding.errorMessage.visibility = View.GONE\n                            }\n                            adapter.submitList(emojis.map {\n                                \":${it.name}:\"\n                            })\n                        }\n                        is ResultState.Error -> {\n                            binding.progressBar.visibility = View.GONE\n                            binding.suggestedEmojis.visibility = View.GONE\n                            binding.errorMessage.visibility = View.VISIBLE\n                            binding.errorMessage.text = state.throwable.stackTraceToString()\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/SaveImageAspectRequestListener.kt",
    "content": "package net.pantasystem.milktea.note.reaction\n\nimport android.content.Context\nimport android.graphics.drawable.Drawable\nimport com.bumptech.glide.load.DataSource\nimport com.bumptech.glide.load.engine.GlideException\nimport com.bumptech.glide.request.RequestListener\nimport com.bumptech.glide.request.target.Target\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common_android_ui.BindingProvider\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\n\nclass SaveImageAspectRequestListener(\n    val emoji: CustomEmoji,\n    val context: Context,\n) : RequestListener<Drawable> {\n    override fun onLoadFailed(\n        e: GlideException?,\n        model: Any?,\n        target: Target<Drawable>?,\n        isFirstResource: Boolean,\n    ): Boolean {\n        return false\n    }\n\n    override fun onResourceReady(\n        resource: Drawable?,\n        model: Any?,\n        target: Target<Drawable>?,\n        dataSource: DataSource?,\n        isFirstResource: Boolean,\n    ): Boolean {\n        resource ?: return false\n        val imageAspectRatio: Float = resource.intrinsicWidth.toFloat() / resource.intrinsicHeight\n        val navigationEntryPoint = EntryPointAccessors.fromApplication(\n            context,\n            BindingProvider::class.java\n        )\n        navigationEntryPoint.customEmojiAspectRatioStore().save(\n            emoji, imageAspectRatio\n        )\n\n        if (emoji.aspectRatio == null || emoji.aspectRatio != imageAspectRatio) {\n            ImageAspectRatioCache.put(emoji.url ?: emoji.uri, imageAspectRatio)\n        }\n        navigationEntryPoint.emojiImageCacheStore().save(emoji)\n\n\n        return false\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/choices/EmojiListItemsAdapter.kt",
    "content": "package net.pantasystem.milktea.note.reaction.choices\n\nimport android.os.Handler\nimport android.os.Looper\nimport android.util.TypedValue\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.LinearLayout\nimport androidx.databinding.DataBindingUtil\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.RecyclerView\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android.ui.VisibilityHelper.setMemoVisibility\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport net.pantasystem.milktea.note.EmojiListItemType\nimport net.pantasystem.milktea.note.EmojiType\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemEmojiChoiceBinding\nimport net.pantasystem.milktea.note.databinding.ItemEmojiListItemHeaderBinding\nimport net.pantasystem.milktea.note.reaction.CustomEmojiImageViewSizeHelper.applySizeByAspectRatio\nimport net.pantasystem.milktea.note.reaction.ImageAspectRatioCache\nimport net.pantasystem.milktea.note.reaction.SaveImageAspectRequestListener\nimport java.util.concurrent.Executors\nimport kotlin.math.abs\n\nclass EmojiListItemsAdapter(\n    private val isApplyImageAspectRatio: Boolean,\n    private val onEmojiSelected: (EmojiType) -> Unit,\n    private val onEmojiLongClicked: (EmojiType) -> Boolean,\n    private val baseItemSizeDp: Int = 28,\n) : RecyclerView.Adapter<EmojiListItemsAdapter.VH>() {\n\n    companion object {\n        // この閾値以上の差分は DiffUtil を使わず全置換する\n        private const val FULL_REPLACE_THRESHOLD = 200\n    }\n\n    private var items: List<EmojiListItemType> = emptyList()\n\n    // 最後に submitList されたリストへの参照（古い diff 結果を破棄するために使用）\n    @Volatile\n    private var latestSubmittedList: List<EmojiListItemType> = emptyList()\n\n    private val bgExecutor = Executors.newSingleThreadExecutor()\n    private val mainHandler = Handler(Looper.getMainLooper())\n\n    fun submitList(newList: List<EmojiListItemType>) {\n        latestSubmittedList = newList\n\n        val oldList = items\n        val sizeDiff = abs(oldList.size - newList.size)\n\n        // 大きな差分（検索モード切替など）は即座に全置換\n        if (sizeDiff >= FULL_REPLACE_THRESHOLD) {\n            items = newList\n            notifyDataSetChanged()\n            return\n        }\n\n        // 小規模差分: バックグラウンドで DiffUtil を実行\n        // detectMoves=false で移動検出を省略し計算を高速化\n        bgExecutor.execute {\n            val capturedLatest = latestSubmittedList\n            if (capturedLatest !== newList) return@execute  // より新しいリクエストが来ていたらスキップ\n\n            val result = DiffUtil.calculateDiff(object : DiffUtil.Callback() {\n                override fun getOldListSize() = oldList.size\n                override fun getNewListSize() = newList.size\n\n                override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                    val old = oldList[oldItemPosition]\n                    val new = newList[newItemPosition]\n                    if (old is EmojiListItemType.EmojiItem && new is EmojiListItemType.EmojiItem) {\n                        return old.emoji.areItemsTheSame(new.emoji)\n                    }\n                    return old == new\n                }\n\n                override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                    return oldList[oldItemPosition] == newList[newItemPosition]\n                }\n            }, false)\n\n            mainHandler.post {\n                if (latestSubmittedList !== newList) return@post  // 結果適用前に新しいリクエストが来ていたらスキップ\n                items = newList\n                result.dispatchUpdatesTo(this@EmojiListItemsAdapter)\n            }\n        }\n    }\n\n    val currentList: List<EmojiListItemType> get() = items\n\n    override fun getItemCount() = items.size\n\n    override fun getItemViewType(position: Int): Int {\n        return when (items[position]) {\n            is EmojiListItemType.EmojiItem -> ItemType.Emoji.ordinal\n            is EmojiListItemType.Header -> ItemType.Header.ordinal\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {\n        return when (ItemType.values()[viewType]) {\n            ItemType.Header -> {\n                val binding = ItemEmojiListItemHeaderBinding.inflate(\n                    LayoutInflater.from(parent.context),\n                    parent,\n                    false\n                )\n                HeaderVH(binding)\n            }\n            ItemType.Emoji -> {\n                val binding = DataBindingUtil.inflate<ItemEmojiChoiceBinding>(\n                    LayoutInflater.from(parent.context),\n                    R.layout.item_emoji_choice,\n                    parent,\n                    false\n                )\n                EmojiVH(binding, isApplyImageAspectRatio, baseItemSizeDp)\n            }\n        }\n    }\n\n    override fun onBindViewHolder(holder: VH, position: Int) {\n        when (val item = items[position]) {\n            is EmojiListItemType.EmojiItem -> {\n                (holder as EmojiVH).onBind(\n                    item.emoji,\n                    onEmojiLongClicked = onEmojiLongClicked,\n                    onEmojiSelected = onEmojiSelected\n                )\n            }\n            is EmojiListItemType.Header -> {\n                (holder as HeaderVH).binding.categoryName.text =\n                    item.label.getString(holder.binding.root.context)\n            }\n        }\n    }\n\n    sealed class VH(view: View) : RecyclerView.ViewHolder(view)\n\n    class EmojiVH(\n        val binding: ItemEmojiChoiceBinding,\n        private val isApplyImageAspectRatio: Boolean,\n        private val baseItemSizeDp: Int,\n    ) : VH(binding.root) {\n\n        fun onBind(\n            item: EmojiType, onEmojiSelected: (EmojiType) -> Unit,\n            onEmojiLongClicked: (EmojiType) -> Boolean,\n        ) {\n            when (item) {\n                is EmojiType.CustomEmoji -> {\n                    if (isApplyImageAspectRatio) {\n                        binding.reactionImagePreview.applySizeByAspectRatio<LinearLayout.LayoutParams>(\n                            baseItemSizeDp,\n                            item.emoji.aspectRatio ?: ImageAspectRatioCache.get(\n                                item.emoji.url ?: item.emoji.uri\n                            )\n                        )\n                    }\n                    if (item.emoji.cachePath == null) {\n                        GlideApp.with(binding.reactionImagePreview.context)\n                            .load(item.emoji.url ?: item.emoji.uri)\n                            .addListener(\n                                SaveImageAspectRequestListener(\n                                    item.emoji,\n                                    binding.root.context\n                                )\n                            )\n                            .into(binding.reactionImagePreview)\n                    } else {\n                        GlideApp.with(binding.reactionImagePreview.context)\n                            .load(item.emoji.cachePath)\n                            .addListener(\n                                SaveImageAspectRequestListener(\n                                    item.emoji,\n                                    binding.root.context\n                                )\n                            )\n                            .error(\n                                GlideApp.with(binding.reactionImagePreview.context)\n                                    .load(item.emoji.url ?: item.emoji.uri)\n                                    .addListener(\n                                        SaveImageAspectRequestListener(\n                                            item.emoji,\n                                            binding.root.context\n                                        )\n                                    )\n                            )\n                            .into(binding.reactionImagePreview)\n                    }\n\n                    binding.reactionStringPreview.setMemoVisibility(View.GONE)\n                    binding.reactionImagePreview.setMemoVisibility(View.VISIBLE)\n                }\n                is EmojiType.Legacy -> {\n                    binding.reactionStringPreview.setTextSize(TypedValue.COMPLEX_UNIT_DIP, baseItemSizeDp * 0.8f)\n                    binding.reactionImagePreview.setMemoVisibility(View.GONE)\n                    binding.reactionStringPreview.setMemoVisibility(View.VISIBLE)\n                    binding.reactionStringPreview.text =\n                        requireNotNull(LegacyReaction.reactionMap[item.type])\n                }\n                is EmojiType.UtfEmoji -> {\n                    binding.reactionStringPreview.setTextSize(TypedValue.COMPLEX_UNIT_DIP, baseItemSizeDp * 0.8f)\n                    binding.reactionStringPreview.setMemoVisibility(View.VISIBLE)\n                    binding.reactionImagePreview.setMemoVisibility(View.GONE)\n                    binding.reactionStringPreview.text = item.code\n                }\n            }\n            binding.root.setOnClickListener {\n                HapticFeedbackController.performClickHapticFeedback(it)\n                onEmojiSelected(item)\n            }\n            binding.root.setOnLongClickListener {\n                HapticFeedbackController.performLongClickHapticFeedback(it)\n                onEmojiLongClicked(item)\n            }\n            binding.executePendingBindings()\n        }\n    }\n\n    class HeaderVH(val binding: ItemEmojiListItemHeaderBinding) : VH(binding.root)\n\n    enum class ItemType {\n        Header, Emoji\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/history/ReactionHistoryListAdapter.kt",
    "content": "package net.pantasystem.milktea.note.reaction.history\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.EmojiType\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemReactionHistoryHeaderBinding\nimport net.pantasystem.milktea.note.databinding.ItemSimpleUserBinding\n\nclass ReactionHistoryListAdapter(\n    val lifecycleOwner: LifecycleOwner\n) : ListAdapter<ReactionHistoryListType, ReactionHistoryViewHolder>(Diff()) {\n\n    class Diff : DiffUtil.ItemCallback<ReactionHistoryListType>() {\n        override fun areContentsTheSame(\n            oldItem: ReactionHistoryListType,\n            newItem: ReactionHistoryListType\n        ): Boolean {\n            return oldItem == newItem\n        }\n\n        override fun areItemsTheSame(\n            oldItem: ReactionHistoryListType,\n            newItem: ReactionHistoryListType\n        ): Boolean {\n            if (oldItem is ReactionHistoryListType.ItemUser && newItem is ReactionHistoryListType.ItemUser) {\n                return oldItem.user.id == newItem.user.id\n            }\n            return oldItem == newItem\n        }\n    }\n\n    inner class ViewHolder(val binding: ItemSimpleUserBinding) :\n        RecyclerView.ViewHolder(binding.root) {\n        fun bind(user: User) {\n            binding.user = user\n            binding.lifecycleOwner = lifecycleOwner\n            binding.executePendingBindings()\n        }\n    }\n\n\n\n    override fun getItemViewType(position: Int): Int {\n        return when (getItem(position)) {\n            is ReactionHistoryListType.Header -> {\n                VHType.Header.ordinal\n            }\n            is ReactionHistoryListType.ItemUser -> {\n                VHType.User.ordinal\n            }\n            ReactionHistoryListType.Loading -> {\n                VHType.Loading.ordinal\n            }\n        }\n    }\n\n    override fun onBindViewHolder(holder: ReactionHistoryViewHolder, position: Int) {\n        when(val item = getItem(position)) {\n            is ReactionHistoryListType.Header -> {\n                (holder as ReactionHistoryViewHolder.HeaderView).onBind(item.emojiType)\n            }\n            is ReactionHistoryListType.ItemUser -> {\n                (holder as ReactionHistoryViewHolder.UserView).onBind(item.user, item.account)\n            }\n            ReactionHistoryListType.Loading -> {\n                // 何もしない\n            }\n        }\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ReactionHistoryViewHolder {\n        return when (VHType.values()[viewType]) {\n            VHType.Loading -> ReactionHistoryViewHolder.LoadingView(\n                LayoutInflater.from(parent.context)\n                    .inflate(R.layout.item_reaction_history_loading, parent, false)\n            )\n            VHType.User -> ReactionHistoryViewHolder.UserView(\n                DataBindingUtil.inflate(\n                    LayoutInflater.from(\n                        parent.context\n                    ), R.layout.item_simple_user, parent, false\n                ), lifecycleOwner\n            )\n            VHType.Header -> ReactionHistoryViewHolder.HeaderView(\n                DataBindingUtil.inflate(\n                    LayoutInflater.from(parent.context),\n                    R.layout.item_reaction_history_header,\n                    parent,\n                    false\n                )\n            )\n        }\n    }\n\n}\n\nsealed class ReactionHistoryViewHolder(view: View) : RecyclerView.ViewHolder(view) {\n    class LoadingView(view: View) : ReactionHistoryViewHolder(view)\n    class UserView(val binding: ItemSimpleUserBinding, val lifecycleOwner: LifecycleOwner) :\n        ReactionHistoryViewHolder(binding.root) {\n        fun onBind(user: User, account: Account?) {\n            binding.user = user\n            binding.account = account\n            binding.lifecycleOwner = lifecycleOwner\n            binding.executePendingBindings()\n        }\n    }\n\n    class HeaderView(val binding: ItemReactionHistoryHeaderBinding) :\n        ReactionHistoryViewHolder(binding.root) {\n        fun onBind(emojiType: EmojiType) {\n            when (emojiType) {\n                is EmojiType.CustomEmoji -> {\n                    binding.customEmojiView.isVisible = true\n                    binding.emojiView.isVisible = false\n                    GlideApp.with(binding.customEmojiView)\n                        .load(emojiType.emoji.uri ?: emojiType.emoji.url)\n                        .into(binding.customEmojiView)\n                }\n                is EmojiType.Legacy -> {\n                    binding.customEmojiView.isVisible = false\n                    binding.emojiView.isVisible = true\n                    binding.emojiView.text = requireNotNull(LegacyReaction.reactionMap[emojiType.type])\n                }\n                is EmojiType.UtfEmoji -> {\n                    binding.customEmojiView.isVisible = false\n                    binding.emojiView.isVisible = true\n                    binding.emojiView.text = emojiType.code\n                }\n            }\n        }\n    }\n}\n\ninternal enum class VHType {\n    Loading, User, Header\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/history/ReactionHistoryListFragment.kt",
    "content": "package net.pantasystem.milktea.note.reaction.history\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.FragmentReactionHistoryListBinding\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ReactionHistoryListFragment : Fragment(R.layout.fragment_reaction_history_list) {\n\n    companion object {\n        private const val EXTRA_NOTE_ID = \"NOTE_ID\"\n        private const val EXTRA_ACCOUNT_ID = \"EXTRA_ACCOUNT_ID\"\n        private const val EXTRA_TYPE = \"EXTRA_TYPE\"\n\n        fun newInstance(noteId: Note.Id, type: String? = null): ReactionHistoryListFragment {\n            return ReactionHistoryListFragment().also {\n                it.arguments = Bundle().also { bundle ->\n                    bundle.putString(EXTRA_NOTE_ID, noteId.noteId)\n                    bundle.putLong(EXTRA_ACCOUNT_ID, noteId.accountId)\n                    type?.let {\n                        bundle.putString(EXTRA_TYPE, type)\n                    }\n                }\n            }\n        }\n    }\n\n    private val binding: FragmentReactionHistoryListBinding by dataBinding()\n\n    lateinit var mLinearLayoutManager: LinearLayoutManager\n\n    @Inject\n    lateinit var assistedFactory: ReactionHistoryViewModel.ViewModelAssistedFactory\n    private val viewModel: ReactionHistoryViewModel by viewModels {\n        val aId = requireArguments().getLong(EXTRA_ACCOUNT_ID, -1)\n        val nId = requireArguments().getString(EXTRA_NOTE_ID)\n        val type = requireArguments().getString(EXTRA_TYPE)\n        requireNotNull(nId)\n        require(aId != -1L)\n        val noteId = Note.Id(aId, nId)\n        ReactionHistoryViewModel.provideViewModel(assistedFactory, noteId, type)\n    }\n\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val listAdapter = ReactionHistoryListAdapter(requireActivity())\n        binding.historiesView.adapter = listAdapter\n        mLinearLayoutManager = LinearLayoutManager(requireContext())\n        binding.historiesView.layoutManager = mLinearLayoutManager\n        binding.historiesView.addOnScrollListener(mScrollListener)\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                viewModel.uiState.collect { uiState ->\n                    listAdapter.submitList(uiState.items)\n                }\n            }\n        }\n        viewModel.next()\n    }\n\n    private val mScrollListener = object : RecyclerView.OnScrollListener() {\n        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n            super.onScrollStateChanged(recyclerView, newState)\n            val endVisibleItemPosition = mLinearLayoutManager.findLastVisibleItemPosition()\n            val itemCount = mLinearLayoutManager.itemCount\n\n            if (endVisibleItemPosition == (itemCount - 1)) {\n                viewModel.next()\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/history/ReactionHistoryPagerAdapter.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage net.pantasystem.milktea.note.reaction.history\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentPagerAdapter\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.ReactionHistoryRequest\n\nclass ReactionHistoryPagerAdapter(\n    fragmentManager: FragmentManager,\n    private val types: List<ReactionHistoryRequest>,\n    val noteId: Note.Id\n) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT){\n\n\n\n    override fun getCount(): Int {\n        return types.size\n    }\n\n    override fun getItem(position: Int): Fragment {\n        val req = types[position]\n        return ReactionHistoryListFragment.newInstance(req.noteId, req.type)\n    }\n\n    override fun getPageTitle(position: Int): CharSequence {\n        return types[position].type?: \"All\"\n    }\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/history/ReactionHistoryPagerDialog.kt",
    "content": "package net.pantasystem.milktea.note.reaction.history\n\nimport android.os.Bundle\nimport android.text.SpannableStringBuilder\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.core.view.children\nimport androidx.databinding.DataBindingUtil\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiDecorator\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.note.reaction.ReactionHistoryRequest\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.DialogReactionHistoryPagerBinding\nimport net.pantasystem.milktea.note.reaction.viewmodel.ReactionHistoryPagerUiState\nimport net.pantasystem.milktea.note.reaction.viewmodel.ReactionHistoryPagerViewModel\n\n@AndroidEntryPoint\nclass ReactionHistoryPagerDialog : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"ReactionHistoryPagerDialog\"\n        private const val EXTRA_NOTE_ID = \"EXTRA_NOTE_ID\"\n        private const val EXTRA_ACCOUNT_ID = \"EXTRA_ACCOUNT_ID\"\n        private const val EXTRA_SHOW_REACTION_TYPE = \"EXTRA_SHOW_REACTION_TYPE\"\n\n        fun newInstance(noteId: Note.Id, showReaction: String? = null): ReactionHistoryPagerDialog {\n            return ReactionHistoryPagerDialog().also {\n                it.arguments = Bundle().also { bundle ->\n                    bundle.putString(EXTRA_NOTE_ID, noteId.noteId)\n                    bundle.putLong(EXTRA_ACCOUNT_ID, noteId.accountId)\n                    showReaction?.let { type ->\n                        bundle.putString(EXTRA_SHOW_REACTION_TYPE, type)\n                    }\n                }\n            }\n        }\n    }\n\n    private var _binding: DialogReactionHistoryPagerBinding? = null\n    val binding: DialogReactionHistoryPagerBinding\n        get() = requireNotNull(_binding)\n\n    private val pagerViewModel by viewModels<ReactionHistoryPagerViewModel>()\n\n\n    private val aId: Long by lazy(LazyThreadSafetyMode.NONE) {\n        requireArguments().getLong(EXTRA_ACCOUNT_ID, -1).apply {\n            require(this != -1L)\n        }\n    }\n\n    private val nId: String by lazy(LazyThreadSafetyMode.NONE) {\n        requireArguments().getString(EXTRA_NOTE_ID)!!\n    }\n\n    private val noteId by lazy {\n        Note.Id(aId, nId)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        _binding = DataBindingUtil.inflate(\n            inflater,\n            R.layout.dialog_reaction_history_pager,\n            container,\n            false\n        )\n        return binding.root\n    }\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        pagerViewModel.setNoteId(noteId)\n\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val showCurrentReaction = requireArguments().getString(EXTRA_SHOW_REACTION_TYPE)\n\n\n        binding.reactionHistoryTab.setupWithViewPager(binding.reactionHistoryPager)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                pagerViewModel.uiState.collect { uiState ->\n                    val list = uiState.types\n                    val types = list.toMutableList().also {\n                        it.add(\n                            0,\n                            ReactionHistoryRequest(\n                                noteId,\n                                null\n                            )\n                        )\n                    }\n                    val index = showCurrentReaction.let { type ->\n\n                        types.indexOfFirst {\n                            it.type == type\n                        }\n                    }\n                    withContext(Dispatchers.Main) {\n                        showPager(noteId, types)\n                        binding.reactionHistoryPager.currentItem = index\n                        setCustomEmojiSpanIntoTabs(uiState)\n                    }\n                }\n            }\n\n        }\n\n\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _binding = null\n    }\n\n    private fun setCustomEmojiSpanIntoTabs(uiState: ReactionHistoryPagerUiState) {\n\n        if (uiState.note != null) {\n            val types = uiState.types\n            for (i in 1 until types.size) {\n                val tab = binding.reactionHistoryTab.getTabAt(i + 1)!!\n                val textView = tab.view.children.firstOrNull {\n                    it is TextView && it.id == -1\n                } as? TextView\n\n                if (textView != null) {\n                    val spanned = CustomEmojiDecorator().decorate(\n                        accountHost = uiState.account?.getHost(),\n                        sourceHost = uiState.noteAuthor?.host,\n                        uiState.note.emojis,\n                        types[i].type ?: \"\",\n                        textView,\n                    )\n\n                    tab.text = SpannableStringBuilder(spanned).apply {\n                        if (Reaction(types[i].type ?: \"\").isCustomEmojiFormat()) {\n                            append(types[i].type ?: \"\")\n                        }\n                    }\n                }\n\n            }\n        }\n    }\n\n    private fun showPager(noteId: Note.Id, types: List<ReactionHistoryRequest>) {\n        val adapter = ReactionHistoryPagerAdapter(childFragmentManager, types, noteId)\n        binding.reactionHistoryPager.adapter = adapter\n    }\n\n    override fun onPause() {\n        super.onPause()\n        dismissAllowingStateLoss()\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/history/ReactionHistoryViewModel.kt",
    "content": "package net.pantasystem.milktea.note.reaction.history\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.*\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common_android.emoji.V13EmojiUrlResolver\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.reaction.*\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.note.EmojiType\nimport net.pantasystem.milktea.note.from\n\n\nclass ReactionHistoryViewModel @AssistedInject constructor(\n    loggerFactory: Logger.Factory,\n    private val accountRepository: AccountRepository,\n    noteRepository: NoteRepository,\n    private val userRepository: UserRepository,\n    private val reactionUserRepository: ReactionUserRepository,\n    private val customEmojiRepository: CustomEmojiRepository,\n    @Assisted val noteId: Note.Id,\n    @Assisted val type: String?\n) : ViewModel() {\n\n    @AssistedFactory\n    interface ViewModelAssistedFactory {\n        fun create(noteId: Note.Id, type: String?): ReactionHistoryViewModel\n    }\n\n    companion object\n\n    val logger = loggerFactory.create(\"ReactionHistoryVM\")\n\n    private val isLoading = MutableStateFlow(false)\n\n    private val users = reactionUserRepository.observeBy(noteId, type)\n        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val emojis = flowOf(noteId).mapNotNull {\n        accountRepository.get(it.accountId).getOrNull()\n    }.flatMapLatest {\n        customEmojiRepository.observeBy(it.getHost())\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    private val note = noteRepository.observeOne(noteId)\n        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(FlowPreview::class)\n    private val account = suspend {\n        accountRepository.get(noteId.accountId).getOrNull()\n    }.asFlow().stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val noteAuthor = note.filterNotNull().map {\n        userRepository.find(it.userId)\n    }.catch {\n        logger.error(\"ノートの作者情報の取得に失敗\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val noteInfo = combine(note, noteAuthor) { n, author ->\n        NoteInfo(\n            note = n,\n            user = author,\n        )\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), NoteInfo())\n    val uiState = combine(\n        noteInfo,\n        emojis,\n        isLoading,\n        users,\n        account,\n    ) { noteInfo, emojis, loading, users, a ->\n        val emojiMap = emojis.associateBy {\n            it.name\n        }\n        ReactionHistoryUiState(\n            items = listOfNotNull(\n                type?.let { type ->\n                    EmojiType.from(emojiMap + (noteInfo.note?.emojiNameMap ?: emptyMap()), type)\n                        ?: EmojiType.CustomEmoji(\n                            CustomEmoji(\n                                name = type,\n                                url = V13EmojiUrlResolver.resolve(\n                                    accountHost = a?.getHost(),\n                                    emojiHost = noteInfo.user?.host,\n                                    tagName = type\n                                ),\n                                uri = V13EmojiUrlResolver.resolve(\n                                    accountHost = a?.getHost(),\n                                    emojiHost = noteInfo.user?.host,\n                                    tagName = type\n                                )\n                            )\n                        )\n                    EmojiType.from(emojiMap + (noteInfo.note?.emojiNameMap ?: emptyMap()), type)?.let {\n                        ReactionHistoryListType.Header(it)\n                    }\n                }\n            ) + users.map {\n                ReactionHistoryListType.ItemUser(it, account = a)\n            } + listOfNotNull(\n                if (loading) {\n                    ReactionHistoryListType.Loading\n                } else {\n                    null\n                }\n            )\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ReactionHistoryUiState(listOf())\n    )\n\n    init {\n        viewModelScope.launch {\n            isLoading.value = true\n            reactionUserRepository.syncBy(noteId, type).onFailure {\n                logger.error(\"リアクション履歴の同期に失敗\", it)\n            }\n            isLoading.value = false\n        }\n    }\n\n    fun next() {\n\n    }\n\n}\n\n@Suppress(\"UNCHECKED_CAST\")\nfun ReactionHistoryViewModel.Companion.provideViewModel(\n    factory: ReactionHistoryViewModel.ViewModelAssistedFactory,\n    noteId: Note.Id,\n    type: String?\n) = object : ViewModelProvider.Factory {\n    override fun <T : ViewModel> create(modelClass: Class<T>): T {\n        return factory.create(noteId, type) as T\n    }\n}\n\nsealed interface ReactionHistoryListType {\n    data class ItemUser(val user: User, val account: Account?) : ReactionHistoryListType\n    data class Header(val emojiType: EmojiType) : ReactionHistoryListType\n    object Loading : ReactionHistoryListType\n}\n\ndata class ReactionHistoryUiState(\n    val items: List<ReactionHistoryListType> = emptyList(),\n\n    )\n\n\nprivate data class NoteInfo(\n    val note: Note? = null,\n    val user: User? = null\n)"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/picker/ReactionPickerDialog.kt",
    "content": "package net.pantasystem.milktea.note.reaction.picker\n\nimport android.content.Context\nimport android.os.Bundle\nimport android.view.KeyEvent\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.view.inputmethod.InputMethodManager\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport com.google.android.flexbox.*\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common_android_ui.reaction.ReactionAutoCompleteArrayAdapter\nimport net.pantasystem.milktea.common_android_ui.reaction.ReactionChoicesAdapter\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.DialogReactionPickerBinding\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ReactionPickerDialog : AppCompatDialogFragment(){\n\n    companion object {\n        const val FRAGMENT_TAG = \"ReactionPickerDialog\"\n        fun newInstance(noteId: Note.Id): ReactionPickerDialog {\n            return ReactionPickerDialog().apply {\n                arguments = Bundle().apply {\n                    putString(\"NOTE_ID\", noteId.noteId)\n                    putLong(\"ACCOUNT_ID\", noteId.accountId)\n                }\n            }\n        }\n    }\n\n    val notesViewModel by activityViewModels<NotesViewModel>()\n\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var customEmojiRepository: CustomEmojiRepository\n\n    private val reactionPickerDialogViewModel by activityViewModels<ReactionPickerDialogViewModel>()\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return inflater.inflate(R.layout.dialog_reaction_picker, container, false)\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val binding = DialogReactionPickerBinding.bind(view)\n        val noteId = Note.Id(\n            requireArguments().getLong(\"ACCOUNT_ID\"),\n            requireArguments().getString(\"NOTE_ID\")!!,\n        )\n\n        val adapter =\n            ReactionChoicesAdapter {\n                dismiss()\n                notesViewModel.toggleReaction(noteId, it)\n            }\n        binding.reactionsView.adapter = adapter\n\n\n\n        binding.reactionsView.layoutManager = getFlexBoxLayoutManager(view.context)\n\n        reactionPickerDialogViewModel.setCurrentAccountById(noteId.accountId)\n        viewLifecycleOwner.lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                reactionPickerDialogViewModel.userConfigReactions.collect { reactions ->\n                    adapter.submitList(reactions)\n                }\n            }\n\n        }\n\n        accountStore.observeCurrentAccount.filterNotNull().onEach { account ->\n            val autoCompleteAdapter =\n                ReactionAutoCompleteArrayAdapter(\n                    account,\n                    view.context,\n                    customEmojiRepository,\n                )\n            binding.reactionField.setAdapter(autoCompleteAdapter)\n            binding.reactionField.setOnItemClickListener { _, _, i, _ ->\n                val reaction = autoCompleteAdapter.suggestions[i]\n                notesViewModel.toggleReaction(noteId, reaction)\n                dismiss()\n            }\n        }.launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n\n\n        binding.reactionField.setOnEditorActionListener { v, _, event ->\n            if(event != null && event.keyCode == KeyEvent.KEYCODE_ENTER){\n                if(event.action == KeyEvent.ACTION_UP){\n                    notesViewModel.toggleReaction(noteId, v.text.toString())\n                    (view.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(v.windowToken, 0)\n                    dismiss()\n                }\n                return@setOnEditorActionListener true\n            }\n            false\n        }\n        binding.reactionField\n    }\n    private fun getFlexBoxLayoutManager(context: Context): FlexboxLayoutManager{\n        val flexBoxLayoutManager = FlexboxLayoutManager(context)\n        flexBoxLayoutManager.flexDirection = FlexDirection.ROW\n        flexBoxLayoutManager.flexWrap = FlexWrap.WRAP\n        flexBoxLayoutManager.justifyContent = JustifyContent.FLEX_START\n        flexBoxLayoutManager.alignItems = AlignItems.STRETCH\n        return flexBoxLayoutManager\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/picker/ReactionPickerDialogViewModel.kt",
    "content": "package net.pantasystem.milktea.note.reaction.picker\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.emoji.UserEmojiConfigRepository\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ReactionPickerDialogViewModel @Inject constructor(\n    userEmojiConfigRepository: UserEmojiConfigRepository,\n    val accountRepository: AccountRepository,\n): ViewModel() {\n    private val _currentAccount = MutableStateFlow<Account?>(null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val userConfigReactions = _currentAccount.filterNotNull().flatMapLatest { ac ->\n        userEmojiConfigRepository.observeByInstanceDomain(ac.normalizedInstanceUri).map { list ->\n            list.sortedBy {\n                it.weight\n            }.map {\n                it.reaction\n            }\n        }\n    }.flowOn(Dispatchers.IO).stateIn(viewModelScope, SharingStarted.Eagerly, LegacyReaction.defaultReaction)\n\n    private fun setCurrentAccount(account: Account?) {\n        _currentAccount.value = account\n    }\n\n    fun setCurrentAccountById(accountId: Long?) {\n        if (accountId == null) {\n            return\n        }\n        viewModelScope.launch {\n            accountRepository.get(accountId).onSuccess {\n                setCurrentAccount(it)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/viewmodel/ReactionHistoryPagerViewModel.kt",
    "content": "package net.pantasystem.milktea.note.reaction.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteCaptureAPIAdapter\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.reaction.ReactionHistoryRequest\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@HiltViewModel\nclass ReactionHistoryPagerViewModel @Inject constructor(\n    val noteRepository: NoteRepository,\n    val adapter: NoteCaptureAPIAdapter,\n    val noteDataSource: NoteDataSource,\n    val userRepository: UserRepository,\n    val accountRepository: AccountRepository,\n    val loggerFactory: Logger.Factory,\n) : ViewModel() {\n\n    val logger by lazy {\n        loggerFactory.create(\"ReactionHistoryVM\")\n    }\n\n\n    private val noteId = MutableStateFlow<Note.Id?>(null)\n    val note: StateFlow<Note?> = noteId.filterNotNull().flatMapLatest {\n        noteDataSource.observeOne(it)\n    }.catch { e ->\n        logger.warning(\"ノートの取得に失敗\", e = e)\n    }.stateIn(viewModelScope + Dispatchers.IO, SharingStarted.Lazily, null)\n\n    private val types: Flow<List<ReactionHistoryRequest>> = note.mapNotNull { note ->\n        note?.id?.let {  note.id to note.reactionCounts }\n    }.map { idAndList ->\n        idAndList.second.map { count ->\n            count.reaction\n        }.map {\n            ReactionHistoryRequest(idAndList.first, it)\n        }\n    }.shareIn(viewModelScope, SharingStarted.Eagerly)\n\n    private val account = noteId.filterNotNull().map {\n        accountRepository.get(it.accountId).getOrNull()\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val author = note.filterNotNull().map {\n        userRepository.find(it.userId)\n    }.catch {\n        logger.error(\"投稿したユーザの取得に失敗\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n    val uiState = combine(note, account, author, types) { note, ac, author, types ->\n        ReactionHistoryPagerUiState(note, ac, author,types)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, ReactionHistoryPagerUiState())\n\n    init {\n        viewModelScope.launch {\n            noteId.filterNotNull().flatMapLatest { noteId ->\n                adapter.capture(noteId)\n            }.flowOn(Dispatchers.IO).collect()\n        }\n        viewModelScope.launch {\n            noteId.filterNotNull().flatMapLatest {\n                suspend {\n                    noteRepository.find(it).getOrThrow()\n                }.asLoadingStateFlow()\n            }.collect()\n        }\n    }\n\n    fun setNoteId(noteId: Note.Id) {\n        this.noteId.update {\n            noteId\n        }\n    }\n}\n\ndata class ReactionHistoryPagerUiState(\n    val note: Note? = null,\n    val account: Account? = null,\n    val noteAuthor: User? = null,\n    val types: List<ReactionHistoryRequest> = emptyList()\n)"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/reaction/viewmodel/RemoteReactionEmojiSuggestionViewModel.kt",
    "content": "package net.pantasystem.milktea.note.reaction.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.note.reaction.ToggleReactionUseCase\nimport javax.inject.Inject\n\ndata class RemoteReaction(\n    val reaction: Reaction,\n    val currentAccountId: Long,\n    val noteId: String\n)\n\n@HiltViewModel\nclass RemoteReactionEmojiSuggestionViewModel @Inject constructor(\n    val accountRepository: AccountRepository,\n    val noteRepository: NoteRepository,\n    val customEmojiRepository: CustomEmojiRepository,\n    val loggerFactory: Logger.Factory,\n    val toggleReactionUseCase: ToggleReactionUseCase,\n) : ViewModel() {\n\n    private val _reaction = MutableStateFlow<RemoteReaction?>(null)\n    val reaction: StateFlow<RemoteReaction?> = _reaction\n    val logger = loggerFactory.create(\"RemoteReactionEmojiSuggestionVM\")\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val filteredEmojis = reaction.flatMapLatest { remoteReaction ->\n        val name = remoteReaction?.reaction?.getName()\n        if (name == null) {\n            flow {\n                emit(ResultState.Fixed<List<CustomEmoji>>(StateContent.NotExist()))\n            }\n        } else {\n            suspend {\n                val account = accountRepository.get(remoteReaction.currentAccountId).getOrThrow()\n                customEmojiRepository.findBy(account.getHost()).getOrThrow().filter {\n                    it.name == name\n                }\n            }.asLoadingStateFlow()\n        }\n    }.stateIn(\n        viewModelScope, SharingStarted.Lazily, ResultState.initialState()\n    )\n\n    fun setReaction(accountId: Long, reaction: String, noteId: String) {\n        _reaction.value = RemoteReaction(\n            Reaction(\n                reaction\n            ), accountId, noteId\n        )\n    }\n\n    fun send() {\n        val value = reaction.value ?: return\n        val name = value.reaction.getName()\n        viewModelScope.launch {\n            toggleReactionUseCase(\n                Note.Id(\n                    value.currentAccountId,\n                    value.noteId\n                ),\n                \":$name:\"\n            ).onFailure {\n                logger.warning(\"リアクションの作成失敗\", e = it)\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteBottomSheetDialog.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_compose.haptic.rememberHapticFeedback\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass RenoteBottomSheetDialog : BottomSheetDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"RenoteBottomSheetDialog\"\n        fun newInstance(noteId: Note.Id, isRenotedByMe: Boolean): RenoteBottomSheetDialog {\n            return RenoteBottomSheetDialog().apply {\n                arguments = Bundle().apply {\n                    putLong(\"ACCOUNT_ID\", noteId.accountId)\n                    putString(\"NOTE_ID\", noteId.noteId)\n                    putBoolean(\"IS_RENOTED_BY_ME\", isRenotedByMe)\n                }\n            }\n        }\n    }\n\n    val notesViewModel by activityViewModels<NotesViewModel>()\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel by activityViewModels<RenoteViewModel>()\n\n\n    val noteId: Note.Id by lazy {\n        Note.Id(\n            requireArguments().getLong(\"ACCOUNT_ID\"),\n            requireArguments().getString(\"NOTE_ID\")!!\n        )\n    }\n\n    private val isRenotedByMe by lazy {\n        requireArguments().getBoolean(\"IS_RENOTED_BY_ME\", false)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        viewModel.setTargetNoteId(noteId)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val uiState by viewModel.uiState.collectAsState()\n                    val feedback = rememberHapticFeedback()\n                    RenoteDialogContent(\n                        uiState = uiState,\n                        isRenotedByMe = isRenotedByMe,\n                        onToggleAddAccount = {\n                            feedback.performClickHapticFeedback()\n                            viewModel.toggleAddAccount(it)\n                        },\n                        onRenoteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            viewModel.renote()\n                            dismiss()\n                        },\n                        onQuoteRenoteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.showQuoteNoteEditor(noteId)\n                            dismiss()\n                        },\n                        onRenoteInChannelButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            viewModel.renoteToChannel()\n                            dismiss()\n                        },\n                        onQuoteInChannelRenoteButtonClicked = {\n                            feedback.performClickHapticFeedback()\n                            notesViewModel.showQuoteToChannelNoteEditor(noteId)\n                            dismiss()\n                        },\n                        onDeleteRenoteButtonCLicked = {\n                            feedback.performClickHapticFeedback()\n                            viewModel.unRenote()\n                            dismiss()\n                        },\n                    )\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteDialogLayout.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.Surface\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.FormatQuote\nimport androidx.compose.material.icons.filled.Repeat\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.view.NormalBottomSheetDialogSelectionLayout\n\n@Composable\nfun RenoteDialogContent(\n    uiState: RenoteViewModelUiState,\n    isRenotedByMe: Boolean,\n    onToggleAddAccount: (Long) -> Unit,\n    onRenoteButtonClicked: () -> Unit,\n    onQuoteRenoteButtonClicked: () -> Unit,\n    onRenoteInChannelButtonClicked: () -> Unit,\n    onQuoteInChannelRenoteButtonClicked: () -> Unit,\n    onDeleteRenoteButtonCLicked: () -> Unit,\n) {\n    Surface(\n        modifier = Modifier.fillMaxWidth()\n    ) {\n        Column(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(vertical = 8.dp)\n        ) {\n            RenoteTargetAccountRowList(\n                accounts = uiState.accounts,\n                onClick = onToggleAddAccount\n            )\n\n            if (uiState.isRenoteButtonVisible) {\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = onRenoteButtonClicked,\n                    icon = Icons.Default.Repeat,\n                    text = stringResource(id = R.string.renote)\n                )\n            }\n\n            Spacer(modifier = Modifier.height(8.dp))\n            if (isRenotedByMe) {\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = onDeleteRenoteButtonCLicked,\n                    icon = Icons.Default.FormatQuote,\n                    text = stringResource(id = R.string.unrenote)\n                )\n                Spacer(modifier = Modifier.height(8.dp))\n\n            }\n\n            if (uiState.isRenoteButtonVisible && uiState.canQuote) {\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = onQuoteRenoteButtonClicked,\n                    icon = Icons.Default.FormatQuote,\n                    text = stringResource(id = R.string.quote_renote)\n                )\n            }\n\n            if (uiState.isChannelRenoteButtonVisible) {\n                Spacer(modifier = Modifier.height(8.dp))\n                NormalBottomSheetDialogSelectionLayout(\n                    onClick = onRenoteInChannelButtonClicked,\n                    icon = Icons.Default.Repeat,\n                    text = stringResource(id = R.string.renote_in_channel)\n                )\n\n                if (uiState.canQuote) {\n                    Spacer(modifier = Modifier.height(8.dp))\n                    NormalBottomSheetDialogSelectionLayout(\n                        onClick = onQuoteInChannelRenoteButtonClicked,\n                        icon = Icons.Default.FormatQuote,\n                        text = stringResource(id = R.string.quote_renote_in_channel)\n                    )\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteResultHandler.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport android.content.Context\nimport android.widget.Toast\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.repeatOnLifecycle\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.launch\n\nclass RenoteResultHandler(\n    val viewModel: RenoteViewModel,\n    val scope: CoroutineScope,\n    val lifecycle: Lifecycle,\n    val context: Context,\n) {\n\n    fun setup() {\n        scope.launch {\n            lifecycle.repeatOnLifecycle(Lifecycle.State.CREATED) {\n                viewModel.resultEvents.collect { event ->\n                    handle(event)\n                }\n            }\n        }\n    }\n\n    private fun handle(event: RenoteActionResultEvent) {\n        when (event) {\n            is RenoteActionResultEvent.Renote -> {\n                event.result.onFailure {\n                    Toast.makeText(context, \"Failed Renote\", Toast.LENGTH_LONG).show()\n                }.onSuccess {\n                    val failedCount = it.count { nr ->\n                        nr.isFailure\n                    }\n                    val successCount = it.count { nr ->\n                        nr.isSuccess\n                    }\n                    Toast.makeText(\n                        context,\n                        \"Success Renote($successCount)/ Failed Renote($failedCount)\",\n                        Toast.LENGTH_LONG\n                    ).show()\n                }\n            }\n            is RenoteActionResultEvent.UnRenote -> {\n                event.result.onSuccess {\n                    Toast.makeText(\n                        context,\n                        \"Successful delete Renote\",\n                        Toast.LENGTH_LONG\n                    ).show()\n                }.onFailure {\n                    Toast.makeText(context, \"Failed delete Renote\", Toast.LENGTH_LONG)\n                        .show()\n                }\n\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteTargetAccountList.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.horizontalScroll\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.size\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.shape.CircleShape\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.CheckCircle\nimport androidx.compose.material.icons.outlined.Circle\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\n\n@Composable\nfun RenoteTargetAccountRowList(\n    modifier: Modifier = Modifier,\n    accounts: List<AccountInfo>,\n    onClick: (Long) -> Unit,\n) {\n    Row(\n        modifier = modifier\n            .padding(vertical = 8.dp)\n            .horizontalScroll(rememberScrollState()),\n    ) {\n        Spacer(modifier = Modifier.width(16.dp))\n        accounts.forEach {\n            SelectableAvatarOnlyAccount(\n                isSelected = it.isSelected,\n                avatarUrl = it.user.avatarUrl ?: \"\",\n                onClick = {\n                    onClick(it.accountId)\n                },\n                username = it.user.displayName,\n                emojis = it.user.emojis,\n                isEnable = it.isEnable,\n                accountHost = it.user.host,\n                iconUrl = it.instanceIconUrl ?: \"\"\n            )\n        }\n    }\n}\n\n@Composable\nfun SelectableAvatarOnlyAccount(\n    modifier: Modifier = Modifier,\n    isSelected: Boolean,\n    isEnable: Boolean,\n    username: String,\n    avatarUrl: String,\n    emojis: List<CustomEmoji>,\n    accountHost: String?,\n    iconUrl: String,\n    onClick: () -> Unit,\n) {\n    Column(\n        modifier = modifier\n            .width(56.dp)\n            .padding(4.dp),\n        horizontalAlignment = Alignment.CenterHorizontally,\n    ) {\n        Box(\n\n            contentAlignment = Alignment.TopEnd,\n        ) {\n\n            AvatarIcon(\n                url = avatarUrl,\n                onAvatarClick = onClick,\n                size = 48.dp,\n                borderStrokeWidth = 1.dp,\n                borderStrokeColor = Color.Gray,\n            )\n            val tint = MaterialTheme.colorScheme.primary\n            val background = if (isSelected) Color.White else Color.Transparent\n\n            if (isEnable) {\n                if (isSelected) {\n                    Icon(\n                        Icons.Filled.CheckCircle,\n                        contentDescription = null,\n                        tint = tint,\n                        modifier = Modifier.background(background, CircleShape)\n\n                    )\n                } else {\n                    Icon(\n                        Icons.Outlined.Circle,\n                        contentDescription = null,\n                        tint = tint,\n                        modifier = Modifier.background(background, CircleShape)\n                    )\n\n                }\n            }\n\n            Image(\n                painter = rememberAsyncImagePainter(iconUrl),\n                contentDescription = null,\n                contentScale = ContentScale.Crop,\n                modifier = modifier\n                    .size(12.dp)\n                    .align(Alignment.BottomEnd)\n            )\n        }\n        CustomEmojiText(\n            text = username,\n            emojis = emojis,\n            maxLines = 1,\n            fontSize = 8.sp,\n            accountHost = accountHost,\n            sourceHost = accountHost\n        )\n    }\n\n}\n\n@Composable\n@Preview\nfun PreviewSelectableAvatarOnlyAccount() {\n    SelectableAvatarOnlyAccount(\n        avatarUrl = \"\",\n        onClick = {},\n        isSelected = true,\n        username = \"@harunon\",\n        emojis = emptyList(),\n        isEnable = true,\n        accountHost = \"misskey.io\",\n        iconUrl = \"\"\n    )\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteUiState.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\ndata class RenoteViewModelUiState(\n    val targetNoteId: Note.Id? = null,\n    val noteState: RenoteViewModelTargetNoteState = RenoteViewModelTargetNoteState(\n        ResultState.initialState(),\n        null\n    ),\n    val accounts: List<AccountInfo> = emptyList(),\n    val canQuote: Boolean = true,\n    val isRenoteButtonVisible: Boolean = true,\n    val isChannelRenoteButtonVisible: Boolean = false,\n)\n\ndata class RenoteViewModelTargetNoteState(\n    val syncState: ResultState<Unit>,\n    val note: Note?,\n)\n\ndata class AccountInfo(\n    val accountId: Long,\n    val user: User,\n    val isSelected: Boolean,\n    val isEnable: Boolean,\n    val instanceIconUrl: String?,\n)"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteUiStateBuilder.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.coroutines.combine\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.isLocalOnly\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass RenoteUiStateBuilder @Inject constructor(\n    private val userRepository: UserRepository,\n    private val instanceInfoService: InstanceInfoService,\n) {\n    @OptIn(ExperimentalCoroutinesApi::class)\n    fun buildState(\n        targetNoteIdFlow: StateFlow<Note.Id?>,\n        noteFlow: Flow<NoteRelation?>,\n        channelFlow: Flow<Channel?>,\n        noteSyncState: Flow<ResultState<Unit>>,\n        selectedAccountIds: Flow<List<Long>>,\n        accountsFlow: Flow<List<Account>>,\n        currentAccountInstanceInfo: Flow<InstanceInfoType?>,\n        coroutineScope: CoroutineScope,\n    ): Flow<RenoteViewModelUiState> {\n        val accountAndUserList = accountsFlow.map { accounts ->\n            accounts.map {\n                it to User.Id(\n                    it.accountId,\n                    it.remoteId\n                )\n            }.map { (account, userId) ->\n                userRepository.observe(userId).map { user ->\n                    account to user\n                }\n            }\n        }.flatMapLatest { flows ->\n            combine(flows) { users ->\n                users.toList()\n            }\n        }.stateIn(\n            coroutineScope,\n            SharingStarted.WhileSubscribed(5_000),\n            emptyList()\n        )\n\n        val noteState = combine(noteFlow, noteSyncState) { n, s ->\n            RenoteViewModelTargetNoteState(\n                note = n?.contentNote?.note,\n                syncState = s\n            )\n        }.stateIn(\n            coroutineScope,\n            SharingStarted.WhileSubscribed(5_000),\n            RenoteViewModelTargetNoteState(\n                syncState = ResultState.initialState(),\n                note = null\n            )\n        )\n\n        val instanceInfoListFlow = accountsFlow.flatMapLatest { accounts ->\n            instanceInfoService.observeIn(\n                accounts.map {\n                    it.normalizedInstanceUri\n                }\n            )\n        }.stateIn(\n            coroutineScope,\n            SharingStarted.WhileSubscribed(5_000),\n            emptyList()\n        )\n\n        val accountWithUsers = combine(\n            accountAndUserList,\n            selectedAccountIds,\n            noteFlow,\n            instanceInfoListFlow,\n        ) { accountWithUser, selectedIds, note, instanceInfoList ->\n            accountWithUser.map { (account, user) ->\n                AccountInfo(\n                    accountId = account.accountId,\n                    user = user,\n                    isSelected = selectedIds.any { id -> id == account.accountId },\n                    isEnable = note?.contentNote?.canRenote(account, user) == true,\n                    instanceIconUrl = instanceInfoList.firstOrNull {\n                        it.uri == account.normalizedInstanceUri\n                    }?.iconUrl\n                )\n            }\n        }.stateIn(\n            coroutineScope,\n            SharingStarted.WhileSubscribed(5_000),\n            emptyList()\n        )\n\n        val isRenoteButtonVisibleFlow = channelFlow.map { it?.allowRenoteToExternal ?: true }\n        val isChannelRenoteButtonVisibleFlow = channelFlow.map { it != null }\n\n        return combine(\n            targetNoteIdFlow,\n            noteState,\n            accountWithUsers,\n            currentAccountInstanceInfo,\n            isRenoteButtonVisibleFlow,\n            isChannelRenoteButtonVisibleFlow,\n        ) { noteId, syncState, accounts, instanceInfo, isRenoteButtonVisible, isChannelRenoteButtonVisible ->\n            RenoteViewModelUiState(\n                targetNoteId = noteId,\n                noteState = syncState,\n                accounts = accounts,\n                canQuote = instanceInfo?.canQuote ?: false,\n                isRenoteButtonVisible = isRenoteButtonVisible,\n                isChannelRenoteButtonVisible = isChannelRenoteButtonVisible,\n            )\n        }\n    }\n}\n\nfun NoteRelation.canRenote(account: Account, user: User): Boolean {\n    if (note.canRenote(user.id)) {\n        return true\n    }\n\n    // NOTE: 公開範囲がpublicなら可能\n    if (note.visibility is Visibility.Public && !note.visibility.isLocalOnly()) {\n        return true\n    }\n\n    // NOTE: 公開範囲がフォロワー、DMの場合は無理\n    if (note.visibility is Visibility.Followers || note.visibility is Visibility.Specified) {\n        return false\n    }\n\n    // NOTE: 同一ホストなら可能\n    if (note.visibility.isLocalOnly() && this.user.host == account.getHost()) {\n        return true\n    }\n\n    // NOTE: 投稿のホストとアカウントが同一ホストかつ公開範囲の場合はRenote可能\n    if (note.visibility is Visibility.Home && this.user.host == account.getHost()) {\n        return true\n    }\n\n    return false\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteUserItem.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Delete\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.runtime.remember\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.common_compose.getSimpleElapsedTime\nimport net.pantasystem.milktea.model.user.User\nimport java.text.SimpleDateFormat\nimport java.util.Date\n\n@ExperimentalCoroutinesApi\n@Composable\n@Stable\nfun ItemRenoteUser(\n    note: RenoteItemType,\n    myId: User.Id?,\n    accountHost: String?,\n    isDisplayTimestampsAsAbsoluteDates: Boolean,\n    onAction: (ItemRenoteAction) -> Unit,\n    isUserNameDefault: Boolean = false\n) {\n\n    val createdAt = (note as? RenoteItemType.Renote)?.let { renote ->\n        if (isDisplayTimestampsAsAbsoluteDates) {\n            remember(renote.note.note.createdAt) {\n                SimpleDateFormat.getDateTimeInstance().format(renote.note.note.createdAt.let {\n                    Date(it.toEpochMilliseconds())\n                })\n            }\n        } else {\n            getSimpleElapsedTime(time = renote.note.note.createdAt)\n        }\n\n    }\n\n    Card(\n        shape = RoundedCornerShape(0.dp),\n        modifier = Modifier\n            .padding(0.5.dp)\n            .clickable {\n                onAction(ItemRenoteAction.OnClick(note))\n            }\n    ) {\n        Row(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(8.dp),\n            horizontalArrangement = Arrangement.SpaceBetween,\n            verticalAlignment = Alignment.CenterVertically\n\n        ) {\n\n            Row(\n                verticalAlignment = Alignment.CenterVertically,\n                modifier = Modifier.weight(1f),\n            ) {\n                AvatarIcon(url = note.user.avatarUrl, size = 48.dp)\n                Spacer(modifier = Modifier.width(16.dp))\n                Column {\n                    if(isUserNameDefault){\n                        Text(text = note.user.displayUserName, fontSize = 16.sp)\n                    }else{\n                        CustomEmojiText(\n                            text = note.user.displayName,\n                            emojis = note.user.emojis,\n                            fontSize = 16.sp,\n                            parsedResult = note.user.parsedResult,\n                            accountHost = accountHost,\n                            sourceHost = note.user.host,\n                        )\n                    }\n                    if(isUserNameDefault){\n                        CustomEmojiText(\n                            text = note.user.displayName,\n                            emojis = note.user.emojis,\n                            accountHost = accountHost,\n                            sourceHost = note.user.host,\n                            parsedResult = note.user.parsedResult,\n                        )\n                    }else{\n                        Text(text = note.user.displayUserName)\n                    }\n                }\n            }\n            Column {\n                if (createdAt != null) {\n                    Text(createdAt)\n                }\n                if (note.user.id == myId) {\n                    IconButton(onClick = {\n                        onAction(ItemRenoteAction.OnDeleteButtonClicked(note))\n                    }) {\n                        Icon(Icons.Default.Delete, contentDescription = null)\n                    }\n                }\n\n            }\n\n        }\n    }\n}\n\n\nsealed interface ItemRenoteAction {\n    data class OnClick(val note: RenoteItemType) : ItemRenoteAction\n    data class OnDeleteButtonClicked(val note: RenoteItemType): ItemRenoteAction\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteUsers.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filter\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.mapNotNull\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.model.user.User\n\n\n@ExperimentalCoroutinesApi\n@Composable\nfun RenoteUsersScreen(\n    renotesViewModel: RenotesViewModel,\n    onSelected: (RenoteItemType) -> Unit,\n    onScrollState: (Boolean) -> Unit,\n) {\n\n    val myId by renotesViewModel.myId.collectAsState()\n    val account by renotesViewModel.account.collectAsState()\n    val config by renotesViewModel.config.collectAsState()\n\n    val renotes: PageableState<List<RenoteItemType>> by renotesViewModel.renotes.collectAsState()\n\n    LaunchedEffect(true) {\n        renotesViewModel.refresh()\n    }\n\n    if (renotes.content is StateContent.Exist && (renotes.content as StateContent.Exist).rawContent.isNotEmpty()) {\n        val content = (renotes.content as StateContent.Exist).rawContent\n        RenoteUserList(\n            notes = content,\n            onAction = {\n                when(it) {\n                    is ItemRenoteAction.OnClick -> {\n                        onSelected(it.note)\n                    }\n                    is ItemRenoteAction.OnDeleteButtonClicked -> {\n                        renotesViewModel.delete(it.note)\n                    }\n                }\n            },\n            onBottomReached = {\n                renotesViewModel.next()\n            },\n            modifier = Modifier.fillMaxSize(),\n            onScrollState = onScrollState,\n            myId = myId,\n            accountHost = account?.getHost(),\n            isDisplayTimestampsAsAbsoluteDates = config.isDisplayTimestampsAsAbsoluteDates,\n        )\n    } else {\n        Column(\n            Modifier.fillMaxSize(),\n            horizontalAlignment = Alignment.CenterHorizontally,\n            verticalArrangement = Arrangement.Center\n        ) {\n            when (renotes) {\n                is PageableState.Loading -> {\n                    CircularProgressIndicator()\n                }\n                is PageableState.Error -> {\n                    val error = (renotes as PageableState.Error).throwable\n                    Text(text = \"load error:${error}\")\n                }\n                else -> {\n                    Text(\"renote not exist\")\n                }\n            }\n        }\n\n    }\n}\n\n@OptIn(ExperimentalComposeUiApi::class)\n@ExperimentalCoroutinesApi\n@Composable\nfun RenoteUserList(\n    notes: List<RenoteItemType>,\n    myId: User.Id?,\n    accountHost: String?,\n    isDisplayTimestampsAsAbsoluteDates: Boolean?,\n    onAction: (ItemRenoteAction) -> Unit,\n    onBottomReached: () -> Unit,\n    onScrollState: (Boolean) -> Unit,\n    modifier: Modifier = Modifier\n) {\n    val scrollState = rememberLazyListState()\n\n    LaunchedEffect(scrollState) {\n        snapshotFlow {\n            scrollState.layoutInfo.visibleItemsInfo.lastOrNull()?.index\n        }.mapNotNull { index ->\n            index == scrollState.layoutInfo.totalItemsCount - 1\n        }.distinctUntilChanged().filter {\n            it\n        }.collect {\n            onBottomReached.invoke()\n        }\n    }\n\n    LaunchedEffect(scrollState) {\n        snapshotFlow { scrollState.layoutInfo.visibleItemsInfo.firstOrNull()?.offset }\n            .map { it == 0 }\n            .distinctUntilChanged()\n            .collect {\n                onScrollState.invoke(it)\n            }\n    }\n\n    LazyColumn(state = scrollState, modifier = modifier.nestedScroll(\n        rememberNestedScrollInteropConnection())) {\n        this.items(\n            notes.size,\n        ) { pos ->\n            ItemRenoteUser(\n                note = notes[pos],\n                onAction = onAction,\n                myId = myId,\n                accountHost = accountHost,\n                isDisplayTimestampsAsAbsoluteDates = isDisplayTimestampsAsAbsoluteDates ?: false,\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenoteViewModel.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.channel.ChannelRepository\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.note.*\nimport net.pantasystem.milktea.model.note.repost.CreateRenoteMultipleAccountUseCase\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass RenoteViewModel @Inject constructor(\n    val noteRepository: NoteRepository,\n    val accountRepository: AccountRepository,\n    val userRepository: UserRepository,\n    private val channelRepository: ChannelRepository,\n    val accountStore: AccountStore,\n    val userDataSource: UserDataSource,\n    private val renoteUseCase: CreateRenoteMultipleAccountUseCase,\n    val noteRelationGetter: NoteRelationGetter,\n    private val instanceInfoService: InstanceInfoService,\n    renoteUiStateBuilder: RenoteUiStateBuilder,\n    loggerFactory: Logger.Factory\n) : ViewModel() {\n\n    val logger = loggerFactory.create(\"RenoteDialogViewModel\")\n\n    private val _targetNoteId = MutableStateFlow<Note.Id?>(null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val _targetNote = _targetNoteId.filterNotNull().flatMapLatest {\n        noteRepository.observeOne(it).filterNotNull().map { note ->\n            noteRelationGetter.get(note).getOrNull()\n        }\n    }\n\n    private val _resultEvents = MutableSharedFlow<RenoteActionResultEvent>(\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n        extraBufferCapacity = 20\n    )\n\n    val resultEvents = _resultEvents.asSharedFlow()\n\n    val note = _targetNote.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null\n    )\n\n    val channel = _targetNote\n        .map { it?.note?.channelId?.let { id -> channelRepository.findOne(id).getOrNull() } }\n        .stateIn(\n            viewModelScope,\n            SharingStarted.WhileSubscribed(5_000),\n            null\n        )\n\n    private val _selectedAccountIds = MutableStateFlow<List<Long>>(emptyList())\n    private val accounts = accountStore.observeAccounts.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val _syncState = _targetNoteId.filterNotNull().flatMapLatest {\n        suspend {\n            noteRepository.sync(it).getOrThrow()\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState(),\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val currentAccountInstanceInfo = _targetNoteId.filterNotNull().map {\n        accountRepository.get(it.accountId).getOrThrow()\n    }.flatMapLatest {\n        instanceInfoService.observe(it.normalizedInstanceUri)\n    }.catch {\n        logger.error(\"observe current account error\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n\n    val uiState = renoteUiStateBuilder.buildState(\n        targetNoteIdFlow = _targetNoteId,\n        noteFlow = note,\n        channelFlow = channel,\n        noteSyncState = _syncState,\n        selectedAccountIds = _selectedAccountIds,\n        accountsFlow = accounts,\n        currentAccountInstanceInfo = currentAccountInstanceInfo,\n        coroutineScope = viewModelScope\n    ).stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        RenoteViewModelUiState()\n    )\n\n    fun setTargetNoteId(noteId: Note.Id) {\n        _targetNoteId.value = noteId\n        _selectedAccountIds.value = listOf(noteId.accountId)\n    }\n\n    fun toggleAddAccount(accountId: Long) {\n        _selectedAccountIds.update { accounts ->\n            val isExists = accounts.any {\n                it == accountId\n            }\n            if (isExists) {\n                accounts - accountId\n\n                // NOTE: 三件以上同時にRenoteするのは流石に不味そうなので三件以上同時にRenoteできないようにする。\n            } else if ((accounts.size + 1) < 3) {\n                accounts + accountId\n            } else {\n                accounts\n            }\n        }\n    }\n\n    fun renote() {\n        val noteId = _targetNoteId.value ?: return\n        val accountIds = _selectedAccountIds.value\n        viewModelScope.launch {\n            val result = renoteUseCase.renote(noteId, accountIds)\n            _resultEvents.tryEmit(\n                RenoteActionResultEvent.Renote(result, noteId, accountIds)\n            )\n        }\n    }\n\n    fun renoteToChannel() {\n        val noteId = _targetNoteId.value ?: return\n        val accountIds = _selectedAccountIds.value\n        viewModelScope.launch {\n            val result = renoteUseCase.renoteToChannel(noteId, accountIds)\n            _resultEvents.tryEmit(\n                RenoteActionResultEvent.Renote(result, noteId, accountIds)\n            )\n        }\n    }\n\n\n    fun unRenote() {\n        val noteId = _targetNoteId.value\n            ?: return\n        viewModelScope.launch {\n            val result = noteRepository.delete(noteId)\n            _resultEvents.tryEmit(\n                RenoteActionResultEvent.UnRenote(result, noteId = noteId)\n            )\n        }\n    }\n\n\n}\n\n\nsealed interface RenoteActionResultEvent {\n    data class Renote(\n        val result: Result<List<Result<Note>>>,\n        val noteId: Note.Id,\n        val accounts: List<Long>\n    ) : RenoteActionResultEvent\n\n    data class UnRenote(val result: Result<Note>, val noteId: Note.Id) : RenoteActionResultEvent\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenotesBottomSheetDialog.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.FrameLayout\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.viewModels\nimport com.google.android.material.bottomsheet.BottomSheetBehavior\nimport com.google.android.material.bottomsheet.BottomSheetDialog\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteCaptureAPIAdapter\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass RenotesBottomSheetDialog : BottomSheetDialogFragment(){\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    companion object {\n        const val FRAGMENT_TAG = \"RenotesBottomSheetDialog\"\n        private const val EXTRA_ACCOUNT_ID = \"ACCOUNT_ID\"\n        private const val EXTRA_NOTE_ID = \"NOTE_ID\"\n\n        fun newInstance(noteId: Note.Id) : RenotesBottomSheetDialog {\n            return RenotesBottomSheetDialog().also {\n                it.arguments = Bundle().also { bundle ->\n                    bundle.putLong(EXTRA_ACCOUNT_ID, noteId.accountId)\n                    bundle.putString(EXTRA_NOTE_ID, noteId.noteId)\n                }\n            }\n        }\n    }\n\n    @Inject\n    lateinit var renotesViewModelAssistedFactory: RenotesViewModel.ViewModelAssistedFactory\n\n\n\n    private val viewModel by viewModels<RenotesViewModel> {\n        val noteId = arguments?.let {\n            val aId = it.getLong(EXTRA_ACCOUNT_ID)\n            val nId = it.getString(EXTRA_NOTE_ID)!!\n            Note.Id(aId, nId)\n        }!!\n        RenotesViewModel.provideViewModel(renotesViewModelAssistedFactory, noteId)\n    }\n\n\n    private val bottomSheetDialogBehavior: BottomSheetBehavior<FrameLayout>?\n        get() = (dialog as? BottomSheetDialog)?.behavior\n\n    @Inject\n    lateinit var noteCaptureAPIAdapter: NoteCaptureAPIAdapter\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    RenoteUsersScreen(\n                        renotesViewModel = viewModel,\n                        onSelected = { nr ->\n                            dismiss()\n                            val intent = userDetailNavigation.newIntent(UserDetailNavigationArgs.UserId(\n                                nr.user.id\n                            ))\n                            startActivity(intent)\n                        },\n                        onScrollState = { state ->\n                            bottomSheetDialogBehavior?.isDraggable = state\n                        }\n                    )\n                }\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/renote/RenotesViewModel.kt",
    "content": "package net.pantasystem.milktea.note.renote\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.note.*\nimport net.pantasystem.milktea.model.note.repost.RenoteType\nimport net.pantasystem.milktea.model.note.repost.RenotesPagingService\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\n\nclass RenotesViewModel @AssistedInject constructor(\n    private val renotesPagingServiceFactory: RenotesPagingService.Factory,\n    private val noteGetter: NoteRelationGetter,\n    private val noteRepository: NoteRepository,\n    private val noteCaptureAPIAdapter: NoteCaptureAPIAdapter,\n    private val userRepository: UserRepository,\n    configRepository: LocalConfigRepository,\n    accountStore: AccountStore,\n    loggerFactory: Logger.Factory,\n    @Assisted val noteId: Note.Id,\n) : ViewModel() {\n\n    @AssistedFactory\n    interface ViewModelAssistedFactory {\n        fun create(noteId: Note.Id): RenotesViewModel\n    }\n\n    companion object;\n\n    private val renotesPagingService by lazy {\n        renotesPagingServiceFactory.create(noteId)\n    }\n\n\n    private val logger = loggerFactory.create(\"RenotesVM\")\n\n    val config = configRepository.observe().stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        DefaultConfig.config,\n    )\n\n    val renotes = renotesPagingService.state.map { state ->\n        state.suspendConvert { renotes ->\n            renotes.mapNotNull {renote ->\n                when(renote) {\n                    is RenoteType.Renote -> if (renote.isQuote) {\n                        null\n                    } else {\n                        noteGetter.get(renote.noteId).getOrNull()?.let {\n                            RenoteItemType.Renote(it)\n                        }\n                    }\n                    is RenoteType.Reblog -> RenoteItemType.Reblog(userRepository.find(renote.userId))\n                }\n            }\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init(),\n    )\n\n    val myId = accountStore.observeCurrentAccount.map {\n        it?.let {\n            User.Id(it.accountId, it.remoteId)\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val account = accountStore.observeCurrentAccount.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val _errors = MutableStateFlow<Throwable?>(null)\n\n    init {\n        viewModelScope.launch {\n            renotesPagingService.state.mapNotNull {\n                (it.content as? StateContent.Exist)?.rawContent\n            }.map { renotes ->\n                renotes.mapNotNull { renote ->\n                    (renote as? RenoteType.Renote)?.let {\n                        noteCaptureAPIAdapter.capture(it.noteId)\n                    }\n                }\n            }.map { flows ->\n                combine(flows) {\n                    it.toList()\n                }\n            }.collect()\n        }\n    }\n\n    fun next() {\n        viewModelScope.launch {\n            runCancellableCatching {\n                renotesPagingService.next()\n            }.onFailure {\n                logger.warning(\"next error\", e = it)\n                _errors.value = it\n            }\n        }\n    }\n\n    fun refresh() {\n        viewModelScope.launch {\n            runCancellableCatching {\n                renotesPagingService.refresh()\n            }.onFailure {\n                logger.warning(\"refresh error\", e = it)\n                _errors.value = it\n            }\n        }\n    }\n\n    fun delete(item: RenoteItemType) {\n        viewModelScope.launch {\n            when(item) {\n                is RenoteItemType.Reblog -> {\n                    noteRepository.unrenote(noteId).onFailure {\n                        _errors.value = it\n                    }.onSuccess {\n                        refresh()\n                    }\n                }\n                is RenoteItemType.Renote -> {\n                    noteRepository.delete(item.note.note.id).onFailure {\n                        _errors.value = it\n                    }.onSuccess {\n                        refresh()\n                    }\n                }\n            }\n\n        }\n    }\n\n}\n\nfun RenotesViewModel.Companion.provideViewModel(\n    factory: RenotesViewModel.ViewModelAssistedFactory,\n    noteId: Note.Id\n) = object : ViewModelProvider.Factory {\n    @Suppress(\"UNCHECKED_CAST\")\n    override fun <T : ViewModel> create(modelClass: Class<T>): T {\n        return factory.create(noteId) as T\n    }\n}\n\nsealed interface RenoteItemType {\n\n    val user: User\n    data class Renote(val note: NoteRelation) : RenoteItemType {\n        override val user: User\n            get() = note.user\n    }\n\n    data class Reblog(override val user: User) : RenoteItemType\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/NoteFontSizeBinder.kt",
    "content": "package net.pantasystem.milktea.note.timeline\n\nimport android.widget.TextView\nimport net.pantasystem.milktea.note.databinding.ItemSimpleNoteBinding\n\nclass NoteFontSizeBinder(\n    val userInfoViews: HeaderViews,\n    val contentViews: ContentViews,\n    val quoteToUserInfoViews: HeaderViews,\n    val quoteToContentViews: ContentViews,\n    val replyToHeaderViews: HeaderViews? = null,\n    val replyToContentViews: ContentViews? = null,\n) {\n\n    class HeaderViews(\n        val nameView: TextView,\n        val userNameView: TextView,\n        val elapsedTimeView: TextView?,\n    )\n\n    class ContentViews(\n        val cwView: TextView,\n        val textView: TextView,\n    )\n\n    companion object {\n        fun from(binding: ItemSimpleNoteBinding): NoteFontSizeBinder {\n            return NoteFontSizeBinder(\n                userInfoViews = HeaderViews(\n                    nameView = binding.mainName,\n                    userNameView = binding.subName,\n                    elapsedTimeView = binding.elapsedTime\n                ),\n                contentViews = ContentViews(\n                    cwView = binding.cw,\n                    textView = binding.text\n                ),\n                quoteToUserInfoViews = HeaderViews(\n                    nameView = binding.subNoteMainName,\n                    userNameView = binding.subNoteSubName,\n                    elapsedTimeView = null,\n                ),\n                quoteToContentViews = ContentViews(\n                    cwView = binding.subCw,\n                    textView = binding.subNoteText\n                )\n            )\n        }\n    }\n\n    fun bind(\n        headerFontSize: Float,\n        contentFontSize: Float,\n    ) {\n        bind(\n            header = userInfoViews,\n            content = contentViews,\n            headerFontSize = headerFontSize,\n            contentFontSize = contentFontSize\n        )\n        bind(\n            header = quoteToUserInfoViews,\n            content = quoteToContentViews,\n            headerFontSize = headerFontSize,\n            contentFontSize = contentFontSize,\n        )\n\n\n        if (replyToContentViews != null && replyToHeaderViews != null) {\n            bind(\n                header = replyToHeaderViews,\n                content = replyToContentViews,\n                headerFontSize = headerFontSize,\n                contentFontSize = contentFontSize,\n            )\n        }\n    }\n\n    private fun bind(\n        header: HeaderViews,\n        content: ContentViews,\n        headerFontSize: Float,\n        contentFontSize: Float,\n    ) {\n        header.elapsedTimeView?.textSize = headerFontSize\n        header.userNameView.textSize = headerFontSize\n        header.nameView.textSize = headerFontSize\n        content.cwView.textSize = contentFontSize\n        content.textView.textSize = contentFontSize\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/ReactionCountItemsInflater.kt",
    "content": "package net.pantasystem.milktea.note.timeline\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport com.bumptech.glide.Glide\nimport com.google.android.flexbox.FlexboxLayout\nimport net.pantasystem.milktea.common_android.ui.FontSizeUnitConverter.setMemoFontSpSize\nimport net.pantasystem.milktea.common_android.ui.VisibilityHelper.setMemoVisibility\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.note.databinding.ItemReactionBinding\nimport net.pantasystem.milktea.note.reaction.NoteReactionViewHelper.bindReactionCount\nimport net.pantasystem.milktea.note.reaction.ReactionCountAction\nimport net.pantasystem.milktea.note.reaction.ReactionHelper.applyBackgroundColor\nimport net.pantasystem.milktea.note.reaction.ReactionViewData\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport java.util.Stack\n\nclass ReactionCountItemsFlexboxLayoutBinder(\n    val viewRecycler: ViewRecycler<View>,\n    val reactionCountActionListener: (ReactionCountAction) -> Unit,\n) {\n\n    fun bindReactionCounts(flexboxLayout: FlexboxLayout, currentNote: PlaneNoteViewData?, reactionCounts: List<ReactionViewData>) {\n        val currentViewsCount = flexboxLayout.childCount\n        val newDataCount = reactionCounts.size\n\n        // Step 1: Remove unnecessary views\n        while (flexboxLayout.childCount > newDataCount) {\n\n            val child = flexboxLayout.getChildAt(flexboxLayout.childCount - 1)\n            flexboxLayout.removeViewAt(flexboxLayout.childCount - 1)\n            Glide.with(child).clear(ItemReactionBinding.bind(child).reactionImage)\n            viewRecycler.recycleView(child)\n        }\n\n        reactionCounts.forEachIndexed { index, reactionData ->\n            val existingBinding: ItemReactionBinding? = if (index < currentViewsCount) {\n                ItemReactionBinding.bind(flexboxLayout.getChildAt(index))\n            } else null\n\n            val binding = existingBinding ?: viewRecycler.getRecycledView {\n                ItemReactionBinding.inflate(\n                    LayoutInflater.from(flexboxLayout.context),\n                    flexboxLayout,\n                    false\n                ).root\n            }.let {\n                ItemReactionBinding.bind(it)\n            }\n\n            // Step 2: Bind data to the view\n            binding.apply {\n                reactionLayout.applyBackgroundColor(\n                    reactionData,\n                    currentNote?.toShowNote?.note?.isMisskey ?: false\n                )\n                reactionLayout.bindReactionCount(\n                    reactionText,\n                    reactionImage,\n                    reactionData,\n                    (currentNote?.config?.value?.noteReactionCounterFontSize ?: 15f) * 1.2f\n                )\n                reactionCounter.text = reactionData.reactionCount.count.toString()\n                reactionCounter.setMemoFontSpSize(\n                    currentNote?.config?.value?.noteReactionCounterFontSize ?: 15f\n                )\n            }\n\n            binding.root.setOnLongClickListener { view ->\n                val id = currentNote?.toShowNote?.note?.id\n                if (id != null) {\n                    HapticFeedbackController.performLongClickHapticFeedback(view)\n                    reactionCountActionListener(\n                        ReactionCountAction.OnLongClicked(\n                            currentNote,\n                            reactionData.reaction\n                        )\n                    )\n                    true\n                } else {\n                    false\n                }\n            }\n            binding.root.setOnClickListener { view ->\n                currentNote?.let {\n                    HapticFeedbackController.performClickHapticFeedback(view)\n                    reactionCountActionListener(ReactionCountAction.OnClicked(currentNote, reactionData.reaction))\n                }\n            }\n\n            // Step 3: Add new view if necessary\n            if (existingBinding == null) {\n                flexboxLayout.addView(binding.root)\n            }\n        }\n        flexboxLayout.setMemoVisibility(View.VISIBLE)\n    }\n}\n\nclass ViewRecycler<T> where T : View {\n\n    private val recycledViews: Stack<T> = Stack()\n\n    /**\n     * 使わなくなったViewをリサイクル用のスタックに追加する\n     */\n    fun recycleView(view: T) {\n        if (recycledViews.size < 40) {\n            recycledViews.push(view)\n        }\n    }\n\n    /**\n     * 必要なビューを取得する。\n     * リサイクルできるビューがあればそれを返し、なければnullを返す。\n     */\n    fun getRecycledView(onInflateView: () -> T): T {\n        return if (recycledViews.isNotEmpty()) {\n            recycledViews.pop()\n        } else {\n            onInflateView()\n        }\n    }\n\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/TimeMachineDialog.kt",
    "content": "package net.pantasystem.milktea.note.timeline\n\nimport android.app.DatePickerDialog\nimport android.app.Dialog\nimport android.app.TimePickerDialog\nimport android.os.Bundle\nimport android.view.View\nimport android.widget.DatePicker\nimport android.widget.TimePicker\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.DialogTimeMachineBinding\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimeMachineDialogViewModel\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimeMachineEventViewModel\n\n@AndroidEntryPoint\nclass TimeMachineDialog : AppCompatDialogFragment() {\n    companion object {\n        const val FRAGMENT_TAG = \"TimeMachineDialog\"\n    }\n\n    val viewModel by activityViewModels<TimeMachineDialogViewModel>()\n    private val timeMachineEventViewModel by activityViewModels<TimeMachineEventViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val view = View.inflate(this.context, R.layout.dialog_time_machine, null)\n        val binding = DialogTimeMachineBinding.bind(view)\n        binding.lifecycleOwner = this\n        binding.viewModel = viewModel\n\n        binding.pickTime.setOnClickListener {\n            TimeMachineTimePickerDialog().show(childFragmentManager, TimeMachineTimePickerDialog.FRAGMENT_TAG)\n        }\n\n        binding.pickDate.setOnClickListener {\n            TimeMachineDatePickerDialog().show(childFragmentManager, TimeMachineDatePickerDialog.FRAGMENT_TAG)\n        }\n\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.time_machine)\n            .setMessage(R.string.dialog_timemachine_message)\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                timeMachineEventViewModel.setDateTime(viewModel.currentDateTime.value)\n            }.setNegativeButton(android.R.string.cancel) { _, _ ->\n\n            }.setView(view)\n            .create()\n    }\n}\n\n@AndroidEntryPoint\nclass TimeMachineDatePickerDialog : AppCompatDialogFragment(), DatePickerDialog.OnDateSetListener {\n\n    companion object {\n        const val FRAGMENT_TAG = \"TimeMachineDatePickerDialog\"\n    }\n\n    val viewModel: TimeMachineDialogViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val local = viewModel.currentDateTime.value.toLocalDateTime(TimeZone.currentSystemDefault())\n        return DatePickerDialog(requireActivity(), this, local.year, local.monthNumber - 1, local.dayOfMonth)\n    }\n\n    override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {\n        viewModel.setDate(year, month, dayOfMonth)\n    }\n}\n\nclass TimeMachineTimePickerDialog : AppCompatDialogFragment(), TimePickerDialog.OnTimeSetListener {\n    companion object {\n        const val FRAGMENT_TAG = \"TimeMachineTimePickerDialog\"\n    }\n\n    val viewModel: TimeMachineDialogViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val local = viewModel.currentDateTime.value.toLocalDateTime(TimeZone.currentSystemDefault())\n        return TimePickerDialog(requireActivity(), this, local.hour, local.minute, true)\n    }\n    override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {\n        viewModel.setTime(hourOfDay, minute)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/TimelineErrorHandler.kt",
    "content": "package net.pantasystem.milktea.note.timeline\n\nimport android.content.Context\nimport android.widget.Toast\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.APIErrorStringConverter\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.note.R\nimport java.io.IOException\n\nclass TimelineErrorHandler(\n    val context: Context,\n) {\n\n    operator fun invoke(error: Throwable) {\n        when (error) {\n            is IOException -> {\n                Toast.makeText(context, R.string.network_error, Toast.LENGTH_LONG)\n                    .show()\n            }\n            is APIError -> {\n                if (error is APIError.InternalServerException) {\n                    return\n                }\n                Toast.makeText(context, APIErrorStringConverter()(error).getString(context), Toast.LENGTH_LONG)\n                    .show()\n            }\n\n            is UnauthorizedException -> {\n                Toast.makeText(\n                    context,\n                    R.string.unauthorized_error,\n                    Toast.LENGTH_LONG\n                ).show()\n            }\n            else -> Unit\n\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/TimelineFragment.kt",
    "content": "package net.pantasystem.milktea.note.timeline\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.ViewCompositionStrategy\nimport androidx.core.view.MenuHost\nimport androidx.core.view.MenuProvider\nimport androidx.core.view.isVisible\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.whenResumed\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.PageableView\nimport net.pantasystem.milktea.common_android.debug.DebugFeatureFlags\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.common_viewmodel.ScrollToTopViewModel\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.compose.ComposeTimeline\nimport net.pantasystem.milktea.note.databinding.FragmentTimelineBinding\nimport net.pantasystem.milktea.note.timeline.viewmodel.AccountId\nimport net.pantasystem.milktea.note.timeline.viewmodel.PageId\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimeMachineEventViewModel\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimelineViewModel\nimport net.pantasystem.milktea.note.timeline.viewmodel.provideViewModel\nimport net.pantasystem.milktea.note.view.NoteCardActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass TimelineFragment : Fragment(R.layout.fragment_timeline), PageableView {\n\n    companion object {\n\n        private const val EXTRA_PAGE = \"jp.panta.misskeyandroidclient.EXTRA_PAGE\"\n        private const val EXTRA_PAGEABLE = \"jp.panta.misskeyandroidclient.EXTRA_PAGEABLE\"\n        private const val EXTRA_ACCOUNT_ID = \"jp.panta.misskeyandroidclient.EXTRA_ACCOUNT_ID\"\n        private const val EXTRA_PAGE_ID = \"jp.panta.misskeyandroidclient.EXTRA_PAGE_ID\"\n\n        fun newInstance(page: Page): TimelineFragment {\n            return TimelineFragment().apply {\n                arguments = Bundle().apply {\n                    putSerializable(EXTRA_PAGE, page)\n                    putLong(EXTRA_PAGE_ID, page.pageId)\n                }\n            }\n        }\n\n        fun newInstance(pageable: Pageable, accountId: Long? = null, pageId: Long? = null): TimelineFragment {\n            return TimelineFragment().apply {\n                arguments = Bundle().apply {\n                    putSerializable(EXTRA_PAGEABLE, pageable)\n                    if (accountId != null) {\n                        putLong(EXTRA_ACCOUNT_ID, accountId)\n                    }\n                    if (pageId != null) {\n                        putLong(EXTRA_PAGE_ID, pageId)\n                    }\n                }\n            }\n        }\n\n    }\n\n    private var _linearLayoutManager: LinearLayoutManager? = null\n    private val layoutManager: LinearLayoutManager\n        get() = requireNotNull(_linearLayoutManager)\n\n    @Inject\n    internal lateinit var timelineViewModelFactory: TimelineViewModel.ViewModelAssistedFactory\n\n    private val mViewModel: TimelineViewModel by viewModels<TimelineViewModel> {\n        TimelineViewModel.provideViewModel(\n            timelineViewModelFactory,\n            accountId = (mPage?.attachedAccountId?: mPage?.accountId ?: accountId)?.let {\n                AccountId(it)\n            },\n            pageId = mPage?.pageId?.let {\n                PageId(it)\n            } ?: pageId?.let {\n                PageId(it)\n            },\n            pageable = mPageable,\n            isSaveScrollPosition = mPage?.isSavePagePosition\n        )\n    }\n\n    private val timeMachineEventViewModel by activityViewModels<TimeMachineEventViewModel>()\n\n    private val scrollToTopViewModel by activityViewModels<ScrollToTopViewModel>()\n\n    @Inject\n    internal lateinit var settingStore: SettingStore\n\n    @Inject\n    internal lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var setMenuTint: ApplyMenuTint\n\n    @Inject\n    internal lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    internal lateinit var accountStore: AccountStore\n\n    @Inject\n    internal lateinit var channelDetailNavigation: ChannelDetailNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var searchNavigation: SearchNavigation\n\n\n    private val mBinding: FragmentTimelineBinding by dataBinding()\n\n    @Suppress(\"DEPRECATION\")\n    private val mPage: Page? by lazy {\n        arguments?.getSerializable(EXTRA_PAGE) as? Page\n    }\n\n    private val accountId: Long? by lazy {\n        arguments?.getLong(EXTRA_ACCOUNT_ID, -1).takeIf {\n            it != -1L\n        }\n    }\n\n    private val pageId by lazy {\n        arguments?.getLong(EXTRA_PAGE_ID, -1).takeIf {\n            it != -1L\n        }\n    }\n\n    @Suppress(\"DEPRECATION\")\n    private val mPageable: Pageable by lazy {\n        val pageable = arguments?.getSerializable(EXTRA_PAGEABLE) as? Pageable\n        mPage?.pageable() ?: pageable ?: throw IllegalStateException(\"構築に必要な情報=Pageableがありません。\")\n    }\n\n    /**\n     * タイムラインが画面上に表示されているかを判定するフラグ\n     */\n    private var isShowing: Boolean = false\n\n    private var mFirstVisibleItemPosition: Int? = null\n\n\n    val notesViewModel by activityViewModels<NotesViewModel>()\n\n    private val currentPageableTimelineViewModel: CurrentPageableTimelineViewModel by activityViewModels()\n\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        // ── デバッグ専用: Compose タイムラインを使用する場合は早期 return ──────────\n        if (DebugFeatureFlags.isComposeTimelineEnabled(requireContext())) {\n            setupComposeTimeline(view)\n            return\n        }\n        // ─────────────────────────────────────────────────────────────────────────\n\n        val lm = LinearLayoutManager(this.requireContext())\n        _linearLayoutManager = lm\n        val adapter = TimelineListAdapter(\n            configRepository = configRepository,\n            viewLifecycleOwner,\n            onRefreshAction = {\n                mViewModel.loadInit()\n            },\n            onReauthenticateAction = {\n                startActivity(\n                    authorizationNavigation.newIntent(\n                        AuthorizationArgs.ReAuth(\n                            accountStore.currentAccount\n                        )\n                    )\n                )\n            },\n        ) {\n            NoteCardActionHandler(\n                requireActivity() as AppCompatActivity,\n                notesViewModel,\n                settingStore,\n                userDetailNavigation,\n                channelDetailNavigation,\n                currentPageable = mPageable,\n                searchNavigation = searchNavigation\n            ).onAction(it)\n        }\n\n        adapter.AvatarIconPreloadProvider(requireContext()).setup(mBinding.listView)\n\n        mBinding.listView.layoutManager = lm\n\n        mBinding.refresh.setOnRefreshListener {\n            mViewModel.loadNew()\n        }\n\n        mViewModel.isLoading.onEach {\n            if (!it) {\n                mBinding.refresh.isRefreshing = false\n            }\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n        mBinding.listView.adapter = adapter\n        mBinding.listView.setItemViewCacheSize(8)\n\n        mViewModel.timelineListState.onEach { state ->\n            adapter.submitList(state)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n        mViewModel.errorEvent.onEach { error ->\n            TimelineErrorHandler(requireContext())(error)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n        scrollToTopViewModel.scrollToTopEvent.onEach {\n                mBinding.listView.smoothScrollToPosition(0)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n        adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {\n\n            override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {\n                super.onItemRangeInserted(positionStart, itemCount)\n                if (mViewModel.timelineStore.latestReceiveNoteId() != null && positionStart == 0 && mFirstVisibleItemPosition == 0 && isShowing && itemCount == 1) {\n                    lm.scrollToPosition(0)\n                    performNewPostReceivedVibrateFeedback()\n                } else {\n                    mViewModel.onScrollStateChanged(lm.findFirstVisibleItemPosition())\n                }\n            }\n        })\n\n\n        (requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {\n            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n                menuInflater.inflate(R.menu.menu_timeline, menu)\n                setMenuTint(requireActivity(), menu)\n                if (mPageable is Pageable.Mastodon) {\n                    menu.findItem(R.id.set_time_machine).isVisible = false\n                }\n            }\n\n            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n                when (menuItem.itemId) {\n                    R.id.refresh_timeline -> {\n                        mViewModel.loadInit(ignoreSavedScrollPosition = true)\n                        return true\n                    }\n                    R.id.set_time_machine -> {\n                        TimeMachineDialog().show(childFragmentManager, TimeMachineDialog.FRAGMENT_TAG)\n                        return true\n                    }\n                }\n                return false\n            }\n        }, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            whenResumed {\n                timeMachineEventViewModel.loadEvents.collect {\n                    mViewModel.loadInit(it, ignoreSavedScrollPosition = true)\n                }\n            }\n        }\n\n        mBinding.listView.addOnScrollListener(\n            object : RecyclerView.OnScrollListener() {\n                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {\n                    super.onScrolled(recyclerView, dx, dy)\n                    val firstVisibleItemPosition = lm.findFirstVisibleItemPosition()\n                    mFirstVisibleItemPosition = firstVisibleItemPosition\n                    val topView = layoutManager.findViewByPosition(firstVisibleItemPosition)\n                    var offset: Int? = null\n                    if (topView != null) {\n                        val top = topView.top - topView.paddingTop\n                        offset = top\n                    }\n                    mViewModel.onScrolled(dy, firstVisibleItemPosition, offset)\n                }\n\n                override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n                    super.onScrollStateChanged(recyclerView, newState)\n\n                    val endVisibleItemPosition = lm.findLastVisibleItemPosition()\n                    val itemCount = lm.itemCount\n\n                    if (endVisibleItemPosition == (itemCount - 1)) {\n                        mViewModel.loadOld()\n                    }\n\n                    mViewModel.onScrollStateChanged(lm.findFirstVisibleItemPosition())\n\n                }\n            }\n        )\n\n        mViewModel.isVisibleNewPostsButton.onEach {\n            mBinding.jumpToNewPostsButton.isVisible = it\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        mBinding.jumpToNewPostsButton.setOnClickListener {\n            mViewModel.loadInit(ignoreSavedScrollPosition = true)\n        }\n    }\n\n\n    /**\n     * Compose タイムラインをセットアップする。\n     * 既存の SwipeRefreshLayout + RecyclerView を隠し、ComposeView を FrameLayout に追加する。\n     * DEBUG ビルド + DebugFeatureFlags.isComposeTimelineEnabled() == true のときのみ呼ばれる。\n     */\n    private fun setupComposeTimeline(view: View) {\n        // 既存の RecyclerView (SwipeRefreshLayout) を隠す\n        mBinding.refresh.isVisible = false\n        mBinding.jumpToNewPostsButton.isVisible = false\n\n        val actionHandler = NoteCardActionHandler(\n            requireActivity() as AppCompatActivity,\n            notesViewModel,\n            settingStore,\n            userDetailNavigation,\n            channelDetailNavigation,\n            currentPageable = mPageable,\n            searchNavigation = searchNavigation,\n        )\n\n        val composeView = ComposeView(requireContext()).apply {\n            layoutParams = android.widget.FrameLayout.LayoutParams(\n                android.widget.FrameLayout.LayoutParams.MATCH_PARENT,\n                android.widget.FrameLayout.LayoutParams.MATCH_PARENT,\n            )\n            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    ComposeTimeline(\n                        viewModel = mViewModel,\n                        onAction = { actionHandler.onAction(it) },\n                    )\n                }\n            }\n        }\n        (mBinding.root as android.widget.FrameLayout).addView(composeView, 0)\n\n        (requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {\n            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n                menuInflater.inflate(R.menu.menu_timeline, menu)\n                setMenuTint(requireActivity(), menu)\n                if (mPageable is Pageable.Mastodon) {\n                    menu.findItem(R.id.set_time_machine).isVisible = false\n                }\n            }\n\n            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n                when (menuItem.itemId) {\n                    R.id.refresh_timeline -> {\n                        mViewModel.loadInit(ignoreSavedScrollPosition = true)\n                        return true\n                    }\n                    R.id.set_time_machine -> {\n                        TimeMachineDialog().show(childFragmentManager, TimeMachineDialog.FRAGMENT_TAG)\n                        return true\n                    }\n                }\n                return false\n            }\n        }, viewLifecycleOwner, Lifecycle.State.RESUMED)\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        isShowing = true\n        mViewModel.onResume()\n\n        currentPageableTimelineViewModel.setCurrentPageable(mViewModel.accountId?.value, mPageable, pageId)\n        try {\n            layoutManager.scrollToPositionWithOffset(mViewModel.position, mViewModel.offset)\n        } catch (_: Exception) {\n        }\n\n    }\n\n    override fun onPause() {\n        super.onPause()\n        isShowing = false\n        mViewModel.onPause()\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n        _linearLayoutManager = null\n    }\n\n    private fun performNewPostReceivedVibrateFeedback() {\n        if (configRepository.get().getOrElse { DefaultConfig.config }.isEnableHapticFeedbackOnNewPost) {\n            HapticFeedbackController.performTickVibrateHapticFeedback(requireContext())\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/TimelineListAdapter.kt",
    "content": "package net.pantasystem.milktea.note.timeline\n\n\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.ListPreloader.PreloadModelProvider\nimport com.bumptech.glide.RequestBuilder\nimport com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader\nimport com.bumptech.glide.util.FixedPreloadSizeProvider\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.common.glide.GlideUtils\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemHasReplyToNoteBinding\nimport net.pantasystem.milktea.note.databinding.ItemNoteBinding\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimelineListItem\nimport net.pantasystem.milktea.note.view.NoteCardAction\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\nimport net.pantasystem.milktea.note.viewmodel.HasReplyToNoteViewData\nimport java.util.Collections\n\nclass TimelineListAdapter(\n    private val configRepository: LocalConfigRepository,\n    private val lifecycleOwner: LifecycleOwner,\n    val onRefreshAction: () -> Unit,\n    val onReauthenticateAction: () -> Unit,\n    val onAction: (NoteCardAction) -> Unit,\n) : ListAdapter<TimelineListItem, TimelineListItemViewHolderBase>(\n    object : DiffUtil.ItemCallback<TimelineListItem>() {\n        override fun areContentsTheSame(\n            oldItem: TimelineListItem,\n            newItem: TimelineListItem,\n        ): Boolean {\n            if (oldItem is TimelineListItem.Note && newItem is TimelineListItem.Note) {\n                return oldItem.note.id == newItem.note.id\n            }\n            return oldItem == newItem\n        }\n\n        override fun areItemsTheSame(\n            oldItem: TimelineListItem,\n            newItem: TimelineListItem,\n        ): Boolean {\n            if (oldItem is TimelineListItem.Note && newItem is TimelineListItem.Note) {\n                return oldItem.note.id == newItem.note.id\n            }\n            return oldItem == newItem\n        }\n    },\n) {\n\n    val cardActionListener = NoteCardActionListenerAdapter(onAction)\n\n    private val reactionCountItemsFlexboxLayoutBinder = ReactionCountItemsFlexboxLayoutBinder(\n        ViewRecycler(),\n    ) {\n        cardActionListener.onReactionCountAction(it)\n    }\n\n    enum class ViewHolderType {\n        NormalNote, HasReplyToNote, Loading, Empty, Error\n    }\n\n\n\n    override fun getItemViewType(position: Int): Int {\n        val item = getItem(position)\n        return when (item) {\n            TimelineListItem.Empty -> ViewHolderType.Empty\n            is TimelineListItem.Error -> ViewHolderType.Error\n            TimelineListItem.Loading -> ViewHolderType.Loading\n            is TimelineListItem.Note -> {\n                if (item.note is HasReplyToNoteViewData) {\n                    ViewHolderType.HasReplyToNote\n                } else {\n                    ViewHolderType.NormalNote\n                }\n            }\n        }.ordinal\n\n    }\n\n    override fun onBindViewHolder(p0: TimelineListItemViewHolderBase, position: Int) {\n\n        val item = getItem(position)\n\n        when (p0) {\n\n            is LoadingViewHolder -> {\n                // 何もしない\n            }\n\n            is HasReplyToNoteViewHolder -> {\n                p0.bind((item as TimelineListItem.Note).note)\n            }\n\n            is NoteViewHolder -> {\n                p0.bind((item as TimelineListItem.Note).note)\n            }\n\n            is EmptyViewHolder -> {\n                p0.binding.retryLoadButton.setOnClickListener {\n                    onRefreshAction()\n                }\n            }\n\n            is ErrorViewHolder -> {\n                p0.binding.retryLoadButton.setOnClickListener {\n                    onRefreshAction()\n                }\n                p0.binding.reauthenticateButton.setOnClickListener {\n                    onReauthenticateAction()\n                }\n                p0.bind((item as TimelineListItem.Error))\n            }\n        }\n\n    }\n\n    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): TimelineListItemViewHolderBase {\n        val config = configRepository.get().getOrElse {\n            DefaultConfig.config\n        }\n        return when (ViewHolderType.values()[p1]) {\n            ViewHolderType.NormalNote -> {\n                val binding = DataBindingUtil.inflate<ItemNoteBinding>(\n                    LayoutInflater.from(p0.context),\n                    R.layout.item_note,\n                    p0,\n                    false\n                )\n\n                NoteFontSizeBinder.from(binding.simpleNote).bind(\n                    headerFontSize = config.noteHeaderFontSize,\n                    contentFontSize = config.noteContentFontSize,\n                )\n                NoteViewHolder(binding, reactionCountItemsFlexboxLayoutBinder, lifecycleOwner, cardActionListener)\n            }\n\n            ViewHolderType.HasReplyToNote -> {\n                val binding = DataBindingUtil.inflate<ItemHasReplyToNoteBinding>(\n                    LayoutInflater.from(p0.context),\n                    R.layout.item_has_reply_to_note,\n                    p0,\n                    false\n                )\n\n                NoteFontSizeBinder.from(binding.simpleNote).bind(\n                    headerFontSize = config.noteHeaderFontSize,\n                    contentFontSize = config.noteContentFontSize,\n                )\n                HasReplyToNoteViewHolder(binding, reactionCountItemsFlexboxLayoutBinder, lifecycleOwner, cardActionListener)\n            }\n\n            ViewHolderType.Loading -> {\n                LoadingViewHolder(\n                    LayoutInflater.from(p0.context)\n                        .inflate(R.layout.item_timeline_loading, p0, false)\n                )\n            }\n\n            ViewHolderType.Empty -> {\n                EmptyViewHolder(\n                    DataBindingUtil.inflate(\n                        LayoutInflater.from(p0.context),\n                        R.layout.item_timeline_empty,\n                        p0,\n                        false\n                    )\n                )\n            }\n\n            ViewHolderType.Error -> {\n                ErrorViewHolder(\n                    DataBindingUtil.inflate(\n                        LayoutInflater.from(p0.context),\n                        R.layout.item_timeline_error,\n                        p0,\n                        false\n                    )\n                )\n            }\n        }\n\n\n    }\n\n\n    override fun onViewRecycled(holder: TimelineListItemViewHolderBase) {\n        super.onViewRecycled(holder)\n        val simpleNote = when (holder) {\n            is EmptyViewHolder -> return\n            is ErrorViewHolder -> return\n            is LoadingViewHolder -> return\n            is HasReplyToNoteViewHolder -> {\n                holder.binding.simpleNote\n            }\n\n            is NoteViewHolder -> {\n                holder.binding.simpleNote\n            }\n        }\n        val imageViews = listOf(\n            simpleNote.avatarIcon,\n//            simpleNote.mediaPreview.thumbnailTopLeft,\n//            simpleNote.mediaPreview.thumbnailTopRight,\n//            simpleNote.mediaPreview.thumbnailBottomLeft,\n//            simpleNote.mediaPreview.thumbnailBottomRight,\n            simpleNote.subAvatarIcon,\n//            simpleNote.subNoteMediaPreview.ethumbnailBottomLeft,\n//            simpleNote.subNoteMediaPreview.thumbnailBottomRight,\n//            simpleNote.subNoteMediaPreview.thumbnailBottomLeft,\n//            simpleNote.subNoteMediaPreview.thumbnailBottomRight,\n\n            )\n//        simpleNote.reactionView.itemAnimator?.endAnimations()\n\n        imageViews.map {\n            if (GlideUtils.isAvailableContextForGlide(it.context)) {\n                Glide.with(it).clear(it)\n            }\n        }\n\n        if (holder is NoteViewHolderBase<*>) {\n            holder.unbind()\n        }\n    }\n\n\n    inner class AvatarIconPreloadProvider(private val context: Context) : PreloadModelProvider<String> {\n        override fun getPreloadItems(position: Int): MutableList<String> {\n            return when(val item = getItem(position)) {\n                TimelineListItem.Empty -> Collections.emptyList()\n                is TimelineListItem.Error -> Collections.emptyList()\n                TimelineListItem.Loading -> Collections.emptyList()\n                is TimelineListItem.Note -> Collections.singletonList(item.note.avatarUrl)\n            }\n        }\n\n        override fun getPreloadRequestBuilder(item: String): RequestBuilder<*> {\n            return Glide.with(context)\n                .load(item)\n                .override(\n                    avatarIconSize,\n                )\n\n        }\n\n        fun setup(recyclerView: RecyclerView) {\n            val modelProvider = AvatarIconPreloadProvider(context)\n            val sizeProvider = FixedPreloadSizeProvider<String>(modelProvider.avatarIconSize, modelProvider.avatarIconSize)\n            val loader = RecyclerViewPreloader(GlideApp.with(context), modelProvider, sizeProvider, 10)\n            recyclerView.addOnScrollListener(loader)\n        }\n        val avatarIconSize: Int\n            get() {\n                return context.resources.getDimensionPixelSize(R.dimen.note_avatar_icon_size)\n            }\n    }\n\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/TimelineListAdapterViewHolders.kt",
    "content": "package net.pantasystem.milktea.note.timeline\n\nimport android.text.Spannable\nimport android.text.SpannableString\nimport android.view.View\nimport androidx.core.view.isVisible\nimport androidx.databinding.ViewDataBinding\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.flexbox.FlexboxLayout\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common_android.ui.FontSizeUnitConverter.specialPointToPixel\nimport net.pantasystem.milktea.note.databinding.ItemHasReplyToNoteBinding\nimport net.pantasystem.milktea.note.databinding.ItemNoteBinding\nimport net.pantasystem.milktea.note.databinding.ItemTimelineEmptyBinding\nimport net.pantasystem.milktea.note.databinding.ItemTimelineErrorBinding\nimport net.pantasystem.milktea.note.reaction.ReactionViewData\nimport net.pantasystem.milktea.note.timeline.viewmodel.TimelineListItem\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\nimport net.pantasystem.milktea.note.view.NoteUserRoleBadgeBinder.setUserRoleBadge\nimport net.pantasystem.milktea.note.viewmodel.HasReplyToNoteViewData\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\n\nsealed class TimelineListItemViewHolderBase(view: View) : RecyclerView.ViewHolder(view)\n\nsealed class NoteViewHolderBase<out T : ViewDataBinding>(\n    view: View,\n    private val reactionCountBinder: ReactionCountItemsFlexboxLayoutBinder\n) :\n    TimelineListItemViewHolderBase(view) {\n\n    abstract val binding: T\n    abstract val lifecycleOwner: LifecycleOwner\n    abstract val flexboxLayout: FlexboxLayout\n    abstract val noteCardActionListenerAdapter: NoteCardActionListenerAdapter\n\n\n    abstract fun onBind(note: PlaneNoteViewData)\n\n    private var mCurrentNote: PlaneNoteViewData? = null\n\n    fun bind(note: PlaneNoteViewData) {\n\n        unbind()\n\n        mCurrentNote = note\n        bindReactionCounter()\n\n        onBind(mCurrentNote!!)\n        binding.lifecycleOwner = lifecycleOwner\n        binding.executePendingBindings()\n    }\n\n    private var job: Job? = null\n\n    fun unbind() {\n        job?.cancel()\n//            reactionCountsView.itemAnimator?.endAnimations()\n\n        mCurrentNote = null\n    }\n\n    private fun bindReactionCounter() {\n        val note = mCurrentNote!!\n        job = note.reactionCountsViewData.onEach { counts ->\n            bindReactionCountVisibility(counts)\n        }.flowWithLifecycle(lifecycleOwner.lifecycle).launchIn(lifecycleOwner.lifecycleScope)\n    }\n\n    private fun bindReactionCountVisibility(reactionCounts: List<ReactionViewData>?) {\n        reactionCountBinder.bindReactionCounts(\n            flexboxLayout,\n            mCurrentNote,\n            reactionCounts ?: emptyList(),\n        )\n\n        flexboxLayout.visibility = if (reactionCounts.isNullOrEmpty()) {\n            View.GONE\n        } else {\n            View.VISIBLE\n        }\n    }\n\n}\n\nclass LoadingViewHolder(view: View) : TimelineListItemViewHolderBase(view)\n\nclass ErrorViewHolder(val binding: ItemTimelineErrorBinding) :\n    TimelineListItemViewHolderBase(binding.root) {\n    fun bind(item: TimelineListItem.Error) {\n        binding.errorItem = item\n        binding.errorView.isVisible = false\n        binding.showErrorMessageButton.isVisible = true\n        binding.errorView.text = item.throwable.toString()\n        binding.showErrorMessageButton.setOnClickListener {\n            binding.errorView.isVisible = true\n        }\n    }\n}\n\nclass EmptyViewHolder(val binding: ItemTimelineEmptyBinding) :\n    TimelineListItemViewHolderBase(binding.root)\n\nclass NoteViewHolder(\n    override val binding: ItemNoteBinding,\n    binder: ReactionCountItemsFlexboxLayoutBinder,\n    override val lifecycleOwner: LifecycleOwner,\n    override val noteCardActionListenerAdapter: NoteCardActionListenerAdapter\n) :\n    NoteViewHolderBase<ItemNoteBinding>(binding.root, binder) {\n\n    override val flexboxLayout: FlexboxLayout\n        get() = binding.simpleNote.reactionView\n\n\n\n    init {\n        listOf(\n            binding.simpleNote.text,\n            binding.simpleNote.cw,\n            binding.simpleNote.mainName,\n            binding.simpleNote.subName,\n\n            binding.simpleNote.subNoteText,\n            binding.simpleNote.subCw,\n            binding.simpleNote.subNoteSubName,\n            binding.simpleNote.subNoteMainName,\n        ).forEach {\n            it.setSpannableFactory(spannableFactory)\n        }\n    }\n\n    override fun onBind(note: PlaneNoteViewData) {\n        binding.note = note\n        binding.noteCardActionListener = noteCardActionListenerAdapter\n        val badgeIconSize =\n            binding.root.context.specialPointToPixel(note.config.value.noteHeaderFontSize).toInt()\n        binding.simpleNote.badgeRoles.apply {\n            setUserRoleBadge(\n                binding.simpleNote.noteLayout,\n                note.toShowNote.user.iconBadgeRoles,\n                badgeIconSize\n            )\n        }\n    }\n\n\n}\n\nclass HasReplyToNoteViewHolder(\n    override val binding: ItemHasReplyToNoteBinding, binder: ReactionCountItemsFlexboxLayoutBinder,\n    override val lifecycleOwner: LifecycleOwner,\n    override val noteCardActionListenerAdapter: NoteCardActionListenerAdapter\n) :\n    NoteViewHolderBase<ItemHasReplyToNoteBinding>(binding.root, binder) {\n\n    override val flexboxLayout: FlexboxLayout\n        get() = binding.simpleNote.reactionView\n\n    init {\n        listOf(\n            binding.simpleNote.text,\n            binding.simpleNote.cw,\n            binding.simpleNote.mainName,\n            binding.simpleNote.subName,\n\n            binding.simpleNote.subNoteText,\n            binding.simpleNote.subCw,\n            binding.simpleNote.subNoteSubName,\n            binding.simpleNote.subNoteMainName,\n        ).forEach {\n            it.setSpannableFactory(spannableFactory)\n        }\n    }\n\n\n    override fun onBind(note: PlaneNoteViewData) {\n        if (note is HasReplyToNoteViewData) {\n            binding.hasReplyToNote = note\n            binding.noteCardActionListener = noteCardActionListenerAdapter\n            binding.simpleNote.badgeRoles.apply {\n                val badgeIconSize =\n                    context.specialPointToPixel(note.config.value.noteHeaderFontSize).toInt()\n                setUserRoleBadge(\n                    binding.simpleNote.noteLayout,\n                    note.toShowNote.user.iconBadgeRoles,\n                    badgeIconSize\n                )\n            }\n        }\n    }\n\n}\n\nprivate val spannableFactory = object : Spannable.Factory() {\n    override fun newSpannable(source: CharSequence?): Spannable {\n        return (source as? Spannable?) ?: SpannableString(source)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/NoteStreamingCollector.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.notes.TimelineStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.CurrentAccountWatcher\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.NoteStreaming\n\ninternal class NoteStreamingCollector(\n    val coroutineScope: CoroutineScope,\n    val timelineStore: TimelineStore,\n    val accountStore: AccountStore,\n    val noteStreaming: NoteStreaming,\n    val logger: Logger,\n    val pageable: Pageable,\n    val currentAccountWatcher: CurrentAccountWatcher,\n) {\n\n    private var job: Job? = null\n\n    fun suspendStreaming() {\n        synchronized(this) {\n            job?.cancel()\n            job = null\n        }\n    }\n\n    fun resumeStreaming() {\n        startObserveStreaming()\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private fun startObserveStreaming() {\n        synchronized(this) {\n            if (job != null) {\n                return\n            }\n            job = accountStore.observeCurrentAccount.filterNotNull().distinctUntilChanged()\n                .flatMapLatest {\n                    noteStreaming.connect(currentAccountWatcher::getAccount, pageable)\n                }.map {\n                    timelineStore.onReceiveNote(it.id)\n                }.catch {\n                    logger.error(\"receive not error\", it)\n                }.launchIn(coroutineScope + Dispatchers.IO)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/TimeMachineDialogViewModel.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.*\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport java.util.*\nimport javax.inject.Inject\n\n@HiltViewModel\nclass TimeMachineDialogViewModel @Inject constructor(): ViewModel() {\n\n    private val _currentDateTime = MutableStateFlow(Clock.System.now())\n    val currentDateTime: StateFlow<Instant> = _currentDateTime\n    val currentDate = _currentDateTime.map {\n        Date(it.toEpochMilliseconds())\n    }.stateIn(viewModelScope, SharingStarted.Eagerly, Date())\n\n    fun setDate(year: Int, month: Int, dayOfMonth: Int) {\n\n        _currentDateTime.update {\n            val calendar = Calendar.getInstance()\n            calendar.time = Date(it.toEpochMilliseconds())\n            calendar.set(Calendar.YEAR, year)\n            calendar.set(Calendar.MONTH, month)\n            calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)\n            Instant.fromEpochMilliseconds(calendar.time.time)\n        }\n    }\n\n    fun setTime(hourOfDay: Int, minutes: Int) {\n        _currentDateTime.update {\n            val calendar = Calendar.getInstance()\n            calendar.time = Date(it.toEpochMilliseconds())\n            calendar.set(Calendar.HOUR_OF_DAY, hourOfDay)\n            calendar.set(Calendar.MINUTE, minutes)\n            Instant.fromEpochMilliseconds(calendar.time.time)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/TimeMachineEventViewModel.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.datetime.Instant\nimport javax.inject.Inject\n\n@HiltViewModel\nclass TimeMachineEventViewModel @Inject constructor() : ViewModel() {\n\n    private val _loadEvents = MutableSharedFlow<Instant>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 1)\n\n    val loadEvents: SharedFlow<Instant> = _loadEvents\n\n    fun setDateTime(instant: Instant) {\n        _loadEvents.tryEmit(instant)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/TimelineFilterService.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel\n\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.filter.WordFilterService\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMuteRepository\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport javax.inject.Inject\n\nclass TimelineFilterService(\n    private val pageable: Pageable,\n    private val wordFilterService: WordFilterService,\n    private val renoteMuteRepository: RenoteMuteRepository,\n) {\n\n    class Factory @Inject constructor(\n        private val wordFilterService: WordFilterService,\n        private val renoteMuteRepository: RenoteMuteRepository,\n    ){\n        fun create(pageable: Pageable): TimelineFilterService {\n            return TimelineFilterService(pageable, wordFilterService, renoteMuteRepository)\n        }\n    }\n\n\n    suspend fun filterNote(note: PlaneNoteViewData): PlaneNoteViewData {\n        val newResult = when(val result = note.filterResult) {\n            PlaneNoteViewData.FilterResult.NotExecuted -> {\n                if (wordFilterService.isShouldFilterNote(pageable, note.note)) {\n                    PlaneNoteViewData.FilterResult.ShouldFilterNote\n                } else {\n                    if (note.note.note.isRenoteOnly()\n                        && renoteMuteRepository.exists(\n                            note.note.note.userId\n                        ).getOrElse { false }\n                    ) {\n                        PlaneNoteViewData.FilterResult.ShouldFilterNote\n                    } else {\n                        PlaneNoteViewData.FilterResult.Pass\n                    }\n                }\n            }\n            PlaneNoteViewData.FilterResult.ShouldFilterNote -> result\n            PlaneNoteViewData.FilterResult.Pass -> result\n        }\n        note.filterResult = newResult\n        return note\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/TimelineListItem.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel\n\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_android_ui.APIErrorStringConverter\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport java.io.IOException\nimport java.net.SocketTimeoutException\n\n\nsealed interface TimelineListItem {\n    data object Loading : TimelineListItem\n    data class Note(val note: PlaneNoteViewData) : TimelineListItem\n    data class Error(val throwable: Throwable) : TimelineListItem {\n        fun getErrorMessage(): StringSource {\n            return when (throwable) {\n                is SocketTimeoutException -> {\n                    StringSource(R.string.timeout_error)\n                }\n                is IOException -> {\n                    StringSource(R.string.timeout_error)\n                }\n                is APIError -> {\n                    APIErrorStringConverter()(throwable)\n                }\n                is UnauthorizedException -> {\n                    StringSource(R.string.unauthorized_error)\n                }\n                else -> {\n                    StringSource(\"error:$throwable\")\n                }\n            }\n        }\n\n        fun isUnauthorizedError(): Boolean {\n            return throwable is APIError.AuthenticationException\n                    || throwable is APIError.ForbiddenException\n                    || throwable is UnauthorizedException\n        }\n    }\n\n    data object Empty : TimelineListItem\n}\n\ninternal fun PageableState<List<PlaneNoteViewData>>.toList(): List<TimelineListItem> {\n    return when (val content = this.content) {\n        is StateContent.Exist -> {\n            content.rawContent.map {\n                TimelineListItem.Note(it)\n            } + if (this is PageableState.Loading.Previous) {\n                listOf(TimelineListItem.Loading)\n            } else {\n                emptyList()\n            }\n        }\n        is StateContent.NotExist -> {\n            listOf(\n                when (this) {\n                    is PageableState.Error -> {\n                        TimelineListItem.Error(this.throwable)\n                    }\n                    is PageableState.Fixed -> {\n                        TimelineListItem.Empty\n                    }\n                    is PageableState.Loading -> TimelineListItem.Loading\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/TimelineViewModel.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.asStateFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.shareIn\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.plus\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.notes.InitialLoadQuery\nimport net.pantasystem.milktea.app_store.notes.TimelineStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.coroutines.throttleLatest\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.CurrentAccountWatcher\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteStreaming\nimport net.pantasystem.milktea.model.note.TimelineScrollPositionRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineRepository\nimport net.pantasystem.milktea.model.note.timeline.TimelineType\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.timeline.viewmodel.filter.ExcludeIfExistsSensitiveMediaFilter\nimport net.pantasystem.milktea.note.timeline.viewmodel.filter.ExcludeRepostOrReplyFilter\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\n\nclass TimelineViewModel @AssistedInject constructor(\n    timelineStoreFactory: TimelineStore.Factory,\n    noteStreaming: NoteStreaming,\n    accountRepository: AccountRepository,\n    loggerFactory: Logger.Factory,\n    private val accountStore: AccountStore,\n    private val timelineFilterServiceFactory: TimelineFilterService.Factory,\n    planeNoteViewDataCacheFactory: PlaneNoteViewDataCache.Factory,\n    private val configRepository: LocalConfigRepository,\n    private val timelineScrollPositionRepository: TimelineScrollPositionRepository,\n    private val timelineRepository: TimelineRepository,\n    @Assisted val accountId: AccountId?,\n    @Assisted val pageId: PageId?,\n    @Assisted val pageable: Pageable,\n    @Assisted val isSaveScrollPosition: Boolean,\n) : ViewModel() {\n\n    @AssistedFactory\n    interface ViewModelAssistedFactory {\n        fun create(\n            accountId: AccountId?,\n            pageId: PageId?,\n            pageable: Pageable,\n            isSaveScrollPosition: Boolean,\n        ): TimelineViewModel\n    }\n\n    companion object {\n        const val TAG = \"TimelineViewModel\"\n    }\n\n\n\n    var position: Int = 0\n        private set\n    var offset: Int = 0\n        private set\n\n    private val currentAccountWatcher = CurrentAccountWatcher(\n        if (accountId?.value != null && accountId.value <= 0) null else accountId?.value,\n        accountRepository\n    )\n\n    val timelineStore: TimelineStore =\n        timelineStoreFactory.create(pageable, viewModelScope, currentAccountWatcher::getAccount, pageId?.value)\n\n    private val timelineFilterService by lazy {\n        timelineFilterServiceFactory.create(pageable)\n    }\n\n    private val timelineState = timelineStore.timelineState.map { pageableState ->\n        pageableState.suspendConvert { list ->\n            cache.useByIds(list).filterNot { note ->\n                note.filterResult == PlaneNoteViewData.FilterResult.ShouldFilterNote\n            }\n        }\n    }.stateIn(\n        viewModelScope + Dispatchers.Default,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init()\n    )\n\n    val timelineListState: StateFlow<List<TimelineListItem>> = timelineState.map { state ->\n        state.toList()\n    }.stateIn(\n        viewModelScope + Dispatchers.Default,\n        SharingStarted.Lazily,\n        listOf(TimelineListItem.Loading)\n    )\n\n    val configState = configRepository.observe().stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        DefaultConfig.config,\n    )\n\n    val errorEvent = timelineStore.timelineState.map {\n        (it as? PageableState.Error)?.throwable\n    }.filterNotNull().shareIn(viewModelScope, SharingStarted.WhileSubscribed())\n\n    val isLoading = timelineStore.timelineState.map {\n        it is PageableState.Loading\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        false\n    )\n\n    private val _isVisibleNewPostsButton = MutableStateFlow(false)\n    val isVisibleNewPostsButton: SharedFlow<Boolean> = _isVisibleNewPostsButton.asStateFlow()\n\n\n    private val logger = loggerFactory.create(TAG)\n    private val cache = planeNoteViewDataCacheFactory.create(\n        currentAccountWatcher::getAccount,\n        viewModelScope\n    )\n\n    private val noteStreamingCollector = NoteStreamingCollector(\n        accountStore = accountStore,\n        timelineStore = timelineStore,\n        coroutineScope = viewModelScope,\n        logger = logger,\n        currentAccountWatcher = currentAccountWatcher,\n        noteStreaming = noteStreaming,\n        pageable = pageable,\n    )\n\n    private val pagingCoroutineScope = PagingLoaderScopeController(viewModelScope)\n\n    private var isActive = false\n\n    private val saveScrollPositionScrolledEvent = MutableSharedFlow<Int>(extraBufferCapacity = 4)\n\n    init {\n\n        viewModelScope.launch {\n            accountStore.observeCurrentAccount.filterNotNull().distinctUntilChanged().map {\n                currentAccountWatcher.getAccount()\n            }.distinctUntilChanged().catch {\n                logger.error(\"observe account error\", it)\n            }.collect {\n                loadInit()\n            }\n        }\n\n        saveScrollPositionScrolledEvent.distinctUntilChanged().throttleLatest(500).onEach {\n            saveNowScrollPosition()\n        }.launchIn(viewModelScope)\n\n        cache.addFilter(object : PlaneNoteViewDataCache.ViewDataFilter {\n            override suspend fun check(viewData: PlaneNoteViewData): PlaneNoteViewData.FilterResult {\n                return timelineFilterService.filterNote(viewData).filterResult\n            }\n        })\n        cache.addFilter(ExcludeRepostOrReplyFilter(pageable))\n        cache.addFilter(ExcludeIfExistsSensitiveMediaFilter(pageable, configRepository))\n\n        timelineStore.setActiveStreamingChangedListener { isActiveStreaming ->\n            if (isActiveStreaming && isActive) {\n                val config = configRepository.get().getOrNull()\n                if (config?.isEnableStreamingAPIAndNoteCapture == true) {\n                    noteStreamingCollector.resumeStreaming()\n                }\n                _isVisibleNewPostsButton.value = false\n            } else {\n                noteStreamingCollector.suspendStreaming()\n            }\n        }\n    }\n\n\n    fun loadNew() {\n        pagingCoroutineScope.launch {\n            timelineStore.loadFuture().onSuccess { count ->\n                _isVisibleNewPostsButton.value = count >= 10\n            }.onFailure {\n                logger.error(\"load future timeline failed\", it)\n            }\n        }\n    }\n\n    fun loadOld() {\n        logger.debug { \"call load old\" }\n        pagingCoroutineScope.launch {\n            timelineStore.loadPrevious().onSuccess {\n                _isVisibleNewPostsButton.value = false\n            }.onFailure {\n                logger.error(\"load previous timeline failed\", it)\n            }\n        }\n    }\n\n    fun loadInit(initialUntilDate: Instant? = null, ignoreSavedScrollPosition: Boolean = false) {\n        pagingCoroutineScope.cancel()\n        pagingCoroutineScope.launch {\n            cache.clear()\n\n            if (ignoreSavedScrollPosition) {\n                pageId?.let {\n                    timelineScrollPositionRepository.remove(it.value)\n                }\n            }\n            val savedScrollPositionId = pageId?.value?.let {\n                timelineScrollPositionRepository.get(it)\n            }?.takeIf {\n                !ignoreSavedScrollPosition\n            }\n\n            if (ignoreSavedScrollPosition || !isSaveScrollPosition) {\n                try {\n                    timelineRepository.clear(\n                        TimelineType(\n                            accountId = currentAccountWatcher.getAccount().accountId,\n                            pageable = pageable,\n                            pageId = pageId?.value\n                        )\n                    ).getOrThrow()\n                } catch (e: Exception) {\n                    logger.error(\"clear timeline failed\", e)\n                }\n            }\n\n            timelineStore.clear(initialUntilDate?.let {\n                InitialLoadQuery.UntilDate(it)\n            } ?: savedScrollPositionId?.let {\n                InitialLoadQuery.UntilId(it)\n            })\n            timelineStore.loadPrevious().onFailure {\n                logger.error(\"load initial timeline failed\", it)\n            }\n            timelineStore.loadFuture().onFailure {\n                logger.error(\"load initial timeline failed\", it)\n            }\n        }\n    }\n\n\n    fun onResume() {\n        isActive = true\n        viewModelScope.launch {\n            val config = configRepository.get().getOrNull()\n            resumeReceiveStreamingIfNeed()\n            resumeNoteCaptureIfNeed()\n            if (config?.isStopStreamingApiWhenBackground == true) {\n                loadNew()\n            }\n        }\n    }\n\n    fun onPause() {\n        isActive = false\n        viewModelScope.launch {\n            saveNowScrollPosition()\n            suspendReceiveStreamingIfNeed()\n            suspendNoteCaptureIfNeed()\n        }\n    }\n\n    fun onScrollStateChanged(firstVisiblePosition: Int) {\n        if (firstVisiblePosition <= 3) {\n            onVisibleFirst()\n        } else {\n            // NOTE: 先頭を表示していない時はストリーミングを停止する\n            timelineStore.suspendStreaming()\n        }\n        viewModelScope.launch {\n            try {\n                timelineStore.releaseUnusedPages(firstVisiblePosition)\n            } catch (e: IllegalArgumentException) {\n                logger.log(\"release unused pages failed\")\n                logger.error(\"release unused pages failed\", e)\n            }\n        }\n        saveScrollPositionScrolledEvent.tryEmit(firstVisiblePosition)\n    }\n\n    fun onScrolled(dy: Int, firstVisibleItemPosition: Int, offset: Int? = null) {\n        position = firstVisibleItemPosition\n        this.offset = offset ?: this.offset\n        // 下方向へのスクロールであれば、新着ボタンを非表示にする\n        if (dy > 16) {\n            _isVisibleNewPostsButton.value = false\n        }\n    }\n\n    private fun onVisibleFirst() {\n        viewModelScope.launch {\n            if (this@TimelineViewModel.isActive\n                && !timelineStore.isActiveStreaming\n                && timelineState.value !is PageableState.Loading\n            ) {\n                timelineStore.loadFuture().onSuccess { count ->\n                    _isVisibleNewPostsButton.value = count >= 10\n                }\n            }\n        }\n    }\n\n    private suspend fun saveNowScrollPosition() {\n        if (isSaveScrollPosition && pageId != null) {\n            val listState = timelineListState.value\n            var savePos = position - 1\n            while(savePos < listState.size && listState.getOrNull(savePos) !is TimelineListItem.Note) {\n                savePos++\n            }\n            val savePosId: Note.Id? = listState.getOrNull(savePos)?.let {\n                (it as? TimelineListItem.Note)?.note?.note?.note?.id\n            }\n            savePosId?.also {\n                timelineScrollPositionRepository.save(\n                    pageId.value,\n                    it\n                )\n            }\n        }\n    }\n\n    private fun resumeReceiveStreamingIfNeed() {\n        val config = configRepository.get().getOrNull()\n        if (config?.isEnableStreamingAPIAndNoteCapture == false) {\n            // NOTE: 自動更新が無効なのでStreaming APIを停止している\n            timelineStore.suspendStreaming()\n        }\n    }\n\n    private suspend fun resumeNoteCaptureIfNeed() {\n        val config = configRepository.get().getOrNull()\n        if (config?.isEnableStreamingAPIAndNoteCapture == false) {\n            // NOTE: 自動更新が無効であればNoteのCaptureを停止している\n            cache.suspendNoteCapture()\n        } else {\n            // NOTE: 自動更新が有効なのでNote Captureを再開している\n            cache.captureNotesBy(\n                (timelineState.value.content as? StateContent.Exist)?.rawContent?.map {\n                    it.id\n                } ?: emptyList()\n            )\n            cache.captureNotes()\n        }\n    }\n\n    private fun suspendReceiveStreamingIfNeed() {\n        val config = configRepository.get().getOrNull()\n\n        if (config?.isStopStreamingApiWhenBackground == true) {\n            timelineStore.suspendStreaming()\n        }\n    }\n\n    private suspend fun suspendNoteCaptureIfNeed() {\n        val config = configRepository.get().getOrNull()\n        if (config?.isStopNoteCaptureWhenBackground == true) {\n            cache.suspendNoteCapture()\n        }\n    }\n}\n\n@Suppress(\"UNCHECKED_CAST\")\nfun TimelineViewModel.Companion.provideViewModel(\n    assistedFactory: TimelineViewModel.ViewModelAssistedFactory,\n    accountId: AccountId?,\n    pageId: PageId?,\n    pageable: Pageable,\n    isSaveScrollPosition: Boolean?,\n\n    ) = object : ViewModelProvider.Factory {\n    override fun <T : ViewModel> create(modelClass: Class<T>): T {\n        return assistedFactory.create(\n            accountId = accountId,\n            pageId = pageId,\n            pageable,\n            isSaveScrollPosition ?: false,\n        ) as T\n    }\n}\n\n\nclass PageId(val value: Long)\n\n\nclass AccountId(val value: Long)\n\n\n\n\nclass PagingLoaderScopeController(private val coroutineScope: CoroutineScope) {\n\n    private var jobs = listOf<Job>()\n\n    fun launch(block: suspend CoroutineScope.() -> Unit): Job {\n        val job = coroutineScope.launch {\n            block.invoke(coroutineScope)\n        }\n        jobs = jobs + job\n        return job\n    }\n\n    fun cancel() {\n        jobs.forEach {\n            it.cancel()\n        }\n        jobs = emptyList()\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/filter/ExcludeIfExistsSensitiveMediaFilter.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel.filter\n\nimport net.pantasystem.milktea.model.account.page.CanExcludeIfExistsSensitiveMedia\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\n\nclass ExcludeIfExistsSensitiveMediaFilter(private val pageable: Pageable, private val configRepository: LocalConfigRepository) : PlaneNoteViewDataCache.ViewDataFilter {\n\n    override suspend fun check(viewData: PlaneNoteViewData): PlaneNoteViewData.FilterResult {\n        // 自分の投稿ではないことを確認(リノートや返信も含む)\n        if (viewData.note.user.id.id == viewData.account.remoteId) {\n            // 何もしない\n            return viewData.filterResult\n        }\n\n        val config = configRepository.get().getOrElse { DefaultConfig.config }\n\n        // 除外設定がされていない場合は何もしない\n        if (!config.isEnableSafeSearch.isEnabled && (pageable as? CanExcludeIfExistsSensitiveMedia<*>)?.getExcludeIfExistsSensitiveMedia() != true) {\n            return viewData.filterResult\n        }\n\n        val hasSensitive = viewData.toShowNote.files?.any { file ->\n            file.isSensitive\n        } ?: false\n\n        val hasSensitiveInRenoteToNote = viewData.toShowNote.files?.any { file ->\n            file.isSensitive\n        } ?: false\n\n        if (hasSensitive || hasSensitiveInRenoteToNote) {\n            return PlaneNoteViewData.FilterResult.ShouldFilterNote\n        }\n\n        return viewData.filterResult\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/timeline/viewmodel/filter/ExcludeRepostOrReplyFilter.kt",
    "content": "package net.pantasystem.milktea.note.timeline.viewmodel.filter\n\nimport net.pantasystem.milktea.model.account.page.CanExcludeReplies\nimport net.pantasystem.milktea.model.account.page.CanExcludeReposts\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\n\nclass ExcludeRepostOrReplyFilter(\n    val pageable: Pageable,\n) : PlaneNoteViewDataCache.ViewDataFilter {\n    override suspend fun check(viewData: PlaneNoteViewData): PlaneNoteViewData.FilterResult {\n        if (\n            (pageable as? CanExcludeReplies<*>)?.getExcludeReplies() == true\n            && viewData.note.note.replyId != null\n        ) {\n            return PlaneNoteViewData.FilterResult.ShouldFilterNote\n        }\n\n        if ((pageable as? CanExcludeReposts<*>)?.getExcludeReposts() == true\n            && viewData.note.note.isRenoteOnly()\n        ) {\n            return PlaneNoteViewData.FilterResult.ShouldFilterNote\n        }\n        return viewData.filterResult\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/url/OtherFileView.kt",
    "content": "package net.pantasystem.milktea.note.url\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.R.layout\nimport net.pantasystem.milktea.note.url.UrlPreviewHelper.setUrlPreviewThumbnail\n\nclass OtherFileView @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n) : ConstraintLayout(\n    context, attrs, defStyleAttr\n) {\n\n    private val fileThumbnailView: ImageView\n    private val fileNameView: TextView\n    private val fileTypeView: TextView\n    init {\n        inflate(context, layout.view_other_file, this)\n        fileThumbnailView = findViewById(R.id.fileThumbnailView)\n        fileNameView = findViewById(R.id.fileNameView)\n        fileTypeView = findViewById(R.id.fileTypeView)\n    }\n\n    fun setOtherFile(otherFile: FilePreviewSource) {\n        fileThumbnailView.setUrlPreviewThumbnail(otherFile.thumbnailUrl)\n        fileNameView.text = otherFile.name\n        fileTypeView.text = otherFile.type\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/url/UrlPreviewHelper.kt",
    "content": "package net.pantasystem.milktea.note.url\n\nimport android.annotation.SuppressLint\nimport android.app.Activity\nimport android.content.ActivityNotFoundException\nimport android.content.Intent\nimport android.net.Uri\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.Toast\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\nimport dagger.hilt.android.EntryPointAccessors\nimport dagger.hilt.android.internal.managers.FragmentComponentManager\nimport net.pantasystem.milktea.common_android.ui.VisibilityHelper.setMemoVisibility\nimport net.pantasystem.milktea.common_android_ui.NavigationEntryPointForBinding\nimport net.pantasystem.milktea.common_navigation.MediaNavigationArgs\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.databinding.ItemUrlOrFilePreviewBinding\nimport net.pantasystem.milktea.note.viewmodel.Preview\n\nobject UrlPreviewHelper {\n\n    @SuppressLint(\"IntentReset\")\n    @JvmStatic\n    @BindingAdapter(\"previewList\")\n    fun LinearLayout.setUrlPreviewList(previewList: List<Preview>?) {\n        if (previewList.isNullOrEmpty()) {\n            this.setMemoVisibility(View.GONE)\n            return\n        }\n\n        while(this.childCount > previewList.size){\n            this.removeViewAt(this.childCount - 1)\n        }\n\n        previewList.forEachIndexed { index, preview ->\n            val existsView: ItemUrlOrFilePreviewBinding? = this.getChildAt(index)?.let {\n                ItemUrlOrFilePreviewBinding.bind(it)\n            }\n\n            val view = existsView ?: ItemUrlOrFilePreviewBinding.inflate(LayoutInflater.from(this.context), this, false)\n\n            when(preview) {\n                is Preview.FileWrapper -> {\n                    view.urlPreviewView.setMemoVisibility(View.GONE)\n                    view.filePreviewView.setMemoVisibility(View.VISIBLE)\n                    view.filePreviewView.setOtherFile(preview.file)\n\n                    view.filePreviewView.setOnClickListener { v ->\n\n                        if (preview.file.type.startsWith(\"audio\")) {\n                            val activity = FragmentComponentManager.findActivity(v.context)\n                            if (activity is Activity) {\n                                val accessor = EntryPointAccessors.fromActivity(\n                                    activity,\n                                    NavigationEntryPointForBinding::class.java\n                                )\n                                val intent = accessor.mediaNavigation().newIntent(\n                                    MediaNavigationArgs.AFile(\n                                        preview.file\n                                    )\n                                )\n                                v.context?.startActivity(intent)\n                            }\n                        } else {\n                            try {\n                                v.context?.startActivity(\n                                    Intent().apply {\n                                        data = Uri.parse(preview.file.path)\n                                        type = preview.file.type\n                                    }\n                                )\n                            } catch (e: ActivityNotFoundException) {\n                                Toast.makeText(\n                                    v.context,\n                                    context.getString(net.pantasystem.milktea.common_resource.R.string.no_app_available_to_open_this_file),\n                                    Toast.LENGTH_SHORT\n                                ).show()\n                            }\n\n                        }\n                    }\n                }\n                is Preview.UrlWrapper -> {\n                    view.urlPreviewView.setMemoVisibility(View.VISIBLE)\n                    view.filePreviewView.setMemoVisibility(View.GONE)\n                    view.urlPreviewView.setUrlPreview(preview.urlPreview)\n\n\n                    view.urlPreviewView.setOnClickListener {\n                        context?.startActivity(\n                            Intent(Intent.ACTION_VIEW).apply{\n                                data = Uri.parse(preview.urlPreview.url)\n                            }\n                        )\n                    }\n                }\n            }\n\n            if(existsView == null){\n                this.addView(view.root)\n            }\n        }\n\n        this.visibility = View.VISIBLE\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"urlPreviewThumbnailUrl\")\n    fun ImageView.setUrlPreviewThumbnail(url: String?){\n        Glide.with(this)\n            .load(url)\n            .centerCrop()\n            .error(R.drawable.ic_cloud_off_black_24dp)\n            .into(this)\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"siteIconUrl\")\n    fun ImageView.setSiteIcon(url: String?){\n        Glide.with(this)\n            .load(url)\n            .error(R.drawable.ic_cloud_off_black_24dp)\n            .centerCrop()\n            .into(this)\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/url/UrlPreviewView.kt",
    "content": "package net.pantasystem.milktea.note.url\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.widget.ImageView\nimport android.widget.TextView\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport net.pantasystem.milktea.common_android.ui.CircleOutlineHelper.setCircleOutline\nimport net.pantasystem.milktea.model.url.UrlPreview\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.url.UrlPreviewHelper.setSiteIcon\nimport net.pantasystem.milktea.note.url.UrlPreviewHelper.setUrlPreviewThumbnail\n\nclass UrlPreviewView @JvmOverloads constructor(\n    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0\n): ConstraintLayout(\n    context, attrs, defStyleAttr\n) {\n\n    private val siteThumbnailView: ImageView\n    private val siteTitleView: TextView\n    private val siteDescription: TextView\n    private val siteIconView: ImageView\n    private val siteNameView: TextView\n\n    init {\n        inflate(context, R.layout.view_url_preview, this)\n        siteThumbnailView = findViewById(R.id.siteThumbnailView)\n        siteTitleView = findViewById(R.id.siteTitleView)\n        siteDescription = findViewById(R.id.siteDescription)\n        siteIconView = findViewById(R.id.siteIconView)\n        siteNameView = findViewById(R.id.siteNameView)\n        this.setCircleOutline(7)\n    }\n\n    fun setUrlPreview(urlPreview: UrlPreview) {\n        siteThumbnailView.setUrlPreviewThumbnail(urlPreview.thumbnail)\n        siteTitleView.text = urlPreview.title\n        siteDescription.text = urlPreview.description\n        siteIconView.setSiteIcon(urlPreview.icon)\n        siteNameView.text = urlPreview.siteName\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/ContentFoldingHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.core.view.isVisible\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android.ui.VisibilityHelper.setMemoVisibility\nimport net.pantasystem.milktea.note.viewmodel.CwTextGenerator\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\nobject ContentFoldingHelper {\n\n\n\n    @BindingAdapter(\"foldingNote\", \"cw\", \"foldingButton\",\"foldingContent\", \"isFolding\")\n    @JvmStatic\n    fun ViewGroup.setFoldingState(foldingNote: PlaneNoteViewData?, cw: TextView?, foldingButton: TextView?, foldingContent: ViewGroup?, isFolding: Boolean?){\n\n        val isVisible = foldingNote?.cw != null && foldingNote.cw.isNotBlank()\n        cw?.isVisible = isVisible\n\n        val folding = isFolding ?: false\n\n        if (foldingNote?.cw == null) {\n            foldingButton?.setMemoVisibility(View.GONE)\n        } else {\n            val buttonText = CwTextGenerator(foldingNote.toShowNote, folding)\n\n            foldingButton?.setMemoVisibility(View.VISIBLE)\n\n            foldingButton?.text = buttonText.getString(context)\n        }\n\n        foldingContent?.setMemoVisibility(if (folding) {\n            View.GONE\n        } else {\n            View.VISIBLE\n        })\n    }\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/CwAnimationHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.animation.ValueAnimator\nimport android.util.Log\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.animation.doOnEnd\nimport androidx.core.animation.doOnStart\nimport androidx.core.view.isVisible\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.model.note.Note\n\nobject CwAnimationHelper {\n\n    private val animatingNoteIds = mutableSetOf<Note.Id>()\n\n    const val DURATION = 50L\n    @BindingAdapter(\n        \"noteId\" ,\"targetView\", \"isVisible\", \"onToggleCw\"\n    )\n    @JvmStatic\n    fun View.setCwClickListenerWithAnimation(\n        noteId: Note.Id?,\n        targetView: View?,\n        isVisible: Boolean?,\n        onToggleCw: (() -> Unit)?\n    ) {\n        noteId?: return\n        this.tag = noteId.noteId\n        this.setOnClickListener {\n\n            if (animatingNoteIds.contains(noteId) || this.tag != noteId.noteId) {\n                return@setOnClickListener\n            }\n            HapticFeedbackController.performToggledHapticFeedback(it, isVisible ?: false)\n            val animator = if (isVisible == false) {\n                targetView!!.measure(\n                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),\n                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),\n                )\n                val height = targetView.measuredHeight\n                ValueAnimator.ofInt(height, 0).setDuration(DURATION).apply {\n                    addUpdateListener {\n                        val newHeight = it.animatedValue as Int\n\n                        targetView.layoutParams.height = newHeight\n                        if (targetView.parent is ViewGroup) {\n                            targetView.parent.requestLayout()\n                        }\n                        targetView.invalidate()\n\n                    }\n                }\n            } else {\n                targetView!!.measure(\n                    View.MeasureSpec.makeMeasureSpec(\n                        0,\n                        View.MeasureSpec.UNSPECIFIED\n                    ), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)\n                )\n                val height = targetView.measuredHeight\n                ValueAnimator.ofInt(0, height).setDuration(DURATION).apply {\n                    addUpdateListener {\n                        val newHeight = it.animatedValue as Int\n\n                        if (newHeight == 0) {\n                            targetView.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT\n                            targetView.isVisible = true\n                        }\n                        targetView.layoutParams.height = newHeight\n\n                        if (targetView.parent is ViewGroup) {\n                            targetView.parent.requestLayout()\n                        }\n                        targetView.invalidate()\n\n                        Log.d(\"CwAnimationHelper\", \"newHeight:$newHeight\")\n                    }\n\n                }\n\n            }\n            animator.doOnEnd {\n                targetView.layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT\n                animatingNoteIds.remove(noteId)\n                onToggleCw?.invoke()\n\n            }\n            animator.doOnStart {\n                animatingNoteIds.add(noteId)\n            }\n            animator.start()\n\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/InstanceInfoHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.graphics.Color\nimport android.text.SpannableStringBuilder\nimport android.widget.TextView\nimport androidx.core.graphics.ColorUtils\nimport androidx.core.view.isVisible\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\nimport net.pantasystem.milktea.common_android.ui.text.DrawableEmojiSpan\nimport net.pantasystem.milktea.common_android.ui.text.EmojiAdapter\nimport net.pantasystem.milktea.model.user.User\nimport kotlin.math.min\n\nobject InstanceInfoHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"instanceInfo\", \"isEnable\")\n    fun TextView.setInstanceInfo(info: User.InstanceInfo?, isEnable: Boolean? = null) {\n\n\n\n        val enable = info?.name != null\n                && info.faviconUrl != null\n                && isEnable == true\n        this.isVisible = enable\n        if (enable) {\n            val emojiAdapter = EmojiAdapter(this)\n\n            val iconDrawable = DrawableEmojiSpan(emojiAdapter, info?.faviconUrl)\n            Glide.with(this)\n                .load(info!!.faviconUrl)\n                .override(min(this.textSize.toInt(), 20))\n                .into(iconDrawable.target)\n            text =  SpannableStringBuilder(\":${info.faviconUrl}:${info.name}\").apply {\n                setSpan(iconDrawable, 0, \":${info.faviconUrl}:\".length, 0)\n            }\n            when(val color = info.themeColorNumber.getOrNull()) {\n                null -> {\n\n                }\n                else -> {\n                    val parsedColor = ColorUtils.setAlphaComponent(color, (255 * 0.42).toInt())\n                    setBackgroundColor(parsedColor)\n                    val isDark = ColorUtils.calculateLuminance(parsedColor) < 0.5\n                    if (isDark) {\n                        setTextColor(Color.WHITE)\n                    } else {\n                        setTextColor(Color.BLACK)\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/MastodonFavoriteButtonHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.content.res.ColorStateList\nimport android.util.TypedValue\nimport android.view.View\nimport android.widget.ImageButton\nimport androidx.core.content.ContextCompat\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.R\n\nobject MastodonFavoriteButtonHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"favoriteButtonIcon\")\n    fun ImageButton.setFavoriteButtonState(note: Note?) {\n        note ?: return\n        val theme = context.theme\n        val typedValue = TypedValue()\n        theme.resolveAttribute(R.attr.normalIconTint, typedValue, true)\n        val normalTintColor = typedValue.data\n\n        theme.resolveAttribute(R.attr.colorPrimary, typedValue, true)\n        val primaryColor = typedValue.data\n\n        when(val type = note.type) {\n            is Note.Type.Mastodon -> {\n                if (type.favorited == true) {\n                    this.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_star_black_24dp))\n                    this.imageTintList = ColorStateList.valueOf(primaryColor)\n                } else {\n                    this.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_star_border_black_24dp))\n                    this.imageTintList = ColorStateList.valueOf(normalTintColor)\n                }\n            }\n            is Note.Type.Misskey -> {\n                this.visibility = View.GONE\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NormalBottomSheetDialogSelectionLayout.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.FormatQuote\nimport androidx.compose.material.icons.filled.Repeat\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.vector.ImageVector\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\n\n@Composable\nfun NormalBottomSheetDialogSelectionLayout(\n    modifier: Modifier = Modifier,\n    onClick: () -> Unit,\n    icon: ImageVector,\n    text: String,\n) {\n    Row(\n        modifier\n            .clickable { onClick() }\n            .fillMaxWidth()\n            .padding(16.dp),\n        verticalAlignment = Alignment.CenterVertically\n    ) {\n        Icon(icon, contentDescription = text)\n        Text(\n            text,\n            fontSize = 18.sp,\n            fontWeight = FontWeight.Bold,\n            modifier = Modifier.weight(1f),\n            textAlign = TextAlign.Center\n        )\n\n    }\n}\n\n@Preview\n@Composable\nfun PreviewRenoteButtonLayout() {\n    Surface() {\n        Column {\n            NormalBottomSheetDialogSelectionLayout(onClick = {  }, icon = Icons.Default.Repeat, text = \"Renote\")\n            NormalBottomSheetDialogSelectionLayout(onClick = {  }, icon = Icons.Default.FormatQuote, text = \"Quote\")\n        }\n    }\n\n}\n\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteActionHandler.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.content.Context\nimport android.widget.Toast\nimport androidx.fragment.app.FragmentManager\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.report.ReportDialog\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport net.pantasystem.milktea.note.dialog.ConfirmDeleteAndEditNoteDialog\nimport net.pantasystem.milktea.note.dialog.ConfirmDeleteNoteDialog\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\n\n\nclass NoteActionHandler(\n    private val fragmentManager: FragmentManager,\n    private val context: Context,\n    private val lifecycleOwner: LifecycleOwner,\n    private val notesViewModel: NotesViewModel\n) {\n\n    fun initViewModelListener() {\n\n        notesViewModel.statusMessage.onEach {\n            Toast.makeText(context, it.getString(context), Toast.LENGTH_LONG).show()\n        }.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(lifecycleOwner.lifecycleScope)\n\n        notesViewModel.quoteRenoteTarget\n            .onEach {\n                val intent = NoteEditorActivity.newBundle(\n                    context,\n                    quoteTo = it.noteId,\n                    channelId = it.channelId\n                )\n                context.startActivity(intent)\n            }\n            .flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(lifecycleOwner.lifecycleScope)\n\n        notesViewModel.openNoteEditorEvent.filterNotNull().onEach { note ->\n            context.startActivity(\n                NoteEditorActivity.newBundle(\n                    context,\n                    draftNoteId = note.draftNoteId\n                )\n            )\n        }.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(lifecycleOwner.lifecycleScope)\n\n        notesViewModel.confirmDeletionEvent.filterNotNull().onEach { note ->\n            if (fragmentManager.findFragmentByTag(ConfirmDeleteNoteDialog.FRAGMENT_TAG) == null) {\n                ConfirmDeleteNoteDialog.newInstance(note.note.id)\n                    .show(fragmentManager, ConfirmDeleteNoteDialog.FRAGMENT_TAG)\n            }\n        }.flowWithLifecycle(\n            lifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(lifecycleOwner.lifecycleScope)\n\n        notesViewModel.confirmDeleteAndEditEvent.filterNotNull().onEach { note ->\n            if (fragmentManager.findFragmentByTag(ConfirmDeleteAndEditNoteDialog.FRAGMENT_TAG) == null) {\n                ConfirmDeleteAndEditNoteDialog\n                    .newInstance(note.note.id)\n                    .show(fragmentManager, ConfirmDeleteAndEditNoteDialog.FRAGMENT_TAG)\n            }\n        }.flowWithLifecycle(\n            lifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(lifecycleOwner.lifecycleScope)\n\n\n        notesViewModel.confirmReportEvent.onEach { report ->\n            report?.let {\n                ReportDialog.newInstance(report.userId, report.comment, report.noteIds)\n                    .show(fragmentManager, ReportDialog.FRAGMENT_TAG)\n            }\n        }.flowWithLifecycle(lifecycleOwner.lifecycle, Lifecycle.State.RESUMED)\n            .launchIn(lifecycleOwner.lifecycleScope)\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteAutoCollapsingLayoutHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.animation.ValueAnimator\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.animation.doOnCancel\nimport androidx.core.animation.doOnEnd\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common_android.ui.AutoCollapsingLayout\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\n\nobject NoteAutoCollapsingLayoutHelper {\n    @JvmStatic\n    @BindingAdapter(\"targetButton\", \"onExpandedChanged\")\n    fun AutoCollapsingLayout.setExpandedWithAnimation(\n        targetButton: View,\n        onExpandedChanged: (() -> Unit)?\n    ) {\n\n        val button = findExpandButton()\n        button?.alpha = 1.0f\n\n        targetButton.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n\n            val beforeHeight = measuredHeight\n\n            val (_, maxHeight, _) = getWidthAndHeightAndButton(\n                View.MeasureSpec.makeMeasureSpec(\n                    0,\n                    View.MeasureSpec.UNSPECIFIED\n                ), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)\n            )\n\n            val animator =\n                ValueAnimator.ofInt(beforeHeight, maxHeight)\n                    .setDuration(100).apply {\n                        addUpdateListener {\n                            onExpandedChanged?.invoke()\n                            val newHeight = it.animatedValue as Int\n                            setHeightAndInvalidate(newHeight)\n                            button?.alpha = 1f - newHeight.toFloat() / maxHeight.toFloat()\n                        }\n\n\n                        doOnEnd {\n                            isExpanded = true\n                            hideExpandButton()\n//                            findExpandButton()?.isVisible = false\n                            onExpandedChanged?.invoke()\n                            setHeightAndInvalidate(ViewGroup.LayoutParams.WRAP_CONTENT)\n                        }\n                        doOnCancel {\n                            button?.alpha = 1.0f\n                            setHeightAndInvalidate(ViewGroup.LayoutParams.WRAP_CONTENT)\n                        }\n                    }\n\n\n            setCurrentAnimator(animator)\n            animator.start()\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteBadgeRoleData.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.aspectRatio\nimport androidx.compose.foundation.layout.fillMaxHeight\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Surface\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.unit.dp\nimport coil.compose.rememberAsyncImagePainter\nimport coil.decode.SvgDecoder\nimport coil.request.ImageRequest\n\nprivate val defaultSvgDecoderFactory = SvgDecoder.Factory()\n\n@Composable\nfun NoteBadgeRoles(\n    badgeRoles: List<NoteBadgeRoleData>,\n    modifier: Modifier = Modifier,\n) {\n    val sortedBadgeRoles = badgeRoles\n        // アイコンなしは出しようがないので弾く\n        .filter { it.iconUri != null }\n        .sortedBy { it.displayOrder }\n\n    Surface {\n        Row(\n//            horizontalArrangement = Arrangement.spacedBy(2.dp),\n            modifier = modifier.fillMaxHeight()\n        ) {\n            for (it in sortedBadgeRoles) {\n                NoteBadgeRoleImage(\n                    data = it,\n                    modifier = Modifier.padding(1.dp) // 名前欄とxml側で高さを揃えているが、それでも気持ちデカイので調節\n                )\n            }\n        }\n    }\n}\n\n@Composable\nfun NoteBadgeRoleImage(\n    data: NoteBadgeRoleData,\n    modifier: Modifier = Modifier,\n) {\n    Image(\n        painter = rememberAsyncImagePainter(\n            model = ImageRequest.Builder(LocalContext.current)\n                .data(data.iconUri)\n                .decoderFactory(defaultSvgDecoderFactory)\n                .build(),\n        ),\n        contentDescription = data.name,\n        contentScale = ContentScale.FillHeight,\n        modifier = modifier.aspectRatio(1.0f)\n    )\n}\n\ndata class NoteBadgeRoleData(\n    val name: String,\n    val iconUri: String?,\n    val displayOrder: Int,\n)"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionHandler.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.content.Intent\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.core.net.toUri\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common_android_ui.NavigationEntryPointForBinding\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.MediaNavigationArgs.Files\nimport net.pantasystem.milktea.common_navigation.SearchNavType\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs.UserId\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.setting.ReactionPickerType\nimport net.pantasystem.milktea.note.NoteDetailActivity\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.option.NoteOptionDialog\nimport net.pantasystem.milktea.note.reaction.ReactionSelectionDialog\nimport net.pantasystem.milktea.note.reaction.RemoteReactionEmojiSuggestionDialog\nimport net.pantasystem.milktea.note.reaction.history.ReactionHistoryPagerDialog\nimport net.pantasystem.milktea.note.reaction.picker.ReactionPickerDialog\nimport net.pantasystem.milktea.note.renote.RenoteBottomSheetDialog\nimport net.pantasystem.milktea.note.renote.RenotesBottomSheetDialog\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\n\nclass NoteCardActionHandler(\n    val activity: AppCompatActivity,\n    val notesViewModel: NotesViewModel,\n    val settingStore: SettingStore,\n    val userDetailNavigation: UserDetailNavigation,\n    val channelDetailNavigation: ChannelDetailNavigation,\n    val searchNavigation: SearchNavigation,\n    val currentPageable: Pageable? = null,\n) {\n\n    fun onAction(action: NoteCardAction) {\n        when (action) {\n            is NoteCardAction.OnNoteCardClicked -> {\n                activity.startActivity(\n                    NoteDetailActivity.newIntent(\n                        activity,\n                        noteId = action.note.id,\n                        fromPageable = currentPageable\n                    )\n                )\n            }\n            is NoteCardAction.OnOptionButtonClicked -> {\n                NoteOptionDialog.newInstance(action.note.toShowNote.note.id, fromPageable = currentPageable)\n                    .show(activity.supportFragmentManager, NoteOptionDialog.FRAGMENT_TAG)\n            }\n            is NoteCardAction.OnPollChoiceClicked -> {\n                notesViewModel.vote(\n                    action.noteId,\n                    action.poll,\n                    action.choice,\n                )\n            }\n            is NoteCardAction.OnReactionButtonClicked -> {\n                if (\n                    action.note.currentNote.value.isReacted\n                    && !action.note.currentNote.value.canReaction\n                ) {\n                    notesViewModel.deleteReactions(action.note.toShowNote.note.id)\n                    return\n                }\n                if (action.note.toShowNote.note.isAcceptingOnlyLikeReaction) {\n                    notesViewModel.toggleReaction(action.note.toShowNote.note.id, \"❤️\")\n                    return\n                }\n                when (settingStore.reactionPickerType) {\n                    ReactionPickerType.LIST -> {\n                        ReactionSelectionDialog.newInstance(action.note.toShowNote.note.id)\n                            .show(activity.supportFragmentManager, ReactionSelectionDialog.FRAGMENT_TAG)\n                    }\n                    ReactionPickerType.SIMPLE -> {\n                        ReactionPickerDialog.newInstance(action.note.toShowNote.note.id)\n                            .show(activity.supportFragmentManager, ReactionPickerDialog.FRAGMENT_TAG)\n                    }\n                }\n            }\n            is NoteCardAction.OnReactionClicked -> {\n\n                // NOTE: MisskeyだとLocalの以外のカスタム絵文字はリアクションとして送信できない\n                if (action.note.toShowNote.note.type is Note.Type.Misskey) {\n                    if (!Reaction(action.reaction).isLocal()) {\n                        RemoteReactionEmojiSuggestionDialog.newInstance(\n                            accountId = action.note.id.accountId,\n                            noteId = action.note.toShowNote.note.id.noteId,\n                            reaction = action.reaction\n                        ).show(activity.supportFragmentManager, RemoteReactionEmojiSuggestionDialog.FRAGMENT_TAG)\n                        return\n                    }\n                }\n\n                notesViewModel.postReaction(action.note, action.reaction)\n            }\n            is NoteCardAction.OnReactionLongClicked -> {\n                ReactionHistoryPagerDialog.newInstance(\n                    action.note.toShowNote.note.id,\n                    action.reaction\n                ).show(activity.supportFragmentManager, ReactionHistoryPagerDialog.FRAGMENT_TAG)\n            }\n            is NoteCardAction.OnRenoteButtonClicked -> {\n                RenoteBottomSheetDialog.newInstance(\n                    action.note.note.note.id,\n                    action.note.isRenotedByMe\n                ).show(activity.supportFragmentManager, RenoteBottomSheetDialog.FRAGMENT_TAG)\n            }\n            is NoteCardAction.OnRenoteButtonLongClicked -> {\n                RenotesBottomSheetDialog.newInstance(action.note.toShowNote.note.id)\n                    .show(activity.supportFragmentManager, RenotesBottomSheetDialog.FRAGMENT_TAG)\n            }\n            is NoteCardAction.OnReplyButtonClicked -> {\n                activity.startActivity(\n                    NoteEditorActivity.newBundle(\n                        activity,\n                        replyTo = action.note.toShowNote.note.id\n                    )\n                )\n            }\n            is NoteCardAction.OnUserClicked -> {\n                val intent = userDetailNavigation.newIntent(UserId(action.user.id))\n                activity.startActivity(\n                    intent\n                )\n            }\n            is NoteCardAction.OnFavoriteButtonClicked -> {\n                notesViewModel.onToggleFavoriteUseCase(action.note)\n            }\n            is NoteCardAction.OnChannelButtonClicked -> {\n                if (currentPageable is Pageable.ChannelTimeline && currentPageable.channelId == action.channelId.channelId) {\n                    return\n                }\n                activity.startActivity(\n                    channelDetailNavigation.newIntent(action.channelId)\n                )\n            }\n            is NoteCardAction.OnMediaPreviewLongClicked -> {\n                val context = activity\n                val previewAbleFile = action.previewAbleFile\n                val title = previewAbleFile?.source?.name\n                val altText = previewAbleFile?.source?.comment\n                val alertDialog = MaterialAlertDialogBuilder(context)\n                alertDialog.setTitle(title)\n                alertDialog.setMessage(altText)\n                alertDialog.setNeutralButton(\"Exit\") { intf, _ ->\n                    intf.cancel()\n                }\n                alertDialog.show()\n            }\n            is NoteCardAction.OnMediaPreviewClicked -> {\n                val previewAbleFileList = action.files\n                val previewAbleFile = action.previewAbleFile\n                val intent = EntryPointAccessors.fromActivity(\n                    activity,\n                    NavigationEntryPointForBinding::class.java\n                )\n                    .mediaNavigation().newIntent(\n                        Files(\n                            files = previewAbleFileList.map { fvd ->\n                                fvd.source\n                            },\n                            index = previewAbleFileList.indexOfFirst { f ->\n                                f === previewAbleFile\n                            })\n                    )\n\n                when(val thumbnailView = action.thumbnailView.get()) {\n                    null -> activity.startActivity(intent)\n                    else -> {\n                        val compat = ActivityOptionsCompat.makeSceneTransitionAnimation(\n                            activity,\n                            thumbnailView,\n                            \"image\"\n                        )\n                        activity.startActivity(intent, compat.toBundle())\n                    }\n                }\n\n            }\n            is NoteCardAction.OnSensitiveMediaPreviewClicked -> {\n                if (settingStore.configState.value.isShowWarningDisplayingSensitiveMedia) {\n                    val dialog = MaterialAlertDialogBuilder(activity)\n                        .setTitle(R.string.confirm_display_sensitive_media_dialog_title)\n                        .setMessage(R.string.confirm_display_sensitive_media_dialog_message)\n                        .setNeutralButton(R.string.confirm_display_sensitive_media_dialog_neutral_button) { _, _ ->\n                            notesViewModel.neverShowSensitiveMediaDialog()\n                        }\n                        .setPositiveButton(R.string.confirm_display_sensitive_media_dialog_positive_button) { _, _ ->\n                            action.mediaViewData.show(action.targetIndex)\n                        }\n                        .setNegativeButton(android.R.string.cancel) { _, _ ->\n                            // do nothing\n                        }\n                        .create()\n                    dialog.show()\n                } else {\n                    action.mediaViewData.show(action.targetIndex)\n                }\n\n            }\n\n            is NoteCardAction.OnHashtagClick -> {\n                activity.startActivity(\n                    searchNavigation.newIntent(\n                        SearchNavType.ResultScreen(\n                            action.hashtag,\n                        )\n                    )\n                )\n            }\n            is NoteCardAction.OnLinkClick -> {\n                val intent = Intent(Intent.ACTION_VIEW, action.url.toUri())\n                activity.startActivity(intent)\n            }\n            is NoteCardAction.OnMentionClick -> {\n                activity.startActivity(\n                    userDetailNavigation.newIntent(\n                        UserDetailNavigationArgs.UserName(\n                            action.mention\n                        )\n                    )\n                )\n            }\n            is NoteCardAction.OnUrlClick -> {\n                val intent = Intent(Intent.ACTION_VIEW, action.url.toUri())\n                activity.startActivity(intent)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteCardActionListenerAdapter.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.widget.ImageView\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.media.viewmodel.MediaViewData\nimport net.pantasystem.milktea.note.media.viewmodel.PreviewAbleFile\nimport net.pantasystem.milktea.note.reaction.ReactionCountAction\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport java.lang.ref.WeakReference\n\nclass NoteCardActionListenerAdapter(\n    val onAction: (NoteCardAction) -> Unit,\n) {\n\n    fun onReplyButtonClicked(note: PlaneNoteViewData) {\n        onAction(NoteCardAction.OnReplyButtonClicked(note))\n    }\n\n    fun onRenoteButtonClicked(note: PlaneNoteViewData) {\n        onAction(NoteCardAction.OnRenoteButtonClicked(note))\n    }\n\n    fun onOptionButtonClicked(note: PlaneNoteViewData) {\n        onAction(NoteCardAction.OnOptionButtonClicked(note))\n    }\n\n    fun onReactionButtonClicked(note: PlaneNoteViewData) {\n        onAction(NoteCardAction.OnReactionButtonClicked(note))\n    }\n\n    fun onUserClicked(user: User?) {\n        if (user != null) {\n            onAction(NoteCardAction.OnUserClicked(user))\n        }\n    }\n\n    fun onPollChoiceClicked(noteId: Note.Id, poll: Poll, choice: Poll.Choice) {\n        onAction(NoteCardAction.OnPollChoiceClicked(noteId, poll, choice))\n    }\n\n    fun onRenoteButtonLongClicked(note: PlaneNoteViewData) {\n        onAction(NoteCardAction.OnRenoteButtonLongClicked(note))\n    }\n\n    fun onNoteCardClicked(note: Note) {\n        onAction(NoteCardAction.OnNoteCardClicked(note))\n    }\n\n    fun onReactionCountAction(action: ReactionCountAction) {\n        when(action) {\n            is ReactionCountAction.OnClicked -> {\n                onAction(NoteCardAction.OnReactionClicked(action.note, action.reaction))\n            }\n            is ReactionCountAction.OnLongClicked -> {\n                onAction(NoteCardAction.OnReactionLongClicked(action.note, action.reaction))\n            }\n        }\n    }\n\n    fun onFavoriteButtonClicked(note: Note) {\n        onAction(NoteCardAction.OnFavoriteButtonClicked(note))\n    }\n\n    fun onChannelButtonClicked(channelId: Channel.Id) {\n        onAction(NoteCardAction.OnChannelButtonClicked(channelId))\n    }\n\n    fun onMediaPreviewLongClicked(previewAbleFile: PreviewAbleFile?) {\n        onAction(NoteCardAction.OnMediaPreviewLongClicked(previewAbleFile))\n    }\n\n    fun onMediaPreviewClicked(previewAbleFile: PreviewAbleFile?, files: List<PreviewAbleFile>, index: Int, thumbnailView: ImageView) {\n        onAction(NoteCardAction.OnMediaPreviewClicked(previewAbleFile, files, index, WeakReference(thumbnailView)))\n    }\n\n    fun onSensitiveMediaPreviewClicked(mediaViewData: MediaViewData, targetIndex: Int) {\n        onAction(NoteCardAction.OnSensitiveMediaPreviewClicked(mediaViewData, targetIndex))\n    }\n}\n\n\n\n\nsealed interface NoteCardAction {\n    data class OnReplyButtonClicked(val note: PlaneNoteViewData) : NoteCardAction\n    data class OnRenoteButtonClicked(val note: PlaneNoteViewData) : NoteCardAction\n    data class OnOptionButtonClicked(val note: PlaneNoteViewData) : NoteCardAction\n    data class OnReactionButtonClicked(val note: PlaneNoteViewData) : NoteCardAction\n    data class OnReactionClicked(val note: PlaneNoteViewData, val reaction: String) : NoteCardAction\n    data class OnReactionLongClicked(val note: PlaneNoteViewData, val reaction: String) : NoteCardAction\n    data class OnPollChoiceClicked(val noteId: Note.Id, val poll: Poll, val choice: Poll.Choice) : NoteCardAction\n    data class OnRenoteButtonLongClicked(val note: PlaneNoteViewData) : NoteCardAction\n    data class OnNoteCardClicked(val note: Note) : NoteCardAction\n    data class OnUserClicked(val user: User) : NoteCardAction\n    data class OnFavoriteButtonClicked(val note: Note) : NoteCardAction\n    data class OnChannelButtonClicked(val channelId: Channel.Id) : NoteCardAction\n\n    data class OnMediaPreviewLongClicked(val previewAbleFile: PreviewAbleFile?) : NoteCardAction\n\n    data class OnSensitiveMediaPreviewClicked(val mediaViewData: MediaViewData, val targetIndex: Int) : NoteCardAction\n\n    data class OnMediaPreviewClicked(\n        val previewAbleFile: PreviewAbleFile?,\n        val files: List<PreviewAbleFile>,\n        val index: Int,\n        val thumbnailView: WeakReference<ImageView>,\n    ) : NoteCardAction\n\n    data class OnUrlClick(val url: String) : NoteCardAction\n\n    data class OnLinkClick(val url: String) : NoteCardAction\n\n    data class OnHashtagClick(val hashtag: String) : NoteCardAction\n\n    data class OnMentionClick(val mention: String) : NoteCardAction\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteTransitionHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.app.Activity\nimport android.view.View\nimport androidx.core.app.ActivityOptionsCompat\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.common_android.ui.putActivity\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.NoteDetailActivity\n\nobject NoteTransitionHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"clickedView\", \"transitionDestinationNote\")\n    fun View.transitionNoteDetail(clickedView: View?, transitionDestinationNote: Note?){\n        transitionDestinationNote?: return\n        val clicked = clickedView?: this\n        clicked.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            val context = this.context\n            val intent = NoteDetailActivity.newIntent(context, transitionDestinationNote.id)\n            intent.putActivity(Activities.ACTIVITY_IN_APP)\n\n            if(context is Activity){\n                val compat = ActivityOptionsCompat.makeSceneTransitionAnimation(context, this, \"note\")\n                context.startActivity(intent, compat.toBundle())\n            }else{\n                context.startActivity(intent)\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/NoteUserRoleBadgeBinder.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.view.View\nimport android.widget.ImageView\nimport androidx.constraintlayout.helper.widget.Flow\nimport androidx.constraintlayout.widget.ConstraintLayout\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common.glide.GlideApp\nimport net.pantasystem.milktea.model.user.User\n\nobject NoteUserRoleBadgeBinder {\n\n    @JvmStatic\n    @BindingAdapter(\"parentView\", \"userRoleBadges\", \"iconSizePx\")\n    fun Flow.setUserRoleBadge(parentView: ConstraintLayout, badges: List<User.BadgeRole>, iconSizePx: Int) {\n        val refIds = this.referencedIds?.toList()?: emptyList()\n\n        // 使用しないViewを削除する処理\n        while((this.referencedIds?.size ?: 0) > badges.size) {\n            val id = this.referencedIds?.lastOrNull() ?: break\n            this.removeView(parentView.findViewById(id))\n            parentView.removeView(parentView.findViewById(id))\n        }\n\n        badges.forEachIndexed { index, badgeRole ->\n            val existsView = refIds.getOrNull(index)\n                ?.let { parentView.findViewById<ImageView>(it) }\n\n            val imageView = existsView ?: ImageView(parentView.context).apply {\n                // height width 20dp\n                this.layoutParams = ConstraintLayout.LayoutParams(\n                    iconSizePx,\n                    iconSizePx,\n                )\n\n                // padding\n                this.setPadding(4, 0, 4, 0)\n            }\n\n            GlideApp.with(parentView.context)\n                .load(badgeRole.iconUri)\n                .into(imageView)\n\n            if (existsView == null) {\n                imageView.id = View.generateViewId()\n                parentView.addView(imageView)\n                this.addView(imageView)\n            }\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/RenoteButtonHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.content.res.ColorStateList\nimport android.util.TypedValue\nimport android.widget.ImageButton\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\nobject RenoteButtonHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"notesViewModelForClickRenote\", \"clickTargetNote\")\n    fun ImageButton.renoteButtonClickHelper(notesViewModelForClickRenote: NoteCardActionListenerAdapter?, clickTargetNote: PlaneNoteViewData?) {\n        if(notesViewModelForClickRenote == null || clickTargetNote == null) {\n            return\n        }\n        this.setOnClickListener {\n            notesViewModelForClickRenote.onRenoteButtonClicked(clickTargetNote)\n        }\n        this.setOnLongClickListener {\n            notesViewModelForClickRenote.onRenoteButtonLongClicked(clickTargetNote)\n            false\n        }\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"renoteButtonColor\")\n    fun ImageButton.setRenoteButtonIconFromState(note: Note?) {\n        note ?: return\n        val theme = context.theme\n        val typedValue = TypedValue()\n        theme.resolveAttribute(R.attr.normalIconTint, typedValue, true)\n        val normalTintColor = typedValue.data\n\n        theme.resolveAttribute(R.attr.colorPrimary, typedValue, true)\n        val primaryColor = typedValue.data\n\n        when(val type = note.type) {\n            is Note.Type.Mastodon -> {\n                if (type.reblogged == true) {\n                    this.imageTintList = ColorStateList.valueOf(primaryColor)\n                } else {\n                    this.imageTintList = ColorStateList.valueOf(normalTintColor)\n                }\n            }\n            is Note.Type.Misskey -> {\n                this.imageTintList = ColorStateList.valueOf(normalTintColor)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/StatusMessageHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.text.SpannableStringBuilder\nimport android.view.View\nimport android.widget.TextView\nimport androidx.core.content.ContextCompat\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiDecorator\nimport net.pantasystem.milktea.common_android.ui.text.DrawableEmojiSpan\nimport net.pantasystem.milktea.common_android.ui.text.EmojiAdapter\nimport net.pantasystem.milktea.common_android_ui.BindingProvider\nimport net.pantasystem.milktea.note.R\nimport net.pantasystem.milktea.note.viewmodel.NoteStatusMessageTextGenerator\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport kotlin.math.min\n\n\nobject StatusMessageHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"statusMessageTargetViewNote\")\n    fun TextView.setStatusMessage(statusMessageTargetViewNote: PlaneNoteViewData) {\n        val entrypoint = EntryPointAccessors.fromApplication(\n            context.applicationContext,\n            BindingProvider::class.java\n        )\n        val settingStore = entrypoint.settingStore()\n\n        val isUserNameDefault = settingStore.isUserNameDefault\n        val note = statusMessageTargetViewNote.note\n\n        val context = this.context\n        val message = NoteStatusMessageTextGenerator(note, isUserNameDefault)\n        if (message == null) {\n            this.visibility = View.GONE\n            return\n        }\n        this.visibility = View.VISIBLE\n        val text = if (isUserNameDefault) {\n            message.getString(context)\n        } else {\n            CustomEmojiDecorator().decorate(\n                statusMessageTargetViewNote.account.getHost(),\n                note.user.host,\n                note.user.emojis,\n                message.getString(context),\n                this,\n            )\n        }\n\n        val icon = when {\n            note.reply != null -> R.drawable.ic_reply_black_24dp\n            note.renote != null -> R.drawable.ic_re_note\n            else -> null\n        }\n\n        this.text = if (icon != null) {\n            SpannableStringBuilder(text).apply {\n                insert(0, \"icon\")\n                val span = DrawableEmojiSpan(EmojiAdapter(this@setStatusMessage), icon)\n                val drawable = ContextCompat.getDrawable(context, icon)\n                drawable?.setTint(currentTextColor)\n                Glide.with(context)\n                    .load(drawable)\n                    .override(min(textSize.toInt(), 640))\n                    .into(span.target)\n\n                setSpan(span, 0, \"icon\".length, 0)\n            }\n        } else {\n            text\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/view/TranslationHelper.kt",
    "content": "package net.pantasystem.milktea.note.view\n\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.mfm.MFMParser\nimport net.pantasystem.milktea.common_android_ui.LazyDecorateSkipElementsHolder\nimport net.pantasystem.milktea.common_android_ui.MFMDecorator\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.Translation\nimport net.pantasystem.milktea.note.R\n\nobject TranslationHelper {\n\n\n    @JvmStatic\n    @BindingAdapter(\"translationState\", \"emojis\")\n    fun TextView.setTranslatedText(state: ResultState<Translation>?, emojis: List<CustomEmoji>?) {\n        if(state == null) {\n            this.visibility = View.GONE\n            return\n        }\n\n        if(state is ResultState.Loading) {\n            this.visibility = View.GONE\n            return\n        }\n\n        val translation = runCancellableCatching {\n            (state.content as StateContent.Exist).rawContent\n        }.getOrNull()\n        this.visibility = View.VISIBLE\n\n        if(state is ResultState.Error) {\n            this.text = context.getString(R.string.error_s, state.throwable.toString())\n        }\n        if(translation == null) {\n            return\n        }\n\n        val text = context.getString(R.string.translated_from_s, translation.sourceLang) + translation.text\n        val nodes = MFMParser.parse(text)\n        if (nodes != null) {\n            val emojiMap = emojis?.associateBy { it.name } ?: emptyMap()\n            val lazy = MFMDecorator.decorate(\n                sourceText = text,\n                nodes = nodes,\n                emojiNameMap = emojiMap,\n                instanceEmojiNameMap = emptyMap(),\n                userHost = null,\n                accountHost = null,\n                isRequireProcessNyaize = false,\n                holder = LazyDecorateSkipElementsHolder(),\n            )\n            android.text.method.LinkMovementMethod.getInstance().also {\n                this.movementMethod = it\n            }\n            this.text = MFMDecorator.decorate(this, lazy)\n        } else {\n            this.text = text\n        }\n\n    }\n\n    @JvmStatic\n    @BindingAdapter(\"translationState\")\n    fun ViewGroup.translationVisibility(state: ResultState<Translation>?) {\n        if(state == null) {\n            this.visibility = View.GONE\n            return\n        }\n        this.visibility = if(state.content is StateContent.NotExist && state is ResultState.Fixed) {\n            View.GONE\n        }else{\n            View.VISIBLE\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/CwTextGenerator.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.note.R\n\nobject CwTextGenerator {\n\n    operator fun invoke(note: NoteRelation?, isFolding: Boolean): StringSource {\n        if (note == null) {\n            return StringSource(\"()\")\n        }\n        val textSize = note.note.text?.let {\n            it.codePointCount(0, it.length)\n        }\n        val fileSize = note.note.fileIds?.size\n\n        val buttonText = listOfNotNull(\n            textSize?.let {\n                StringSource(R.string.char_count, it)\n            },\n            fileSize?.takeIf {\n                it > 0\n            }?.let {\n                StringSource(R.string.file_count, it)\n            },\n            note.note.poll?.let {\n                StringSource(R.string.poll)\n            },\n        )\n        val result = if (buttonText.isEmpty()) {\n            StringSource(\"\")\n        } else {\n            buttonText.reduceIndexed { index, acc, stringSource ->\n                acc + if (index > 0) {\n                    StringSource(\"/\") + stringSource\n                } else {\n                    stringSource\n                }\n            }\n        }\n\n        return if (isFolding) StringSource(R.string.show_more, result) else StringSource(R.string.hide)\n\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/HasReplyToNoteViewData.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\nimport androidx.lifecycle.MutableLiveData\nimport kotlinx.coroutines.CoroutineScope\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\n\nclass HasReplyToNoteViewData(\n    noteRelation: NoteRelation,\n    account: Account,\n    noteTranslationStore: NoteTranslationStore,\n    noteDataSource: NoteDataSource,\n    configRepository: LocalConfigRepository,\n    coroutineScope: CoroutineScope,\n) : PlaneNoteViewData(\n    noteRelation,\n    account,\n    noteTranslationStore,\n    noteDataSource,\n    configRepository,\n    coroutineScope\n) {\n    val reply = noteRelation.reply\n\n\n    val replyExpanded = MutableLiveData<Boolean>(reply?.note?.cw != null)\n\n    val replyTo = if (reply == null) {\n        throw IllegalArgumentException(\"replyがnullですPlaneNoteViewDataを利用してください\")\n    } else {\n        PlaneNoteViewData(\n            reply,\n            account,\n            noteTranslationStore,\n            noteDataSource,\n            configRepository,\n            coroutineScope\n        )\n    }\n\n    fun expandReplyNote() {\n        replyExpanded.value = true\n    }\n\n\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/NoteStatusMessageTextGenerator.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.note.R\n\nobject NoteStatusMessageTextGenerator {\n\n    operator fun invoke(note: NoteRelation?, isUserNameDefault: Boolean): StringSource? {\n        if (note == null) {\n            return null\n        }\n        val name = if (isUserNameDefault) {\n            note.user.displayUserName\n        } else {\n            note.user.displayName\n        }\n        return when {\n            note.reply != null -> {\n                StringSource(R.string.replied_by, name)\n            }\n            note.note.isRenote() && !note.note.hasContent() -> {\n                StringSource(R.string.renoted_by, name)\n            }\n\n            else -> null\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/NoteViewData.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\ninterface NoteViewData"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/NotesViewModel.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.handler.AppGlobalError\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorAction\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorStore\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.note.DeleteAndEditUseCase\nimport net.pantasystem.milktea.model.note.DeleteNoteUseCase\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.note.NoteService\nimport net.pantasystem.milktea.model.note.bookmark.CreateBookmarkUseCase\nimport net.pantasystem.milktea.model.note.bookmark.DeleteBookmarkUseCase\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.favorite.CreateFavoriteUseCase\nimport net.pantasystem.milktea.model.note.favorite.DeleteFavoriteUseCase\nimport net.pantasystem.milktea.model.note.favorite.ToggleFavoriteUseCase\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.poll.VoteUseCase\nimport net.pantasystem.milktea.model.note.reaction.DeleteReactionsUseCase\nimport net.pantasystem.milktea.model.note.reaction.ToggleReactionUseCase\nimport net.pantasystem.milktea.model.note.repost.QuoteRenoteData\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.report.Report\nimport net.pantasystem.milktea.note.R\nimport javax.inject.Inject\n\n\n@HiltViewModel\nclass NotesViewModel @Inject constructor(\n    private val noteService: NoteService,\n    private val toggleReactionUseCase: ToggleReactionUseCase,\n    private val createFavoriteUseCase: CreateFavoriteUseCase,\n    private val deleteFavoriteUseCase: DeleteFavoriteUseCase,\n    private val translationStore: NoteTranslationStore,\n    private val createBookmarkUseCase: CreateBookmarkUseCase,\n    private val deleteBookmarkUseCase: DeleteBookmarkUseCase,\n    private val deleteNoteUseCase: DeleteNoteUseCase,\n    private val toggleFavoriteUseCase: ToggleFavoriteUseCase,\n    private val deleteAndEditUseCase: DeleteAndEditUseCase,\n    private val deleteReactionUseCase: DeleteReactionsUseCase,\n    private val voteUseCase: VoteUseCase,\n    private val configRepository: LocalConfigRepository,\n    private val userActionAppGlobalErrorStore: UserActionAppGlobalErrorStore,\n    loggerFactory: Logger.Factory\n) : ViewModel() {\n    private val logger by lazy {\n        loggerFactory.create(\"NotesViewModel\")\n    }\n\n    private val _statusMessage = MutableSharedFlow<StringSource>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 10)\n    val statusMessage = _statusMessage.asSharedFlow()\n\n    val quoteRenoteTarget = MutableSharedFlow<QuoteRenoteData>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 10)\n\n    val confirmDeletionEvent = MutableSharedFlow<NoteRelation?>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 10)\n\n    val confirmDeleteAndEditEvent = MutableSharedFlow<NoteRelation?>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 10)\n\n    val confirmReportEvent = MutableSharedFlow<Report?>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 10)\n\n    private val _openNoteEditorEvent = MutableSharedFlow<DraftNote?>(onBufferOverflow = BufferOverflow.DROP_OLDEST, extraBufferCapacity = 10)\n    val openNoteEditorEvent = _openNoteEditorEvent.asSharedFlow()\n\n    fun showQuoteNoteEditor(noteId: Note.Id) {\n        viewModelScope.launch {\n            // 引用リノートしようとしたノートが第三者によりリノートされたものである可能性もあるので、\n            // リノートIDを辿って大本のノートを探し出す\n            recursiveSearchHasContentNote(noteId).onSuccess {\n                quoteRenoteTarget.tryEmit(\n                    QuoteRenoteData.ofTimeline(it.id)\n                )\n            }.onFailure {\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.showQuoteNoteEditor\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Load note failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n\n    fun showQuoteToChannelNoteEditor(noteId: Note.Id) {\n        viewModelScope.launch {\n            recursiveSearchHasContentNote(noteId).onSuccess {\n                quoteRenoteTarget.tryEmit(\n                    QuoteRenoteData.ofChannel(it.id, requireNotNull(it.channelId))\n                )\n            }.onFailure {\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.showQuoteToChannelNoteEditor\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Load note failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n\n    private suspend fun recursiveSearchHasContentNote(noteId: Note.Id): Result<Note> =\n        noteService.findHasContentNote(noteId)\n\n    /**\n     * リアクションを送信する\n     * @param reaction 既存のリアクションと値が同様の場合は解除のみする\n     * 既に含まれているmyReactionと一致しない場合は一度解除し再送する\n     */\n    fun postReaction(planeNoteViewData: PlaneNoteViewData, reaction: String) {\n\n        val id = planeNoteViewData.toShowNote.note.id\n        toggleReaction(id, reaction)\n    }\n\n    fun toggleReaction(noteId: Note.Id, reaction: String) {\n        viewModelScope.launch {\n            toggleReactionUseCase(noteId, reaction).onFailure {\n                logger.error(\"リアクション失敗\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.toggleReaction\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Reaction failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n\n    fun deleteReactions(noteId: Note.Id) {\n        viewModelScope.launch {\n            deleteReactionUseCase(noteId).onFailure {\n                logger.error(\"リアクションの解除に失敗\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.deleteReactions\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Delete reactions failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n\n    fun addFavorite(noteId: Note.Id) {\n        viewModelScope.launch {\n            createFavoriteUseCase(noteId).onSuccess {\n                _statusMessage.tryEmit(StringSource(R.string.successfully_added_to_favorites))\n            }.onFailure {\n                _statusMessage.tryEmit(StringSource(R.string.failed_to_add_to_favorites))\n            }\n        }\n    }\n\n    fun deleteFavorite(noteId: Note.Id) {\n        viewModelScope.launch {\n            deleteFavoriteUseCase(noteId).onFailure {\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.deleteFavorite\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(R.string.failed_to_delete_favorites),\n                        throwable = it\n                    )\n                )\n            }.onSuccess {\n                _statusMessage.tryEmit(StringSource(R.string.removed_from_favorites))\n            }\n        }\n    }\n\n\n    fun addBookmark(noteId: Note.Id) {\n        viewModelScope.launch {\n            createBookmarkUseCase(noteId).onFailure {\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.addBookmark\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Add bookmark failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n\n    fun removeBookmark(noteId: Note.Id) {\n        viewModelScope.launch {\n            deleteBookmarkUseCase(noteId).onFailure {\n                logger.error(\"remove book mark error\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.removeBookmark\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Remove bookmark failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n\n    fun removeNote(noteId: Note.Id) {\n        viewModelScope.launch {\n            deleteNoteUseCase(noteId).onSuccess {\n                _statusMessage.tryEmit(StringSource(R.string.successfully_deleted))\n            }.onFailure {\n                logger.error(\"ノート削除に失敗\", it)\n                if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            tag = \"NotesViewModel.removeNote\",\n                            level = AppGlobalError.ErrorLevel.Error,\n                            message = StringSource(\"Delete note failed\"),\n                            throwable = it,\n                            retryable = true\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                    )\n                ) {\n                    removeNote(\n                        noteId\n                    )\n                }\n            }\n        }\n\n    }\n\n    fun removeAndEditNote(noteId: Note.Id) {\n        viewModelScope.launch {\n            deleteAndEditUseCase(noteId).onSuccess {\n                _openNoteEditorEvent.tryEmit(it)\n            }.onFailure {\n                logger.error(\"削除に失敗しました\", it)\n                if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            tag = \"NotesViewModel.removeAndEditNote\",\n                            level = AppGlobalError.ErrorLevel.Error,\n                            message = StringSource(\"Delete note failed\"),\n                            throwable = it,\n                            retryable = true\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                    )\n                ) {\n                    removeAndEditNote(\n                        noteId\n                    )\n                }\n            }\n        }\n\n    }\n\n    fun vote(noteId: Note.Id?, poll: Poll?, choice: Poll.Choice?) {\n        if (noteId == null || poll == null || choice == null) {\n            return\n        }\n        viewModelScope.launch {\n            voteUseCase(noteId, choice).onFailure {\n                logger.error(\"投票に失敗しました\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.vote\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Vote failed\"),\n                        throwable = it\n                    )\n                )\n            }.onSuccess {\n                logger.debug(\"投票に成功しました\")\n            }\n        }\n    }\n\n    fun onToggleFavoriteUseCase(note: Note) {\n        viewModelScope.launch {\n            toggleFavoriteUseCase(note.id).onFailure {\n                logger.error(\"favoriteに失敗\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.onToggleFavoriteUseCase\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Toggle favorite failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n\n    fun translate(noteId: Note.Id) {\n        viewModelScope.launch {\n            translationStore.translate(noteId)\n        }\n    }\n\n    fun neverShowSensitiveMediaDialog() {\n        viewModelScope.launch {\n            configRepository.get().mapCancellableCatching {\n                it.copy(isShowWarningDisplayingSensitiveMedia = false)\n            }.flatMapCancellableCatching {\n                configRepository.save(it)\n            }.onFailure {\n                logger.error(\"警告表示の抑制に失敗\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        tag = \"NotesViewModel.neverShowSensitiveMediaDialog\",\n                        level = AppGlobalError.ErrorLevel.Warning,\n                        message = StringSource(\"Never show sensitive media dialog failed\"),\n                        throwable = it\n                    )\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/PlaneNoteViewData.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\n\nimport android.util.Log\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onStart\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common_android.mfm.MFMParser\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_android_ui.LazyDecorateResult\nimport net.pantasystem.milktea.common_android_ui.LazyDecorateSkipElementsHolder\nimport net.pantasystem.milktea.common_android_ui.MFMDecorator\nimport net.pantasystem.milktea.common_android_ui.getTextType\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.file.AboutMediaType\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteCaptureAPIAdapter\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.note.Translation\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.url.UrlPreview\nimport net.pantasystem.milktea.model.url.UrlPreviewLoadTask\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.media.viewmodel.MediaViewData\nimport net.pantasystem.milktea.note.reaction.ReactionViewData\nimport java.util.UUID\n\nopen class PlaneNoteViewData(\n    val note: NoteRelation,\n    val account: Account,\n    noteTranslationStore: NoteTranslationStore,\n    noteDataSource: NoteDataSource,\n    configRepository: LocalConfigRepository,\n    coroutineScope: CoroutineScope,\n) : NoteViewData {\n\n    val uuid = UUID.randomUUID().toString()\n    val id = note.note.id\n\n    var filterResult: FilterResult = FilterResult.NotExecuted\n\n    val toShowNote: NoteRelation = note.contentNote\n\n    val currentNote: StateFlow<Note> = noteDataSource.observeOne(toShowNote.note.id).map {\n        it ?: toShowNote.note\n    }.onStart {\n        emit(toShowNote.note)\n    }.stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), toShowNote.note)\n\n    val isRenotedByMe = !note.note.hasContent() && note.user.id.id == account.remoteId\n\n    val userId: User.Id\n        get() = toShowNote.user.id\n\n    val name: String\n        get() = toShowNote.user.displayName\n\n    val userName: String = toShowNote.user.displayUserName\n\n    val avatarUrl = toShowNote.user.avatarUrl\n\n    val cw = toShowNote.note.cw\n    val cwNode: LazyDecorateResult? = toShowNote.note.cw?.let { text ->\n        val nodes = MFMParser.parse(text) ?: return@let null\n        MFMDecorator.decorate(\n            sourceText = text,\n            nodes = nodes,\n            emojiNameMap = toShowNote.note.emojiNameMap ?: emptyMap(),\n            instanceEmojiNameMap = emptyMap(),\n            userHost = toShowNote.user.host,\n            accountHost = account.getHost(),\n            isRequireProcessNyaize = (toShowNote.note.type as? Note.Type.Misskey)?.isRequireNyaize ?: false,\n            holder = LazyDecorateSkipElementsHolder(),\n        )\n    }\n\n    val text = toShowNote.note.text\n\n    val contentFolding = MutableStateFlow(cw != null)\n    val contentFoldingStatusMessage: StateFlow<StringSource> = contentFolding.map {\n        CwTextGenerator(toShowNote, it)\n    }.stateIn(\n        coroutineScope,\n        SharingStarted.WhileSubscribed(5_000),\n        CwTextGenerator(toShowNote, true)\n    )\n\n    val textNode = getTextType(\n        account,\n        toShowNote,\n        emptyMap(),\n        (toShowNote.note.type as? Note.Type.Misskey)?.isRequireNyaize ?: false\n    )\n\n    val translateState: StateFlow<ResultState<Translation?>?> =\n        noteTranslationStore.state(toShowNote.note.id).stateIn(\n            coroutineScope,\n            SharingStarted.WhileSubscribed(5_000),\n            null\n        )\n\n    private val previewableFiles = toShowNote.files?.map {\n        FilePreviewSource.Remote(AppFile.Remote(it.id), it)\n    }?.filter {\n        it.aboutMediaType == AboutMediaType.IMAGE || it.aboutMediaType == AboutMediaType.VIDEO\n    } ?: emptyList()\n    val media = MediaViewData(previewableFiles, configRepository.get().getOrNull())\n\n    val isOnlyVisibleRenoteStatusMessage = MutableStateFlow<Boolean>(false)\n\n    val urlPreviewList = MutableStateFlow<List<UrlPreview>>(emptyList())\n\n    val previews = urlPreviewList.map {\n        val otherFiles = toShowNote.files?.map { file ->\n            FilePreviewSource.Remote(AppFile.Remote(file.id), file)\n        }?.filterNot { fp ->\n            fp.aboutMediaType == AboutMediaType.IMAGE || fp.aboutMediaType == AboutMediaType.VIDEO\n        }?.map { file ->\n            Preview.FileWrapper(file)\n        }\n        val urlPreviews = it.map { url ->\n            Preview.UrlWrapper(url)\n        }\n        (otherFiles ?: emptyList()) + urlPreviews\n    }.stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    val replyCount = toShowNote.note.repliesCount\n\n    val favoriteCount = currentNote.map {\n        (it.type as? Note.Type.Mastodon?)?.favoriteCount\n    }.stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), 0)\n\n    val canRenote =\n        toShowNote.note.canRenote(User.Id(accountId = account.accountId, id = account.remoteId))\n\n    val reactionCountsExpanded =\n        MutableStateFlow(toShowNote.note.reactionCounts.size <= Note.SHORT_REACTION_COUNT_MAX_SIZE)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val reactionCountsViewData: StateFlow<List<ReactionViewData>> = currentNote.flatMapLatest { n ->\n        reactionCountsExpanded.map {\n            val reactions = if (it) {\n                n.reactionCounts\n            } else {\n                n.getShortReactionCounts(note.note.isRenoteOnly())\n            }\n            ReactionViewData.from(\n                reactions,\n                n,\n            )\n        }\n    }.flowOn(Dispatchers.Default).stateIn(\n        coroutineScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n\n    val subNote: NoteRelation? = toShowNote.renote\n\n    val subNoteAvatarUrl = subNote?.user?.avatarUrl\n    val subNoteTextNode = subNote?.let {\n        getTextType(\n            account, it, emptyMap(),\n            (it.note.type as? Note.Type.Misskey)?.isRequireNyaize ?: false\n        )\n    }\n\n    val subCw = subNote?.note?.cw\n    val subCwNode: LazyDecorateResult? = subNote?.note?.cw?.let { text ->\n        val nodes = MFMParser.parse(text) ?: return@let null\n        MFMDecorator.decorate(\n            sourceText = text,\n            nodes = nodes,\n            emojiNameMap = subNote.note.emojiNameMap ?: emptyMap(),\n            instanceEmojiNameMap = emptyMap(),\n            userHost = subNote.user.host,\n            accountHost = account.getHost(),\n            isRequireProcessNyaize = (toShowNote.note.type as? Note.Type.Misskey)?.isRequireNyaize ?: false,\n            holder = LazyDecorateSkipElementsHolder(),\n        )\n    }\n\n    val subContentFolding = MutableStateFlow(subCw != null)\n\n    val subContentFoldingStatusMessage = subContentFolding.map { isFolding ->\n        CwTextGenerator(subNote, isFolding)\n    }.stateIn(\n        coroutineScope,\n        SharingStarted.WhileSubscribed(5_000),\n        CwTextGenerator(subNote, subCw != null)\n    )\n    val subNoteFiles = subNote?.files ?: emptyList()\n    val subNoteMedia = MediaViewData(subNote?.files?.map {\n        FilePreviewSource.Remote(AppFile.Remote(it.id), it)\n    } ?: emptyList(), configRepository.get().getOrNull())\n\n    val channelInfo = (toShowNote.note.type as? Note.Type.Misskey)?.channel\n\n    val config = configRepository.observe().stateIn(\n        coroutineScope,\n        SharingStarted.WhileSubscribed(5_000),\n        DefaultConfig.config\n    )\n\n    val isVisibleSubNoteMediaPreview = subContentFolding.map { folding ->\n        !(folding || subNoteFiles.isEmpty() || subNoteMedia.isOver4Files)\n    }.stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), true)\n\n    fun changeContentFolding() {\n        val isFolding = contentFolding.value\n        contentFolding.value = !isFolding\n    }\n\n    fun changeSubContentFolding() {\n        val isFolding = subContentFolding.value\n        subContentFolding.value = !isFolding\n    }\n\n    val urlPreviewLoadTaskCallback = object : UrlPreviewLoadTask.Callback {\n        override fun accept(list: List<UrlPreview>) {\n            urlPreviewList.value = list\n        }\n    }\n\n    fun capture(\n        noteCaptureAPIAdapter: NoteCaptureAPIAdapter,\n        job: (Flow<NoteDataSource.Event>) -> Job,\n    ) {\n        val flow = noteCaptureAPIAdapter.capture(toShowNote.note.id).catch { e ->\n            Log.d(\"PlaneNoteViewData\", \"error\", e)\n        }\n        this.job = job(flow)\n    }\n\n    var job: Job? = null\n\n    val expanded = MutableStateFlow(cw != null)\n\n    init {\n        require(toShowNote.note.id != subNote?.note?.id)\n    }\n\n    fun expand() {\n        Log.d(\"PlaneNoteViewData\", \"expand\")\n        expanded.value = true\n    }\n\n    fun expandReactions() {\n        reactionCountsExpanded.value = true\n    }\n\n    enum class FilterResult {\n        NotExecuted,\n        ShouldFilterNote,\n        Pass,\n    }\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/PlaneNoteViewDataCache.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.plus\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.app_store.notes.NoteTranslationStore\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteCaptureAPIAdapter\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.note.NoteRelationGetter\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.url.UrlPreviewStore\nimport net.pantasystem.milktea.model.url.UrlPreviewStoreProvider\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\nclass PlaneNoteViewDataCache(\n    private val getAccount: suspend () -> Account,\n    private val noteCaptureAdapter: NoteCaptureAPIAdapter,\n    private val translationStore: NoteTranslationStore,\n    private val getUrlPreviewStore: suspend (Account) -> UrlPreviewStore?,\n    private val coroutineScope: CoroutineScope,\n    private val noteRelationGetter: NoteRelationGetter,\n    private val noteDataSource: NoteDataSource,\n    private val configRepository: LocalConfigRepository,\n    private val emojiRepository: CustomEmojiRepository,\n) {\n\n    interface ViewDataFilter {\n        suspend fun check(viewData: PlaneNoteViewData): PlaneNoteViewData.FilterResult\n    }\n\n    @Singleton\n    class Factory @Inject constructor(\n        private val noteCaptureAdapter: NoteCaptureAPIAdapter,\n        private val translationStore: NoteTranslationStore,\n        private val urlPreviewStoreProvider: UrlPreviewStoreProvider,\n        private val noteRelationGetter: NoteRelationGetter,\n        private val noteDataSource: NoteDataSource,\n        private val configRepository: LocalConfigRepository,\n        private val emojiRepository: CustomEmojiRepository,\n    ) {\n        fun create(\n            getAccount: suspend () -> Account,\n            coroutineScope: CoroutineScope,\n        ): PlaneNoteViewDataCache {\n            return PlaneNoteViewDataCache(\n                getAccount,\n                noteCaptureAdapter,\n                translationStore,\n                {\n                    urlPreviewStoreProvider.getUrlPreviewStore(it)\n                },\n                coroutineScope,\n                noteRelationGetter,\n                noteDataSource,\n                configRepository,\n                emojiRepository,\n            )\n        }\n    }\n\n    private val lock = Mutex()\n    private val cache = mutableMapOf<Note.Id, PlaneNoteViewData>()\n\n    private val _filters = mutableListOf<ViewDataFilter>()\n\n    fun addFilter(filter: ViewDataFilter) {\n        _filters.add(filter)\n    }\n\n    suspend fun get(relation: NoteRelation): PlaneNoteViewData {\n        return lock.withLock {\n            getUnThreadSafe(relation)\n        }\n    }\n\n    private suspend fun useIn(relations: List<NoteRelation>): List<PlaneNoteViewData> {\n        return lock.withLock {\n            val viewDataList = relations.map {\n                getUnThreadSafe(it)\n            }\n            viewDataList\n        }\n    }\n\n    suspend fun useByIds(\n        ids: List<Note.Id>,\n        isGoneAfterRenotes: Boolean = true,\n        isReleaseUnUsedResource: Boolean = true,\n    ): List<PlaneNoteViewData> {\n        val notExistsIds: List<Note.Id>\n        lock.withLock {\n            notExistsIds = ids.filter {\n                cache[it] == null\n            }\n        }\n\n        val relations = noteRelationGetter.getIn(notExistsIds)\n\n        useIn(relations)\n\n        val notes = ids.mapNotNull {\n            cache[it]\n        }\n\n        if (isReleaseUnUsedResource) {\n            val idHash = ids.toSet()\n            lock.withLock {\n                val removedIds = cache.keys.filterNot {\n                    idHash.contains(it)\n                }\n\n                for (id in removedIds) {\n                    cache.remove(id)?.job?.cancel()\n                }\n            }\n        }\n\n\n        // NOTE: リノートが連続している場合は、そのコンテンツを省略するフラグを立てる処理\n        if (isGoneAfterRenotes) {\n            for (i in 0 until notes.size - 1) {\n                val current = notes[i]\n                val next = notes[i + 1]\n                current.isOnlyVisibleRenoteStatusMessage.value = (current.note.note.isRenoteOnly()\n                        && (\n                        current.note.note.renoteId == next.note.note.renoteId\n                                || current.note.note.renoteId == next.note.note.id))\n            }\n        }\n        return notes\n    }\n\n    suspend fun put(viewData: PlaneNoteViewData): PlaneNoteViewData {\n        return lock.withLock {\n            cache[viewData.note.note.id] = viewData\n            viewData\n        }\n    }\n\n    suspend fun clear() {\n        return lock.withLock {\n            releaseAll(cache.values.toList())\n            cache.clear()\n        }\n    }\n\n    private fun releaseAll(list: List<PlaneNoteViewData>) {\n        list.map { note ->\n            note.job?.cancel()\n        }\n    }\n\n    private suspend fun getUnThreadSafe(relation: NoteRelation): PlaneNoteViewData {\n        val note = cache[relation.note.id]\n\n        if (note == null) {\n            cache[relation.note.id] = createViewData(relation)\n        }\n        return cache[relation.note.id]!!\n    }\n\n    private suspend fun createViewData(relation: NoteRelation): PlaneNoteViewData {\n        val account = getAccount()\n        emojiRepository.findBy(account.getHost())\n        return if (relation.reply == null) {\n            PlaneNoteViewData(\n                relation,\n                account,\n                translationStore,\n                noteDataSource,\n                configRepository,\n                coroutineScope,\n            )\n        } else {\n            HasReplyToNoteViewData(\n                relation,\n                account,\n                translationStore,\n                noteDataSource,\n                configRepository,\n                coroutineScope\n            )\n        }.also {\n            it.captureNotes()\n            loadUrlPreview(it)\n            for (filter in _filters) {\n                when(val result = filter.check(it)) {\n                    PlaneNoteViewData.FilterResult.NotExecuted -> {\n                        it.filterResult = result\n                    }\n                    PlaneNoteViewData.FilterResult.ShouldFilterNote -> {\n                        it.filterResult = result\n                        break\n                    }\n                    PlaneNoteViewData.FilterResult.Pass -> {\n                        it.filterResult = result\n                    }\n                }\n            }\n        }\n    }\n\n    private suspend fun onDeleted(noteId: Note.Id) {\n        lock.withLock {\n            cache.values.filter {\n                it.toShowNote.note.id == noteId\n            }.map { note ->\n                note.job?.cancel()\n                cache.remove(note.id)\n            }\n        }\n    }\n\n    private fun PlaneNoteViewData.captureNotes() {\n        if (configRepository.get().getOrNull()?.isEnableStreamingAPIAndNoteCapture == false) {\n            return\n        }\n        val scope = coroutineScope + Dispatchers.IO\n        this.capture(noteCaptureAdapter) { flow ->\n            flow.onEach {\n                if (it is NoteDataSource.Event.Deleted) {\n                    onDeleted(it.noteId)\n                }\n            }.launchIn(scope)\n        }\n    }\n\n    private suspend fun loadUrlPreview(note: PlaneNoteViewData) {\n        val urls = when (val textNode = note.textNode) {\n            is net.pantasystem.milktea.common_android_ui.TextType.Misskey -> textNode.getUrls()\n            else -> null\n        } ?: return\n        if (urls.isEmpty()) return\n        net.pantasystem.milktea.model.url.UrlPreviewLoadTask(\n            getUrlPreviewStore.invoke(getAccount.invoke()),\n            urls,\n            coroutineScope + Dispatchers.IO,\n        ).load(note.urlPreviewLoadTaskCallback)\n    }\n\n    suspend fun suspendNoteCapture() {\n        lock.withLock {\n            cache.values.map {\n                it.job?.cancel()\n            }\n        }\n    }\n\n    suspend fun captureNotes() {\n        lock.withLock {\n            cache.values.filterNot {\n                it.job?.isActive == true\n            }.map {\n                it.captureNotes()\n            }\n        }\n    }\n\n    suspend fun captureNotesBy(ids: List<Note.Id>) {\n        lock.withLock {\n            cache.values.filterNot {\n                it.job?.isActive == true\n            }.filter {\n                ids.contains(it.id)\n            }.map {\n                it.captureNotes()\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "modules/features/note/src/main/java/net/pantasystem/milktea/note/viewmodel/Preview.kt",
    "content": "package net.pantasystem.milktea.note.viewmodel\n\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.url.UrlPreview\nimport java.io.Serializable\n\nsealed class Preview : Serializable {\n\n    data class UrlWrapper(\n        val urlPreview: UrlPreview\n    ) : Preview()\n\n    data class FileWrapper(\n        val file: FilePreviewSource\n    ) : Preview()\n}"
  },
  {
    "path": "modules/features/note/src/main/res/drawable/ic_baseline_timeline_24.xml",
    "content": "<!--suppress ALL -->\n<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M23,8c0,1.1 -0.9,2 -2,2c-0.18,0 -0.35,-0.02 -0.51,-0.07l-3.56,3.55C16.98,13.64 17,13.82 17,14c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2c0,-0.18 0.02,-0.36 0.07,-0.52l-2.55,-2.55C10.36,10.98 10.18,11 10,11s-0.36,-0.02 -0.52,-0.07l-4.55,4.56C4.98,15.65 5,15.82 5,16c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2s0.9,-2 2,-2c0.18,0 0.35,0.02 0.51,0.07l4.56,-4.55C8.02,9.36 8,9.18 8,9c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,0.18 -0.02,0.36 -0.07,0.52l2.55,2.55C14.64,12.02 14.82,12 15,12s0.36,0.02 0.52,0.07l3.55,-3.56C19.02,8.35 19,8.18 19,8c0,-1.1 0.9,-2 2,-2S23,6.9 23,8z\"/>\n</vector>\n"
  },
  {
    "path": "modules/features/note/src/main/res/drawable/shape_media_message_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n                    android:topRightRadius=\"4dp\"\n                    android:bottomRightRadius=\"4dp\"\n                    android:topLeftRadius=\"4dp\"\n                    android:bottomLeftRadius=\"4dp\"\n\n                    />\n            <solid\n                    android:color=\"#BF000000\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/activity_draft_notes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.note.DraftNotesActivity\">\n\n\n        <androidx.fragment.app.FragmentContainerView\n                android:id=\"@+id/draftNotesFragment\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:name=\"net.pantasystem.milktea.note.draft.DraftNotesFragment\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/activity_note_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.note.NoteDetailActivity\">\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/noteDetailToolbar\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"?attr/actionBarSize\"\n                android:theme=\"?attr/actionBarTheme\"\n                android:elevation=\"4dp\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:title=\"@string/conversation\"\n                android:transitionName=\"note\"/>\n\n        <FrameLayout\n                android:id=\"@+id/fragment_base\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                android:layout_marginStart=\"1dp\"\n                android:layout_marginTop=\"1dp\"\n                android:layout_marginEnd=\"1dp\"\n                android:layout_marginBottom=\"1dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintHorizontal_bias=\"1.0\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/noteDetailToolbar\"\n                app:layout_constraintVertical_bias=\"0.0\">\n\n        </FrameLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/dialog_custom_emoji_picker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        >\n\n    <FrameLayout\n            android:id=\"@+id/fragmentBaseContainer\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/dialog_reaction_history_pager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            android:background=\"?attr/colorSurface\"\n            >\n\n\n        <com.google.android.material.tabs.TabLayout\n                android:id=\"@+id/reaction_history_tab\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:tabMode=\"scrollable\"\n                app:tabTextColor=\"?attr/normalIconTint\"\n                android:layout_alignParentEnd=\"true\"\n                android:layout_alignParentTop=\"true\"\n                android:layout_alignParentStart=\"true\"\n\n                >\n\n\n        </com.google.android.material.tabs.TabLayout>\n\n\n        <net.pantasystem.milktea.common_android.ui.BottomSheetViewPager\n                android:id=\"@+id/reaction_history_pager\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_below=\"@id/reaction_history_tab\"/>\n\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/dialog_reaction_picker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <LinearLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n            android:padding=\"16dp\"\n            android:orientation=\"vertical\"\n            android:background=\"?attr/colorSurface\">\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/reactionsView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"/>\n\n        <AutoCompleteTextView\n                android:id=\"@+id/reactionField\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:hint=\"@string/input_custom_emoji\"\n                android:focusable=\"true\"\n                android:focusableInTouchMode=\"true\"\n                android:singleLine=\"true\"\n                android:imeOptions=\"actionSend\"\n                />\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/dialog_remote_reaction_emoji_suggestion.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"16dp\"\n            android:orientation=\"vertical\"\n            android:gravity=\"center\">\n\n        <TextView\n                android:id=\"@+id/titleView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/suggested_emojis\"\n                android:textSize=\"@dimen/dialog_title_font_size\"\n                android:textColor=\"?android:attr/textColorPrimary\"\n                android:layout_marginBottom=\"8dp\"\n                />\n        <androidx.recyclerview.widget.RecyclerView\n                android:layout_marginTop=\"16dp\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/suggestedEmojis\"\n                />\n\n        <ProgressBar\n                android:id=\"@+id/progressBar\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"/>\n        <TextView\n                android:id=\"@+id/errorMessage\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/dialog_select_reaction.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        >\n\n    <FrameLayout\n            android:id=\"@+id/fragmentBaseContainer\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/dialog_time_machine.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <data>\n        <variable\n                name=\"viewModel\"\n                type=\"net.pantasystem.milktea.note.timeline.viewmodel.TimeMachineDialogViewModel\" />\n    </data>\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"horizontal\"\n            android:paddingStart=\"16dp\"\n            android:paddingEnd=\"16dp\"\n            >\n        <Button\n                android:id=\"@+id/pickDate\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:layout_marginEnd=\"4dp\"\n                dateOnly=\"@{viewModel.currentDate}\"\n\n                />\n        <Button\n                android:id=\"@+id/pickTime\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:layout_marginStart=\"4dp\"\n                timeOnly=\"@{viewModel.currentDate}\"\n\n                />\n    </LinearLayout>\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/fragment_emoji_picker.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <data>\n        <variable\n                name=\"emojiPickerViewModel\"\n                type=\"net.pantasystem.milktea.note.emojis.viewmodel.EmojiPickerViewModel\" />\n        <import type=\"android.view.View\" />\n    </data>\n    <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            >\n\n        <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/searchReactionInputLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"8dp\"\n                android:layout_marginEnd=\"8dp\"\n                android:layout_marginTop=\"8dp\"\n                style=\"?textInputOutlinedStyle\"\n\n                >\n\n            <com.google.android.material.textfield.TextInputEditText\n                    android:text=\"@={emojiPickerViewModel.searchWord}\"\n                    android:textSize=\"12sp\"\n                    android:id=\"@+id/searchReactionEditText\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/search_custom_emojis\"\n                    android:maxLines=\"1\"\n                    android:singleLine=\"true\"\n                    android:imeOptions=\"actionSend\" />\n        </com.google.android.material.textfield.TextInputLayout>\n        <com.google.android.material.tabs.TabLayout\n                android:id=\"@+id/reaction_choices_tab\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:tabMode=\"scrollable\"\n                android:elevation=\"0dp\"\n                android:visibility=\"@{ emojiPickerViewModel.uiState.isSearchMode ? View.GONE : View.VISIBLE }\"\n                android:layout_below=\"@id/searchReactionInputLayout\"\n                >\n\n\n        </com.google.android.material.tabs.TabLayout>\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/reaction_choices_view_pager\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_below=\"@id/reaction_choices_tab\"\n                android:visibility=\"visible\"\n                />\n\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/fragment_note_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n        <androidx.core.widget.NestedScrollView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\">\n                <Button\n                        android:id=\"@+id/showInBrowser\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/view_in_browser\"\n                        style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                        />\n                <androidx.recyclerview.widget.RecyclerView\n                        android:id=\"@+id/notes_view\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toTopOf=\"parent\" />\n            </LinearLayout>\n        </androidx.core.widget.NestedScrollView>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/fragment_note_detail_pager.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <androidx.viewpager2.widget.ViewPager2 xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:id=\"@+id/viewPager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n\n</layout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/fragment_pinned_notes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/list_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:clipToPadding=\"false\"\n            android:paddingBottom=\"?attr/actionBarSize\"\n            android:nestedScrollingEnabled=\"true\"\n            />\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/fragment_reaction_history_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <androidx.recyclerview.widget.RecyclerView\n            android:id=\"@+id/historiesView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            />\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/fragment_simple_editor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <data>\n\n        <variable\n                name=\"noteEditorViewModel\"\n                type=\"net.pantasystem.milktea.note.editor.viewmodel.NoteEditorViewModel\" />\n\n        <import type=\"android.view.View\" />\n\n        <variable\n                name=\"accountViewModel\"\n                type=\"net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\" />\n\n        <variable\n                name=\"simpleEditor\"\n                type=\"net.pantasystem.milktea.note.editor.SimpleEditor\" />\n\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n    </data>\n\n    <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?colorSurface\"\n            android:orientation=\"vertical\"\n            android:paddingStart=\"8dp\"\n            android:paddingEnd=\"8dp\"\n            android:paddingBottom=\"8dp\">\n\n        <ProgressBar\n                android:id=\"@+id/progressBar2\"\n                style=\"?android:attr/progressBarStyleHorizontal\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:max=\"@{noteEditorViewModel.maxTextLength}\"\n                android:progress=\"@{noteEditorViewModel.maxTextLength - noteEditorViewModel.textRemaining}\" />\n\n        <androidx.compose.ui.platform.ComposeView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/filePreview\" />\n\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/addressUsersView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:visibility=\"@{SafeUnbox.unboxBool(noteEditorViewModel.isSpecified()) &amp;&amp; SafeUnbox.unbox(simpleEditor.isShowEditorMenu) ? View.VISIBLE : View.GONE}\"\n\n                tools:layout_height=\"50dp\" />\n\n        <Button\n                android:id=\"@+id/addAddress\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:drawableStart=\"@drawable/ic_add_black_24dp\"\n                android:text=\"@string/add_address\"\n                android:visibility=\"@{SafeUnbox.unboxBool(noteEditorViewModel.isSpecified()) &amp;&amp; SafeUnbox.unbox(simpleEditor.isShowEditorMenu) ? View.VISIBLE : View.GONE}\" />\n\n\n        <MultiAutoCompleteTextView\n                android:id=\"@+id/inputCw\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n\n                android:hint=\"@string/cw_hint\"\n                android:inputType=\"textMultiLine\"\n                android:text=\"@{noteEditorViewModel.cw}\"\n                android:visibility=\"@{ SafeUnbox.unbox(simpleEditor.isShowEditorMenu) &amp;&amp; SafeUnbox.unboxBool(noteEditorViewModel.hasCw) ? View.VISIBLE : View.GONE}\" />\n\n        <LinearLayout\n                android:id=\"@+id/noteEditorUserActionMenu\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                android:orientation=\"horizontal\"\n                android:visibility=\"@{ SafeUnbox.unbox(simpleEditor.isShowEditorMenu) ? View.VISIBLE : View.GONE}\">\n\n            <ImageButton\n                    android:id=\"@+id/currentAccountAvatarIcon\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"4dp\"\n                    android:onClick=\"@{ ()-> accountViewModel.showSwitchDialog() }\"\n                    android:padding=\"12dp\"\n                    app:circleIcon=\"@{noteEditorViewModel.user.avatarUrl}\"\n\n                    tools:ignore=\"ContentDescription\"\n                     />\n\n            <ImageButton\n                    android:id=\"@+id/selectFileFromLocal\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"4dp\"\n                    android:layout_weight=\"1\"\n                    android:adjustViewBounds=\"true\"\n                    app:srcCompat=\"@drawable/ic_menu_gallery\"\n                    tools:ignore=\"ContentDescription\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <ImageButton\n                    android:id=\"@+id/selectFileFromDrive\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"4dp\"\n                    android:layout_weight=\"1\"\n                    android:adjustViewBounds=\"true\"\n                    app:srcCompat=\"@drawable/ic_cloud_black_24dp\"\n                    tools:ignore=\"ContentDescription\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n\n            <ImageButton\n                    android:id=\"@+id/setCw\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"4dp\"\n                    android:layout_weight=\"1\"\n                    android:adjustViewBounds=\"true\"\n                    android:onClick=\"@{()-> noteEditorViewModel.changeCwEnabled() }\"\n                    android:scaleType=\"fitCenter\"\n                    app:srcCompat=\"@drawable/ic_visibility_off_black_24dp\"\n                    tools:ignore=\"ContentDescription\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <ImageButton\n                    android:id=\"@+id/mentionButton\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"4dp\"\n                    android:layout_weight=\"1\"\n                    android:adjustViewBounds=\"true\"\n                    android:padding=\"12dp\"\n                    android:scaleType=\"fitCenter\"\n                    app:srcCompat=\"@drawable/ic_mention\"\n                    tools:ignore=\"ContentDescription\"\n\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <ImageButton\n                    android:id=\"@+id/showEmojisButton\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"4dp\"\n                    android:layout_weight=\"1\"\n                    android:adjustViewBounds=\"true\"\n                    android:scaleType=\"fitCenter\"\n                    app:srcCompat=\"@drawable/ic_insert_emoticon_black_24dp\"\n                    tools:ignore=\"ContentDescription\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <ImageButton\n                    android:id=\"@+id/noteVisibility\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_margin=\"4dp\"\n                    android:layout_weight=\"1\"\n                    android:adjustViewBounds=\"true\"\n                    app:noteVisibility=\"@{noteEditorViewModel.uiState.sendToState.visibility}\"\n                    tools:ignore=\"ContentDescription\"\n                    tools:src=\"@drawable/ic_language_black_24dp\"\n\n\n                    app:tint=\"?attr/normalIconTint\" />\n\n\n        </LinearLayout>\n\n        <FrameLayout\n                android:id=\"@+id/edit_poll\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\">\n\n            <ImageButton\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_gravity=\"center_vertical\"\n                    android:onClick=\"@{ ()-> simpleEditor.openMenu() }\"\n                    android:src=\"@drawable/ic_expand_less_black_24dp\"\n                    android:visibility=\"@{ SafeUnbox.unbox(simpleEditor.isShowEditorMenu) ? View.GONE : View.VISIBLE }\"\n                    tools:ignore=\"ContentDescription\"\n                    tools:visibility=\"gone\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <MultiAutoCompleteTextView\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"wrap_content\"\n                    android:id=\"@+id/inputMainText\"\n                    android:layout_weight=\"1\"\n                    android:hint=\"@string/please_speak\"\n                    android:inputType=\"textMultiLine\"\n                    android:text=\"@{noteEditorViewModel.text}\" />\n\n            <ImageButton\n                    android:id=\"@+id/postButton\"\n                    style=\"@style/Widget.AppCompat.Button.Borderless\"\n                    android:layout_width=\"40dp\"\n                    android:layout_height=\"40dp\"\n                    android:layout_gravity=\"center_vertical\"\n                    android:src=\"@drawable/ic_menu_send\"\n                    tools:ignore=\"ContentDescription\"\n                    app:tint=\"?attr/normalIconTint\" />\n        </LinearLayout>\n\n\n    </LinearLayout>\n</layout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/fragment_timeline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n            android:id=\"@+id/refresh\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            >\n\n            <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/list_view\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:clipToPadding=\"false\"\n                android:paddingBottom=\"?attr/actionBarSize\"\n                android:nestedScrollingEnabled=\"true\"\n                />\n        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n\n        <TextView\n            android:id=\"@+id/jumpToNewPostsButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"8dp\"\n            android:text=\"@string/jump_to_new_post\"\n            android:background=\"?attr/colorPrimary\"\n            android:textColor=\"?attr/colorOnPrimary\"\n            android:paddingVertical=\"8dp\"\n            android:paddingHorizontal=\"16dp\"\n            rectByDp=\"@{8}\"\n            android:elevation=\"4dp\"\n            android:clickable=\"true\"\n            android:focusable=\"true\"\n            android:visibility=\"gone\"\n            tools:visibility=\"visible\"\n            android:layout_gravity=\"center_horizontal\"\n            />\n    </FrameLayout>\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_category_with_list.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:orientation=\"vertical\">\n        <TextView\n                android:id=\"@+id/categoryName\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"aaaaaaaa\"\n                android:paddingHorizontal=\"16dp\"\n                android:paddingVertical=\"8dp\"/>\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/emojisView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingHorizontal=\"8dp\" />\n\n    </LinearLayout>\n</layout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_choice.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginBottom=\"4dp\"\n    >\n\n    <RadioButton\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        tools:text=\"候補１\"\n        android:textColor=\"?android:attr/textColorPrimary\"\n        android:layout_marginBottom=\"4dp\"\n        android:id=\"@+id/radioChoice\"\n        />\n\n    <ProgressBar\n        android:id=\"@+id/progressBar\"\n        style=\"?android:attr/progressBarStyleHorizontal\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        tools:max=\"200\"\n        tools:progress=\"50\"\n        android:layout_gravity=\"bottom\"\n        />\n\n\n</FrameLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_conversation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <import type=\"android.view.View\"/>\n        <variable\n                name=\"childrenViewData\"\n                type=\"net.pantasystem.milktea.note.detail.viewmodel.NoteConversationViewData\" />\n        <variable\n                name=\"noteDetailViewModel\"\n                type=\"net.pantasystem.milktea.note.detail.viewmodel.NoteDetailViewModel\" />\n        <variable\n                name=\"noteCardActionListener\"\n                type=\"net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\" />\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n    </data>\n    <androidx.cardview.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:layout_marginEnd=\"5dp\"\n            app:cardUseCompatPadding=\"false\"\n            app:cardCornerRadius=\"0dp\"\n            android:layout_marginTop=\"0.5dp\"\n            android:elevation=\"0dp\"\n            app:cardBackgroundColor=\"?attr/colorSurface\"\n\n            >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\">\n            <FrameLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    tools:layout_height=\"100dp\"\n                    >\n                <include\n                        android:id=\"@+id/childNote\"\n                        layout=\"@layout/item_simple_note\"\n                        app:note=\"@{childrenViewData}\"\n                        app:noteCardActionListener=\"@{noteCardActionListener}\"\n                        />\n\n            </FrameLayout>\n\n            <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/conversation_view\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\">\n\n            </androidx.recyclerview.widget.RecyclerView>\n\n\n            <TextView\n                    android:id=\"@+id/show_reply\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:padding=\"4dp\"\n                    android:layout_margin=\"4dp\"\n                    android:textColor=\"?attr/colorAccent\"\n                    android:text=\"@string/show_reply\"\n                    android:visibility=\"@{SafeUnbox.unboxBool(childrenViewData.hasConversation) ? View.GONE : View.VISIBLE}\"\n                    android:onClick=\"@{()-> noteCardActionListener.onNoteCardClicked(childrenViewData.toShowNote.note)}\"\n                    />\n\n        </LinearLayout>\n    </androidx.cardview.widget.CardView>\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_detail_note.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <data>\n\n        <variable\n                name=\"note\"\n                type=\"net.pantasystem.milktea.note.detail.viewmodel.NoteDetailViewData\" />\n\n        <import type=\"android.view.View\" />\n\n\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n\n\n        <import type=\"net.pantasystem.milktea.note.R\" />\n\n\n        <variable\n                name=\"noteCardActionListener\"\n                type=\"net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\" />\n    </data>\n\n    <androidx.cardview.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"5dp\"\n            android:layout_marginEnd=\"5dp\"\n            app:cardUseCompatPadding=\"false\"\n            app:cardCornerRadius=\"0dp\"\n            android:elevation=\"0dp\"\n            app:cardBackgroundColor=\"?attr/colorSurface\"\n\n            >\n\n        <RelativeLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingHorizontal=\"@dimen/note_horizontal_padding_size\"\n                android:paddingTop=\"@dimen/note_top_padding_size\"\n\n                android:paddingBottom=\"5dp\"\n                app:mainNameView=\"@{mainName}\"\n                app:subNameView=\"@{subName}\"\n                app:user=\"@{note.toShowNote.user}\"\n                app:account=\"@{note.account}\"\n\n                app:foldingNote=\"@{note}\"\n                app:foldingButton=\"@{contentFoldingButton}\"\n                app:cw=\"@{cw}\"\n                app:foldingContent=\"@{contentMain}\"\n                app:isFolding=\"@{note.contentFolding}\">\n\n            <TextView\n                    android:id=\"@+id/statusView\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"8dp\"\n                    statusMessageTargetViewNote=\"@{note}\"\n                     tools:text=\"パン太さんができました\" />\n\n            <net.pantasystem.milktea.common.ui.AvatarIconView\n                    android:id=\"@+id/avatarIcon\"\n                    android:layout_width=\"@dimen/note_avatar_icon_size\"\n                    android:layout_height=\"@dimen/note_avatar_icon_size\"\n                    android:layout_below=\"@id/statusView\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:contentDescription=\"@string/avataricon\"\n                    app:imageUrl='@{note.avatarUrl}'\n                    app:blurhash=\"@{note.toShowNote.user.avatarBlurhash}\"\n                    app:iconShape=\"@{note.config.avatarIconShapeType.value}\"\n                    app:transitionDestinationUser=\"@{note.toShowNote.user}\"\n                    tools:srcCompat=\"@android:drawable/sym_def_app_icon\"\n                    android:scaleType=\"centerCrop\"\n                    />\n\n            <TextView\n                    android:id=\"@+id/mainName\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/statusView\"\n                    android:layout_marginEnd=\"8dp\"\n                    android:layout_toEndOf=\"@id/avatarIcon\"\n                    android:textSize=\"@dimen/note_author_info_text_size\"\n                    android:textStyle=\"bold\" />\n\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/statusView\"\n                    android:layout_alignParentEnd=\"true\"\n                    android:layout_toEndOf=\"@id/mainName\"\n                    android:gravity=\"end\"\n                    android:textSize=\"@dimen/note_author_info_text_size\"\n                    tools:text=\"36秒前\" />\n\n            <TextView\n                    android:id=\"@+id/subName\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/mainName\"\n                    android:layout_toEndOf=\"@id/avatarIcon\"\n                    android:ellipsize=\"end\"\n                    android:singleLine=\"true\"\n                    android:textSize=\"@dimen/note_author_info_text_size\"\n                    android:textStyle=\"italic\"\n\n                    />\n\n            <TextView\n                    android:id=\"@+id/instanceInfoLabel\"\n                    tools:text=\"Misskey.io\"\n                    android:textSize=\"@dimen/note_instance_info_text_size\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    tools:background=\"#8BC34A\"\n                    rectViewById=\"@{4}\"\n                    android:gravity=\"center_vertical\"\n                    android:padding=\"2dp\"\n                    instanceInfo=\"@{note.toShowNote.user.instance}\"\n                    isEnable=\"@{note.config.isEnableInstanceTicker}\"\n                    android:layout_below=\"@id/avatarIcon\"\n                    android:layout_marginTop=\"4dp\"\n                    />\n            <TextView\n                    android:id=\"@+id/cw\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/instanceInfoLabel\"\n                    app:textNode=\"@{note.cwNode}\"\n                    tools:text=\"cwcwcwwcwcw\"\n                    android:textSize=\"@dimen/note_content_text_size\" />\n\n\n            <TextView\n                    android:id=\"@+id/contentFoldingButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@+id/cw\"\n\n                    android:layout_marginStart=\"5dp\"\n                    android:layout_marginBottom=\"5dp\"\n                    onClickAndPerformHapticFeedback=\"@{()-> note.changeContentFolding() }\"\n                    stringSource=\"@{note.contentFoldingStatusMessage}\"\n                    android:textColor=\"?attr/colorAccent\"\n                    android:visibility='@{note.cw == null ? View.GONE : View.VISIBLE }'\n                    tools:text=\"展開する\" />\n\n            <RelativeLayout\n                    android:id=\"@+id/contentMain\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@+id/contentFoldingButton\"\n                    android:visibility=\"@{SafeUnbox.unboxBool(note.contentFolding) ? View.GONE : View.VISIBLE }\"\n                    android:layout_marginBottom=\"8dp\">\n\n                <TextView\n                        android:id=\"@id/text\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:textSize=\"@dimen/note_content_text_size\"\n                        android:visibility='@{note.text == null ? View.GONE : View.VISIBLE}'\n                        textTypeSource=\"@{note.textNode}\"\n                        customEmojiScale=\"@{note.config.noteCustomEmojiScaleSizeInText}\"\n                        tools:text=\"aoiwefjowiaejiowajefihawoefoiawehfioawheoifawoiefioawejfowaoeifjawoiejfoaw\" />\n\n                <include\n                        android:layout_below=\"@id/text\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:id=\"@+id/translationView\"\n                        layout=\"@layout/view_translation\"\n                        android:layout_marginTop=\"8dp\"\n\n                        app:emojis=\"@{note.toShowNote.note.emojis}\"\n                        app:translationState=\"@{note.translateState}\"\n                        android:layout_marginBottom=\"8dp\" />\n\n                <net.pantasystem.milktea.common_android.ui.MediaLayout\n                    android:id=\"@+id/mediaPreview\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    android:layout_below=\"@id/translationView\"\n                    android:visibility=\"@{note.media.visibleMediaPreviewArea ? View.VISIBLE : View.GONE}\"\n                    mediaViewData=\"@{note.media}\"\n                    previewAbleList=\"@{note.media.files}\"\n                    noteCardActionListenerAdapter=\"@{noteCardActionListener}\"\n                    tools:visibility=\"gone\"\n                    rect=\"@{30f}\"\n                    android:layout_marginTop=\"@dimen/note_media_preview_top_margin_size\"\n                    />\n\n                <LinearLayout\n                        android:id=\"@+id/poll\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_below=\"@id/mediaPreview\"\n                        android:visibility=\"@{note.currentNote.poll == null ? View.GONE : View.VISIBLE}\"\n                        tools:itemCount=\"2\"\n                        tools:listitem=\"@layout/item_choice\"\n                        noteId=\"@{note.toShowNote.note.id}\"\n                        poll=\"@{note.currentNote.poll}\"\n                        noteCardActionListenerAdapter=\"@{noteCardActionListener}\"\n                        android:orientation=\"vertical\"\n\n                        />\n\n                <LinearLayout\n                        android:id=\"@+id/url_preview_list\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_below=\"@id/poll\"\n                        tools:itemCount=\"1\"\n                        tools:listitem=\"@layout/item_url_preview\"\n                        previewList=\"@{note.previews}\"\n                        android:orientation=\"vertical\"\n                        />\n\n\n                <RelativeLayout\n                        android:id=\"@+id/subNote\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_below=\"@+id/url_preview_list\"\n                        android:layout_marginTop=\"3dp\"\n                        android:background=\"@drawable/shape_rounded_square_line\"\n                        onClickAndPerformHapticFeedback=\"@{()-> noteCardActionListener.onNoteCardClicked(note.subNote.note)}\"\n                        android:padding=\"8dp\"\n                        android:visibility='@{note.subNote != null ? View.VISIBLE : View.GONE}'\n                        app:mainNameView=\"@{subNoteMainName}\"\n                        app:subNameView=\"@{subNoteSubName}\"\n                        app:user=\"@{note.subNote.user}\"\n                        app:account=\"@{note.account}\">\n\n                    <net.pantasystem.milktea.common.ui.AvatarIconView\n                            android:id=\"@+id/subAvatarIcon\"\n                            android:layout_width=\"20dp\"\n                            android:layout_height=\"20dp\"\n                            android:layout_marginEnd=\"5dp\"\n                            android:contentDescription=\"@string/avataricon\"\n                            imageUrl='@{note.subNoteAvatarUrl}'\n                            app:iconShape=\"@{note.config.avatarIconShapeType.value}\"\n                            app:transitionDestinationUser=\"@{note.subNote.user}\"\n                            android:scaleType=\"centerCrop\"\n                            />\n\n                    <TextView\n                            android:id=\"@+id/subNoteMainName\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginEnd=\"8dp\"\n                            android:layout_toEndOf=\"@+id/subAvatarIcon\"\n                            android:textSize=\"@dimen/note_author_info_text_size\"\n\n                            android:textStyle=\"bold\" />\n\n                    <TextView\n                            android:id=\"@+id/subNoteSubName\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_toEndOf=\"@id/subNoteMainName\"\n                            android:singleLine=\"true\"\n                            android:textSize=\"@dimen/note_author_info_text_size\"\n                            android:textStyle=\"italic\"\n\n                            />\n\n                    <TextView\n                            android:id=\"@+id/subCw\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_below=\"@+id/subNoteMainName\"\n                            android:visibility='@{note.cw == null ? View.GONE : View.VISIBLE}'\n                            app:textNode=\"@{note.subCwNode}\"\n                            tools:text=\"cwcwcwwcwcw\"\n                            android:textSize=\"@dimen/note_content_text_size\" />\n\n\n                    <TextView\n                            android:id=\"@+id/subContentFoldingButton\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_below=\"@+id/subCw\"\n                            android:layout_marginStart=\"5dp\"\n                            android:layout_marginBottom=\"5dp\"\n                            onClickAndPerformHapticFeedback=\"@{()-> note.changeSubContentFolding() }\"\n                            stringSource=\"@{note.subContentFoldingStatusMessage}\"\n                            android:textColor=\"?attr/colorAccent\"\n                            android:visibility='@{note.subCw == null ? View.GONE : View.VISIBLE }'\n                            tools:text=\"展開する\"\n\n                            />\n\n                    <TextView\n                            android:id=\"@+id/subNoteText\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_below=\"@+id/subContentFoldingButton\"\n                            android:textSize=\"@dimen/note_content_text_size\"\n                            android:visibility=\"@{SafeUnbox.unboxBool(note.subContentFolding) ? View.GONE : View.VISIBLE }\"\n                            textTypeSource=\"@{note.subNoteTextNode}\"\n                            customEmojiScale=\"@{note.config.noteCustomEmojiScaleSizeInText}\"\n                            tools:text=\"aowjfoiwajehofijawioefjioawejfiowajeiofhawoifahwoiefwaioe\" />\n\n                    <net.pantasystem.milktea.common_android.ui.MediaLayout\n                            android:id=\"@+id/subNoteMediaPreview\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"250dp\"\n                            android:layout_below=\"@id/subNoteText\"\n                            android:visibility=\"@{note.subNoteFiles.empty ? View.GONE : View.VISIBLE}\"\n                            mediaViewData=\"@{note.subNoteMedia}\"\n                            previewAbleList=\"@{note.subNoteMedia.files}\"\n                            noteCardActionListenerAdapter=\"@{noteCardActionListener}\"\n                            rect=\"@{20f}\"\n                            tools:layout_height=\"50dp\" />\n\n\n                </RelativeLayout>\n            </RelativeLayout>\n\n            <ImageView\n                    android:id=\"@+id/visibility\"\n                    android:layout_width=\"20dp\"\n                    android:layout_height=\"20dp\"\n                    app:noteVisibility=\"@{ note.toShowNote.note.visibility}\"\n                    tools:src=\"@drawable/ic_follow\"\n                    android:layout_below=\"@id/contentMain\"\n                    android:layout_marginEnd=\"4dp\"\n                    tools:ignore=\"ContentDescription\"\n                    app:tint=\"?attr/normalIconTint\" />\n\n            <TextView\n                    android:id=\"@+id/elapsed_time\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    createdAt=\"@{note.toShowNote.note.createdAt}\"\n                    android:layout_below=\"@id/contentMain\"\n                    tools:text=\"10秒前\"\n                    android:singleLine=\"true\"\n                    android:ellipsize=\"end\"\n                    android:layout_toEndOf=\"@id/visibility\"\n                    android:layout_alignBaseline=\"@id/visibility\"\n\n                    />\n\n            <com.google.android.flexbox.FlexboxLayout\n                    android:id=\"@+id/reaction_view\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@id/elapsed_time\"\n                    android:layout_marginTop=\"4dp\"\n                    tools:layout_height=\"50dp\"\n                    tools:visibility=\"visible\"\n                    app:flexWrap=\"wrap\"\n\n                    />\n\n            <LinearLayout\n                    android:id=\"@+id/noteActionButtonBaseLayout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_below=\"@+id/reaction_view\"\n                    android:layout_marginTop=\"8dp\"\n                    android:orientation=\"horizontal\">\n\n                <ImageButton\n                        android:id=\"@+id/replyButton\"\n                        style=\"?android:attr/borderlessButtonStyle\"\n                        android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n                        android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n                        android:contentDescription=\"@string/reply_title\"\n                        onClickAndPerformHapticFeedback=\"@{ ()-> noteCardActionListener.onReplyButtonClicked(note) }\"\n                        android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n                        android:scaleType=\"centerCrop\"\n                        app:srcCompat=\"@drawable/ic_reply_black_24dp\"\n                        app:tint=\"?attr/normalIconTint\" />\n\n                <TextView\n                        android:id=\"@+id/replyCountView\"\n                        android:layout_width=\"50dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:layout_weight=\"1\"\n                        android:singleLine=\"true\"\n                        android:text='@{String.valueOf(SafeUnbox.unbox(note.replyCount))}'\n                        android:visibility='@{note.replyCount == 0 ? View.INVISIBLE : View.VISIBLE}'\n                        android:textSize=\"@dimen/note_counter_text_size\" />\n\n                <ImageButton\n                        android:id=\"@+id/renoteButton\"\n                        style=\"?android:attr/borderlessButtonStyle\"\n                        android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n                        android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n                        android:contentDescription=\"@string/renote\"\n                        onClickAndPerformHapticFeedback=\"@{ ()-> noteCardActionListener.onRenoteButtonClicked(note)}\"\n                        android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n                        android:scaleType=\"centerCrop\"\n                        app:srcCompat=\"@drawable/ic_re_note\"\n                        renoteButtonColor=\"@{note.currentNote}\"\n                        android:visibility=\"@{ note.canRenote ? View.VISIBLE : View.GONE }\"\n                        app:tint=\"?attr/normalIconTint\" />\n\n                <TextView\n                        android:id=\"@+id/renoteCountView\"\n                        android:layout_width=\"50dp\"\n\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:layout_weight=\"1\"\n                        android:singleLine=\"true\"\n                        android:text='@{String.valueOf(SafeUnbox.unbox(note.currentNote.renoteCount))}'\n                        android:visibility='@{note.currentNote.renoteCount == 0 ? View.INVISIBLE : View.VISIBLE}'\n                        android:textSize=\"@dimen/note_counter_text_size\"\n                        />\n                <ImageButton\n                        android:id=\"@+id/toggleMastodonFavouriteButton\"\n                        android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n                        android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n                        tools:srcCompat=\"@drawable/ic_star_black_24dp\"\n                        android:src=\"@drawable/ic_star_black_24dp\"\n                        style=\"?android:attr/borderlessButtonStyle\"\n                        android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n                        android:scaleType=\"centerCrop\"\n                        android:contentDescription=\"@string/reaction\"\n                        app:tint=\"?attr/normalIconTint\"\n                        favoriteButtonIcon=\"@{note.currentNote}\"\n\n                        tools:ignore=\"TouchTargetSizeCheck\"\n                        onClickAndPerformHapticFeedback=\"@{ () -> noteCardActionListener.onFavoriteButtonClicked(note.currentNote) }\"\n                        />\n                <TextView\n                        android:id=\"@+id/mastodonFavoriteCountView\"\n                        android:text='@{String.valueOf(SafeUnbox.unbox(note.favoriteCount))}'\n                        android:visibility='@{note.currentNote.mastodon ? (note.favoriteCount == null || note.favoriteCount == 0 ? View.INVISIBLE : View.VISIBLE ) : View.GONE }'\n\n                        android:layout_width=\"50dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_weight=\"1\"\n                        android:layout_gravity=\"center_vertical\"\n                        android:maxLines=\"1\"\n\n                        tools:text=\"10\"\n                        app:emojiCompatEnabled=\"false\"\n                        android:textSize=\"@dimen/note_counter_text_size\"\n                        />\n\n\n                <ImageButton\n                        android:id=\"@+id/toggleReactionButton\"\n                        style=\"?android:attr/borderlessButtonStyle\"\n                        android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n                        android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n                        android:contentDescription=\"@string/reaction\"\n                        onClickAndPerformHapticFeedback=\"@{ ()-> noteCardActionListener.onReactionButtonClicked(note) }\"\n                        android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n                        android:scaleType=\"centerCrop\"\n                        app:isReacted=\"@{!note.currentNote.canReaction}\"\n                        isAcceptingOnlyFavoriteReaction=\"@{note.currentNote.acceptingOnlyLikeReaction}\"\n                        tools:srcCompat=\"@drawable/ic_add_circle_outline_black_24dp\"\n                        android:visibility=\"@{note.currentNote.supportEmojiReaction ? View.VISIBLE : View.GONE }\"\n                        app:tint=\"?attr/normalIconTint\" />\n\n                <TextView\n                        android:layout_width=\"50dp\"\n\n                        android:layout_height=\"wrap_content\"\n\n                        android:layout_gravity=\"center_vertical\"\n                        android:layout_weight=\"1\"\n                        android:text='@{String.valueOf(SafeUnbox.unboxInt(note.currentNote.reactionsCount))}'\n                        android:visibility=\"@{note.currentNote.supportEmojiReaction ? SafeUnbox.unboxInt(note.currentNote.reactionsCount) == 0 ? View.INVISIBLE : View.VISIBLE : View.GONE }\"\n                        android:textSize=\"@dimen/note_counter_text_size\"\n                        />\n\n                <ImageButton\n                        android:id=\"@+id/noteOptionButton\"\n                        style=\"?android:attr/borderlessButtonStyle\"\n                        android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n                        android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n                        android:contentDescription=\"@string/more\"\n                        onClickAndPerformHapticFeedback=\"@{() -> noteCardActionListener.onOptionButtonClicked(note)}\"\n                        android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n                        android:scaleType=\"centerCrop\"\n                        app:srcCompat=\"@drawable/ic_more_horiz_black_24dp\"\n                        app:tint=\"?attr/normalIconTint\" />\n            </LinearLayout>\n            <View\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/note_divider_height\"\n                    android:background=\"?android:attr/listDivider\"\n                    android:layout_below=\"@id/noteActionButtonBaseLayout\"\n                    android:visibility=\"@{ note.config.isEnableNoteDivider ? View.VISIBLE : View.GONE}\" />\n        </RelativeLayout>\n    </androidx.cardview.widget.CardView>\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_emoji_choice.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <FrameLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"4dp\"\n            android:layout_margin=\"8dp\"\n            android:background=\"?attr/selectableItemBackgroundBorderless\"\n            android:theme=\"@style/EmojiPickerLayoutStyle\"\n            >\n        <ImageView\n                android:id=\"@+id/reactionImagePreview\"\n                android:layout_width=\"20dp\"\n                android:layout_height=\"20dp\"\n                android:layout_gravity=\"center\"\n                tools:visibility=\"gone\"\n                tools:ignore=\"ContentDescription\" />\n        <TextView\n                android:id=\"@+id/reactionStringPreview\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"match_parent\"\n                tools:text=\"😇\"\n                tools:visibility=\"visible\"\n                android:gravity=\"center\"\n                android:textSize=\"20sp\"\n                android:textColor=\"?android:textColorPrimary\"\n                />\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_emoji_list_item_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n    <TextView android:id=\"@+id/categoryName\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"aaaaaaaa\"\n        android:paddingHorizontal=\"16dp\"\n        android:paddingVertical=\"8dp\"\n        />\n</LinearLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_file_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<net.pantasystem.milktea.note.url.OtherFileView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/filePropertyView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\" />"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_has_reply_to_note.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <import type=\"android.view.View\"/>\n        <import type=\"net.pantasystem.milktea.note.R\"/>\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\"/>\n        <variable name=\"hasReplyToNote\" type=\"net.pantasystem.milktea.note.viewmodel.HasReplyToNoteViewData\"/>\n        <variable\n                name=\"noteCardActionListener\"\n                type=\"net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\" />\n    </data>\n\n    <androidx.cardview.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardUseCompatPadding=\"false\"\n            app:cardCornerRadius=\"0dp\"\n            android:elevation=\"0dp\"\n            app:setCardViewSurfaceColor=\"@{null}\"\n\n            >\n        <LinearLayout\n                android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n            <net.pantasystem.milktea.common_android.ui.AutoCollapsingLayout\n                    android:id=\"@+id/replyAutoCollapsingLayout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    targetButton=\"@{replyAutoExpandableButton}\"\n                    onExpandedChanged=\"@{hasReplyToNote::expandReplyNote}\"\n                    overflowExpanded=\"@{hasReplyToNote.replyExpanded}\"\n                    app:expandableButton=\"@id/replyAutoExpandableButton\"\n\n                    >\n\n                <RelativeLayout\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:paddingHorizontal=\"@dimen/note_horizontal_padding_size\"\n                        android:paddingTop=\"@dimen/note_top_padding_size\"\n                        android:paddingBottom=\"5dp\"\n\n                        app:mainNameView=\"@{replyToUserName}\"\n                        app:subNameView=\"@{replyToName}\"\n                        app:user=\"@{hasReplyToNote.replyTo.toShowNote.user}\"\n                        app:account=\"@{hasReplyToNote.account}\"\n                        >\n                    <net.pantasystem.milktea.common.ui.AvatarIconView\n                            android:id=\"@+id/replyToAvatarIcon\"\n                            android:layout_width=\"@dimen/note_avatar_icon_size\"\n                            android:layout_height=\"@dimen/note_avatar_icon_size\"\n                            imageUrl=\"@{hasReplyToNote.replyTo.avatarUrl}\"\n                            app:iconShape=\"@{hasReplyToNote.config.avatarIconShapeType.value}\"\n                            android:layout_marginEnd=\"8dp\"\n                            tools:ignore=\"ContentDescription\"\n                            app:transitionDestinationUser=\"@{hasReplyToNote.replyTo.toShowNote.user}\"\n                            android:scaleType=\"centerCrop\"\n                            />\n\n                    <TextView\n                            android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"\n                            android:layout_toEndOf=\"@id/replyToAvatarIcon\"\n                            android:id=\"@+id/replyToUserName\"\n                            android:textStyle=\"bold\"\n                            android:textSize=\"@dimen/note_author_info_text_size\"\n                            tools:text=\"userName\"\n\n                            android:layout_marginEnd=\"8dp\"\n                            />\n                    <TextView\n                            android:id=\"@+id/replyToName\"\n                            android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"\n                            android:layout_toEndOf=\"@id/replyToUserName\"\n                            android:textStyle=\"italic\"\n                            android:singleLine=\"true\"\n                            android:ellipsize=\"end\"\n                            android:textSize=\"@dimen/note_author_info_text_size\"\n                            />\n\n                    <TextView\n                            android:id=\"@+id/replyToCw\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            tools:text=\"cwcwcwwcwcw\"\n                            android:text=\"@{hasReplyToNote.replyTo.cw}\"\n                            android:layout_toEndOf=\"@+id/replyToAvatarIcon\"\n                            android:layout_below=\"@+id/replyToUserName\"\n                            android:visibility='@{hasReplyToNote.replyTo.cw == null ? View.GONE : View.VISIBLE}'\n                            android:textSize=\"@dimen/note_content_text_size\"\n                            />\n\n\n                    <TextView\n                            android:id=\"@+id/replyToContentFoldingButton\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_below=\"@+id/replyToUserName\"\n                            android:layout_toEndOf=\"@+id/replyToCw\"\n                            android:layout_marginStart=\"5dp\"\n                            android:layout_marginBottom=\"5dp\"\n                            tools:text=\"展開する\"\n                            android:visibility='@{hasReplyToNote.replyTo.cw == null ? View.GONE : View.VISIBLE }'\n                            android:textColor=\"?attr/colorAccent\"\n                            stringSource=\"@{hasReplyToNote.replyTo.contentFoldingStatusMessage}\"\n                            android:onClick=\"@{()-> hasReplyToNote.replyTo.changeContentFolding() }\"\n                            />\n                    <RelativeLayout\n                            android:id=\"@+id/replyToContentMain\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_below=\"@+id/replyToContentFoldingButton\"\n                            android:layout_toEndOf=\"@id/replyToAvatarIcon\"\n                            android:visibility=\"@{SafeUnbox.unbox(hasReplyToNote.replyTo.contentFolding) ? View.GONE : View.VISIBLE }\"\n                            >\n                        <TextView\n                                android:id=\"@id/text\"\n                                android:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"\n                                android:textSize=\"@dimen/note_content_text_size\"\n                                tools:text=\"aoiwefjowiaejiowajefihawoefoiawehfioawheoifawoiefioawejfowaoeifjawoiejfoaw\"\n                                android:visibility='@{hasReplyToNote.replyTo.text == null ? View.GONE : View.VISIBLE}'\n                                textTypeSource=\"@{hasReplyToNote.replyTo.textNode}\"\n                                customEmojiScale=\"@{hasReplyToNote.config.noteCustomEmojiScaleSizeInText}\"\n                                />\n\n                    </RelativeLayout>\n\n                </RelativeLayout>\n\n                <com.google.android.material.button.MaterialButton\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/expand\"\n                        android:layout_gravity=\"center_horizontal|bottom\"\n                        android:id=\"@+id/replyAutoExpandableButton\"\n                        android:visibility=\"@{ hasReplyToNote.expanded ? View.GONE : View.VISIBLE}\"\n                        app:emojiCompatEnabled=\"false\"\n                        app:cornerRadius=\"24dp\"\n                        />\n            </net.pantasystem.milktea.common_android.ui.AutoCollapsingLayout>\n\n            <include layout=\"@layout/item_simple_note\"\n                    app:note=\"@{hasReplyToNote}\"\n                    android:id=\"@+id/simpleNote\"\n                    app:noteCardActionListener=\"@{noteCardActionListener}\"\n                    />\n\n\n            <View\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/note_divider_height\"\n                    android:background=\"?android:attr/listDivider\"\n                    android:visibility=\"@{ hasReplyToNote.config.isEnableNoteDivider ? View.VISIBLE : View.GONE}\" />\n        </LinearLayout>\n    </androidx.cardview.widget.CardView>\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_media_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/baseFrame\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"100dp\"\n    tools:ignore=\"NestedWeights\"\n    >\n\n    <ImageView\n        android:id=\"@+id/thumbnail\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:contentDescription=\"@string/thumbnail\"\n        android:scaleType=\"centerCrop\"\n        tools:srcCompat=\"@drawable/ic_baseline_hide_image_24\"\n        />\n    <ImageButton\n        android:id=\"@+id/actionButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:contentDescription=\"@string/play_media\"\n        style=\"?android:attr/borderlessButtonStyle\"\n        android:src=\"@drawable/ic_play_circle_outline_black_24dp\"\n        android:scaleType=\"fitCenter\"\n        app:tint=\"?attr/colorAccent\" />\n\n    <TextView\n        android:id=\"@+id/nsfwMessage\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"クリックで表示\"\n        android:layout_gravity=\"center\"\n        android:text=\"@string/sensitive_content\"\n        android:background=\"@drawable/shape_media_message_background\"\n        android:padding=\"4dp\"\n        android:textColor=\"@android:color/white\"\n        />\n    <ImageButton\n        android:id=\"@+id/toggleVisibilityButton\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:layout_gravity=\"top|end\"\n\n        tools:ignore=\"ContentDescription\"\n\n        />\n\n</FrameLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_note.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        >\n    <data>\n        <variable name=\"note\" type=\"net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\"/>\n        <import type=\"android.view.View\"/>\n\n\n\n\n        <import type=\"net.pantasystem.milktea.note.R\"/>\n\n        <variable\n                name=\"noteCardActionListener\"\n                type=\"net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\" />\n    </data>\n\n    <androidx.cardview.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:cardUseCompatPadding=\"false\"\n            app:cardCornerRadius=\"0dp\"\n            android:elevation=\"0dp\"\n            setCardViewSurfaceColor=\"@{null}\"\n    >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\"\n        >\n\n            <TextView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\" android:id=\"@+id/textView2\"\n                    android:paddingHorizontal=\"@dimen/note_horizontal_padding_size\"\n                    android:paddingTop=\"@dimen/note_top_padding_size\"\n\n                    android:onClick=\"@{()-> noteCardActionListener.onUserClicked(note.note.user)}\"\n                    app:statusMessageTargetViewNote=\"@{note}\"\n                    android:textSize=\"@dimen/note_content_text_size\"\n            />\n            <include\n                    android:id=\"@+id/simpleNote\"\n                    layout=\"@layout/item_simple_note\"\n                    app:note=\"@{note}\"\n                    app:noteCardActionListener=\"@{noteCardActionListener}\"\n                    android:visibility=\"@{note.isOnlyVisibleRenoteStatusMessage ? View.GONE : View.VISIBLE }\"\n                    />\n\n            <View\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"@dimen/note_divider_height\"\n                    android:background=\"?android:attr/listDivider\"\n                    android:visibility=\"@{ note.config.isEnableNoteDivider ? View.VISIBLE : View.GONE}\" />\n        </LinearLayout>\n    </androidx.cardview.widget.CardView>\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_note_editor_reply_to_note.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <data>\n\n        <variable\n                name=\"note\"\n                type=\"net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\" />\n\n        <import type=\"android.view.View\" />\n\n\n        <import type=\"net.pantasystem.milktea.note.R\" />\n\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingHorizontal=\"@dimen/note_horizontal_padding_size\"\n            android:paddingTop=\"@dimen/note_top_padding_size\"\n\n            app:transitionDestinationNote=\"@{note.toShowNote.note}\"\n            app:clickedView=\"@{elapsedTime}\"\n            app:mainNameView=\"@{mainName}\"\n            app:subNameView=\"@{subName}\"\n            app:user=\"@{note.toShowNote.user}\"\n            app:account=\"@{note.account}\"\n            app:foldingNote=\"@{note}\"\n            app:foldingButton=\"@{contentFoldingButton}\"\n            app:cw=\"@{cw}\"\n            app:foldingContent=\"@{contentMain}\"\n            app:isFolding=\"@{note.contentFolding}\">\n\n        <net.pantasystem.milktea.common.ui.AvatarIconView\n                android:id=\"@+id/avatarIcon\"\n                android:layout_width=\"@dimen/note_avatar_icon_size\"\n                android:layout_height=\"@dimen/note_avatar_icon_size\"\n                imageUrl='@{note.avatarUrl}'\n                app:iconShape=\"@{note.config.avatarIconShapeType.value}\"\n                tools:srcCompat=\"@android:drawable/sym_def_app_icon\"\n                android:contentDescription=\"@string/avataricon\"\n                app:transitionDestinationUser=\"@{note.toShowNote.user}\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                android:scaleType=\"centerCrop\"\n                />\n\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/mainName\"\n                android:textStyle=\"bold\"\n                android:textSize=\"@dimen/note_author_info_text_size\"\n                android:singleLine=\"true\"\n                android:ellipsize=\"end\"\n                app:layout_constrainedWidth=\"true\"\n                tools:text=\"名前aio\"\n                app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                android:layout_marginStart=\"@dimen/note_avatar_icon_right_margin_size\"\n                app:layout_constraintEnd_toStartOf=\"@id/elapsedTime\"\n                app:layout_constraintHorizontal_bias=\"0\"\n\n                />\n\n        <TextView\n                android:id=\"@+id/subName\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_toEndOf=\"@id/mainName\"\n                android:textStyle=\"italic\"\n                android:singleLine=\"true\"\n                android:ellipsize=\"end\"\n                tools:text=\"ユーザー名awefawefawefawefawefawefwaefwef\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintStart_toEndOf=\"@id/mainName\"\n                android:layout_marginStart=\"4dp\"\n                app:layout_constraintEnd_toStartOf=\"@id/elapsedTime\"\n                android:textSize=\"@dimen/note_author_info_text_size\"/>\n\n        <TextView\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textSize=\"@dimen/note_author_info_text_size\"\n                android:layout_toEndOf=\"@id/subName\"\n                android:layout_marginStart=\"4dp\"\n                android:singleLine=\"true\"\n                android:ellipsize=\"end\"\n                elapsedTime=\"@{note.toShowNote.note.createdAt}\"\n                visibility=\"@{note.toShowNote.note.visibility}\"\n                isDisplayTimestampsAsAbsoluteDates=\"@{note.config.displayTimestampsAsAbsoluteDates}\"\n                android:layout_alignParentEnd=\"true\"\n                android:gravity=\"end\"\n                tools:text=\"16分前\"\n                android:id=\"@+id/elapsedTime\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                android:textColor=\"?attr/colorPrimary\"\n                app:emojiCompatEnabled=\"false\" />\n\n        <net.pantasystem.milktea.common_android.ui.AutoCollapsingLayout\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:id=\"@+id/autoExpanded\"\n                android:layout_toEndOf=\"@+id/avatarIcon\"\n                android:layout_below=\"@+id/mainName\"\n                overflowExpanded=\"@{note.expanded}\"\n                app:expandableButton=\"@id/autoExpandableButton\"\n                app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@id/subName\"\n                targetButton=\"@{autoExpandableButton}\"\n                onExpandedChanged=\"@{note::expand}\"\n                >\n\n            <LinearLayout\n                    android:id=\"@+id/expandableBase\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:layout_marginStart=\"@dimen/note_avatar_icon_right_margin_size\"\n\n                    >\n\n                <TextView\n                        android:id=\"@+id/instanceInfoLabel\"\n                        tools:text=\"Misskey.io\"\n                        android:textSize=\"@dimen/note_instance_info_text_size\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        tools:background=\"#8BC34A\"\n                        rectViewById=\"@{4}\"\n                        android:gravity=\"center_vertical\"\n                        android:padding=\"2dp\"\n                        instanceInfo=\"@{note.toShowNote.user.instance}\"\n                        isEnable=\"@{note.config.isEnableInstanceTicker}\"\n                        android:singleLine=\"true\"\n                        />\n                <TextView\n                        android:id=\"@+id/cw\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        tools:text=\"cwcwcwwcwcw\"\n                        app:textNode=\"@{note.cwNode}\"\n                        android:textSize=\"@dimen/note_content_text_size\"\n                        />\n\n\n                <TextView\n                        android:id=\"@+id/contentFoldingButton\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n\n                        android:layout_marginBottom=\"4dp\"\n                        tools:text=\"展開する\"\n                        android:textColor=\"?attr/colorAccent\"\n                        android:text=\"@string/auto_note_folding\"\n                        onToggleCw=\"@{ note::changeContentFolding }\"\n                        noteId=\"@{note.id}\"\n                        targetView=\"@{contentMain}\"\n                        isVisible=\"@{note.contentFolding}\"\n                        app:emojiCompatEnabled=\"false\"\n                        />\n\n                <LinearLayout\n                        android:id=\"@+id/contentMain\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:orientation=\"vertical\">\n\n                    <TextView\n                            android:id=\"@id/text\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:textSize=\"@dimen/note_content_text_size\"\n                            textTypeSource=\"@{note.textNode}\"\n                            customEmojiScale=\"@{note.config.noteCustomEmojiScaleSizeInText}\"\n                            tools:text=\"aoiwefjowiaejiowajefihawoefoiawehfioawheoifawoiefioawejfowaoeifjawoiejfoaw\"\n                            android:visibility='@{note.text == null ? View.GONE : View.VISIBLE}'\n                            />\n\n                    <include\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:id=\"@+id/translationView\"\n                            layout=\"@layout/view_translation\"\n                            app:emojis=\"@{note.toShowNote.note.emojis}\"\n                            app:translationState=\"@{note.translateState}\"\n                            android:layout_marginBottom=\"4dp\"\n                            android:layout_marginTop=\"4dp\" />\n\n                    <net.pantasystem.milktea.common_android.ui.MediaLayout\n                        android:id=\"@+id/manyFilePreviewListView\"\n                        mediaViewData=\"@{note.media}\"\n                        previewAbleList=\"@{note.media.files}\"\n                        noteCardActionListenerAdapter=\"@{null}\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:visibility=\"gone\"\n                        android:columnCount=\"2\"\n                        tools:layout_height=\"20dp\"\n                        rect=\"@{30f}\"\n                        android:layout_marginTop=\"@dimen/note_media_preview_top_margin_size\"\n                        />\n\n\n                    <LinearLayout\n                            android:id=\"@+id/poll\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            tools:listitem=\"@layout/item_choice\"\n                            tools:itemCount=\"2\"\n                            android:visibility=\"@{note.currentNote.poll == null ? View.GONE : View.VISIBLE}\"\n\n                            noteId=\"@{note.toShowNote.note.id}\"\n                            poll=\"@{note.currentNote.poll}\"\n                            noteCardActionListenerAdapter=\"@{null}\"\n                            android:orientation=\"vertical\"\n                            />\n\n                    <LinearLayout\n                            android:id=\"@+id/url_preview_list\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            tools:itemCount=\"1\"\n                            tools:listitem=\"@layout/item_url_preview\"\n                            app:previewList=\"@{note.previews}\"\n                            android:orientation=\"vertical\"\n                        />\n\n\n                    <androidx.constraintlayout.widget.ConstraintLayout\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:padding=\"8dp\"\n                            android:visibility='@{note.subNote != null ? View.VISIBLE : View.GONE}'\n                            android:id=\"@+id/subNote\"\n                            android:background=\"@drawable/shape_rounded_square_line\"\n                            app:transitionDestinationNote=\"@{note.subNote.note}\"\n                            app:clickedView=\"@{subNote}\"\n                            app:subNameView=\"@{subNoteSubName}\"\n                            app:mainNameView=\"@{subNoteMainName}\"\n                            app:user=\"@{note.subNote.user}\"\n                            app:account=\"@{note.account}\"\n                            android:layout_marginTop=\"4dp\">\n\n                        <net.pantasystem.milktea.common.ui.AvatarIconView\n                                android:id=\"@+id/subAvatarIcon\"\n                                android:layout_width=\"20dp\"\n                                android:layout_height=\"20dp\"\n                                imageUrl='@{note.subNoteAvatarUrl}'\n                                app:iconShape=\"@{note.config.avatarIconShapeType.value}\"\n                                android:contentDescription=\"@string/avataricon\"\n                                app:transitionDestinationUser=\"@{note.subNote.user}\"\n                                app:layout_constraintStart_toStartOf=\"parent\"\n                                app:layout_constraintTop_toTopOf=\"parent\"\n                                android:scaleType=\"centerCrop\"\n                                />\n\n                        <TextView\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_toEndOf=\"@+id/subAvatarIcon\"\n                                android:id=\"@+id/subNoteMainName\"\n                                android:textStyle=\"bold\"\n                                android:textSize=\"@dimen/note_author_info_text_size\"\n                                app:layout_constraintStart_toEndOf=\"@id/subAvatarIcon\"\n                                android:layout_marginStart=\"4dp\"\n                                app:layout_constraintTop_toTopOf=\"parent\"\n                                tools:text=\"mainName\"\n                                android:singleLine=\"true\"\n                                app:layout_constraintEnd_toEndOf=\"parent\"\n                                app:layout_constraintHorizontal_bias=\"0\"\n                                app:layout_constrainedWidth=\"true\"\n                                android:ellipsize=\"end\"\n\n\n                                />\n\n                        <TextView\n                                android:layout_toEndOf=\"@id/subNoteMainName\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:textStyle=\"italic\"\n                                android:id=\"@+id/subNoteSubName\"\n                                android:textSize=\"@dimen/note_author_info_text_size\"\n                                android:singleLine=\"true\"\n                                app:layout_constraintStart_toEndOf=\"@id/subNoteMainName\"\n                                app:layout_constraintTop_toTopOf=\"parent\"\n                                tools:text=\"subName\"\n                                android:layout_marginStart=\"4dp\"\n\n                                />\n\n                        <TextView\n                                android:id=\"@+id/subCw\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                tools:text=\"cwcwcwwcwcw\"\n                                app:textNode=\"@{note.subCwNode}\"\n                                android:layout_below=\"@+id/subNoteMainName\"\n                                android:visibility='@{note.cw == null ? View.GONE : View.VISIBLE}'\n                                app:layout_constraintTop_toBottomOf=\"@id/subNoteMainName\"\n                                app:layout_constraintStart_toStartOf=\"parent\"\n                                android:textSize=\"@dimen/note_content_text_size\"/>\n\n\n                        <TextView\n                                android:id=\"@+id/subContentFoldingButton\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_below=\"@+id/subCw\"\n                                android:layout_marginStart=\"5dp\"\n                                android:layout_marginBottom=\"5dp\"\n                                tools:text=\"展開する\"\n                                android:visibility='@{note.subCw == null ? View.GONE : View.VISIBLE }'\n                                android:textColor=\"?attr/colorAccent\"\n                                stringSource=\"@{note.subContentFoldingStatusMessage}\"\n                                app:layout_constraintTop_toBottomOf=\"@id/subCw\"\n                                app:layout_constraintStart_toStartOf=\"parent\"\n                                android:onClick=\"@{ () -> note.changeSubContentFolding() }\"\n                                />\n\n                        <TextView\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_below=\"@+id/subContentFoldingButton\"\n                                android:textSize=\"@dimen/note_content_text_size\"\n                                android:id=\"@+id/subNoteText\"\n                                tools:text=\"aowjfoiwajehofijawioefjioawejfiowajeiofhawoifahwoiefwaioe\"\n                                textTypeSource=\"@{note.subNoteTextNode}\"\n                                customEmojiScale=\"@{note.config.noteCustomEmojiScaleSizeInText}\"\n                                app:layout_constraintTop_toBottomOf=\"@id/subContentFoldingButton\"\n                                app:layout_constraintStart_toStartOf=\"parent\"\n                                android:visibility=\"@{ note.subContentFolding || note.subNote.note.text == null ? View.GONE : View.VISIBLE }\"/>\n\n                        <net.pantasystem.milktea.common_android.ui.MediaLayout\n                            android:id=\"@+id/subNoteMediaPreview\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"200dp\"\n                            android:visibility=\"@{note.isVisibleSubNoteMediaPreview ? View.VISIBLE : View.GONE}\"\n                            noteCardActionListenerAdapter=\"@{null}\"\n\n                            android:layout_below=\"@id/subNoteText\"\n                            mediaViewData=\"@{note.subNoteMedia}\"\n                            previewAbleList=\"@{note.subNoteMedia.files}\"\n                            tools:layout_height=\"20dp\"\n                            tools:visibility=\"gone\"\n                            rect=\"@{20f}\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            app:layout_constraintTop_toBottomOf=\"@id/subNoteText\"\n                            android:layout_marginTop=\"2dp\"\n                            />\n\n\n\n                    </androidx.constraintlayout.widget.ConstraintLayout>\n                </LinearLayout>\n\n\n            </LinearLayout>\n\n            <com.google.android.material.button.MaterialButton\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:text=\"@string/expand\"\n                    android:layout_gravity=\"center_horizontal|bottom\"\n                    app:cornerRadius=\"24dp\"\n                    android:id=\"@+id/autoExpandableButton\"\n                    android:visibility=\"@{ note.expanded ? View.GONE : View.VISIBLE}\"\n                    app:emojiCompatEnabled=\"false\"\n                    />\n\n        </net.pantasystem.milktea.common_android.ui.AutoCollapsingLayout>\n\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_reaction.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/reactionLayout\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:paddingHorizontal=\"6dp\"\n    android:paddingVertical=\"4dp\"\n\n\n    android:layout_marginStart=\"4dp\"\n    android:layout_marginBottom=\"2dp\"\n    android:layout_marginTop=\"2dp\"\n    tools:background=\"@drawable/shape_normal_reaction_backgruond\"\n    android:gravity=\"center_vertical\"\n\n\n    >\n    <ImageView\n        android:id=\"@+id/reactionImage\"\n        android:layout_width=\"0dp\"\n        android:minWidth=\"20dp\"\n        android:layout_height=\"20dp\"\n        android:layout_marginEnd=\"4dp\"\n        tools:ignore=\"ContentDescription\"\n        android:scaleType=\"fitCenter\"\n        android:layout_weight=\"1\" />\n    <TextView\n        android:id=\"@+id/reactionText\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"😇\"\n        android:layout_gravity=\"center\"\n        android:textSize=\"15sp\"\n        android:layout_marginEnd=\"4dp\"\n        android:alpha=\"100\"\n\n        />\n    <TextView\n        android:id=\"@+id/reaction_counter\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"20\"\n        android:layout_gravity=\"center\"\n        android:textSize=\"15sp\"\n\n        />\n\n</LinearLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_reaction_history_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:paddingHorizontal=\"16dp\"\n            android:paddingVertical=\"8dp\">\n        <ImageView\n                android:id=\"@+id/customEmojiView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"32dp\"\n\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                tools:src=\"@drawable/ic_edit_black_24dp\"\n                tools:ignore=\"ContentDescription\" />\n\n        <TextView\n                android:id=\"@+id/emojiView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"🥺\"\n                android:gravity=\"center\"\n                android:textSize=\"20sp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\" />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_reaction_history_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"8dp\">\n\n    <ProgressBar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n</FrameLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_simple_note.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n    <data>\n\n        <variable\n            name=\"note\"\n            type=\"net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\" />\n\n        <import type=\"android.view.View\" />\n\n\n        <import type=\"net.pantasystem.milktea.note.R\" />\n\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n\n        <variable\n            name=\"noteCardActionListener\"\n            type=\"net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\" />\n    </data>\n\n    <androidx.constraintlayout.widget.ConstraintLayout\n        android:id=\"@+id/noteLayout\"\n        isUserNameDefault=\"@{note.config.isUserNameDefault}\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingHorizontal=\"@dimen/note_horizontal_padding_size\"\n\n\n        android:paddingTop=\"@dimen/note_top_padding_size\"\n        app:account=\"@{note.account}\"\n        app:cw=\"@{cw}\"\n        app:foldingButton=\"@{contentFoldingButton}\"\n        app:foldingContent=\"@{contentMain}\"\n\n        app:foldingNote=\"@{note}\"\n        app:isFolding=\"@{note.contentFolding}\"\n        app:mainNameView=\"@{mainName}\"\n        app:subNameView=\"@{subName}\"\n        app:user=\"@{note.toShowNote.user}\">\n\n        <net.pantasystem.milktea.common.ui.AvatarIconView\n            android:id=\"@+id/avatarIcon\"\n            android:layout_width=\"@dimen/note_avatar_icon_size\"\n            android:layout_height=\"@dimen/note_avatar_icon_size\"\n            android:contentDescription=\"@string/avataricon\"\n            android:scaleType=\"centerCrop\"\n            app:iconShape=\"@{note.config.avatarIconShapeType.value}\"\n            app:imageUrl=\"@{note.avatarUrl}\"\n            app:blurhash=\"@{note.toShowNote.user.avatarBlurhash}\"\n            app:layout_constraintStart_toStartOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            app:transitionDestinationUser=\"@{note.toShowNote.user}\"\n            tools:srcCompat=\"@android:drawable/sym_def_app_icon\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n        <TextView\n            android:id=\"@+id/mainName\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"@dimen/note_avatar_icon_right_margin_size\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"1\"\n            android:textSize=\"@dimen/note_author_info_text_size\"\n            android:textStyle=\"bold\"\n            app:layout_constrainedWidth=\"true\"\n            app:layout_constraintEnd_toStartOf=\"@id/badgeRoles\"\n            app:layout_constraintHorizontal_bias=\"0\"\n            app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"名前aio\" />\n\n        <TextView\n            android:id=\"@+id/subName\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"4dp\"\n            android:layout_toEndOf=\"@id/mainName\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"1\"\n            android:textSize=\"@dimen/note_author_info_text_size\"\n            android:textStyle=\"italic\"\n            app:layout_constraintEnd_toStartOf=\"@id/badgeRoles\"\n            app:layout_constraintStart_toEndOf=\"@id/mainName\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"ユーザー名awefawefawefawefawefawefwaefwef\" />\n\n        <androidx.constraintlayout.helper.widget.Flow\n            android:id=\"@+id/badgeRoles\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"4dp\"\n            android:padding=\"2dp\"\n            app:layout_constraintBottom_toBottomOf=\"@+id/subName\"\n            app:layout_constraintEnd_toStartOf=\"@id/elapsedTime\"\n            app:layout_constraintStart_toEndOf=\"@id/subName\"\n            app:layout_constraintTop_toTopOf=\"@+id/subName\"\n            android:orientation=\"horizontal\"\n            app:flow_wrapMode=\"none\"\n            />\n\n        <TextView\n            android:id=\"@+id/elapsedTime\"\n            elapsedTime=\"@{note.toShowNote.note.createdAt}\"\n            isDisplayTimestampsAsAbsoluteDates=\"@{note.config.displayTimestampsAsAbsoluteDates}\"\n            visibility=\"@{note.toShowNote.note.visibility}\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentEnd=\"true\"\n            android:layout_marginStart=\"4dp\"\n            android:layout_toEndOf=\"@id/badgeRoles\"\n            android:ellipsize=\"end\"\n\n            android:gravity=\"end\"\n            android:maxLines=\"1\"\n            onClickAndPerformHapticFeedback=\"@{() -> noteCardActionListener.onNoteCardClicked(note.note.note)}\"\n            android:textColor=\"?attr/colorPrimary\"\n            android:textSize=\"@dimen/note_author_info_text_size\"\n            android:visibility=\"@{note.config.displayTimestampsAsAbsoluteDates ? View.GONE : View.VISIBLE}\"\n            app:emojiCompatEnabled=\"false\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toTopOf=\"parent\"\n            tools:text=\"16分前\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n        <net.pantasystem.milktea.common_android.ui.AutoCollapsingLayout\n            android:id=\"@+id/autoExpanded\"\n            onExpandedChanged=\"@{note::expand}\"\n            overflowExpanded=\"@{note.expanded}\"\n            targetButton=\"@{autoExpandableButton}\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_toEndOf=\"@+id/avatarIcon\"\n            app:expandableButton=\"@id/autoExpandableButton\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n            app:layout_constraintTop_toBottomOf=\"@id/subName\">\n\n            <LinearLayout\n                android:id=\"@+id/expandableBase\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginStart=\"@dimen/note_avatar_icon_right_margin_size\"\n                android:orientation=\"vertical\"\n\n                >\n\n                <TextView\n                    android:id=\"@+id/instanceInfoLabel\"\n                    instanceInfo=\"@{note.toShowNote.user.instance}\"\n                    isEnable=\"@{note.config.isEnableInstanceTicker}\"\n                    rectViewById=\"@{4}\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:gravity=\"center_vertical\"\n                    android:maxLines=\"1\"\n                    android:padding=\"2dp\"\n                    android:textSize=\"@dimen/note_instance_info_text_size\"\n                    tools:background=\"#8BC34A\"\n                    tools:text=\"Misskey.io\" />\n\n                <TextView\n                    android:id=\"@+id/cw\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"@dimen/note_content_text_size\"\n                    app:textNode=\"@{note.cwNode}\"\n                    tools:text=\"cwcwcwwcwcw\" />\n\n\n                <TextView\n                    android:id=\"@+id/contentFoldingButton\"\n                    isVisible=\"@{note.contentFolding}\"\n                    noteId=\"@{note.id}\"\n\n                    onToggleCw=\"@{ note::changeContentFolding }\"\n                    targetView=\"@{contentMain}\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"4dp\"\n                    android:text=\"@string/auto_note_folding\"\n                    android:textColor=\"?attr/colorAccent\"\n                    app:emojiCompatEnabled=\"false\"\n                    tools:text=\"展開する\"\n                    android:hapticFeedbackEnabled=\"true\"\n                    />\n\n                <LinearLayout\n                    android:id=\"@+id/contentMain\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\">\n\n                    <TextView\n                        android:id=\"@id/text\"\n                        customEmojiScale=\"@{note.config.noteCustomEmojiScaleSizeInText}\"\n                        memoVisibility='@{note.text == null ? View.GONE : View.VISIBLE}'\n                        textTypeSource=\"@{note.textNode}\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:textSize=\"@dimen/note_content_text_size\"\n                        tools:text=\"aoiwefjowiaejiowajefihawoefoiawehfioawheoifawoiefioawejfowaoeifjawoiejfoaw\"\n\n                        />\n\n                    <include\n                        android:id=\"@+id/translationView\"\n                        layout=\"@layout/view_translation\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"4dp\"\n                        android:layout_marginBottom=\"4dp\"\n                        app:emojis=\"@{note.toShowNote.note.emojis}\"\n                        app:translationState=\"@{note.translateState}\" />\n\n                    <net.pantasystem.milktea.common_android.ui.MediaLayout\n                        android:id=\"@+id/manyFilePreviewListView\"\n                        mediaViewData=\"@{note.media}\"\n                        previewAbleList=\"@{note.media.files}\"\n                        noteCardActionListenerAdapter=\"@{noteCardActionListener}\"\n                        android:layout_marginTop=\"@dimen/note_media_preview_top_margin_size\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"match_parent\"\n                        android:visibility=\"gone\"\n                        tools:layout_height=\"20dp\"\n                        rect=\"@{30f}\"\n                        />\n\n\n                    <LinearLayout\n                        android:id=\"@+id/poll\"\n                        memoVisibility=\"@{note.currentNote.poll == null ? View.GONE : View.VISIBLE}\"\n                        noteCardActionListenerAdapter=\"@{noteCardActionListener}\"\n                        noteId=\"@{note.toShowNote.note.id}\"\n                        poll=\"@{note.currentNote.poll}\"\n                        android:layout_width=\"match_parent\"\n\n                        android:layout_height=\"wrap_content\"\n                        tools:itemCount=\"2\"\n                        tools:listitem=\"@layout/item_choice\"\n                        android:orientation=\"vertical\"\n                        />\n\n                    <LinearLayout\n                        android:id=\"@+id/url_preview_list\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        app:previewList=\"@{note.previews}\"\n                        android:orientation=\"vertical\"\n                        tools:listitem=\"@layout/item_url_preview\"\n                        />\n\n\n                    <RelativeLayout\n                        android:id=\"@+id/subNote\"\n                        isUserNameDefault=\"@{note.config.isUserNameDefault}\"\n                        memoVisibility='@{note.subNote != null ? View.VISIBLE : View.GONE}'\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"4dp\"\n                        android:background=\"@drawable/shape_rounded_square_line\"\n                        android:padding=\"8dp\"\n                        app:account=\"@{note.account}\"\n                        app:clickedView=\"@{subNote}\"\n                        app:mainNameView=\"@{subNoteMainName}\"\n                        app:subNameView=\"@{subNoteSubName}\"\n                        app:transitionDestinationNote=\"@{note.subNote.note}\"\n                        app:user=\"@{note.subNote.user}\">\n\n                        <net.pantasystem.milktea.common.ui.AvatarIconView\n                            android:id=\"@+id/subAvatarIcon\"\n                            android:layout_width=\"20dp\"\n                            android:layout_height=\"20dp\"\n                            android:contentDescription=\"@string/avataricon\"\n                            android:scaleType=\"centerCrop\"\n                            app:iconShape=\"@{note.config.avatarIconShapeType.value}\"\n                            app:imageUrl=\"@{note.subNoteAvatarUrl}\"\n                            app:blurhash=\"@{note.subNote.user.avatarBlurhash}\"\n                            app:transitionDestinationUser=\"@{note.subNote.user}\" />\n\n                        <TextView\n                            android:id=\"@+id/subNoteMainName\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginStart=\"4dp\"\n                            android:layout_toEndOf=\"@+id/subAvatarIcon\"\n                            android:ellipsize=\"end\"\n                            android:maxLines=\"1\"\n                            android:textSize=\"@dimen/note_author_info_text_size\"\n                            android:textStyle=\"bold\"\n                            app:layout_constrainedWidth=\"true\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            app:layout_constraintHorizontal_bias=\"0\"\n                            app:layout_constraintStart_toEndOf=\"@id/subAvatarIcon\"\n                            app:layout_constraintTop_toTopOf=\"parent\"\n                            tools:text=\"mainName\"\n\n                            />\n\n                        <TextView\n                            android:id=\"@+id/subNoteSubName\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginStart=\"4dp\"\n                            android:layout_toEndOf=\"@id/subNoteMainName\"\n                            android:maxLines=\"1\"\n                            android:textSize=\"@dimen/note_author_info_text_size\"\n                            android:textStyle=\"italic\"\n                            tools:text=\"subName\"\n\n                            />\n\n                        <TextView\n                            android:id=\"@+id/subCw\"\n                            memoVisibility='@{note.cw == null ? View.GONE : View.VISIBLE}'\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_below=\"@id/subNoteSubName\"\n                            app:textNode=\"@{note.subCwNode}\"\n                            tools:text=\"cwcwcwwcwcw\" />\n\n\n                        <TextView\n                            android:id=\"@+id/subContentFoldingButton\"\n                            memoVisibility='@{note.subCw == null ? View.GONE : View.VISIBLE }'\n                            stringSource=\"@{note.subContentFoldingStatusMessage}\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginStart=\"5dp\"\n                            android:layout_marginBottom=\"5dp\"\n                            onClickAndPerformHapticFeedback=\"@{ () -> note.changeSubContentFolding() }\"\n                            android:textColor=\"?attr/colorAccent\"\n\n                            android:layout_below=\"@id/subCw\"\n                            tools:text=\"展開する\"\n                            android:hapticFeedbackEnabled=\"true\"\n                            />\n\n                        <TextView\n                            android:id=\"@+id/subNoteText\"\n                            customEmojiScale=\"@{note.config.noteCustomEmojiScaleSizeInText}\"\n                            memoVisibility=\"@{ note.subContentFolding || note.subNote.note.text == null ? View.GONE : View.VISIBLE }\"\n                            textTypeSource=\"@{note.subNoteTextNode}\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:textSize=\"@dimen/note_content_text_size\"\n                            android:layout_below=\"@id/subContentFoldingButton\"\n                            tools:text=\"aowjfoiwajehofijawioefjioawejfiowajeiofhawoifahwoiefwaioe\" />\n\n                        <net.pantasystem.milktea.common_android.ui.MediaLayout\n                            android:id=\"@+id/subNoteMediaPreview\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"200dp\"\n                            android:layout_marginTop=\"2dp\"\n                            android:visibility=\"@{note.isVisibleSubNoteMediaPreview ? View.VISIBLE : View.GONE}\"\n\n                            android:layout_below=\"@id/subNoteText\"\n                            mediaViewData=\"@{note.subNoteMedia}\"\n                            previewAbleList=\"@{note.subNoteMedia.files}\"\n                            noteCardActionListenerAdapter=\"@{noteCardActionListener}\"\n                            tools:layout_height=\"20dp\"\n                            tools:visibility=\"gone\"\n                            rect=\"@{20f}\"\n                            />\n\n\n                    </RelativeLayout>\n                </LinearLayout>\n\n\n            </LinearLayout>\n\n            <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/autoExpandableButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center_horizontal|bottom\"\n                android:text=\"@string/expand\"\n                app:cornerRadius=\"8dp\"\n                app:emojiCompatEnabled=\"false\"\n                android:hapticFeedbackEnabled=\"true\"\n                />\n\n        </net.pantasystem.milktea.common_android.ui.AutoCollapsingLayout>\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/channelInfoView\"\n            style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n            drawableTintCompat=\"@{null}\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:drawableLeft=\"@drawable/ic_baseline_radio_24\"\n            onClickAndPerformHapticFeedback=\"@{ ()-> noteCardActionListener.onChannelButtonClicked(note.channelInfo.id) }\"\n            android:text=\"@{ note.channelInfo.name }\"\n            android:visibility=\"@{ note.channelInfo == null ? View.GONE : View.VISIBLE }\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintHorizontal_bias=\"0.0\"\n            app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n            app:layout_constraintTop_toBottomOf=\"@id/autoExpanded\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n        <com.google.android.flexbox.FlexboxLayout\n            android:id=\"@+id/reaction_view\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"4dp\"\n            android:layout_marginTop=\"2dp\"\n            android:layout_toEndOf=\"@id/avatarIcon\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n            app:layout_constraintTop_toBottomOf=\"@id/channelInfoView\"\n            tools:itemCount=\"1\"\n            tools:listitem=\"@layout/item_reaction\"\n            tools:visibility=\"visible\"\n            app:flexWrap=\"wrap\"\n            />\n\n        <com.google.android.material.button.MaterialButton\n            android:id=\"@+id/expandAllReactionCounts\"\n            style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            onClickAndPerformHapticFeedback=\"@{ ()-> note.expandReactions() }\"\n            android:text=\"@string/show_more_reactions\"\n            android:visibility=\"@{ note.reactionCountsExpanded ? View.GONE : View.VISIBLE }\"\n            app:layout_constraintEnd_toEndOf=\"@id/reaction_view\"\n            app:layout_constraintTop_toBottomOf=\"@id/reaction_view\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n        <TextView\n            android:id=\"@+id/absoluteTimestamp\"\n            createdAt=\"@{note.toShowNote.note.createdAt}\"\n            visibility=\"@{note.toShowNote.note.visibility}\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginStart=\"8dp\"\n            android:layout_marginTop=\"2dp\"\n            android:ellipsize=\"end\"\n            onClickAndPerformHapticFeedback=\"@{() -> noteCardActionListener.onNoteCardClicked(note.note.note)}\"\n            android:singleLine=\"true\"\n            android:textColor=\"?attr/colorPrimary\"\n            android:visibility=\"@{note.config.displayTimestampsAsAbsoluteDates ? View.VISIBLE : View.GONE}\"\n            app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n            app:layout_constraintTop_toBottomOf=\"@id/expandAllReactionCounts\"\n            tools:text=\"10秒前\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n        <!-- BEGIN 下部コントロールパネル BEGIN -->\n\n        <ImageButton\n            android:id=\"@+id/replyButton\"\n            style=\"?android:attr/borderlessButtonStyle\"\n            android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n            android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n            android:layout_marginStart=\"8dp\"\n            android:contentDescription=\"@string/reply_title\"\n            onClickAndPerformHapticFeedback=\"@{ ()-> noteCardActionListener.onReplyButtonClicked(note)}\"\n            android:hapticFeedbackEnabled=\"true\"\n\n            android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintEnd_toStartOf=\"@+id/replyCountView\"\n            app:layout_constraintStart_toEndOf=\"@id/avatarIcon\"\n            app:layout_constraintTop_toBottomOf=\"@id/absoluteTimestamp\"\n            app:srcCompat=\"@drawable/ic_reply_black_24dp\"\n            app:tint=\"?attr/normalIconTint\"\n            tools:ignore=\"TouchTargetSizeCheck\"\n            />\n\n        <TextView\n            android:id=\"@+id/replyCountView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"1\"\n            android:text='@{String.valueOf(SafeUnbox.unbox(note.replyCount))}'\n            android:textSize=\"@dimen/note_counter_text_size\"\n            android:visibility='@{note.replyCount == 0 ? View.INVISIBLE : View.VISIBLE}'\n\n            app:emojiCompatEnabled=\"false\"\n            app:layout_constraintBottom_toBottomOf=\"@id/replyButton\"\n            app:layout_constraintEnd_toStartOf=\"@+id/renoteButton\"\n            app:layout_constraintStart_toEndOf=\"@+id/replyButton\"\n            app:layout_constraintTop_toBottomOf=\"@id/absoluteTimestamp\"\n            app:layout_constraintTop_toTopOf=\"@id/replyButton\"\n            tools:text=\"99999999999\" />\n\n\n        <ImageButton\n            android:id=\"@+id/renoteButton\"\n            style=\"?android:attr/borderlessButtonStyle\"\n            renoteButtonColor=\"@{note.currentNote}\"\n            android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n            android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n            android:contentDescription=\"@string/renote\"\n            android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n            android:scaleType=\"centerCrop\"\n            android:visibility=\"@{ note.canRenote ? View.VISIBLE : View.GONE }\"\n            app:clickTargetNote=\"@{note}\"\n            app:layout_constraintEnd_toStartOf=\"@+id/renoteCountView\"\n            app:layout_constraintStart_toEndOf=\"@id/replyCountView\"\n            app:layout_constraintTop_toBottomOf=\"@id/absoluteTimestamp\"\n            app:notesViewModelForClickRenote=\"@{noteCardActionListener}\"\n            app:srcCompat=\"@drawable/ic_re_note\"\n            tools:ignore=\"TouchTargetSizeCheck\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n        <TextView\n            android:id=\"@+id/renoteCountView\"\n            android:layout_width=\"0dp\"\n\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_vertical\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"1\"\n            android:text='@{String.valueOf(SafeUnbox.unbox(note.currentNote.renoteCount))}'\n            android:textSize=\"@dimen/note_counter_text_size\"\n\n            android:visibility='@{note.currentNote.renoteCount == 0 ? View.INVISIBLE : View.VISIBLE}'\n            app:emojiCompatEnabled=\"false\"\n            app:layout_constraintEnd_toStartOf=\"@id/toggleMastodonFavouriteButton\"\n            app:layout_constraintStart_toEndOf=\"@id/renoteButton\"\n            app:layout_constraintTop_toTopOf=\"@id/replyButton\"\n            app:layout_constraintBottom_toBottomOf=\"@id/replyButton\"\n            tools:text=\"10\" />\n\n        <ImageButton\n            android:id=\"@+id/toggleMastodonFavouriteButton\"\n            style=\"?android:attr/borderlessButtonStyle\"\n            favoriteButtonIcon=\"@{note.currentNote}\"\n            android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n            android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n            android:contentDescription=\"@string/reaction\"\n            onClickAndPerformHapticFeedback=\"@{ () -> noteCardActionListener.onFavoriteButtonClicked(note.currentNote) }\"\n            android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n            android:scaleType=\"centerCrop\"\n            android:src=\"@drawable/ic_star_black_24dp\"\n            app:tint=\"?attr/normalIconTint\"\n\n            tools:ignore=\"TouchTargetSizeCheck\"\n            tools:srcCompat=\"@drawable/ic_star_black_24dp\"\n            app:layout_constraintStart_toEndOf=\"@id/renoteCountView\"\n            app:layout_constraintEnd_toStartOf=\"@id/mastodonFavoriteCountView\"\n            app:layout_constraintTop_toBottomOf=\"@id/absoluteTimestamp\"\n            android:hapticFeedbackEnabled=\"true\"\n\n            />\n\n        <TextView\n            android:id=\"@+id/mastodonFavoriteCountView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n\n            android:layout_gravity=\"center_vertical\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"1\"\n            android:text='@{String.valueOf(SafeUnbox.unbox(note.favoriteCount))}'\n            android:textSize=\"@dimen/note_counter_text_size\"\n\n            android:visibility='@{note.currentNote.mastodon ? (note.favoriteCount == null || note.favoriteCount == 0 ? View.INVISIBLE : View.VISIBLE ) : View.GONE }'\n            app:emojiCompatEnabled=\"false\"\n            tools:text=\"10\"\n            app:layout_constraintStart_toEndOf=\"@id/toggleMastodonFavouriteButton\"\n            app:layout_constraintTop_toTopOf=\"@id/toggleMastodonFavouriteButton\"\n            app:layout_constraintBottom_toBottomOf=\"@id/toggleMastodonFavouriteButton\"\n            app:layout_constraintEnd_toStartOf=\"@id/toggleReactionButton\"\n            />\n\n        <ImageButton\n            android:id=\"@+id/toggleReactionButton\"\n            style=\"?android:attr/borderlessButtonStyle\"\n            isAcceptingOnlyFavoriteReaction=\"@{note.currentNote.acceptingOnlyLikeReaction}\"\n            android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n            android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n            android:contentDescription=\"@string/reaction\"\n            onClickAndPerformHapticFeedback=\"@{ () -> noteCardActionListener.onReactionButtonClicked(note) }\"\n            android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n            android:scaleType=\"centerCrop\"\n            android:visibility=\"@{note.currentNote.supportEmojiReaction ? View.VISIBLE : View.GONE }\"\n            app:isReacted=\"@{!note.currentNote.canReaction}\"\n            app:layout_constraintStart_toEndOf=\"@id/mastodonFavoriteCountView\"\n            app:layout_constraintTop_toBottomOf=\"@id/absoluteTimestamp\"\n\n            app:layout_constraintEnd_toStartOf=\"@id/reactionCountView\"\n\n            app:tint=\"?attr/normalIconTint\"\n            tools:ignore=\"TouchTargetSizeCheck\"\n            tools:srcCompat=\"@drawable/ic_add_black_24dp\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n\n        <TextView\n            android:id=\"@+id/reactionCountView\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n\n\n            android:layout_gravity=\"center_vertical\"\n            android:layout_weight=\"1\"\n            android:maxLines=\"1\"\n            android:text='@{String.valueOf(SafeUnbox.unboxInt(note.currentNote.reactionsCount))}'\n            android:textSize=\"@dimen/note_counter_text_size\"\n            android:visibility=\"@{note.currentNote.supportEmojiReaction ? SafeUnbox.unboxInt(note.currentNote.reactionsCount) == 0 ? View.INVISIBLE : View.VISIBLE : View.GONE }\"\n            app:emojiCompatEnabled=\"false\"\n            app:layout_constraintBottom_toBottomOf=\"@id/toggleReactionButton\"\n            app:layout_constraintEnd_toStartOf=\"@+id/noteOptionButton\"\n            app:layout_constraintStart_toEndOf=\"@id/toggleReactionButton\"\n            app:layout_constraintTop_toTopOf=\"@id/toggleReactionButton\"\n            tools:text=\"10000\" />\n\n        <ImageButton\n            android:id=\"@+id/noteOptionButton\"\n            style=\"?android:attr/borderlessButtonStyle\"\n            android:layout_width=\"@dimen/note_bottom_action_icon_size\"\n            android:layout_height=\"@dimen/note_bottom_action_icon_size\"\n            android:contentDescription=\"@string/more\"\n            onClickAndPerformHapticFeedback=\"@{()-> noteCardActionListener.onOptionButtonClicked(note)}\"\n            android:padding=\"@dimen/note_bottom_action_icon_padding_size\"\n            android:scaleType=\"centerCrop\"\n            app:layout_constraintStart_toEndOf=\"@id/reactionCountView\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintTop_toBottomOf=\"@id/absoluteTimestamp\"\n            app:srcCompat=\"@drawable/ic_more_horiz_black_24dp\"\n            app:tint=\"?attr/normalIconTint\"\n            tools:ignore=\"TouchTargetSizeCheck\"\n            android:hapticFeedbackEnabled=\"true\"\n            />\n\n        <!-- END 下部コントロールパネル END -->\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_simple_user.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <data>\n\n        <variable\n                name=\"user\"\n                type=\"net.pantasystem.milktea.model.user.User\" />\n\n        <variable\n                name=\"account\"\n                type=\"net.pantasystem.milktea.model.account.Account\" />\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n    </data>\n    <androidx.cardview.widget.CardView android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n\n            android:layout_marginTop=\"0.5dp\"\n            app:cardBackgroundColor=\"?attr/colorSurface\"\n            app:cardCornerRadius=\"0dp\"\n            >\n        <RelativeLayout\n                android:layout_width=\"match_parent\" android:layout_height=\"match_parent\"\n                android:padding=\"8dp\"\n                user=\"@{user}\"\n                account=\"@{account}\"\n                mainNameView=\"@{nameMain}\"\n                subNameView=\"@{nameSub}\">\n            <net.pantasystem.milktea.common.ui.AvatarIconView\n                    android:id=\"@+id/avatarIcon\"\n                    android:layout_width=\"45dp\"\n                    android:layout_height=\"45dp\"\n                    android:layout_marginEnd=\"8dp\"\n                    tools:src=\"@drawable/ic_person_add_black_24dp\"\n                    tools:ignore=\"ContentDescription\"\n                    imageUrl=\"@{user.avatarUrl}\"\n                    app:iconShape=\"circle\"\n                    android:scaleType=\"centerCrop\"\n                    transitionDestinationUser=\"@{user}\"\n                    applyShapeFromConfig=\"@{true}\"\n                />\n            <TextView\n                    android:id=\"@+id/nameMain\"\n                    android:layout_toEndOf=\"@id/avatarIcon\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:singleLine=\"true\"\n                    tools:text=\"\\@userName\"\n                    android:textSize=\"18sp\"\n                    android:layout_marginBottom=\"8dp\"\n                    android:layout_alignParentEnd=\"true\"\n\n                    />\n            <TextView\n                    android:id=\"@+id/nameSub\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_toEndOf=\"@id/avatarIcon\"\n                    android:layout_below=\"@id/nameMain\"\n                    tools:text=\"name\"\n                    android:layout_alignParentEnd=\"true\"\n                    />\n\n\n\n        </RelativeLayout>\n    </androidx.cardview.widget.CardView>\n\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_timeline_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <LinearLayout android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\"\n            xmlns:android=\"http://schemas.android.com/apk/res/android\">\n        <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center\"\n                android:text=\"@string/failed_to_get_the_note\"\n                />\n        <Button\n                android:id=\"@+id/retryLoadButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/retry\"/>\n\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_timeline_error.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <data>\n        <import type=\"android.view.View\" />\n        <variable\n                name=\"errorItem\"\n                type=\"net.pantasystem.milktea.note.timeline.viewmodel.TimelineListItem.Error\" />\n    </data>\n    <LinearLayout android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\"\n            xmlns:android=\"http://schemas.android.com/apk/res/android\">\n        <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center\"\n                android:text=\"@string/failed_to_get_the_note\"\n                stringSource=\"@{errorItem.errorMessage}\"\n                />\n        <Button\n                android:id=\"@+id/retryLoadButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/retry\"/>\n\n        <Button\n                android:id=\"@+id/reauthenticateButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/reauthenticate\"\n                android:visibility=\"@{errorItem.unauthorizedError ? View.VISIBLE : View.GONE }\"\n                />\n\n        <Button\n                android:id=\"@+id/showErrorMessageButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/show_error\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n\n                />\n        <TextView\n                android:id=\"@+id/errorView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_timeline_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"8dp\">\n\n    <ProgressBar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\" />\n</FrameLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_url_or_file_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:paddingTop=\"4dp\">\n\n    <net.pantasystem.milktea.note.url.UrlPreviewView\n        android:id=\"@+id/urlPreviewView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n    <net.pantasystem.milktea.note.url.OtherFileView\n        android:id=\"@+id/filePreviewView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n</FrameLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_url_preview.xml",
    "content": "<net.pantasystem.milktea.note.url.UrlPreviewView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:id=\"@+id/urlPreviewView\" />"
  },
  {
    "path": "modules/features/note/src/main/res/layout/item_vote_result.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView android:id=\"@+id/voteResult\"\n    android:layout_height=\"wrap_content\"\n    android:layout_width=\"wrap_content\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    />\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/view_other_file.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/filePropertyView\"\n    android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/shape_rounded_square_line\"\n    android:layout_marginTop=\"4dp\"\n    >\n\n    <ImageView\n        android:id=\"@+id/fileThumbnailView\"\n        android:layout_width=\"30dp\"\n        android:layout_height=\"30dp\"\n        android:adjustViewBounds=\"true\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:background=\"@color/black_overlay\"\n        tools:ignore=\"ContentDescription\"\n        tools:src=\"@drawable/ic_selectable_file\"\n        android:layout_marginStart=\"3dp\"\n        />\n\n    <TextView\n        android:id=\"@+id/fileNameView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        android:textStyle=\"bold\"\n\n        app:layout_constraintStart_toEndOf=\"@+id/fileThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintBottom_toTopOf=\"@id/fileTypeView\"\n        tools:text=\"site title\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"4dp\"\n        android:textSize=\"12sp\"\n        />\n\n    <TextView\n        android:id=\"@+id/fileTypeView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"image/jpg\"\n        android:singleLine=\"true\"\n        android:ellipsize=\"end\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"4dp\"\n        app:layout_constraintTop_toBottomOf=\"@id/fileNameView\"\n        app:layout_constraintStart_toEndOf=\"@id/fileThumbnailView\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        android:layout_marginTop=\"2dp\"\n        android:layout_marginStart=\"8dp\"\n        android:textSize=\"12sp\"\n\n        />\n\n\n\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "modules/features/note/src/main/res/layout/view_translation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <data>\n        <variable\n                name=\"translationState\"\n                type=\"net.pantasystem.milktea.common.ResultState&lt;net.pantasystem.milktea.model.note.Translation>\" />\n        <variable\n                name=\"emojis\"\n                type=\"List&lt;net.pantasystem.milktea.model.emoji.CustomEmoji>\" />\n        <import type=\"android.view.View\" />\n        <import type=\"net.pantasystem.milktea.common.ResultState\" />\n        <import type=\"net.pantasystem.milktea.model.note.Translation\" />\n        <import type=\"net.pantasystem.milktea.common.StateContent\"/>\n        <import type=\"java.util.List\" />\n        <import type=\"net.pantasystem.milktea.model.emoji.CustomEmoji\" />\n    </data>\n    <FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"8dp\"\n            android:background=\"@drawable/shape_rounded_square_line\"\n            translationState=\"@{translationState}\">\n        <ProgressBar\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:visibility=\"@{ translationState instanceof ResultState.Loading ? View.VISIBLE : View.GONE}\"/>\n        <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                translationState=\"@{translationState}\"\n                emojis=\"@{emojis}\"\n                />\n    </FrameLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/layout/view_url_preview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:id=\"@+id/urlPreviewView\"\n    android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/shape_rounded_square_line\"\n    android:layout_marginTop=\"4dp\"\n    >\n\n    <ImageView\n        android:id=\"@+id/siteThumbnailView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:adjustViewBounds=\"true\"\n        android:scaleType=\"centerCrop\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        tools:background=\"@color/black_overlay\"\n        tools:ignore=\"ContentDescription\"\n        tools:src=\"@drawable/ic_selectable_file\"\n        app:layout_constraintDimensionRatio=\"1:1\"\n        />\n\n    <TextView\n        android:id=\"@+id/siteTitleView\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginEnd=\"8dp\"\n\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        android:textStyle=\"bold\"\n\n        app:layout_constraintStart_toEndOf=\"@+id/siteThumbnailView\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintBottom_toTopOf=\"@id/siteDescription\"\n        tools:text=\"site title\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginTop=\"4dp\"\n        android:textSize=\"12sp\"\n        />\n\n    <TextView\n        android:id=\"@+id/siteDescription\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        tools:text=\"description\"\n        android:singleLine=\"true\"\n        android:ellipsize=\"end\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"4dp\"\n        app:layout_constraintTop_toBottomOf=\"@id/siteTitleView\"\n        app:layout_constraintStart_toEndOf=\"@id/siteThumbnailView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        android:layout_marginTop=\"2dp\"\n        android:layout_marginStart=\"8dp\"\n        android:textSize=\"12sp\"\n\n\n        />\n\n    <ImageView\n        android:id=\"@+id/siteIconView\"\n        android:layout_width=\"16dp\"\n        android:layout_height=\"16dp\"\n        app:layout_constraintStart_toEndOf=\"@id/siteThumbnailView\"\n        app:layout_constraintTop_toBottomOf=\"@id/siteDescription\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        android:layout_marginStart=\"8dp\"\n        tools:ignore=\"ContentDescription\"\n        />\n    <TextView\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"2dp\"\n        android:ellipsize=\"end\"\n        android:singleLine=\"true\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toEndOf=\"@id/siteIconView\"\n        app:layout_constraintTop_toBottomOf=\"@id/siteDescription\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        android:layout_marginStart=\"4dp\"\n\n        android:layout_marginBottom=\"8dp\"\n        tools:text=\"misskey.io\"\n        android:layout_marginEnd=\"8dp\"\n        android:textSize=\"12sp\"\n        android:id=\"@+id/siteNameView\"\n        app:emojiCompatEnabled=\"false\"\n        />\n\n\n</androidx.constraintlayout.widget.ConstraintLayout>\n"
  },
  {
    "path": "modules/features/note/src/main/res/menu/menu_timeline.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n\n    <item\n            android:id=\"@+id/refresh_timeline\"\n            android:icon=\"@drawable/ic_refresh_black_24dp\"\n            android:title=\"@string/refresh\"\n            app:showAsAction=\"ifRoom\"\n            />\n    <item\n            android:id=\"@+id/set_time_machine\"\n            android:icon=\"@drawable/ic_baseline_timeline_24\"\n            android:title=\"@string/time_machine\"\n            app:showAsAction=\"ifRoom\"\n\n            />\n</menu>"
  },
  {
    "path": "modules/features/note/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"note_bottom_action_icon_size\">40dp</dimen>\n    <dimen name=\"note_bottom_action_icon_padding_size\">10dp</dimen>\n\n    <dimen name=\"note_horizontal_padding_size\">14dp</dimen>\n    <dimen name=\"note_top_padding_size\">10dp</dimen>\n\n    <!-- avatarIconと右側の領域の間のマージン -->\n    <dimen name=\"note_avatar_icon_right_margin_size\">8dp</dimen>\n\n    <dimen name=\"note_avatar_icon_size\">50dp</dimen>\n\n    <dimen name=\"note_divider_height\">0.8dp</dimen>\n    \n    <dimen name=\"note_instance_info_text_size\">12sp</dimen>\n    <dimen name=\"note_content_text_size\">15sp</dimen>\n    <dimen name=\"note_author_info_text_size\">15sp</dimen>\n    <dimen name=\"note_counter_text_size\">15sp</dimen>\n\n    <dimen name=\"note_media_preview_top_margin_size\">4dp</dimen>\n\n</resources>"
  },
  {
    "path": "modules/features/note/src/test/java/net/pantasystem/milktea/note/editor/viewmodel/NoteEditorUiStateTest.kt",
    "content": "package net.pantasystem.milktea.note.editor.viewmodel\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.note.CreateNote\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.PollChoiceState\nimport net.pantasystem.milktea.model.note.PollEditingState\nimport net.pantasystem.milktea.model.note.PollExpiresAt\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.note.Visibility\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftPoll\nimport net.pantasystem.milktea.model.note.poll.CreatePoll\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass NoteEditorUiStateTest {\n\n    @Test\n    fun toCreateNote() {\n        val state = NoteEditorUiState(\n            formState = NoteEditorFormState(\n                text = \"text\",\n                cw = \"cw\",\n                hasCw = true,\n                isSensitive = true,\n            ),\n            sendToState = NoteEditorSendToState(\n                visibility = Visibility.Public(true),\n                channelId = Channel.Id(0L, \"channel\"),\n                renoteId = Note.Id(0L, \"renote\"),\n                replyId = Note.Id(0L, \"reply\"),\n                schedulePostAt = null,\n                draftNoteId = null,\n                reactionAcceptanceType = ReactionAcceptanceType.LikeOnly,\n            ),\n            poll = PollEditingState(\n                choices = listOf(\n                    PollChoiceState(\"choice1\"),\n                    PollChoiceState(\"choice2\"),\n                ),\n                expiresAt = PollExpiresAt.Infinity,\n                multiple = true,\n            ),\n            files = emptyList(),\n            currentAccount = null,\n        )\n\n        val account = Account(\n            remoteId = \"\",\n            instanceDomain = \"\",\n            userName = \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        )\n        val note = state.toCreateNote(\n            account\n        )\n        Assertions.assertEquals(\n            CreateNote(\n                author = account,\n                text = \"text\",\n                cw = \"cw\",\n                isSensitive = true,\n                visibility = Visibility.Public(true),\n                channelId = Channel.Id(0L, \"channel\"),\n                renoteId = Note.Id(0L, \"renote\"),\n                replyId = Note.Id(0L, \"reply\"),\n                reactionAcceptance = ReactionAcceptanceType.LikeOnly,\n                poll = CreatePoll(\n                    choices = listOf(\n                        \"choice1\",\n                        \"choice2\",\n                    ),\n                    multiple = true,\n                    expiresAt = null,\n                ),\n                files = emptyList(),\n                viaMobile = false,\n            ),\n            note,\n        )\n    }\n\n    @Test\n    fun toNoteEditingState_FromDraftNote() {\n        val draftNote = DraftNote(\n            accountId = 5537,\n            visibility = \"public\",\n            visibleUserIds = listOf(),\n            text = \"texttext\",\n            cw = \"hogepiyo\",\n            draftFiles = listOf(),\n            viaMobile = null,\n            localOnly = true,\n            noExtractMentions = null,\n            noExtractHashtags = null,\n            noExtractEmojis = null,\n            replyId = \"replyId\",\n            renoteId = \"renoteId\",\n            draftPoll = DraftPoll(\n                choices = emptyList(),\n                multiple = true,\n                expiresAt = null,\n            ),\n            reservationPostingAt = null,\n            channelId = Channel.Id(0L, \"channel\"),\n            isSensitive = null,\n            reactionAcceptanceType = ReactionAcceptanceType.LikeOnly,\n            draftNoteId = 7742\n        )\n\n        val state = draftNote.toNoteEditingState()\n        Assertions.assertEquals(\n            NoteEditorUiState(\n                formState = NoteEditorFormState(\n                    text = \"texttext\",\n                    cw = \"hogepiyo\",\n                    hasCw = true,\n                    isSensitive = false,\n                ),\n                sendToState = NoteEditorSendToState(\n                    visibility = Visibility.Public(true),\n                    channelId = Channel.Id(0L, \"channel\"),\n                    renoteId = Note.Id(5537, \"renoteId\"),\n                    replyId = Note.Id(5537, \"replyId\"),\n                    schedulePostAt = null,\n                    draftNoteId = 7742,\n                    reactionAcceptanceType = ReactionAcceptanceType.LikeOnly,\n                ),\n                poll = PollEditingState(\n                    choices = emptyList(),\n                    expiresAt = PollExpiresAt.Infinity,\n                    multiple = true,\n                ),\n                files = emptyList(),\n                currentAccount = null,\n            ),\n            state,\n        )\n    }\n\n    @Test\n    fun checkValidate_GiveInvalidDataCaseEmptyFields() {\n        val state = NoteEditorUiState()\n        Assertions.assertFalse(\n            state.checkValidate()\n        )\n    }\n\n    @Test\n    fun checkValidate_GiveValidDataCaseSomeText() {\n        val state = NoteEditorUiState(\n            formState = NoteEditorFormState(\n                text = \"hogehoge\"\n            )\n        )\n        Assertions.assertTrue(\n            state.checkValidate()\n        )\n    }\n\n    @Test\n    fun checkValidate_GiveInvalidDataTextOverflow() {\n        val state = NoteEditorUiState(\n            formState = NoteEditorFormState(\n                text = \"a\".repeat(3001)\n            )\n        )\n\n        Assertions.assertFalse(\n            state.checkValidate(\n                textMaxLength = 3000,\n            )\n        )\n    }\n\n    @Test\n    fun checkValidate_GiveInvalidDataCaseCwAllowBlank() {\n        val state = NoteEditorUiState(\n            formState = NoteEditorFormState(\n                text = \"hogehoge\",\n                cw = \"\",\n                hasCw = true,\n            )\n        )\n\n        Assertions.assertFalse(\n            state.checkValidate(\n                isCwAllowBlank = false,\n            )\n        )\n    }\n\n    @Test\n    fun checkValidate_GiveValidFiles() {\n        val state = NoteEditorUiState(\n            files = listOf(\n                FilePreviewSource.Local(\n                    file = AppFile.Local(\n                        name = \"name\",\n                        path = \"path\",\n                        thumbnailUrl = \"thumbnailUrl\",\n                        type = \"type\",\n                        isSensitive = false,\n                        folderId = null,\n                        fileSize = null,\n                        comment = null,\n                        id = 4695,\n                    ),\n                ),\n            )\n        )\n\n        Assertions.assertTrue(\n            state.checkValidate()\n        )\n    }\n\n    @Test\n    fun checkValidate_GiveInvalidFileSize() {\n        val state = NoteEditorUiState(\n            files = (0..16).map {\n                FilePreviewSource.Local(\n                    file = AppFile.Local(\n                        name = \"name\",\n                        path = \"path\",\n                        thumbnailUrl = \"thumbnailUrl\",\n                        type = \"type\",\n                        isSensitive = false,\n                        folderId = null,\n                        fileSize = null,\n                        comment = null,\n                        id = it.toLong(),\n                    ),\n                )\n            }\n        )\n\n        Assertions.assertFalse(\n            state.checkValidate(maxFileCount = 16)\n        )\n    }\n\n    @Test\n    fun checkValidate_GiveValidJustFileSize() {\n        val state = NoteEditorUiState(\n            files = (1..16).map {\n                FilePreviewSource.Local(\n                    file = AppFile.Local(\n                        name = \"name\",\n                        path = \"path\",\n                        thumbnailUrl = \"thumbnailUrl\",\n                        type = \"type\",\n                        isSensitive = false,\n                        folderId = null,\n                        fileSize = null,\n                        comment = null,\n                        id = it.toLong(),\n                    ),\n                )\n            }\n        )\n\n        Assertions.assertTrue(\n            state.checkValidate(maxFileCount = 16)\n        )\n    }\n\n}"
  },
  {
    "path": "modules/features/notification/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/notification/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.notification'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:api_streaming')\n    implementation libs.androidx.swiperefreshlayout\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:features:note')\n\n\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.fragment.ktx\n    implementation libs.wada811.databinding\n    implementation libs.activity.ktx\n\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    implementation libs.lifecycle.livedata\n    implementation libs.retrofit\n    implementation libs.recyclerview\n    implementation libs.androidx.constraintlayout\n    implementation libs.flexbox\n    implementation libs.kotlin.datetime\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/notification/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/notification/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/notification/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationErrorHandler.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.content.Context\nimport android.widget.Toast\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.APIErrorStringConverter\n\nclass NotificationErrorHandler(\n    val context: Context\n) {\n\n    operator fun invoke(error: Throwable) {\n        when (error) {\n            is APIError -> {\n                Toast.makeText(\n                    context,\n                    APIErrorStringConverter()(error).getString(context),\n                    Toast.LENGTH_SHORT\n                ).show()\n            }\n            else -> Unit\n        }\n    }\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationFragment.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.MenuHost\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_viewmodel.CurrentPageableTimelineViewModel\nimport net.pantasystem.milktea.common_viewmodel.ScrollToTopViewModel\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.view.NoteCardActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport net.pantasystem.milktea.notification.databinding.FragmentNotificationBinding\nimport net.pantasystem.milktea.notification.viewmodel.NotificationListItem\nimport net.pantasystem.milktea.notification.viewmodel.NotificationViewModel\nimport javax.inject.Inject\n\n\n@AndroidEntryPoint\nclass NotificationFragment : Fragment(R.layout.fragment_notification) {\n\n    companion object {\n        fun newInstance(specifiedAccountId: Long? = null): NotificationFragment {\n            return NotificationFragment().apply {\n                arguments = Bundle().apply {\n                    specifiedAccountId?.also {\n                        putLong(NotificationViewModel.EXTRA_SPECIFIED_ACCOUNT_ID, it)\n                    }\n                }\n            }\n        }\n    }\n\n\n    lateinit var mLinearLayoutManager: LinearLayoutManager\n    private val mViewModel: NotificationViewModel by viewModels()\n    private val scrollToTopViewModel: ScrollToTopViewModel by activityViewModels()\n\n    private val notesViewModel by activityViewModels<NotesViewModel>()\n\n    private val currentPageableTimelineViewModel: CurrentPageableTimelineViewModel by activityViewModels()\n\n    @Inject\n    internal lateinit var settingStore: SettingStore\n\n    @Inject\n    internal lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var channelDetailNavigation: ChannelDetailNavigation\n\n    @Inject\n    internal lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    internal lateinit var accountStore: AccountStore\n\n    @Inject\n    internal lateinit var applyMenuTint: ApplyMenuTint\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var searchNavigation: SearchNavigation\n\n    private val mBinding: FragmentNotificationBinding by dataBinding()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        mLinearLayoutManager = LinearLayoutManager(requireContext())\n\n        val adapter = NotificationListAdapter(\n            configRepository,\n            diffUtilItemCallBack,\n            mViewModel,\n            viewLifecycleOwner,\n            onRetryButtonClicked = {\n                mViewModel.loadInit()\n            },\n            onReauthenticateButtonClicked = {\n                startActivity(\n                    authorizationNavigation.newIntent(\n                        AuthorizationArgs.ReAuth(\n                            accountStore.currentAccount\n                        )\n                    )\n                )\n            }\n        ) {\n            NoteCardActionHandler(\n                requireActivity() as AppCompatActivity,\n                notesViewModel,\n                settingStore,\n                userDetailNavigation,\n                channelDetailNavigation,\n                searchNavigation,\n            ).onAction(it)\n        }\n\n\n        mViewModel.errors.onEach {\n            NotificationErrorHandler(requireContext())(it)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        mBinding.notificationListView.adapter = adapter\n        mBinding.notificationListView.layoutManager = mLinearLayoutManager\n\n        mViewModel.notifications.onEach {\n            adapter.submitList(it)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n\n        mViewModel.isLoading.onEach {\n            mBinding.notificationSwipeRefresh.isRefreshing = it\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        mBinding.notificationSwipeRefresh.setOnRefreshListener {\n            mViewModel.loadFuture()\n        }\n        mBinding.notificationListView.addOnScrollListener(mScrollListener)\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                scrollToTopViewModel.scrollToTopEvent.collect {\n                    mBinding.notificationListView.smoothScrollToPosition(0)\n                }\n            }\n        }\n\n        (requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {\n            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n                menuInflater.inflate(R.menu.notification_menu, menu)\n                applyMenuTint(requireActivity(), menu)\n            }\n\n            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n                when(menuItem.itemId) {\n                    R.id.mark_as_all_read_notifications -> {\n                        mViewModel.onMarkAsReadAllNotifications()\n                        return true\n                    }\n                }\n                return false\n            }\n        }, viewLifecycleOwner, Lifecycle.State.RESUMED)\n    }\n\n\n    override fun onResume() {\n        super.onResume()\n\n        currentPageableTimelineViewModel.setCurrentPageable(null, Pageable.Notification())\n        mViewModel.onResume()\n    }\n\n    override fun onPause() {\n        super.onPause()\n\n        mViewModel.onPause()\n    }\n\n    private val mScrollListener = object : RecyclerView.OnScrollListener() {\n        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n            super.onScrollStateChanged(recyclerView, newState)\n\n            val endVisibleItemPosition = mLinearLayoutManager.findLastVisibleItemPosition()\n            val itemCount = mLinearLayoutManager.itemCount\n\n            if (endVisibleItemPosition == (itemCount - 1)) {\n                mViewModel.loadOld()\n            }\n\n        }\n    }\n\n    private val diffUtilItemCallBack = object : DiffUtil.ItemCallback<NotificationListItem>() {\n\n        override fun areContentsTheSame(\n            oldItem: NotificationListItem,\n            newItem: NotificationListItem\n        ): Boolean {\n            if (oldItem is NotificationListItem.Notification && newItem is NotificationListItem.Notification) {\n                return oldItem.notificationViewData.id == newItem.notificationViewData.id\n            }\n            return oldItem == newItem\n        }\n\n        override fun areItemsTheSame(\n            oldItem: NotificationListItem,\n            newItem: NotificationListItem\n        ): Boolean {\n            if (oldItem is NotificationListItem.Notification && newItem is NotificationListItem.Notification) {\n                return oldItem.notificationViewData.id == newItem.notificationViewData.id\n            }\n            return oldItem == newItem\n        }\n\n    }\n\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationHelper.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.UnknownNotification\n\nobject NotificationHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"notification\")\n    fun TextView.setUnknownNotificationMessage(n: Notification) {\n\n        if(n is UnknownNotification) {\n            this.text = String.format(context.getString(R.string.unknown_notification_msg), n.id.notificationId, n.rawType, n.userId?.id ?: \"\")\n        }\n    }\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationListAdapter.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.core.view.isVisible\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.flexbox.FlexboxLayout\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.timeline.NoteFontSizeBinder\nimport net.pantasystem.milktea.note.timeline.ReactionCountItemsFlexboxLayoutBinder\nimport net.pantasystem.milktea.note.timeline.ViewRecycler\nimport net.pantasystem.milktea.note.view.NoteCardAction\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport net.pantasystem.milktea.notification.databinding.ItemNotificationBinding\nimport net.pantasystem.milktea.notification.databinding.ItemNotificationEmptyBinding\nimport net.pantasystem.milktea.notification.databinding.ItemNotificationErrorBinding\nimport net.pantasystem.milktea.notification.databinding.ItemNotificationLoadingBinding\nimport net.pantasystem.milktea.notification.viewmodel.NotificationListItem\nimport net.pantasystem.milktea.notification.viewmodel.NotificationViewModel\n\n\nclass NotificationListAdapter constructor(\n    private val configRepository: LocalConfigRepository,\n    diffUtilCallBack: DiffUtil.ItemCallback<NotificationListItem>,\n    val notificationViewModel: NotificationViewModel,\n    private val lifecycleOwner: LifecycleOwner,\n    private val onRetryButtonClicked: () -> Unit,\n    private val onReauthenticateButtonClicked: () -> Unit,\n    onNoteCardAction: (NoteCardAction) -> Unit,\n) : ListAdapter<NotificationListItem, NotificationBaseViewHolder>(diffUtilCallBack) {\n\n\n    private val noteCardActionListenerAdapter = NoteCardActionListenerAdapter(onNoteCardAction)\n    private val binder = ReactionCountItemsFlexboxLayoutBinder(\n        ViewRecycler()\n    ) {\n        noteCardActionListenerAdapter.onReactionCountAction(it)\n    }\n\n    override fun getItemViewType(position: Int): Int {\n        return when (getItem(position)) {\n            NotificationListItem.Empty -> NotificationViewType.Empty.ordinal\n            is NotificationListItem.Error -> NotificationViewType.Error.ordinal\n            NotificationListItem.Loading -> NotificationViewType.Loading.ordinal\n            is NotificationListItem.Notification -> NotificationViewType.Notification.ordinal\n        }\n    }\n\n    override fun onBindViewHolder(\n        holder: NotificationBaseViewHolder,\n        position: Int\n    ) {\n        when (val item = getItem(position)) {\n            is NotificationListItem.Empty -> {\n                (holder as NotificationEmptyViewHolder).onBind()\n            }\n            is NotificationListItem.Error -> {\n                (holder as NotificationErrorViewHolder).onBind(item)\n            }\n            is NotificationListItem.Loading -> {\n                (holder as NotificationLoading).onBind()\n            }\n            is NotificationListItem.Notification -> {\n                (holder as NotificationViewHolder).onBind(item)\n            }\n        }\n    }\n\n\n    override fun onCreateViewHolder(\n        parent: ViewGroup,\n        viewType: Int\n    ): NotificationBaseViewHolder {\n        return when (NotificationViewType.values()[viewType]) {\n            NotificationViewType.Error -> {\n                NotificationErrorViewHolder(\n                    ItemNotificationErrorBinding.inflate(\n                        LayoutInflater.from(parent.context),\n                        parent,\n                        false\n                    ),\n                    onReauthenticateButtonClicked\n                )\n            }\n            NotificationViewType.Empty -> {\n                NotificationEmptyViewHolder(\n                    ItemNotificationEmptyBinding.inflate(\n                        LayoutInflater.from(parent.context),\n                        parent,\n                        false\n                    ),\n                    onRetryButtonClicked = onRetryButtonClicked\n                )\n            }\n            NotificationViewType.Loading -> {\n                NotificationLoading(\n                    ItemNotificationLoadingBinding.inflate(\n                        LayoutInflater.from(parent.context),\n                        parent,\n                        false\n                    )\n                )\n            }\n            NotificationViewType.Notification -> {\n                NotificationViewHolder(\n                    ItemNotificationBinding.inflate(\n                        LayoutInflater.from(parent.context),\n                        parent,\n                        false\n                    ),\n                    lifecycleOwner,\n                    notificationViewModel,\n                    noteCardActionListenerAdapter,\n                    binder,\n                ).also {\n                    val config = configRepository.get().getOrElse {\n                        DefaultConfig.config\n                    }\n                    NoteFontSizeBinder.from(it.binding.simpleNote).bind(\n                        contentFontSize = config.noteContentFontSize,\n                        headerFontSize = config.noteHeaderFontSize,\n                    )\n                }\n            }\n        }\n    }\n\n\n}\n\nsealed class NotificationBaseViewHolder(view: View) :\n    RecyclerView.ViewHolder(view) {\n}\n\nclass NotificationViewHolder(\n    val binding: ItemNotificationBinding,\n    private val lifecycleOwner: LifecycleOwner,\n    private val notificationViewModel: NotificationViewModel,\n    private val noteCardActionListenerAdapter: NoteCardActionListenerAdapter,\n    private val binder: ReactionCountItemsFlexboxLayoutBinder,\n) : NotificationBaseViewHolder(binding.root) {\n    fun onBind(item: NotificationListItem.Notification) {\n        binding.notification = item.notificationViewData\n        binding.notificationViewModel = notificationViewModel\n        binding.noteCardActionListener = noteCardActionListenerAdapter\n\n        val note = item.notificationViewData.noteViewData\n        note ?: return\n\n        setReactionCounter(note, binding.simpleNote.reactionView)\n        binding.lifecycleOwner = lifecycleOwner\n        binding.executePendingBindings()\n    }\n\n    private var job: Job? = null\n\n    private fun setReactionCounter(note: PlaneNoteViewData, reactionView: FlexboxLayout) {\n\n        val reactionList = note.reactionCountsViewData.value\n\n\n\n        job?.cancel()\n        job = note.reactionCountsViewData.onEach {\n\n            binder.bindReactionCounts(reactionView, note, it)\n        }.flowWithLifecycle(lifecycleOwner.lifecycle).launchIn(lifecycleOwner.lifecycleScope)\n\n\n        if (reactionList.isNotEmpty()) {\n            reactionView.visibility = View.VISIBLE\n        }\n\n    }\n}\n\nclass NotificationLoading(val binding: ItemNotificationLoadingBinding) :\n    NotificationBaseViewHolder(binding.root) {\n    fun onBind() = Unit\n}\n\nclass NotificationErrorViewHolder(\n    val binding: ItemNotificationErrorBinding,\n    val onReauthenticateButtonClicked: () -> Unit\n) :\n    NotificationBaseViewHolder(binding.root) {\n    fun onBind(item: NotificationListItem.Error) {\n        binding.errorItem = item\n        binding.errorView.isVisible = false\n        binding.showErrorMessageButton.isVisible = true\n        binding.errorView.text = item.throwable.toString()\n        binding.showErrorMessageButton.setOnClickListener {\n            binding.errorView.isVisible = true\n        }\n        binding.reauthenticateButton.setOnClickListener {\n            onReauthenticateButtonClicked()\n        }\n    }\n}\n\nclass NotificationEmptyViewHolder(\n    val binding: ItemNotificationEmptyBinding,\n    val onRetryButtonClicked: () -> Unit\n) :\n    NotificationBaseViewHolder(binding.root) {\n    fun onBind() {\n        binding.retryLoadButton.setOnClickListener {\n            onRetryButtonClicked()\n        }\n    }\n}\n\nenum class NotificationViewType {\n    Error, Empty, Loading, Notification\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationMentionFragment.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage net.pantasystem.milktea.notification\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentStatePagerAdapter\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.ui.ToolbarSetter\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.user.FollowRequestsFragmentFactory\nimport net.pantasystem.milktea.notification.databinding.FragmentNotificationMentionBinding\nimport javax.inject.Inject\n\n@FlowPreview\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass NotificationMentionFragment : Fragment(R.layout.fragment_notification_mention) {\n\n    private val mBinding: FragmentNotificationMentionBinding by dataBinding()\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    lateinit var followRequestsFragmentFactory: FollowRequestsFragmentFactory\n\n    private val viewModel: NotificationTabViewModel by viewModels()\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val notificationPagerAdapter = PagerAdapter()\n\n        mBinding.notificationPager.adapter = notificationPagerAdapter\n        mBinding.notificationTab.setupWithViewPager(mBinding.notificationPager)\n\n        viewModel.tabs.onEach {\n            notificationPagerAdapter.setList(it)\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle).launchIn(viewLifecycleOwner.lifecycleScope)\n\n    }\n\n    override fun onResume() {\n        super.onResume()\n\n        (requireActivity() as? ToolbarSetter?)?.apply {\n            setToolbar(mBinding.toolbar)\n            setTitle(R.string.notification)\n        }\n\n    }\n    inner class PagerAdapter() :\n        FragmentStatePagerAdapter(childFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {\n        private var pages: List<NotificationTabType> = emptyList()\n\n        private fun createFragment(position: Int): Fragment {\n            return when(val tabItem = pages[position]) {\n                is NotificationTabType.FollowRequests -> {\n                    followRequestsFragmentFactory.create()\n                }\n                is NotificationTabType.TitleWithPageable -> {\n                    pageableFragmentFactory.create(tabItem.pageable)\n                }\n            }\n        }\n\n        override fun getPageTitle(position: Int): CharSequence {\n            return pages[position].title.getString(requireContext())\n        }\n\n        override fun getItem(position: Int): Fragment {\n            return createFragment(position)\n        }\n\n        override fun getCount(): Int {\n            return pages.size\n        }\n\n        fun setList(pages: List<NotificationTabType>) {\n            this.pages = pages\n            notifyDataSetChanged()\n        }\n\n    }\n}\n\n\n\n"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationStatusIconHelper.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.view.View\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport net.pantasystem.milktea.note.reaction.NoteReactionViewHelper\nimport net.pantasystem.milktea.notification.viewmodel.NotificationViewData\n\nobject NotificationStatusIconHelper {\n\n    @JvmStatic\n    @BindingAdapter(\n        \"notificationStatusView\",\n        \"notificationReactionImageView\",\n        \"notificationReactionStringView\",\n        \"notificationType\",\n        \"notificationReaction\",\n        \"notification\"\n    )\n    fun LinearLayout.setStatusIcon(\n        notificationStatusView: ImageView,\n        notificationReactionImageView: ImageView,\n        notificationReactionStringView: TextView,\n        notificationType: String,\n        notificationReaction: String?,\n        notification: NotificationViewData\n    ) {\n        when (notificationType) {\n            \"reaction\" -> {\n                //context: Context, reactionTextTypeView: TextView, reactionImageTypeView: ImageView,reaction: String, note: PlaneNoteViewData)\n                if (notificationReaction != null && notification.noteViewData != null) {\n                    NoteReactionViewHelper.setReactionCount(\n                        this.context,\n                        notificationReactionStringView,\n                        notificationReactionImageView,\n                        notificationReaction,\n                        notification.noteViewData\n                    )\n                }\n                notificationStatusView.visibility = View.GONE\n\n            }\n            else -> {\n                notificationReactionImageView.visibility = View.GONE\n                notificationReactionStringView.visibility = View.GONE\n                setStatusView(notificationStatusView, notificationType)\n            }\n        }\n    }\n\n    private fun setStatusView(statusView: ImageView, type: String) {\n        statusView.visibility = View.VISIBLE\n        when (type) {\n            \"follow\" -> statusView.setImageResource(R.drawable.ic_follow)\n            \"mention\" -> statusView.setImageResource(R.drawable.ic_mention)\n            \"reply\" -> statusView.setImageResource(R.drawable.ic_reply_black_24dp)\n            \"renote\" -> statusView.setImageResource(R.drawable.ic_re_note)\n            \"quote\" -> statusView.setImageResource(R.drawable.ic_format_quote_black_24dp)\n            \"pollVote\" -> statusView.setImageResource(R.drawable.ic_poll_black_24dp)\n            \"pollEnded\" -> statusView.setImageResource(R.drawable.ic_poll_black_24dp)\n            \"receiveFollowRequest\", \"groupInvited\" -> statusView.setImageResource(R.drawable.ic_supervisor_account_black_24dp)\n            \"followRequestAccepted\" -> statusView.setImageResource(R.drawable.ic_done_black_24dp)\n            \"unknown\" -> statusView.setImageResource(R.drawable.ic_baseline_report_problem_24)\n            \"favorite\" -> statusView.setImageResource(R.drawable.ic_star_black_24dp)\n            \"status\" -> statusView.setImageResource(R.drawable.ic_menu_send)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationTabViewModel.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport javax.inject.Inject\n\n@HiltViewModel\nclass NotificationTabViewModel @Inject constructor(\n    val accountStore: AccountStore,\n) : ViewModel() {\n\n    val tabs = accountStore.observeCurrentAccount.filterNotNull().map {\n        when(it.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                listOf(\n                    NotificationTabType.TitleWithPageable(\n                        StringSource(net.pantasystem.milktea.common_android_ui.R.string.notification),\n                        Pageable.Notification(),\n                    ),\n                    NotificationTabType.TitleWithPageable(\n                        StringSource(net.pantasystem.milktea.common_android_ui.R.string.mention),\n                        Pageable.Mention(following = null),\n                    ),\n                    NotificationTabType.FollowRequests(\n                        StringSource(R.string.notifications_follow_requests)\n                    )\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA  -> {\n                listOf(\n                    NotificationTabType.TitleWithPageable(\n                        StringSource(net.pantasystem.milktea.common_android_ui.R.string.notification),\n                        Pageable.Notification(),\n                    ),\n                    NotificationTabType.TitleWithPageable(\n                        StringSource(net.pantasystem.milktea.common_android_ui.R.string.mention),\n                        Pageable.Mastodon.Mention,\n                    ),\n                    NotificationTabType.FollowRequests(\n                        StringSource(R.string.notifications_follow_requests)\n                    )\n                )\n            }\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n}\n\nsealed interface NotificationTabType {\n    val title: StringSource\n    data class FollowRequests(override val title: StringSource) : NotificationTabType\n    data class TitleWithPageable(override val title: StringSource, val pageable: Pageable) : NotificationTabType\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationTitleHelper.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.widget.TextView\nimport androidx.databinding.BindingAdapter\nimport dagger.hilt.android.EntryPointAccessors\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiDecorator\nimport net.pantasystem.milktea.common_android_ui.BindingProvider\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParsedResult\nimport net.pantasystem.milktea.model.notification.NotificationRelation\nimport net.pantasystem.milktea.model.notification.PollEndedNotification\n\n\nobject NotificationTitleHelper {\n\n    @JvmStatic\n    @BindingAdapter(\"notificationTitle\")\n    fun TextView.setNotificationTitle(notification: NotificationRelation) {\n        val isUserNameDefault = EntryPointAccessors.fromApplication(\n            context.applicationContext,\n            BindingProvider::class.java\n        ).settingStore()\n            .isUserNameDefault\n        this.text = when (notification.notification) {\n            is PollEndedNotification -> {\n                context.getString(R.string.poll_ended)\n            }\n            else -> if (isUserNameDefault) {\n                notification.user?.displayUserName ?: \"\"\n            } else {\n                val account = EntryPointAccessors.fromApplication(\n                    this.context.applicationContext,\n                    BindingProvider::class.java\n                ).accountStore().currentAccount\n                CustomEmojiDecorator().decorate(\n                    account?.getHost(),\n                    notification.user?.parsedResult ?: CustomEmojiParsedResult(\"\", emptyList()),\n                    this\n                )\n\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/NotificationsActivity.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.os.Bundle\nimport android.view.MenuItem\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.appcompat.widget.Toolbar\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common.ui.ToolbarSetter\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport net.pantasystem.milktea.notification.databinding.ActivityNotificationsBinding\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@ExperimentalCoroutinesApi\n@FlowPreview\n@AndroidEntryPoint\nclass NotificationsActivity : AppCompatActivity(), ToolbarSetter {\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    val binding: ActivityNotificationsBinding by dataBinding()\n    private val notesViewModel by viewModels<NotesViewModel>()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_notifications)\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n\n        showNotificationFragment()\n    }\n\n    private fun showNotificationFragment() {\n        val ft = supportFragmentManager.beginTransaction()\n        ft.replace(R.id.notificationBase, NotificationMentionFragment())\n        ft.commit()\n    }\n\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> finish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    override fun setToolbar(toolbar: Toolbar, visibleTitle: Boolean) {\n        setSupportActionBar(toolbar)\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        supportActionBar?.setDisplayShowTitleEnabled(visibleTitle)\n    }\n}\n"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/notification_message_helper.kt",
    "content": "package net.pantasystem.milktea.notification\n\nimport android.content.Context\nimport android.view.View\nimport com.google.android.material.snackbar.Snackbar\nimport net.pantasystem.milktea.model.notification.*\n\n\nfun Context.notificationMessageScope(block: NotificationMessageScope.() -> Unit) {\n    block.invoke(NotificationMessageScope(this))\n}\n\nclass NotificationMessageScope(val context: Context) {\n    fun NotificationRelation.showSnackBarMessage(view: View) {\n        val message = getMessage()\n        Snackbar.make(view, message, Snackbar.LENGTH_LONG).show()\n    }\n\n    private fun NotificationRelation.getMessage(): String {\n        return when (val notification = this.notification) {\n            is FollowNotification -> context.getString(\n                R.string.followed_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is MentionNotification -> context.getString(\n                R.string.mention_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is ReplyNotification -> context.getString(\n                R.string.replied_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is RenoteNotification -> context.getString(\n                R.string.renoted_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is QuoteNotification -> context.getString(\n                R.string.quoted_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is ReactionNotification -> context.getString(\n                R.string.reacted_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is PollVoteNotification -> context.getString(\n                R.string.voted_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is ReceiveFollowRequestNotification -> context.getString(\n                R.string.follow_requested_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is FollowRequestAcceptedNotification -> context.getString(\n                R.string.follow_request_accepted_by,\n                this.user?.displayUserName ?: \"\"\n            )\n            is PollEndedNotification -> context.getString(R.string.poll_ended)\n            is GroupInvitedNotification -> context.getString(\n                R.string.notification_group_invited_message,\n                notification.group.name\n            )\n            is UnknownNotification -> context.getString(R.string.unknown_notification)\n            is FavoriteNotification -> context.getString(\n                R.string.notification_favorited_by,\n                user?.displayUserName ?: \"\"\n            )\n            is PostNotification -> context.getString(\n                R.string.notification_posted_by,\n                user?.displayUserName ?: \"\"\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/viewmodel/NotificationViewData.kt",
    "content": "package net.pantasystem.milktea.notification.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.notification.*\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\nimport net.pantasystem.milktea.notification.R\n\nclass NotificationViewData(\n    val notification: NotificationRelation,\n    val noteViewData: PlaneNoteViewData?,\n    configRepository: LocalConfigRepository,\n    coroutineScope: CoroutineScope,\n) {\n    enum class Type(val default: String) {\n        FOLLOW(\"follow\"),\n        MENTION(\"mention\"),\n        REPLY(\"reply\"),\n        RENOTE(\"renote\"),\n        QUOTE(\"quote\"),\n        REACTION(\"reaction\"),\n        POLL_VOTE(\"pollVote\"),\n        RECEIVE_FOLLOW_REQUEST(\"receiveFollowRequest\"),\n        FOLLOW_REQUEST_ACCEPTED(\"followRequestAccepted\"),\n        POLL_ENDED(\"pollEnded\"),\n        UNKNOWN(\"unknown\"),\n        GROUP_INVITED(\"groupInvited\"),\n        STATUS(\"status\"),\n        FAVORITE(\"favorite\"),\n    }\n\n    val id = notification.notification.id\n\n    val type: Type = when (notification.notification) {\n        is FollowNotification -> Type.FOLLOW\n        is MentionNotification -> Type.MENTION\n        is ReplyNotification -> Type.REPLY\n        is RenoteNotification -> Type.RENOTE\n        is QuoteNotification -> Type.QUOTE\n        is ReactionNotification -> Type.REACTION\n        is PollVoteNotification -> Type.POLL_VOTE\n        is ReceiveFollowRequestNotification -> Type.RECEIVE_FOLLOW_REQUEST\n        is FollowRequestAcceptedNotification -> Type.FOLLOW_REQUEST_ACCEPTED\n        is PollEndedNotification -> Type.POLL_ENDED\n        is GroupInvitedNotification -> Type.GROUP_INVITED\n        is UnknownNotification -> Type.UNKNOWN\n        is FavoriteNotification -> Type.FAVORITE\n        is PostNotification -> Type.STATUS\n    }\n    val statusType: String = type.default\n\n    val user: User? = notification.user\n    val avatarIconUrl = notification.user?.avatarUrl\n    val name = notification.user?.name\n    val userName = notification.user?.userName\n\n    val reaction =\n        (notification.notification as? ReactionNotification)?.reaction\n\n    val groupInvitedMessageSource: StringSource? = (notification.notification as? GroupInvitedNotification?)?.let {\n        StringSource(R.string.notification_group_invited_message, it.group.name)\n    }\n\n    val followRequestMessageSource: StringSource? = (notification.notification as? ReceiveFollowRequestNotification?)?.let {\n        StringSource(R.string.follow_requested_by, name ?: \"\")\n    }\n\n    val config = configRepository.observe().stateIn(coroutineScope, SharingStarted.WhileSubscribed(5_000), DefaultConfig.config)\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as NotificationViewData\n\n        if (notification != other.notification) return false\n        if (id != other.id) return false\n        if (noteViewData != other.noteViewData) return false\n        if (statusType != other.statusType) return false\n        if (avatarIconUrl != other.avatarIconUrl) return false\n        if (name != other.name) return false\n        if (userName != other.userName) return false\n        if (reaction != other.reaction) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        var result = notification.hashCode()\n        result = 31 * result + id.hashCode()\n        result = 31 * result + (noteViewData?.hashCode() ?: 0)\n        result = 31 * result + statusType.hashCode()\n        result = 31 * result + (avatarIconUrl?.hashCode() ?: 0)\n        result = 31 * result + (name?.hashCode() ?: 0)\n        result = 31 * result + userName.hashCode()\n        result = 31 * result + (reaction?.hashCode() ?: 0)\n        return result\n    }\n}"
  },
  {
    "path": "modules/features/notification/src/main/java/net/pantasystem/milktea/notification/viewmodel/NotificationViewModel.kt",
    "content": "package net.pantasystem.milktea.notification.viewmodel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.buffer\nimport kotlinx.coroutines.flow.catch\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flowOn\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.plus\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_android_ui.APIErrorStringConverter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.filter.WordFilterService\nimport net.pantasystem.milktea.model.group.AcceptGroupInvitationUseCase\nimport net.pantasystem.milktea.model.group.RejectGroupInvitationUseCase\nimport net.pantasystem.milktea.model.notification.GroupInvitedNotification\nimport net.pantasystem.milktea.model.notification.Notification\nimport net.pantasystem.milktea.model.notification.NotificationPagingStore\nimport net.pantasystem.milktea.model.notification.NotificationRepository\nimport net.pantasystem.milktea.model.notification.NotificationStreaming\nimport net.pantasystem.milktea.model.notification.ReceiveFollowRequestNotification\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.follow.requests.AcceptFollowRequestUseCase\nimport net.pantasystem.milktea.model.user.follow.requests.RejectFollowRequestUseCase\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\nimport javax.inject.Inject\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@HiltViewModel\nclass NotificationViewModel @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val notificationStreaming: NotificationStreaming,\n    private val notificationRepository: NotificationRepository,\n    private val noteWordFilterService: WordFilterService,\n    private val configRepository: LocalConfigRepository,\n    private val acceptFollowRequestUseCase: AcceptFollowRequestUseCase,\n    private val rejectFollowRequestUseCase: RejectFollowRequestUseCase,\n    private val acceptGroupInvitationUseCase: AcceptGroupInvitationUseCase,\n    private val rejectGroupInvitationUseCase: RejectGroupInvitationUseCase,\n    planeNoteViewDataCacheFactory: PlaneNoteViewDataCache.Factory,\n    loggerFactory: Logger.Factory,\n    accountStore: AccountStore,\n    notificationPagingStoreFactory: NotificationPagingStore.Factory,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_SPECIFIED_ACCOUNT_ID = \"NotificationViewModel.EXTRA_SPECIFIED_ACCOUNT_ID\"\n    }\n\n    private val planeNoteViewDataCache: PlaneNoteViewDataCache =\n        planeNoteViewDataCacheFactory.create({\n            getCurrentAccount()\n        }, viewModelScope)\n\n    private val notificationPagingStore = notificationPagingStoreFactory.create {\n        getCurrentAccount()\n    }\n\n    private val notificationPageableState = notificationPagingStore.notifications.map { state ->\n        state.suspendConvert { list ->\n            list.filterNot {\n                noteWordFilterService.isShouldFilterNote(Pageable.Notification(), it.note)\n            }.map { n ->\n                val noteViewData = n.note?.let {\n                    planeNoteViewDataCache.get(it)\n                }\n                NotificationViewData(\n                    n,\n                    noteViewData,\n                    configRepository,\n                    viewModelScope,\n                )\n            }\n        }\n    }.catch {\n        logger.error(\"observe notifications error\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), PageableState.Loading.Init())\n\n    val notifications = notificationPageableState.map {\n        it.toList()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        listOf(NotificationListItem.Loading)\n    )\n\n\n    val isLoading = notificationPageableState.map {\n        it is PageableState.Loading\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        false\n    )\n\n    private val _error = MutableSharedFlow<Throwable>(\n        onBufferOverflow = BufferOverflow.DROP_LATEST,\n        extraBufferCapacity = 100\n    )\n\n    val errors = _error.asSharedFlow()\n\n    private val logger = loggerFactory.create(\"NotificationViewModel\")\n\n    private val currentAccount = savedStateHandle.getStateFlow<Long?>(EXTRA_SPECIFIED_ACCOUNT_ID, null).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private var listenStreamingJob: Job? = null\n\n    init {\n        currentAccount.filterNotNull().flowOn(Dispatchers.IO)\n            .onEach {\n                loadInit()\n            }.launchIn(viewModelScope)\n\n        //loadInit()\n    }\n\n    fun onResume() {\n        listenStreamingJob?.cancel()\n        listenStreamingJob = currentAccount.filterNotNull().flatMapLatest { ac ->\n            notificationStreaming.connect {\n                ac\n            }.map {\n                ac to it\n            }\n        }.buffer(100).catch { e ->\n            logger.warning(\"ストーリミング受信中にエラー発生\", e = e)\n        }.onEach {\n            notificationPagingStore.onReceiveNewNotification(it.second)\n        }.launchIn(viewModelScope + Dispatchers.IO)\n\n    }\n\n    fun onPause() {\n        listenStreamingJob?.cancel()\n    }\n\n    fun loadInit() {\n        viewModelScope.launch {\n            notificationPagingStore.clear()\n            notificationPagingStore.loadPrevious().onFailure {\n                logger.error(\"通知の読み込みに失敗\", it)\n                _error.tryEmit(it)\n            }.onSuccess {\n                if (it == 0) {\n                    runCancellableCatching {\n                        getCurrentAccount()\n                    }.flatMapCancellableCatching {\n                        notificationRepository.markAsRead(it.accountId)\n                    }.onFailure { e ->\n                        logger.error(\"failed mark as read\", e)\n                        _error.tryEmit(e)\n                    }\n                }\n            }\n        }\n    }\n\n    fun loadOld() {\n        viewModelScope.launch {\n            notificationPagingStore.loadPrevious().onFailure {\n                logger.error(\"通知の読み込みに失敗\", it)\n                _error.tryEmit(it)\n            }\n        }\n    }\n\n    fun loadFuture() {\n        viewModelScope.launch {\n            notificationPagingStore.loadFuture().onFailure {\n                logger.error(\"通知の読み込みに失敗\", it)\n                _error.tryEmit(it)\n            }\n        }\n    }\n\n    fun acceptFollowRequest(notification: Notification) {\n        if (notification is ReceiveFollowRequestNotification) {\n            viewModelScope.launch {\n                acceptFollowRequestUseCase(notification.userId).onSuccess {\n                    loadInit()\n                }.onFailure {\n                    logger.error(\"acceptFollowRequest error:$it\")\n                    _error.tryEmit(it)\n                }\n            }\n        }\n\n    }\n\n    fun rejectFollowRequest(notification: Notification) {\n        if (notification is ReceiveFollowRequestNotification) {\n            viewModelScope.launch(Dispatchers.IO) {\n                rejectFollowRequestUseCase(notification.userId).onSuccess {\n                    loadInit()\n                }.onFailure {\n                    logger.error(\"rejectFollowRequest error:$it\")\n                    _error.tryEmit(it)\n                }\n            }\n        }\n    }\n\n    fun acceptGroupInvitation(notification: Notification) {\n        viewModelScope.launch {\n            if (notification is GroupInvitedNotification) {\n                acceptGroupInvitationUseCase(notification.invitationId)\n                    .onSuccess {\n                        loadInit()\n                    }\n                    .onFailure {\n                        logger.error(\"failed rejectGroupInvitation\", it)\n                        _error.tryEmit(it)\n                    }\n            }\n        }\n\n    }\n\n    fun rejectGroupInvitation(notification: Notification) {\n        viewModelScope.launch(Dispatchers.IO) {\n            if (notification is GroupInvitedNotification) {\n                rejectGroupInvitationUseCase(notification.invitationId)\n                    .onSuccess {\n                        loadInit()\n                    }\n                    .onFailure {\n                        logger.error(\"failed rejectGroupInvitation\", it)\n                        _error.tryEmit(it)\n                    }\n            }\n\n        }\n    }\n\n    fun onMarkAsReadAllNotifications() {\n        viewModelScope.launch {\n            runCancellableCatching {\n                getCurrentAccount()\n            }.flatMapCancellableCatching {\n                notificationRepository.markAsRead(it.accountId)\n            }.onSuccess {\n                loadInit()\n            }.onFailure {\n                logger.error(\"failed mark as read\", it)\n                _error.tryEmit(it)\n            }\n        }\n    }\n\n    private suspend fun getCurrentAccount(): Account {\n        return savedStateHandle.get<Long>(EXTRA_SPECIFIED_ACCOUNT_ID)?.let { accountId ->\n            return accountRepository.get(accountId).getOrThrow()\n        } ?: accountRepository.getCurrentAccount().getOrThrow()\n    }\n\n\n}\n\nsealed interface NotificationListItem {\n    data class Notification(\n        val notificationViewData: NotificationViewData\n    ) : NotificationListItem\n\n    data object Loading : NotificationListItem\n\n    data class Error(val throwable: Throwable) : NotificationListItem {\n\n        fun getErrorMessage(): StringSource {\n            return when(throwable) {\n                is APIError -> {\n                    APIErrorStringConverter()(throwable)\n                }\n                else -> StringSource(\"Error: $throwable\")\n            }\n        }\n\n        fun isUnauthorizedError(): Boolean {\n            return throwable is APIError.AuthenticationException\n                    || throwable is APIError.ForbiddenException\n                    || throwable is UnauthorizedException\n        }\n    }\n\n    data object Empty : NotificationListItem\n}\n\nfun PageableState<List<NotificationViewData>>.toList(): List<NotificationListItem> {\n    return when (val content = this.content) {\n        is StateContent.Exist -> {\n            content.rawContent.map { viewData ->\n                NotificationListItem.Notification(viewData)\n            }\n        }\n        is StateContent.NotExist -> {\n            when (this) {\n                is PageableState.Error -> {\n                    listOf(NotificationListItem.Error(this.throwable))\n                }\n                is PageableState.Fixed -> listOf(NotificationListItem.Empty)\n                is PageableState.Loading -> listOf(NotificationListItem.Loading)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/notification/src/main/res/layout/activity_notifications.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.notification.NotificationsActivity\">\n\n        <FrameLayout\n                android:id=\"@+id/notificationBase\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"/>\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/notification/src/main/res/layout/fragment_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n\n\n        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n                android:id=\"@+id/notification_swipe_refresh\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/notification_list_view\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\" />\n        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/notification/src/main/res/layout/fragment_notification_mention.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n        <com.google.android.material.appbar.AppBarLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:fitsSystemWindows=\"true\"\n                android:stateListAnimator=\"@null\"\n                android:id=\"@+id/appBar\"\n                >\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    app:layout_scrollFlags=\"scroll|enterAlways\"\n                    android:elevation=\"0dp\"\n                    />\n        </com.google.android.material.appbar.AppBarLayout>\n        <LinearLayout\n                android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n            <com.google.android.material.tabs.TabLayout\n                    android:id=\"@+id/notificationTab\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    android:layout_width=\"match_parent\"\n                    />\n\n            <androidx.viewpager.widget.ViewPager\n                    android:id=\"@+id/notificationPager\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"/>\n        </LinearLayout>\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "modules/features/notification/src/main/res/layout/item_notification.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <variable name=\"notification\" type=\"net.pantasystem.milktea.notification.viewmodel.NotificationViewData\"/>\n\n        <import type=\"net.pantasystem.milktea.notification.viewmodel.NotificationViewData\" />\n        <import type=\"android.view.View\"/>\n\n        <import type=\"net.pantasystem.milktea.common_resource.R\"/>\n\n        <variable\n                name=\"notificationViewModel\"\n                type=\"net.pantasystem.milktea.notification.viewmodel.NotificationViewModel\" />\n        <variable\n                name=\"noteCardActionListener\"\n                type=\"net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\" />\n    </data>\n\n    <androidx.cardview.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"0.1dp\"\n            app:setCardViewSurfaceColor=\"@{null}\"\n\n            >\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"vertical\">\n\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingHorizontal=\"@dimen/notification_horizontal_padding_size\"\n                    android:paddingTop=\"@dimen/notification_top_padding_size\"\n                    android:paddingBottom=\"@dimen/notification_bottom_padding_size\"\n\n                    app:notificationStatusView=\"@{notificationStatus}\"\n                    app:notificationReactionImageView=\"@{reactionImage}\"\n                    app:notificationReactionStringView=\"@{reactionString}\"\n                    app:notificationType=\"@{notification.statusType}\"\n                    app:notificationReaction=\"@{notification.reaction}\"\n                    app:notification=\"@{notification}\"\n                    android:orientation=\"horizontal\"\n\n                    >\n\n                <ImageView\n                        android:id=\"@+id/notificationStatus\"\n                        android:layout_width=\"37dp\"\n                        android:layout_height=\"37dp\"\n                        android:layout_gravity=\"center\"\n                        android:layout_marginEnd=\"8dp\"\n                        tools:srcCompat=\"@drawable/ic_follow\"\n                        tools:ignore=\"ContentDescription\"\n                        app:tint=\"?attr/normalIconTint\" />\n\n                <ImageView\n                        android:id=\"@+id/reactionImage\"\n                        android:layout_width=\"37dp\"\n                        android:layout_height=\"37dp\"\n                        android:layout_gravity=\"center\"\n                        android:layout_marginEnd=\"8dp\"\n                        tools:srcCompat=\"@drawable/ic_baseline_hide_image_24\"\n\n\n                        tools:ignore=\"ContentDescription\" />\n                <TextView\n                        android:id=\"@+id/reactionString\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center\"\n                        tools:text=\"😇\"\n                        android:textSize=\"24sp\"\n                    />\n\n\n                <net.pantasystem.milktea.common.ui.AvatarIconView\n                        android:id=\"@+id/imageView5\"\n                        android:layout_width=\"30dp\"\n                        android:layout_height=\"30dp\"\n                        android:layout_gravity=\"center\"\n                        android:layout_marginEnd=\"5dp\"\n                        imageUrl=\"@{notification.avatarIconUrl}\"\n                        app:iconShape=\"circle\"\n                        android:onClick=\"@{()-> noteCardActionListener.onUserClicked(notification.user)}\"\n                        android:visibility=\"@{ notification.user == null ? View.GONE : View.VISIBLE }\"\n                        tools:ignore=\"ContentDescription\"\n                        android:scaleType=\"centerCrop\"\n                        applyShapeFromConfig=\"@{true}\"\n                    />\n\n\n\n                <TextView\n                        android:id=\"@+id/notificationStatusMessage\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_gravity=\"center\"\n                        notificationTitle=\"@{ notification.notification }\"\n                        tools:text=\"name\"\n                        android:layout_weight=\"1\"/>\n                <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        tools:text=\"16min\"\n                        android:singleLine=\"true\"\n                        elapsedTime=\"@{notification.notification.notification.createdAt}\"\n                        isDisplayTimestampsAsAbsoluteDates=\"@{notification.config.displayTimestampsAsAbsoluteDates}\"\n                        android:layout_gravity=\"center\"/>\n            </LinearLayout>\n            <LinearLayout\n                    android:id=\"@+id/follow_request\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingStart=\"8dp\"\n                    android:paddingEnd=\"8dp\"\n                    android:paddingBottom=\"8dp\"\n                    android:visibility=\"@{notification.type == NotificationViewData.Type.RECEIVE_FOLLOW_REQUEST ? View.VISIBLE : View.GONE}\"\n                    >\n                <TextView\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        stringSource=\"@{ notification.followRequestMessageSource }\"\n                        android:layout_weight=\"1\"\n                        />\n                <Button\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/reject\"\n                        android:layout_marginEnd=\"4dp\"\n                        android:onClick=\"@{()-> notificationViewModel.rejectFollowRequest(notification.notification.notification) }\"\n\n                        />\n                <Button\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/accept\"\n                        android:onClick=\"@{()-> notificationViewModel.acceptFollowRequest(notification.notification.notification) }\"\n                        />\n            </LinearLayout>\n            <LinearLayout\n                    android:id=\"@+id/group_invited\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:paddingStart=\"8dp\"\n                    android:paddingEnd=\"8dp\"\n                    android:paddingBottom=\"8dp\"\n                    android:visibility=\"@{notification.type == NotificationViewData.Type.GROUP_INVITED ? View.VISIBLE : View.GONE}\"\n                    >\n                <TextView\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        stringSource=\"@{notification.groupInvitedMessageSource}\"\n                        android:layout_weight=\"1\"\n\n                        />\n                <Button\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/reject\"\n                        android:layout_marginEnd=\"4dp\"\n                        android:onClick=\"@{()-> notificationViewModel.rejectGroupInvitation(notification.notification.notification) }\"\n\n                        />\n                <Button\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/accept\"\n                        android:onClick=\"@{()-> notificationViewModel.acceptGroupInvitation(notification.notification.notification) }\"\n                        />\n            </LinearLayout>\n            <FrameLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    tools:layout_height=\"100dp\"\n                    android:visibility=\"@{notification.noteViewData == null ? View.GONE : View.VISIBLE}\"\n                    >\n                <include android:id=\"@+id/simpleNote\"\n                        layout=\"@layout/item_simple_note\"\n                        app:note=\"@{notification.noteViewData}\"\n                        app:noteCardActionListener=\"@{noteCardActionListener}\"\n                        />\n            </FrameLayout>\n            <TextView\n                    android:id=\"@+id/unknown_notification_msg\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:padding=\"8dp\"\n                    android:visibility='@{notification.statusType == \"unknown\" ? View.VISIBLE : View.GONE }'\n                    notification=\"@{notification.notification.notification}\"\n                    />\n\n\n\n        </LinearLayout>\n    </androidx.cardview.widget.CardView>\n\n\n</layout>\n"
  },
  {
    "path": "modules/features/notification/src/main/res/layout/item_notification_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <LinearLayout android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\"\n            xmlns:android=\"http://schemas.android.com/apk/res/android\">\n        <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center\"\n                android:text=\"@string/no_notifications\"\n                />\n        <Button\n                android:id=\"@+id/retryLoadButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/retry\"/>\n\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/notification/src/main/res/layout/item_notification_error.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <data>\n        <import type=\"android.view.View\" />\n        <variable\n                name=\"errorItem\"\n                type=\"net.pantasystem.milktea.notification.viewmodel.NotificationListItem.Error\" />\n    </data>\n    <LinearLayout android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center_vertical\"\n            android:gravity=\"center\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\"\n            xmlns:android=\"http://schemas.android.com/apk/res/android\">\n        <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:gravity=\"center\"\n                stringSource=\"@{errorItem.errorMessage}\"\n                />\n        <Button\n                android:id=\"@+id/retryLoadButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/retry\"/>\n\n        <Button\n                android:id=\"@+id/reauthenticateButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/reauthenticate\"\n                android:visibility=\"@{errorItem.unauthorizedError ? View.VISIBLE : View.GONE }\"\n                />\n\n        <Button\n                android:id=\"@+id/showErrorMessageButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/show_error\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n\n                />\n        <TextView\n                android:id=\"@+id/errorView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/notification/src/main/res/layout/item_notification_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"8dp\">\n\n        <ProgressBar\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\" />\n    </FrameLayout>\n</layout>"
  },
  {
    "path": "modules/features/notification/src/main/res/menu/notification_menu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/mark_as_all_read_notifications\"\n        android:icon=\"@drawable/ic_check_black_24dp\"\n        android:title=\"@string/notification_menu_mark_as_all_read_notifications_label\"\n        app:showAsAction=\"ifRoom\"\n        />\n</menu>"
  },
  {
    "path": "modules/features/notification/src/main/res/values/dimens.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <dimen name=\"notification_horizontal_padding_size\">16dp</dimen>\n    <dimen name=\"notification_top_padding_size\">12dp</dimen>\n    <dimen name=\"notification_bottom_padding_size\">8dp</dimen>\n</resources>"
  },
  {
    "path": "modules/features/search/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/search/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id('kotlin-kapt')\n    id('dagger.hilt.android.plugin')\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        compose true\n        dataBinding true\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.search'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:features:user')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:features:note')\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.kotlin.datetime\n\n    implementation libs.wada811.databinding\n    implementation libs.fragment.ktx\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.lifecycle.livedata\n    implementation libs.activity.ktx\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/search/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/search/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/search/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchActivity.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport android.widget.SearchView\nimport androidx.activity.addCallback\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.lifecycle.lifecycleScope\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.ap.ApResolver\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.NoteDetailActivity\nimport net.pantasystem.milktea.search.databinding.ActivitySearchBinding\nimport net.pantasystem.milktea.user.profile.UserDetailActivity\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n@AndroidEntryPoint\nclass SearchActivity : AppCompatActivity() {\n\n    companion object {\n        const val EXTRA_SEARCH_WORD =\n            \"net.pantasystem.milktea.search.SearchActivity.EXTRA_SEARCH_WORD\"\n    }\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private var mSearchView: SearchView? = null\n\n    private var mSearchWord: String? = null\n    private var mAcct: String? = null\n\n    private val binding: ActivitySearchBinding by dataBinding()\n\n    private val searchViewModel: SearchViewModel by viewModels()\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContentView(R.layout.activity_search)\n\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, windowInsets ->\n            val systemBarsInsets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            val imeInsets = windowInsets.getInsets(WindowInsetsCompat.Type.ime())\n            binding.searchToolbar.updatePadding(top = systemBarsInsets.top)\n            v.updatePadding(bottom = maxOf(systemBarsInsets.bottom, imeInsets.bottom))\n            windowInsets\n        }\n\n        setSupportActionBar(binding.searchToolbar)\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        supportActionBar?.setDisplayShowTitleEnabled(false)\n        mSearchWord = intent.getStringExtra(EXTRA_SEARCH_WORD)\n        mAcct = intent.getStringExtra(SearchResultViewModel.EXTRA_ACCT)\n\n        findViewById<ComposeView>(R.id.composeBase).setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                val uiState by searchViewModel.uiState.collectAsState()\n\n                SearchSuggestionsLayout(\n                    uiState = uiState,\n                    onUserSelected = ::showUserDetail,\n                    onHashtagSelected = {\n                        showSearchResult(\"#$it\")\n                    },\n                    onSearchHistoryClicked = {\n                        showSearchResult(it.keyword)\n                    },\n                    onDeleteSearchHistory = {\n                        searchViewModel.deleteSearchHistory(it)\n                    }\n                )\n            }\n        }\n\n        onBackPressedDispatcher.addCallback {\n            finish()\n            overridePendingTransition(0, 0)\n        }\n\n    }\n\n    private fun showUserDetail(user: User) {\n        startActivity(UserDetailActivity.newInstance(this, user.id))\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n\n        menuInflater.inflate(R.menu.menu_search, menu)\n\n        val searchView = menu.findItem(R.id.app_bar_search)?.actionView as SearchView\n        mSearchView = searchView\n\n        searchView.isIconifiedByDefault = false\n        searchView.setOnQueryTextListener(queryTextListener)\n        searchView.isIconified = false\n        searchView.setQuery(mSearchWord, false)\n\n        return super.onCreateOptionsMenu(menu)\n    }\n\n\n    private val queryTextListener = object : SearchView.OnQueryTextListener {\n        override fun onQueryTextChange(newText: String?): Boolean {\n            searchViewModel.onInputKeyword(newText ?: \"\")\n            return true\n        }\n\n        override fun onQueryTextSubmit(query: String?): Boolean {\n            if (!query.isNullOrBlank()) {\n                //search(query)\n                showSearchResult(query)\n                return true\n            }\n            return false\n        }\n    }\n\n    fun showSearchResult(searchWord: String) {\n        lifecycleScope.launch {\n\n            when (val result = searchViewModel.onQueryTextSubmit(searchWord)) {\n                is SubmitResult.ApResolved -> {\n                    when (result.apResolve) {\n                        is ApResolver.TypeNote -> {\n                            startActivity(\n                                NoteDetailActivity.newIntent(\n                                    this@SearchActivity,\n                                    result.apResolve.note.id\n                                ),\n                            )\n                            finish()\n                        }\n                        is ApResolver.TypeUser -> {\n                            startActivity(\n                                userDetailNavigation.newIntent(\n                                    UserDetailNavigationArgs.UserId(\n                                        result.apResolve.user.id\n                                    ),\n                                ),\n                            )\n                            finish()\n                        }\n                    }\n                }\n                is SubmitResult.Search -> {\n                    val intent = Intent(this@SearchActivity, SearchResultActivity::class.java)\n                    intent.putExtra(SearchResultActivity.EXTRA_SEARCH_WORLD, searchWord)\n                    intent.putExtra(SearchResultViewModel.EXTRA_ACCT, mAcct)\n                    startActivity(intent)\n                    overridePendingTransition(0, 0)\n                    finish()\n                }\n                SubmitResult.Cancelled -> return@launch\n\n            }\n\n        }\n\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> {\n                finish()\n                overridePendingTransition(0, 0)\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n}\n"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchResultActivity.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport com.google.android.material.tabs.TabLayoutMediator\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_navigation.SearchNavType\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport net.pantasystem.milktea.search.databinding.ActivitySearchResultBinding\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n@AndroidEntryPoint\nclass SearchResultActivity : AppCompatActivity() {\n    companion object {\n        const val EXTRA_SEARCH_WORLD =\n            \"net.pantasystem.milktea.search.SearchResultActivity.EXTRA_SEARCH_WORLD\"\n    }\n\n    private var mSearchWord: String? = null\n    private var mIsTag: Boolean? = null\n\n    private var mAccountRelation: Account? = null\n    private val binding: ActivitySearchResultBinding by dataBinding()\n    private val notesViewModel by viewModels<NotesViewModel>()\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var applyMenuTint: ApplyMenuTint\n\n    private val searchResultViewModel: SearchResultViewModel by viewModels()\n\n    private var tabLayoutMediator: TabLayoutMediator? = null\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_search_result)\n        setSupportActionBar(binding.searchResultToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.searchResultToolbar.updatePadding(top = insets.top)\n            binding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        val keyword: String? = intent.getStringExtra(EXTRA_SEARCH_WORLD)\n            ?: intent.data?.getQueryParameter(\"keyword\")\n\n        searchResultViewModel.setKeyword(keyword ?: \"\")\n        searchResultViewModel.setAcct(intent.getStringExtra(SearchResultViewModel.EXTRA_ACCT))\n\n\n        mSearchWord = keyword\n\n        if (keyword == null) {\n            finish()\n            return\n        }\n        supportActionBar?.title = keyword\n\n        val isTag = keyword.startsWith(\"#\")\n        mIsTag = isTag\n\n        val pager = SearchResultViewPagerAdapter(this, pageableFragmentFactory)\n        binding.searchResultPager.adapter = pager\n        tabLayoutMediator = TabLayoutMediator(\n            binding.searchResultTab,\n            binding.searchResultPager,\n        ) { tab, position ->\n            tab.text = pager.items[position].title.getString(this)\n        }\n        tabLayoutMediator?.attach()\n\n\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n\n        invalidateOptionsMenu()\n\n        searchResultViewModel.uiState.onEach {\n            pager.submitList(it.tabItems)\n        }.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED).launchIn(lifecycleScope)\n\n        accountStore.observeCurrentAccount.onEach { ar ->\n            mAccountRelation = ar\n        }.launchIn(lifecycleScope)\n\n    }\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_search_menu, menu)\n        val item = menu.findItem(R.id.nav_search_add_to_tab)\n\n        if (isAddedPage()) {\n            item.setIcon(R.drawable.ic_remove_to_tab_24px)\n        } else {\n            item.setIcon(R.drawable.ic_add_to_tab_24px)\n        }\n        applyMenuTint(this, menu)\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> finish()\n            R.id.search -> {\n                val intent = Intent(this, SearchActivity::class.java)\n                intent.putExtra(SearchActivity.EXTRA_SEARCH_WORD, mSearchWord)\n                startActivity(intent)\n            }\n            R.id.nav_search_add_to_tab -> {\n                searchAddToTab()\n            }\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    private fun searchAddToTab() {\n        searchResultViewModel.toggleAddToTab()\n    }\n\n    private fun isAddedPage(): Boolean {\n        return getSamePage() != null\n    }\n\n    private fun getSamePage(): Page? {\n        return mAccountRelation?.pages?.firstOrNull {\n            when (val pageable = it.pageable()) {\n                is Pageable.Search -> {\n                    pageable.query == mSearchWord\n                }\n                is Pageable.SearchByTag -> {\n                    pageable.tag == mSearchWord\n                }\n                else -> {\n                    false\n                }\n            }\n        }\n    }\n\n    override fun onDestroy() {\n        super.onDestroy()\n\n        tabLayoutMediator?.detach()\n        tabLayoutMediator = null\n    }\n\n\n}\n\nclass SearchNavigationImpl  @Inject constructor(\n    val activity: Activity\n): SearchNavigation {\n    override fun newIntent(args: SearchNavType): Intent {\n        return when(args) {\n            is SearchNavType.ResultScreen -> {\n                val intent = Intent(activity, SearchResultActivity::class.java)\n                intent.putExtra(SearchResultActivity.EXTRA_SEARCH_WORLD, args.searchWord)\n                if (args.acct != null) {\n                    intent.putExtra(SearchResultViewModel.EXTRA_ACCT, args.acct)\n                }\n                if (args.accountId != null) {\n                    intent.putExtra(SearchResultViewModel.EXTRA_ACCOUNT_ID, args.accountId)\n                }\n                intent\n            }\n            is SearchNavType.SearchScreen -> {\n                val intent = Intent(activity, SearchActivity::class.java)\n                if (args.searchWord != null) {\n                    intent.putExtra(SearchActivity.EXTRA_SEARCH_WORD, args.searchWord)\n                }\n                if (args.acct != null) {\n                    intent.putExtra(SearchResultViewModel.EXTRA_ACCT, args.acct)\n                }\n\n                if (args.accountId != null) {\n                    intent.putExtra(SearchViewModel.EXTRA_ACCOUNT_ID, args.accountId)\n                }\n\n                intent\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchResultLayout.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Remove\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.model.search.SearchHistory\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.compose.ItemSimpleUserCard\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun SearchSuggestionsLayout(\n    modifier: Modifier = Modifier,\n    uiState: SearchUiState,\n    onUserSelected: (User) -> Unit,\n    onHashtagSelected: (String) -> Unit,\n    onDeleteSearchHistory: (Long) -> Unit,\n    onSearchHistoryClicked: (SearchHistory) -> Unit\n) {\n    LazyColumn(modifier = modifier.fillMaxSize()) {\n        if (uiState.hashtags.isEmpty() && uiState.users.isEmpty()) {\n            items(uiState.history) { history ->\n                SearchHistoryCard(history = history, onDelete = {\n                    onDeleteSearchHistory(history.id)\n                }, onClick = {\n                    onSearchHistoryClicked(history)\n                })\n            }\n        }\n        items(uiState.hashtags) { hashtag ->\n            Card(\n                modifier = Modifier.fillMaxWidth(),\n                onClick = {\n                    onHashtagSelected(hashtag)\n                }\n            ) {\n                Box(modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp)) {\n                    Text(text = \"#$hashtag\", fontSize = 20.sp)\n                }\n            }\n        }\n        items(uiState.users) { user ->\n            ItemSimpleUserCard(user = user, onSelected = onUserSelected, accountHost = uiState.accountHost)\n        }\n    }\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun SearchHistoryCard(history: SearchHistory, onDelete: () -> Unit, onClick: () -> Unit) {\n    Card(\n        modifier = Modifier.fillMaxWidth(),\n        onClick = onClick,\n    ) {\n        Row(\n            modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Text(history.keyword, fontSize = 20.sp, modifier = Modifier.weight(1f))\n            IconButton(onClick = onDelete) {\n                Icon(\n                    Icons.Default.Remove,\n                    contentDescription = stringResource(id = R.string.remove)\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchResultViewModel.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.PageableTemplate\nimport net.pantasystem.milktea.model.user.Acct\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass SearchResultViewModel @Inject constructor(\n    loggerFactory: Logger.Factory,\n    private val accountStore: AccountStore,\n    private val accountRepository: AccountRepository,\n    private val userRepository: UserRepository,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n    companion object {\n        const val EXTRA_KEYWORD =\n            \"net.pantasystem.milktea.search.SearchResultViewModel.EXTRA_KEYWORD\"\n        const val EXTRA_ACCT = \"net.pantasystem.milktea.search.SearchResultActivity.EXTRA_ACCT\"\n        const val EXTRA_ACCOUNT_ID = \"net.pantasystem.milktea.search.SearchResultActivity.EXTRA_ACCOUNT_ID\"\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"SearchResultVM\")\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val account = savedStateHandle.getStateFlow(EXTRA_ACCOUNT_ID, - 1L).map {\n        it.takeIf { it > 0 }\n    }.flatMapLatest { acId ->\n        accountStore.getOrCurrent(acId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val keyword = savedStateHandle.getStateFlow(EXTRA_KEYWORD, \"\")\n    private val acct = savedStateHandle.getStateFlow<String?>(EXTRA_ACCT, null)\n    private val user = combine(\n        acct,\n        account.filterNotNull()\n    ) { acct, ac ->\n        userRepository.findByUserName(\n            ac.accountId,\n            Acct(acct ?: \"\").userName,\n            Acct(acct ?: \"\").host\n        )\n    }.catch {\n        logger.debug(\"ユーザの情報の取得に失敗\", e = it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val uiState = combine(\n        account,\n        keyword,\n        acct,\n        user\n    ) { currentAccount, keyword, acct, user ->\n        SearchResultUiState(\n            currentAccount = currentAccount,\n            keyword = keyword,\n            acct = acct,\n            user = user\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        SearchResultUiState(null, \"\", null, null)\n    )\n\n    fun setKeyword(q: String) {\n        savedStateHandle[EXTRA_KEYWORD] = q\n    }\n\n    fun setAcct(acct: String?) {\n        savedStateHandle[EXTRA_ACCT] = acct\n    }\n    fun toggleAddToTab() {\n        viewModelScope.launch {\n            val keyword = savedStateHandle.get<String>(EXTRA_KEYWORD) ?: return@launch\n            accountRepository.getCurrentAccount().mapCancellableCatching { account ->\n                val exists = account.pages.firstOrNull {\n                    (it.pageParams.tag == keyword\n                            || it.pageParams.query == keyword)\n                }\n                if (exists == null) {\n                    val page = if (keyword.startsWith(\"#\")) {\n                        PageableTemplate(account).tag(keyword)\n                    } else {\n                        PageableTemplate(account).search(keyword)\n                    }\n                    accountStore.addPage(page)\n                } else {\n                    accountStore.removePage(exists)\n                }\n            }\n        }\n    }\n}\n\ndata class SearchResultUiState(\n    val currentAccount: Account?,\n    val keyword: String,\n    val acct: String?,\n    val user: User?,\n) {\n    val isTag: Boolean = keyword.startsWith(\"#\") && acct == null\n\n    val tabItems: List<SearchResultTabItem> = when (currentAccount?.instanceType) {\n        Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> listOfNotNull(\n            if (isTag) {\n                SearchResultTabItem(\n                    title = StringSource(R.string.timeline),\n                    type = SearchResultTabItem.Type.SearchMisskeyPostsByTag,\n                    query = keyword.replace(\"#\", \"\")\n                )\n            } else {\n                SearchResultTabItem(\n                    title = StringSource(R.string.timeline),\n                    type = SearchResultTabItem.Type.SearchMisskeyPosts,\n                    query = keyword,\n                    userId = user?.id?.id,\n                )\n            },\n            if (isTag) SearchResultTabItem(\n                title = StringSource(R.string.media),\n                type = SearchResultTabItem.Type.SearchMisskeyPostsWithFilesByTag,\n                query = keyword.replace(\"#\", \"\")\n            ) else null,\n            SearchResultTabItem(\n                title = StringSource(R.string.user),\n                type = SearchResultTabItem.Type.SearchMisskeyUsers,\n                query = keyword,\n                userId = user?.id?.id,\n            )\n        )\n        Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> listOfNotNull(\n            if (isTag) {\n                SearchResultTabItem(\n                    title = StringSource(R.string.timeline),\n                    type = SearchResultTabItem.Type.SearchMastodonPostsByTag,\n                    query = keyword.replace(\"#\", \"\"),\n                )\n            } else {\n                SearchResultTabItem(\n                    title = StringSource(R.string.timeline),\n                    type = SearchResultTabItem.Type.SearchMastodonPosts,\n                    query = keyword,\n                    userId = user?.id?.id,\n                )\n            },\n            SearchResultTabItem(\n                title = StringSource(R.string.user),\n                type = SearchResultTabItem.Type.SearchMastodonUsers,\n                query = keyword,\n            )\n\n        )\n        null -> emptyList()\n    }\n}\n\ndata class SearchResultTabItem(\n    val title: StringSource,\n    val type: Type,\n    val query: String,\n    val userId: String? = null,\n) {\n    enum class Type {\n        SearchMisskeyPosts,\n        SearchMisskeyPostsByTag,\n        SearchMisskeyPostsWithFilesByTag,\n        SearchMisskeyUsers,\n        SearchMastodonPosts,\n        SearchMastodonPostsByTag,\n        SearchMastodonUsers,\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchResultViewPagerAdapter.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.user.search.SearchUserFragment\n\n\nclass SearchResultViewPagerAdapter(\n    activity: FragmentActivity,\n    private val pageableFragmentFactory: PageableFragmentFactory,\n) : FragmentStateAdapter(activity) {\n\n    var items: List<SearchResultTabItem> = emptyList()\n        private set\n\n\n    override fun createFragment(position: Int): Fragment {\n        val item = items[position]\n        return when (item.type) {\n            SearchResultTabItem.Type.SearchMisskeyPosts -> pageableFragmentFactory.create(\n                Pageable.Search(query = item.query, userId = item.userId)\n            )\n            SearchResultTabItem.Type.SearchMisskeyPostsByTag -> pageableFragmentFactory.create(\n                Pageable.SearchByTag(tag = item.query)\n            )\n            SearchResultTabItem.Type.SearchMisskeyPostsWithFilesByTag -> pageableFragmentFactory.create(\n                Pageable.SearchByTag(tag = item.query, withFiles = true)\n            )\n            SearchResultTabItem.Type.SearchMisskeyUsers -> SearchUserFragment.newInstance(item.query)\n            SearchResultTabItem.Type.SearchMastodonPosts -> pageableFragmentFactory.create(\n                Pageable.Mastodon.SearchTimeline(\n                    item.query,\n                    userId = item.userId\n                )\n            )\n            SearchResultTabItem.Type.SearchMastodonPostsByTag -> pageableFragmentFactory.create(\n                Pageable.Mastodon.HashTagTimeline(item.query)\n            )\n            SearchResultTabItem.Type.SearchMastodonUsers -> SearchUserFragment.newInstance(item.query)\n        }\n    }\n\n    override fun getItemCount(): Int {\n        return items.size\n    }\n\n    fun submitList(list: List<SearchResultTabItem>) {\n        val old = items\n        items = list\n        val callback = object : DiffUtil.Callback() {\n            override fun getNewListSize(): Int {\n                return list.size\n            }\n\n            override fun getOldListSize(): Int {\n                return old.size\n            }\n\n            override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n\n            override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n        }\n        val result = DiffUtil.calculateDiff(callback)\n        result.dispatchUpdatesTo(this)\n    }\n\n    override fun getItemId(position: Int): Long {\n        return items[position].hashCode().toLong()\n    }\n\n    override fun containsItem(itemId: Long): Boolean {\n        return items.map {\n            it.hashCode().toLong()\n        }.contains(itemId)\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchTopFragment.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.view.View\nimport androidx.core.view.MenuHost\nimport androidx.core.view.MenuProvider\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport com.google.android.material.tabs.TabLayoutMediator\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.ToolbarSetter\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.search.databinding.FragmentSearchTopBinding\nimport net.pantasystem.milktea.search.explore.ExploreFragment\nimport net.pantasystem.milktea.search.explore.ExploreType\nimport net.pantasystem.milktea.search.trend.TrendFragment\nimport javax.inject.Inject\n\n\n@FlowPreview\n@ExperimentalCoroutinesApi\n@AndroidEntryPoint\nclass SearchTopFragment : Fragment(R.layout.fragment_search_top) {\n\n    private val mBinding: FragmentSearchTopBinding by dataBinding()\n\n    @Inject\n    internal lateinit var applyMenuTint: ApplyMenuTint\n\n    @Inject\n    internal lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    val viewModel: SearchTopViewModel by viewModels()\n\n    private var tabLayoutMediator: TabLayoutMediator? = null\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        val adapter = SearchPagerAdapterV2(pageableFragmentFactory, this)\n\n        mBinding.searchViewPager.adapter = adapter\n        tabLayoutMediator = TabLayoutMediator(\n            mBinding.searchTabLayout,\n            mBinding.searchViewPager\n        ) { tab, position ->\n            tab.text = adapter.tabs[position].title.getString(requireContext())\n        }\n        tabLayoutMediator?.attach()\n\n        (requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {\n            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n                menuInflater.inflate(R.menu.search_top_menu, menu)\n                applyMenuTint(requireActivity(), menu)\n            }\n\n            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n                when (menuItem.itemId) {\n                    //R.id.search ->\n                    R.id.search -> {\n                        activity?.startActivity(\n                            Intent(\n                                requireContext(),\n                                SearchActivity::class.java\n                            )\n                        )\n                        activity?.overridePendingTransition(0, 0)\n                        return true\n                    }\n                }\n                return false\n            }\n        }, viewLifecycleOwner, Lifecycle.State.RESUMED)\n\n        viewModel.uiState.onEach {\n            adapter.submitList(it.tabItems)\n        }.flowWithLifecycle(viewLifecycleOwner.lifecycle).launchIn(viewLifecycleOwner.lifecycleScope)\n    }\n\n\n    override fun onResume() {\n        super.onResume()\n\n        (requireActivity() as? ToolbarSetter)?.apply {\n            setToolbar(mBinding.toolbar)\n            setTitle(R.string.search)\n        }\n    }\n\n    override fun onDestroyView() {\n        super.onDestroyView()\n\n        tabLayoutMediator?.detach()\n        tabLayoutMediator = null\n    }\n\n}\n\nclass SearchPagerAdapterV2(\n    private val pageableFragmentFactory: PageableFragmentFactory,\n    fragment: Fragment\n) : FragmentStateAdapter(fragment) {\n\n    var tabs: List<SearchTopTabItem> = emptyList()\n        private set\n\n    override fun getItemCount(): Int {\n        return tabs.size\n    }\n\n    override fun createFragment(position: Int): Fragment {\n        val item = tabs[position]\n        return when(item.type) {\n            SearchTopTabItem.TabType.MisskeyFeatured -> pageableFragmentFactory.create(Pageable.Featured(null))\n            SearchTopTabItem.TabType.MastodonTrends ->  pageableFragmentFactory.create(Pageable.Mastodon.TrendTimeline)\n            SearchTopTabItem.TabType.MisskeyExploreUsers -> ExploreFragment.newInstance(ExploreType.Local)\n            SearchTopTabItem.TabType.MisskeyExploreFediverseUsers -> ExploreFragment.newInstance(ExploreType.Fediverse)\n            SearchTopTabItem.TabType.MastodonUserSuggestions -> ExploreFragment.newInstance(ExploreType.MastodonUserSuggestions)\n            SearchTopTabItem.TabType.UserSuggestionByReaction -> ExploreFragment.newInstance(ExploreType.UserSuggestionsByReaction)\n            SearchTopTabItem.TabType.HashtagTrend -> TrendFragment()\n        }\n    }\n\n    fun submitList(list: List<SearchTopTabItem>) {\n        val old = tabs\n        tabs = list\n        val callback = object : DiffUtil.Callback() {\n            override fun getOldListSize(): Int {\n                return old.size\n            }\n\n            override fun getNewListSize(): Int {\n                return list.size\n            }\n\n            override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n\n            override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n        }\n        val result = DiffUtil.calculateDiff(callback)\n        result.dispatchUpdatesTo(this)\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchTopTabsFactory.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\n\nclass SearchTopTabsFactory @Inject constructor() {\n\n    fun create(account: Account?): List<SearchTopTabItem> {\n        return when(account?.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                listOf(\n                    SearchTopTabItem(\n                        StringSource(R.string.title_featured),\n                        SearchTopTabItem.TabType.MisskeyFeatured,\n                    ),\n                    SearchTopTabItem(\n                        StringSource(R.string.explore),\n                        SearchTopTabItem.TabType.MisskeyExploreUsers,\n                    ),\n                    SearchTopTabItem(\n                        StringSource(R.string.explore_fediverse),\n                        SearchTopTabItem.TabType.MisskeyExploreFediverseUsers,\n                    ),\n                    SearchTopTabItem(\n                        StringSource(R.string.suggestion_users),\n                        SearchTopTabItem.TabType.UserSuggestionByReaction,\n                    ),\n                    SearchTopTabItem(\n                        StringSource(R.string.trending_tag),\n                        SearchTopTabItem.TabType.HashtagTrend,\n                    )\n                )\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                listOf(\n                    SearchTopTabItem(\n                        StringSource(R.string.title_featured),\n                        SearchTopTabItem.TabType.MastodonTrends,\n                    ),\n                    SearchTopTabItem(\n                        StringSource(R.string.suggestion_users),\n                        SearchTopTabItem.TabType.MastodonUserSuggestions,\n                    ),\n                    SearchTopTabItem(\n                        StringSource(R.string.trending_tag),\n                        SearchTopTabItem.TabType.HashtagTrend,\n                    )\n                )\n            }\n            null -> emptyList()\n        }\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchTopViewModel.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport javax.inject.Inject\n\n@HiltViewModel\nclass SearchTopViewModel @Inject constructor(\n    accountStore: AccountStore,\n    private val searchTopTabsFactory: SearchTopTabsFactory,\n) : ViewModel() {\n    private val currentAccount = accountStore.observeCurrentAccount.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null\n    )\n\n    val uiState = currentAccount.map {\n        SearchTopUiState(\n            currentAccount = it,\n            tabItems = searchTopTabsFactory.create(it)\n        )\n    }\n\n}\n\ndata class SearchTopUiState(\n    val currentAccount: Account?,\n    val tabItems: List<SearchTopTabItem>,\n)\n\ndata class SearchTopTabItem(\n    val title: StringSource,\n    val type: TabType,\n) {\n    enum class TabType {\n        MisskeyFeatured,\n        MastodonTrends,\n        MastodonUserSuggestions,\n        MisskeyExploreUsers,\n        MisskeyExploreFediverseUsers,\n        UserSuggestionByReaction,\n        HashtagTrend,\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/SearchViewModel.kt",
    "content": "package net.pantasystem.milktea.search\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.common.text.UrlPatternChecker\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.CurrentAccountWatcher\nimport net.pantasystem.milktea.model.ap.ApResolver\nimport net.pantasystem.milktea.model.ap.ApResolverRepository\nimport net.pantasystem.milktea.model.hashtag.HashtagRepository\nimport net.pantasystem.milktea.model.search.SearchHistory\nimport net.pantasystem.milktea.model.search.SearchHistoryRepository\nimport net.pantasystem.milktea.model.user.Acct\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass SearchViewModel @Inject constructor(\n    loggerFactory: Logger.Factory,\n    accountRepository: AccountRepository,\n    private val userRepository: UserRepository,\n    private val hashtagRepository: HashtagRepository,\n    private val searchHistoryRepository: SearchHistoryRepository,\n    private val apResolverRepository: ApResolverRepository,\n    private val savedStateHandle: SavedStateHandle\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_ACCOUNT_ID = \"net.pantasystem.milktea.search.SearchViewModel.EXTRA_ACCOUNT_ID\"\n    }\n    private val logger by lazy {\n        loggerFactory.create(\"SearchViewModel\")\n    }\n\n    val keyword = savedStateHandle.getStateFlow<String>(\"keyword\", \"\")\n    private val currentAccountWatcher = CurrentAccountWatcher(savedStateHandle[EXTRA_ACCOUNT_ID], accountRepository)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val hashtagResult = keyword.filter {\n        it.isHashTagFormat()\n    }.map {\n        it.substring(1, it.length)\n    }.flatMapLatest {\n        suspend {\n            hashtagRepository.search(\n                currentAccountWatcher.getAccount().accountId,\n                it\n            ).getOrThrow()\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState(),\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val searchUserResult = keyword.filterNot {\n        it.isHashTagFormat()\n    }.flatMapLatest {\n        suspend {\n            userRepository.syncByUserName(\n                currentAccountWatcher.getAccount().accountId,\n                Acct(it).userName,\n                Acct(it).host\n            )\n            userRepository.searchByNameOrUserName(currentAccountWatcher.getAccount().accountId, it)\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState(),\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val users = searchUserResult.map {\n        (it.content as? StateContent.Exist)?.rawContent ?: emptyList()\n    }.flatMapLatest { users ->\n        val ids = users.map { it.id.id }\n        userRepository.observeIn(currentAccountWatcher.getAccount().accountId, ids)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val searchHistories = suspend {\n        currentAccountWatcher.getAccount()\n    }.asFlow().flatMapLatest {\n        searchHistoryRepository.observeBy(it.accountId, limit = 10)\n    }.catch {\n        logger.error(\"fetch search histories failed\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    private val states = combine(hashtagResult, searchUserResult) { h, s ->\n        States(\n            hashtagsState = h,\n            searchUserState = s,\n        )\n    }.stateIn(\n        viewModelScope, SharingStarted.WhileSubscribed(5_000), States(\n            searchUserState = searchUserResult.value,\n            hashtagsState = hashtagResult.value,\n        )\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val account = currentAccountWatcher.account.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null\n    )\n\n    val uiState = combine(\n        keyword,\n        states,\n        searchHistories,\n        account,\n        users\n    ) { keyword, states, histories, a, users ->\n        SearchUiState(\n            keyword,\n            (states.hashtagsState.content as? StateContent.Exist)?.rawContent ?: emptyList(),\n            users,\n            histories,\n            searchUserState = states.searchUserState,\n            hashtagsState = states.hashtagsState,\n            accountHost = a?.getHost()\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        SearchUiState(keyword.value,)\n    )\n\n    fun onInputKeyword(word: String) {\n        savedStateHandle[\"keyword\"] = word\n    }\n\n    suspend fun onQueryTextSubmit(word: String): SubmitResult {\n        if (word.isBlank()) {\n            return SubmitResult.Cancelled\n        }\n        val accountId = currentAccountWatcher.getAccount().accountId\n        runCancellableCatching {\n            searchHistoryRepository.add(\n                SearchHistory(\n                    accountId = accountId,\n                    keyword = word,\n                )\n            ).getOrThrow()\n        }.onFailure {\n            logger.error(\"検索履歴の保存に失敗\", it)\n        }\n        if (!UrlPatternChecker.isMatch(word)) {\n            return SubmitResult.Search(word)\n        }\n\n        return apResolverRepository.resolve(accountId, word).fold(\n            onSuccess = {\n                SubmitResult.ApResolved(it)\n            },\n            onFailure = {\n                SubmitResult.Search(word)\n            }\n        )\n    }\n\n    fun deleteSearchHistory(id: Long) = viewModelScope.launch {\n        searchHistoryRepository.delete(id).onFailure {\n            logger.error(\"検索履歴の削除に失敗\", it)\n        }\n    }\n}\n\ndata class SearchUiState(\n    val keyword: String = \"\",\n    val hashtags: List<String> = emptyList(),\n    val users: List<User> = emptyList(),\n    val history: List<SearchHistory> = emptyList(),\n    val searchUserState: ResultState<List<User>> = ResultState.initialState(),\n    val hashtagsState: ResultState<List<String>> = ResultState.initialState(),\n    val accountHost: String? = null,\n)\n\nprivate data class States(\n    val searchUserState: ResultState<List<User>>,\n    val hashtagsState: ResultState<List<String>>,\n)\n\nsealed interface SubmitResult {\n    data class Search(val query: String) : SubmitResult\n\n    data class ApResolved(val apResolve: ApResolver) : SubmitResult\n\n    object Cancelled : SubmitResult\n}\nprivate fun String.isHashTagFormat(): Boolean {\n    return startsWith(\"#\") && length > 1\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/explore/ExploreFragment.kt",
    "content": "package net.pantasystem.milktea.search.explore\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport getStringFromStringSource\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.user.UserCardActionHandler\nimport net.pantasystem.milktea.user.compose.UserDetailCard\nimport net.pantasystem.milktea.user.compose.UserDetailCardAction\nimport net.pantasystem.milktea.user.viewmodel.ToggleFollowViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ExploreFragment : Fragment() {\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val exploreViewModel: ExploreViewModel by viewModels()\n    private val toggleFollowViewModel: ToggleFollowViewModel by viewModels()\n\n    companion object {\n        fun newInstance(type: ExploreType): ExploreFragment {\n            return ExploreFragment().apply {\n                arguments = Bundle().apply {\n                    putInt(\"type\", type.ordinal)\n                }\n            }\n        }\n    }\n\n\n    @OptIn(ExperimentalFoundationApi::class, ExperimentalComposeUiApi::class)\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        return ComposeView(requireContext()).apply {\n            setContent {\n                val uiState by exploreViewModel.uiState.collectAsState()\n                val account by exploreViewModel.account.collectAsState()\n\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    LazyColumn(\n                        modifier = Modifier\n                            .fillMaxSize()\n                            .nestedScroll(rememberNestedScrollInteropConnection())\n                    ) {\n                        for(item in uiState.states) {\n                            stickyHeader {\n                                Surface(\n                                    modifier = Modifier\n                                        .fillMaxWidth()\n                                ) {\n                                    Text(\n                                        getStringFromStringSource(item.title),\n                                        fontSize = 16.sp,\n                                        modifier = Modifier.padding(4.dp)\n                                    )\n                                }\n                            }\n                            when(val content = item.loadingState.content) {\n                                is StateContent.Exist -> {\n                                    items(content.rawContent.size) { i ->\n                                        UserDetailCard(\n                                            userDetail = content.rawContent[i],\n                                            isUserNameMain = false,\n                                            accountHost = account?.getHost(),\n                                            myId = account?.remoteId,\n                                            onAction = ::onAction\n                                        )\n                                    }\n                                }\n                                is StateContent.NotExist -> {\n                                    item {\n                                        Column(\n                                            modifier = Modifier.fillMaxWidth(),\n                                            horizontalAlignment = Alignment.CenterHorizontally,\n                                            verticalArrangement = Arrangement.Center\n                                        ) {\n                                            when(val state = item.loadingState) {\n                                                is ResultState.Error -> {\n                                                    Text(\"load error\")\n                                                    Text(state.throwable.toString())\n                                                }\n                                                is ResultState.Fixed -> Text(\"no users\")\n                                                is ResultState.Loading -> CircularProgressIndicator()\n                                            }\n                                        }\n\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }.rootView\n    }\n\n\n    fun onAction(event: UserDetailCardAction) {\n        UserCardActionHandler(requireActivity(), toggleFollowViewModel)\n            .onAction(event)\n    }\n}\n\nenum class ExploreType {\n    Local, Fediverse, MastodonUserSuggestions, UserSuggestionsByReaction\n}\n\n"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/explore/ExploreViewModel.kt",
    "content": "package net.pantasystem.milktea.search.explore\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.model.user.query.*\nimport net.pantasystem.milktea.search.R\nimport javax.inject.Inject\n\n\n@OptIn(ExperimentalCoroutinesApi::class)\n@HiltViewModel\nclass ExploreViewModel @Inject constructor(\n    val accountStore: AccountStore,\n    val userDataSource: UserDataSource,\n    val userRepository: UserRepository,\n    loggerFactory: Logger.Factory,\n    savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n    val logger = loggerFactory.create(\"ExploreViewModel\")\n\n    private val type = savedStateHandle.getStateFlow(\"type\", ExploreType.Local.ordinal).map {\n        ExploreType.values()[it]\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), ExploreType.Local)\n\n    private val findUsers = type.map {\n        when(it) {\n            ExploreType.Local -> {\n                listOf(\n                    ExploreItem(\n                        StringSource(R.string.trending_users),\n                        FindUsersQuery4Misskey.trendingUser(),\n                    ),\n                    ExploreItem(\n                        StringSource(R.string.users_with_recent_activity),\n                        FindUsersQuery4Misskey.usersWithRecentActivity(),\n                    ),\n                    ExploreItem(\n                        StringSource(R.string.newly_joined_users),\n                        FindUsersQuery4Misskey.newlyJoinedUsers()\n                    )\n\n                )\n            }\n            ExploreType.Fediverse -> {\n                listOf(\n                    ExploreItem(\n                        StringSource(R.string.trending_users),\n                        FindUsersQuery4Misskey.remoteTrendingUser()\n                    ),\n                    ExploreItem(\n                        StringSource(R.string.users_with_recent_activity),\n                        FindUsersQuery4Misskey.remoteUsersWithRecentActivity(),\n                    ),\n                    ExploreItem(\n                        StringSource(R.string.newly_discovered_users),\n                        FindUsersQuery4Misskey.newlyDiscoveredUsers()\n                    ),\n                )\n            }\n            ExploreType.MastodonUserSuggestions -> {\n                listOf(\n                    ExploreItem(\n                        StringSource(R.string.suggestion_users),\n                        FindUsersQuery4Mastodon.SuggestUsers()\n                    )\n                )\n            }\n            ExploreType.UserSuggestionsByReaction -> {\n                listOf(\n                    ExploreItem(\n                        StringSource(R.string.suggestion_users),\n                        FindUsersFromFrequentlyReactionUsers,\n                    )\n                )\n            }\n        }\n    }\n\n    private val rawLoadingStates =\n        accountStore.observeCurrentAccount.filterNotNull().flatMapLatest { ac ->\n            findUsers.map { list ->\n                list.map {\n                    it to suspend {\n                        it to userRepository.findUsers(ac.accountId, it.findUsersQuery)\n                    }.asLoadingStateFlow()\n                }\n            }\n        }.flatMapLatest { exploreItems ->\n            combine(exploreItems.map { it.second }) { states ->\n                states.toList()\n            }.map { list ->\n                list.mapIndexed { index, resultState ->\n                    val exploreItem = exploreItems[index].first\n                    ExploreResultState(\n                        findUsersQuery = exploreItem.findUsersQuery,\n                        loadingState = resultState.suspendConvert {\n                            it.second.map { user ->\n                                user.id\n                            }\n                        },\n                        title = exploreItem.title,\n                    )\n                }\n            }\n        }.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())\n\n    val uiState = rawLoadingStates.map { list ->\n        list.map { state ->\n            val rawContent = (state.loadingState.content as? StateContent.Exist)\n                ?.rawContent ?: emptyList()\n            state to userDataSource.observeIn(accountStore.currentAccountId!!, rawContent.map {\n                it.id\n            }).mapNotNull { users ->\n                users.mapNotNull {\n                    it as? User.Detail?\n                }\n            }\n        }\n    }.map { statePair ->\n        val flows = statePair.map { pair ->\n            pair.second\n        }\n        combine(flows) { users ->\n            users.mapIndexed { index, list ->\n                val explore = statePair[index].first\n                ExploreItemState(\n                    title = explore.title,\n                    loadingState = explore.loadingState.convert {\n                        list\n                    },\n                    findUsersQuery = explore.findUsersQuery\n                )\n            }\n        }\n    }.flatMapLatest { flow ->\n        flow.map {\n            ExploreUiState(it)\n        }\n    }.catch { e ->\n        logger.error(\"get explores error\", e)\n    }.distinctUntilChanged()\n        .stateIn(viewModelScope, SharingStarted.Lazily, ExploreUiState(emptyList()))\n\n\n    val account = accountStore.observeCurrentAccount.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n}\n\ndata class ExploreItem(\n    val title: StringSource,\n    val findUsersQuery: FindUsersQuery,\n)\n\ndata class ExploreItemState(\n    val title: StringSource,\n    val findUsersQuery: FindUsersQuery,\n    val loadingState: ResultState<List<User.Detail>>\n)\n\ndata class ExploreResultState(\n    val title: StringSource,\n    val findUsersQuery: FindUsersQuery,\n    val loadingState: ResultState<List<User.Id>>\n)\n\ndata class ExploreUiState(\n    val states: List<ExploreItemState>,\n)"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/trend/HashtagTrendItem.kt",
    "content": "package net.pantasystem.milktea.search.trend\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.model.hashtag.HashTag\nimport net.pantasystem.milktea.search.R\n\n@Composable\nfun HashtagTrendItem(\n    hashtag: HashTag,\n    onClick: () -> Unit,\n) {\n\n    Surface(\n        Modifier\n            .fillMaxWidth()\n            .clickable {\n                onClick()\n            }\n    ) {\n        Column(\n            Modifier\n                .fillMaxWidth()\n                .padding(\n                    vertical = 12.dp,\n                    horizontal = 14.dp\n                )\n        ) {\n            Text(\n                \"#${hashtag.name}\",\n                fontSize = 18.sp,\n                fontWeight = FontWeight.Bold\n            )\n            Text(stringResource(id = R.string.trend_posted_person_count_msg, hashtag.usersCount))\n        }\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/trend/TrendFragment.kt",
    "content": "package net.pantasystem.milktea.search.trend\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.unit.dp\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.SearchNavType\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass TrendFragment : Fragment() {\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    lateinit var searchNavigation: SearchNavigation\n\n    private val viewModel by viewModels<TrendViewModel>()\n\n    @OptIn(ExperimentalComposeUiApi::class)\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?,\n    ): View {\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val uiState by viewModel.uiState.collectAsState()\n                    LazyColumn(\n                        modifier = Modifier\n                            .fillMaxSize()\n                            .nestedScroll(rememberNestedScrollInteropConnection())\n                    ) {\n                        when (val content = uiState.trendTags.content) {\n                            is StateContent.Exist -> {\n                                items(content.rawContent.size) { index ->\n                                    val item = content.rawContent[index]\n                                    HashtagTrendItem(hashtag = item, onClick = {\n                                        requireActivity().startActivity(\n                                            searchNavigation.newIntent(\n                                                SearchNavType.ResultScreen(\n                                                    \"#${item.name}\"\n                                                )\n                                            )\n                                        )\n                                    })\n                                }\n                            }\n                            is StateContent.NotExist -> {\n                                item {\n                                    Box(\n                                        Modifier\n                                            .fillMaxWidth()\n                                            .padding(vertical = 12.dp, horizontal = 14.dp),\n                                        contentAlignment = Alignment.Center\n                                    ) {\n                                        when (val state = uiState.trendTags) {\n                                            is ResultState.Error -> Text(\"Error:${state.throwable}\")\n                                            is ResultState.Fixed -> Text(\"トレンドはありません\")\n                                            is ResultState.Loading -> CircularProgressIndicator()\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/search/src/main/java/net/pantasystem/milktea/search/trend/TrendViewModel.kt",
    "content": "package net.pantasystem.milktea.search.trend\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.hashtag.HashTag\nimport net.pantasystem.milktea.model.hashtag.HashtagRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass TrendViewModel @Inject constructor(\n    val accountStore: AccountStore,\n    val hashtagRepository: HashtagRepository,\n) : ViewModel() {\n    private val currentAccount = accountStore.observeCurrentAccount.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null,\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val trends = currentAccount.filterNotNull().flatMapLatest {\n        suspend {\n            hashtagRepository.trends(it.accountId).getOrThrow()\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState(),\n    )\n\n    val uiState = combine(currentAccount, trends) { ca, t ->\n        TrendUiState(\n            currentAccount = ca,\n            trendTags = t\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        TrendUiState(\n            null,\n            ResultState.initialState(),\n        )\n    )\n\n}\n\ndata class TrendUiState(\n    val currentAccount: Account?,\n    val trendTags: ResultState<List<HashTag>>,\n)"
  },
  {
    "path": "modules/features/search/src/main/res/layout/activity_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.search.SearchActivity\">\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/search_toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\" />\n\n        <androidx.compose.ui.platform.ComposeView\n                android:id=\"@+id/composeBase\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/search_toolbar\" />\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/search/src/main/res/layout/activity_search_result.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.search.SearchResultActivity\">\n\n        <com.google.android.material.appbar.AppBarLayout\n                android:id=\"@+id/searchResultAppBar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:stateListAnimator=\"@null\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                >\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/search_result_toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:minHeight=\"?attr/actionBarSize\"\n                    />\n        </com.google.android.material.appbar.AppBarLayout>\n\n        <com.google.android.material.tabs.TabLayout\n                android:id=\"@+id/searchResultTab\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintTop_toBottomOf=\"@id/searchResultAppBar\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                />\n        <androidx.viewpager2.widget.ViewPager2\n                android:id=\"@+id/searchResultPager\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/searchResultTab\"/>\n\n\n\n\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/search/src/main/res/layout/fragment_search_top.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n        <com.google.android.material.appbar.AppBarLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:fitsSystemWindows=\"true\"\n                android:stateListAnimator=\"@null\"\n                android:id=\"@+id/appBar\"\n                android:background=\"?attr/colorSurface\"\n                >\n            <androidx.appcompat.widget.Toolbar\n                    android:id=\"@+id/toolbar\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    app:layout_scrollFlags=\"scroll|enterAlways\"\n                    android:elevation=\"0dp\"\n                    />\n        </com.google.android.material.appbar.AppBarLayout>\n        <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n                android:orientation=\"vertical\">\n\n\n\n            <com.google.android.material.tabs.TabLayout\n                    android:id=\"@+id/search_tab_layout\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"?attr/actionBarSize\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:tabMode=\"scrollable\"\n                    app:tabGravity=\"fill\"\n                    >\n\n\n            </com.google.android.material.tabs.TabLayout>\n\n            <androidx.viewpager2.widget.ViewPager2\n                    android:id=\"@+id/search_view_pager\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toBottomOf=\"@+id/search_tab_layout\" />\n        </LinearLayout>\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n\n</layout>\n"
  },
  {
    "path": "modules/features/setting/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/setting/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id('kotlin-kapt')\n    id('dagger.hilt.android.plugin')\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n\n    buildFeatures {\n        compose true\n        dataBinding true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.setting'\n}\n\ndependencies {\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'\n    implementation libs.androidx.constraintlayout\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_navigation')\n\n\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.lifecycle.livedata\n    implementation libs.activity.ktx\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n\n\n    implementation libs.kotlin.datetime\n\n    implementation libs.wada811.databinding\n    implementation libs.fragment.ktx\n\n    implementation 'com.google.android.gms:play-services-oss-licenses:17.0.1'\n\n    implementation libs.flexbox\n    implementation libs.recyclerview\n    implementation libs.retrofit\n    implementation libs.kotlin.serialization\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/setting/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/setting/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/setting/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application>\n        <activity\n            android:name=\".activities.CacheSettingActivity\"\n            android:exported=\"false\" />\n        <activity\n            android:name=\".activities.AboutMilkteaActivity\"\n            android:exported=\"false\" />\n        <activity\n            android:name=\".activities.RenoteMuteSettingActivity\"\n            android:exported=\"false\" />\n        <activity\n            android:name=\".activities.AccountSettingActivity\"\n            android:exported=\"false\">\n            <meta-data\n                android:name=\"android.app.lib_name\"\n                android:value=\"\" />\n        </activity>\n        <activity\n            android:name=\".activities.ImportReactionFromWebViewActivity\"\n            android:exported=\"false\">\n            <meta-data\n                android:name=\"android.app.lib_name\"\n                android:value=\"\" />\n        </activity>\n        <activity\n            android:name=\".activities.ClientWordFilterSettingActivity\"\n            android:exported=\"false\" />\n        <activity\n            android:name=\".activities.DeveloperSettingActivity\"\n            android:exported=\"false\" />\n    </application>\n\n</manifest>"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/EditTabSettingDialog.kt",
    "content": "package net.pantasystem.milktea.setting\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.core.view.isVisible\nimport androidx.databinding.DataBindingUtil\nimport androidx.fragment.app.activityViewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.model.account.page.CanExcludeIfExistsSensitiveMedia\nimport net.pantasystem.milktea.model.account.page.CanExcludeReplies\nimport net.pantasystem.milktea.model.account.page.CanExcludeReposts\nimport net.pantasystem.milktea.model.account.page.CanOnlyMedia\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.account.page.UntilPaginate\nimport net.pantasystem.milktea.setting.databinding.DialogEditTabNameBinding\nimport net.pantasystem.milktea.setting.viewmodel.page.PageSettingViewModel\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass EditTabSettingDialog : AppCompatDialogFragment(){\n\n    companion object {\n        const val FRAGMENT_TAG = \"EditTabSettingDialog\"\n        fun newInstance(page: Page): EditTabSettingDialog {\n            return EditTabSettingDialog().apply {\n                arguments = Bundle().apply {\n                    putSerializable(\"page\", page)\n                }\n            }\n        }\n    }\n\n    private val pageSettingViewModel: PageSettingViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n        val view = View.inflate(requireContext(), R.layout.dialog_edit_tab_name, null)\n        val binding = DataBindingUtil.bind<DialogEditTabNameBinding>(view)\n        requireNotNull(binding)\n        dialog.setContentView(view)\n\n        val page = requireArguments().getSerializable(\"page\") as? Page\n        if(page == null){\n            dismiss()\n            return dialog\n        }\n        binding.editTabName.setText(page.title)\n\n         when(val pageable = page.pageable()) {\n            is CanOnlyMedia<*> -> {\n                binding.toggleOnlyMedia.isVisible = true\n                binding.toggleOnlyMedia.isChecked = pageable.getOnlyMedia()\n            }\n            else -> {\n                binding.toggleOnlyMedia.isVisible = false\n            }\n        }\n\n        if (page.pageable() is UntilPaginate) {\n            binding.toggleSavePagePosition.isVisible = true\n            binding.toggleSavePagePosition.isChecked = page.isSavePagePosition\n        } else {\n            binding.toggleSavePagePosition.isVisible = false\n        }\n\n\n        if (page.pageable() is CanExcludeReposts<*>) {\n            binding.toggleExcludeReposts.isVisible = true\n            binding.toggleExcludeReposts.isChecked = page.pageParams.excludeReposts ?: false\n        } else {\n            binding.toggleExcludeReposts.isVisible = false\n        }\n\n        if (page.pageable() is CanExcludeReplies<*>) {\n            binding.toggleExcludeReplies.isVisible = true\n            binding.toggleExcludeReplies.isChecked = page.pageParams.excludeReplies ?: false\n        } else {\n            binding.toggleExcludeReplies.isVisible = false\n        }\n\n        if (page.pageable() is CanExcludeIfExistsSensitiveMedia<*>) {\n            binding.toggleExcludeIfExistsSensitiveMedia.isVisible = true\n            binding.toggleExcludeIfExistsSensitiveMedia.isChecked = page.pageParams.excludeIfExistsSensitiveMedia ?: false\n        } else {\n            binding.toggleExcludeIfExistsSensitiveMedia.isVisible = false\n        }\n\n        binding.okButton.setOnClickListener {\n            val name = binding.editTabName.text?.toString()\n            if(name?.isNotBlank() == true){\n                var target = page.copy(\n                    isSavePagePosition = binding.toggleSavePagePosition.isChecked\n                )\n                when(val pageable = target.pageable()) {\n                    is CanOnlyMedia<*> -> {\n                        target = target.copy(\n                            pageParams = (pageable.setOnlyMedia(binding.toggleOnlyMedia.isChecked) as Pageable).toParams()\n                        )\n                    }\n                    else -> Unit\n                }\n                when(val pageable = target.pageable()) {\n                    is CanExcludeReplies<*> -> {\n                        target = target.copy(\n                            pageParams = (pageable.setExcludeReplies(binding.toggleExcludeReplies.isChecked) as Pageable).toParams()\n                        )\n                    }\n                    else -> Unit\n                }\n\n                when(val pageable = target.pageable()) {\n                    is CanExcludeReposts<*> -> {\n                        target = target.copy(\n                            pageParams = (pageable.setExcludeReposts(binding.toggleExcludeReposts.isChecked) as Pageable).toParams()\n                        )\n                    }\n                    else -> Unit\n                }\n                when(val pageable = target.pageable()) {\n                    is CanExcludeIfExistsSensitiveMedia<*> -> {\n                        target = target.copy(\n                            pageParams = (pageable.setExcludeIfExistsSensitiveMedia(binding.toggleExcludeIfExistsSensitiveMedia.isChecked) as Pageable).toParams()\n                        )\n                    }\n                    else -> Unit\n                }\n                val updated = target.copy(title = name)\n                pageSettingViewModel.updatePage(updated)\n                pageSettingViewModel.save()\n            }\n            dismiss()\n        }\n        binding.cancelButton.setOnClickListener{\n            dismiss()\n        }\n        return dialog\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/PageSettingActionDialog.kt",
    "content": "package net.pantasystem.milktea.setting\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.View\nimport androidx.databinding.DataBindingUtil\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.setting.databinding.DialogPageSettingActionBinding\nimport net.pantasystem.milktea.setting.viewmodel.page.PageSettingViewModel\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass PageSettingActionDialog : BottomSheetDialogFragment(){\n\n    companion object {\n        const val FRAGMENT_TAG = \"PageSettingActionDialog\"\n        private const val PAGE = \"PageSettingActionDialog.page\"\n        fun newInstance(page: Page): PageSettingActionDialog {\n            return PageSettingActionDialog().apply {\n                arguments = Bundle().apply {\n                    putSerializable(PAGE, page)\n                }\n            }\n        }\n    }\n\n    private val viewModel: PageSettingViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n        val view = View.inflate(dialog.context, R.layout.dialog_page_setting_action, null)\n        dialog.setContentView(view)\n        val binding = DataBindingUtil.bind<DialogPageSettingActionBinding>(view)\n\n\n        val targetPage = requireArguments().getSerializable(PAGE) as? Page\n        binding?.deletePage?.setOnClickListener {\n            if(targetPage != null){\n                viewModel.removePage(targetPage)\n            }\n            dismiss()\n        }\n        binding?.editPage?.setOnClickListener {\n            if (targetPage != null) {\n                viewModel.onEditButtonClicked(targetPage)\n            }\n            dismiss()\n        }\n        return dialog\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/PageTypeNameMap.kt",
    "content": "package net.pantasystem.milktea.setting\n\nimport android.content.Context\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport net.pantasystem.milktea.common_android_ui.account.page.PageTypeHelper\nimport net.pantasystem.milktea.model.account.page.PageType\nimport java.lang.ref.WeakReference\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass PageTypeNameMap @Inject constructor(\n    @ApplicationContext context: Context\n){\n    private val contextWrapper = WeakReference(context)\n    fun get(type: PageType): String {\n        val context = contextWrapper.get()\n        return context?.let{\n            PageTypeHelper.nameByPageType(it, type)\n        }?: type.defaultName\n    }\n\n}\n\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/SettingSection.kt",
    "content": "package net.pantasystem.milktea.setting\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\n\n@Composable\nfun SettingSection(\n    title: String,\n    modifier: Modifier = Modifier,\n    paddingTop: Dp = 16.dp,\n    paddingBottom: Dp = 0.dp,\n    isNeedUnderDivider: Boolean = true,\n    children: @Composable ColumnScope.() -> Unit\n) {\n    Column(modifier) {\n        Column(\n            modifier = modifier.padding(\n                top = paddingTop,\n                bottom = paddingBottom\n            )\n        ) {\n            Text(\n                title,\n                color = MaterialTheme.colorScheme.primary,\n                modifier = Modifier.padding(horizontal = 16.dp)\n            )\n            Spacer(modifier = Modifier.height(8.dp))\n            children()\n\n        }\n        if (isNeedUnderDivider) {\n            HorizontalDivider(Modifier.fillMaxWidth())\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/AboutMilkteaActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport coil.compose.rememberAsyncImagePainter\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_resource.R\nimport net.pantasystem.milktea.setting.compose.SettingListTileLayout\nimport java.util.*\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass AboutMilkteaActivity : AppCompatActivity() {\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        val version = getSelfVersion()\n        val lang = Locale.getDefault().language\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            navigationIcon = {\n                                IconButton(onClick = { finish() }) {\n                                    Icon(Icons.Default.ArrowBack, contentDescription = \"navigate up\")\n                                }\n                            },\n                            title = {\n                                Text(stringResource(id = R.string.settings_about_milktea))\n                            }\n                        )\n                    }\n                ) { paddingValues ->\n                    Column(\n                        modifier = Modifier\n                            .padding(paddingValues)\n                            .verticalScroll(\n                                rememberScrollState()\n                            ),\n                        horizontalAlignment = Alignment.CenterHorizontally,\n                    ) {\n                        Spacer(modifier = Modifier.height(32.dp))\n                        Image(\n                            painter = rememberAsyncImagePainter(\"https://raw.githubusercontent.com/pantasystem/Milktea/master/app/src/main/ic_launcher-web.png\"),\n                            contentDescription = \"App icon\",\n                            modifier = Modifier.size(64.dp)\n                        )\n                        Spacer(Modifier.height(12.dp))\n                        Text(\n                            stringResource(id = R.string.app_name),\n                            fontSize = 24.sp,\n                            fontWeight = FontWeight.Bold\n                        )\n                        Spacer(modifier = Modifier.height(12.dp))\n                        Text(version ?: \"\")\n                        Spacer(modifier = Modifier.height(12.dp))\n                        Text(stringResource(id = R.string.milktea_catchphrase))\n                        Spacer(Modifier.height(16.dp))\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(\"https://github.com/pantasystem/Milktea\")))\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.settings_about_milktea_source_code))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(\"https://www.patreon.com/pantasystem\")))\n                            }\n                        ) {\n                            Text(stringResource(R.string.donation))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(\"https://github.com/pantasystem/Milktea/blob/develop/privacy_policy_${\n                                    when(lang) {\n                                        \"zh\", \"jp\", \"en\" -> lang\n                                        else -> \"en\"\n                                    }\n                                }.md\")))\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.privacy_policy))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(\"https://github.com/pantasystem/Milktea/blob/develop/terms_of_service_${\n                                    when(lang) {\n                                        \"zh\", \"jp\", \"en\" -> lang\n                                        else -> \"en\"\n                                    }\n                                }.md\")))\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.terms_of_service))\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    @Suppress(\"DEPRECATION\")\n    private fun getSelfVersion(): String? {\n        val pm = packageManager\n        return try {\n            pm.getPackageInfo(packageName, 0).versionName\n        } catch (e: Exception) {\n            null\n        }\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/AccountSettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.app.Activity\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModel\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.AccountSettingNavigation\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.setting.compose.account.AccountSettingScreen\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass AccountSettingActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel: AccountViewModel by viewModels()\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        setContent {\n            val uiState by viewModel.uiState.collectAsState()\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                AccountSettingScreen(\n                    uiState = uiState,\n                    onAccountClicked = {\n                        viewModel.setSwitchTargetConnectionInstance(it.account)\n                    },\n                    onAddAccountButtonClicked = {\n                        startActivity(authorizationNavigation.newIntent(AuthorizationArgs.New))\n                    },\n                    onNavigateUp = { finish() },\n                    onShowUser = {\n                        startActivity(userDetailNavigation.newIntent(it))\n                    },\n                    onSignOutButtonClicked = {\n                        viewModel.signOut(it.account)\n                    }\n                )\n            }\n        }\n\n    }\n}\n\n\nclass AccountSettingActivityNavigationImpl @Inject constructor(\n    val activity: Activity\n) : AccountSettingNavigation {\n    override fun newIntent(args: Unit): Intent {\n        return Intent(activity, AccountSettingActivity::class.java)\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/CacheSettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TextButton\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.compose.SettingTitleTile\nimport net.pantasystem.milktea.setting.viewmodel.CacheSettingViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass CacheSettingActivity : AppCompatActivity() {\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val viewModel by viewModels<CacheSettingViewModel>()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        setContent {\n            val uiState by viewModel.uiState.collectAsState()\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            navigationIcon = {\n                                IconButton(onClick = { finish() }) {\n                                    Icon(Icons.Default.ArrowBack, contentDescription = null)\n                                }\n                            },\n                            title = {\n                                Text(stringResource(id = R.string.settings_cache_config))\n                            }\n                        )\n                    }\n                ) { paddingValues ->\n                    Column(\n                        Modifier\n                            .padding(paddingValues)\n                            .verticalScroll(rememberScrollState())\n                    ) {\n                        SettingTitleTile(stringResource(id = R.string.settings_note_cache))\n                        Column(Modifier.padding(horizontal = 16.dp)) {\n                            Text(\"Size: ${uiState.noteCacheSize}\")\n                            TextButton(onClick = viewModel::onClearNoteCache) {\n                                Text(stringResource(id = R.string.remove))\n                            }\n                        }\n\n                        SettingTitleTile(stringResource(id = R.string.settings_custom_emoji_cache))\n                        Column(Modifier.padding(horizontal = 16.dp)) {\n                            Text(\"Size: ${uiState.imageCacheSize}\")\n                            TextButton(onClick = viewModel::onClearCustomEmojiCache) {\n                                Text(stringResource(id = R.string.remove))\n                            }\n                        }\n\n                        SettingTitleTile(stringResource(id = R.string.settings_user_cache))\n                        Column(Modifier.padding(horizontal = 16.dp)) {\n                            Text(\"Size: ${uiState.userCacheSize}\")\n                            TextButton(onClick = viewModel::onClearUserCache) {\n                                Text(stringResource(id = R.string.remove))\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/ClientWordFilterSettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.ContentCopy\nimport androidx.compose.material.icons.filled.ContentPaste\nimport androidx.compose.material.icons.filled.Save\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.viewmodel.muteword.ClientWordFilterSettingViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass ClientWordFilterSettingActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val viewModel by viewModels<ClientWordFilterSettingViewModel>()\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        enableEdgeToEdge()\n\n        applyTheme()\n        val clipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            title = {\n                                Text(stringResource(id = R.string.client_word_mute))\n                            },\n                            navigationIcon = {\n                                IconButton(onClick = { finish() }) {\n                                    Icon(Icons.Default.ArrowBack, null)\n                                }\n                            }\n                        )\n                    },\n                    floatingActionButton = {\n                        FloatingActionButton(onClick = { viewModel.save() }) {\n                            Icon(Icons.Default.Save, contentDescription = \"Save\")\n                        }\n                    }\n                ) {\n                    LazyColumn(Modifier.padding(it)) {\n                        item {\n                            Row(\n                                Modifier.padding(horizontal = 16.dp)\n                                    .fillMaxWidth(),\n                                horizontalArrangement = Arrangement.End,\n                                verticalAlignment = Alignment.CenterVertically,\n                            ) {\n                                IconButton(onClick = {\n                                    val text = clipboardManager.primaryClip?.let { clipData ->\n                                        if (clipData.itemCount > 0) {\n                                            clipData.getItemAt(0)\n                                        } else {\n                                            null\n                                        }\n                                    }\n                                    text?.text?.let { t ->\n                                        viewModel.updateText(t.toString())\n                                    }\n                                }) {\n                                    Icon(Icons.Default.ContentPaste, contentDescription = \"Paste\")\n                                }\n                                IconButton(onClick = {\n                                    clipboardManager.setPrimaryClip(\n                                        ClipData.newPlainText(\"mute words\", viewModel.muteWordsFieldState)\n                                    )\n                                }) {\n                                    Icon(Icons.Default.ContentCopy, contentDescription = \"Copy\")\n                                }\n                            }\n                            OutlinedTextField(\n                                modifier = Modifier\n                                    .fillMaxWidth()\n                                    .padding(horizontal = 16.dp),\n                                value = viewModel.muteWordsFieldState,\n                                onValueChange = {\n                                    viewModel.updateText(it)\n                                }\n                            )\n                            Text(\n                                stringResource(R.string.client_word_mute_format_description),\n                                modifier = Modifier\n                                    .fillMaxWidth()\n                                    .padding(horizontal = 16.dp)\n                            )\n                            Spacer(modifier = Modifier.height(16.dp))\n                        }\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/DeveloperSettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.enableEdgeToEdge\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.safeDrawing\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.res.stringResource\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android.debug.DebugFeatureFlags\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.SettingSection\nimport net.pantasystem.milktea.setting.compose.SettingSwitchTile\nimport javax.inject.Inject\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass DeveloperSettingActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    lateinit var configRepository: LocalConfigRepository\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            navigationIcon = {\n                                IconButton(onClick = { finish() }) {\n                                    Icon(Icons.Default.ArrowBack, contentDescription = null)\n                                }\n                            },\n                            title = {\n                                Text(stringResource(R.string.settings_developer_options))\n                            },\n                        )\n                    },\n                ) { paddingValues ->\n                    Column(\n                        modifier = Modifier\n                            .padding(paddingValues)\n                            .verticalScroll(rememberScrollState()),\n                    ) {\n                        val context = LocalContext.current\n\n                        SettingSection(title = \"Compose\") {\n                            var composeTimelineEnabled by remember {\n                                mutableStateOf(DebugFeatureFlags.isComposeTimelineEnabled(context))\n                            }\n                            SettingSwitchTile(\n                                checked = composeTimelineEnabled,\n                                onChanged = { enabled ->\n                                    DebugFeatureFlags.setComposeTimelineEnabled(context, enabled)\n                                    composeTimelineEnabled = enabled\n                                },\n                                subtitle = {\n                                    Text(\n                                        text = stringResource(R.string.settings_dev_compose_timeline_description),\n                                        style = MaterialTheme.typography.bodySmall,\n                                    )\n                                },\n                            ) {\n                                Text(stringResource(R.string.settings_dev_compose_timeline))\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/ImportReactionFromWebViewActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.annotation.SuppressLint\nimport android.os.Bundle\nimport android.view.Menu\nimport android.view.MenuInflater\nimport android.view.MenuItem\nimport android.webkit.CookieManager\nimport android.webkit.WebView\nimport android.webkit.WebViewClient\nimport android.widget.Toast\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.view.MenuProvider\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.delay\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.reaction.ReactionChoicesAdapter\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.databinding.ActivityImportReactionFromWebViewBinding\nimport net.pantasystem.milktea.setting.viewmodel.ImportReactionFromWebViewViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\nconst val EXTRA_ACCOUNT_HOST = \"EXTRA_ACCOUNT_HOST\"\n\n@AndroidEntryPoint\nclass ImportReactionFromWebViewActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    private val host by lazy {\n        intent.getStringExtra(EXTRA_ACCOUNT_HOST)\n    }\n\n\n    private val binding: ActivityImportReactionFromWebViewBinding by dataBinding()\n\n    private val importReactionFromWebViewViewModel: ImportReactionFromWebViewViewModel by viewModels()\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    @SuppressLint(\"SetJavaScriptEnabled\", \"JavascriptInterface\")\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        setContentView(R.layout.activity_import_reaction_from_web_view)\n\n        setupWebView()\n        setSupportActionBar(binding.topToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.topToolbar.updatePadding(top = insets.top)\n            binding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setTitle(R.string.import_reactions_from_the_web)\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        addMenuProvider(object : MenuProvider {\n            override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {\n            }\n\n            override fun onMenuItemSelected(menuItem: MenuItem): Boolean {\n                when(menuItem.itemId) {\n                    android.R.id.home -> {\n                        finish()\n                    }\n                }\n                return true\n            }\n        })\n\n        binding.webView.loadUrl(\"https://$host\")\n\n\n        binding.importButton.setOnClickListener {\n            val currentAccount = accountStore.currentAccount\n            if (currentAccount != null) {\n                val token = getWebClientTokenFromCookie(currentAccount)\n                if (token.isNullOrBlank()) {\n                    Toast.makeText(this, getString(R.string.please_login), Toast.LENGTH_LONG).show()\n                } else {\n                    importReactionFromWebViewViewModel.onGotWebClientToken(currentAccount, token)\n                }\n            }\n        }\n\n        val adapter = ReactionChoicesAdapter {}\n\n        binding.reactionsAdapter.adapter = adapter\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                importReactionFromWebViewViewModel.reactions.collect {\n                    adapter.submitList(it)\n                }\n            }\n        }\n        binding.reactionsAdapter.layoutManager =\n            LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)\n\n        binding.overrideSaveButton.setOnClickListener {\n            importReactionFromWebViewViewModel.onOverwriteButtonClicked()\n        }\n\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                (0..Int.MAX_VALUE).asFlow().map {\n                    delay(500)\n                }.flatMapLatest {\n                    accountStore.observeCurrentAccount\n                }.filterNotNull().map {\n                    val token = getWebClientTokenFromCookie(it)\n                    it to token\n                }.distinctUntilChanged().collect { (account, token) ->\n                    importReactionFromWebViewViewModel.onGotWebClientToken(account, token)\n                }\n            }\n        }\n    }\n\n    @SuppressLint(\"SetJavaScriptEnabled\")\n    fun setupWebView() {\n        binding.webView.settings.javaScriptEnabled = true\n        binding.webView.settings.domStorageEnabled = true\n\n\n        binding.webView.webViewClient = object : WebViewClient() {\n            override fun onPageFinished(view: WebView?, url: String?) {\n                super.onPageFinished(view, url)\n            }\n\n        }\n    }\n\n\n    private fun getWebClientTokenFromCookie(account: Account): String? {\n        val rawCookie: String? = CookieManager.getInstance().getCookie(account.normalizedInstanceUri)\n        val cookies = rawCookie?.split(\";\")?.map { it.trim() }?.mapNotNull {\n            val key = it.split(\"=\").getOrNull(0)?.lowercase()\n            val value = it.split(\"=\").getOrNull(1)\n            if (key == null || value == null) {\n                null\n            } else {\n                key to value\n            }\n        }?.toMap() ?: emptyMap()\n\n        return cookies[\"token\"]\n    }\n\n\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/PageSettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.os.Bundle\nimport android.view.MenuItem\nimport androidx.activity.compose.setContent\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.AntennaNavigation\nimport net.pantasystem.milktea.common_navigation.AntennaNavigationArgs\nimport net.pantasystem.milktea.common_navigation.ChangedDiffResult\nimport net.pantasystem.milktea.common_navigation.ChannelNavigation\nimport net.pantasystem.milktea.common_navigation.ChannelNavigationArgs\nimport net.pantasystem.milktea.common_navigation.ClipListNavigation\nimport net.pantasystem.milktea.common_navigation.ClipListNavigationArgs\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation.Companion.EXTRA_SELECTED_USER_CHANGED_DIFF\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigationArgs\nimport net.pantasystem.milktea.common_navigation.SearchNavType\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserListArgs\nimport net.pantasystem.milktea.common_navigation.UserListNavigation\nimport net.pantasystem.milktea.model.account.page.PageType\nimport net.pantasystem.milktea.setting.EditTabSettingDialog\nimport net.pantasystem.milktea.setting.PageSettingActionDialog\nimport net.pantasystem.milktea.setting.compose.tab.TabItemsListScreen\nimport net.pantasystem.milktea.setting.compose.tab.rememberDragDropListState\nimport net.pantasystem.milktea.setting.viewmodel.page.PageSettingViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@Suppress(\"DEPRECATION\")\n@AndroidEntryPoint\nclass PageSettingActivity : AppCompatActivity() {\n\n    companion object {\n        const val EXTRA_EDIT_TAB_ID = \"edit_tab_id\"\n    }\n\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var searchAndSelectUserNavigation: SearchAndSelectUserNavigation\n\n    @Inject\n    internal lateinit var searchNavigation: SearchNavigation\n\n    @Inject\n    internal lateinit var antennaNavigation: AntennaNavigation\n\n    @Inject\n    internal lateinit var channelNavigation: ChannelNavigation\n\n    @Inject\n    internal lateinit var userListNavigation: UserListNavigation\n\n    @Inject\n    internal lateinit var clipListNavigation: ClipListNavigation\n\n    private val mPageSettingViewModel: PageSettingViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        mPageSettingViewModel.pageOnActionEvent.onEach {\n            PageSettingActionDialog.newInstance(it).show(supportFragmentManager, PageSettingActionDialog.FRAGMENT_TAG)\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n\n        mPageSettingViewModel.pageOnUpdateEvent.onEach {\n            EditTabSettingDialog.newInstance(it).show(supportFragmentManager, EditTabSettingDialog.FRAGMENT_TAG)\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n//\n        mPageSettingViewModel.pageAddedEvent.onEach { pt ->\n            when (pt.type) {\n                PageType.SEARCH, PageType.SEARCH_HASH, PageType.MASTODON_TAG_TIMELINE -> startActivity(\n                    searchNavigation.newIntent(SearchNavType.SearchScreen())\n                )\n                PageType.USER -> {\n                    val intent =\n                        searchAndSelectUserNavigation.newIntent(\n                            SearchAndSelectUserNavigationArgs(\n                                selectableMaximumSize = 1\n                            )\n                        )\n                    launchSearchAndSelectUserForAddUserTimelineTab.launch(intent)\n                }\n                PageType.USER_LIST, PageType.MASTODON_LIST_TIMELINE -> startActivity(\n                    userListNavigation.newIntent(UserListArgs(\n                        specifiedAccountId = pt.relatedAccount.accountId,\n                        addTabToAccountId = mPageSettingViewModel.account.value?.accountId\n                    ))\n                )\n                PageType.DETAIL -> startActivity(searchNavigation.newIntent(SearchNavType.SearchScreen()))\n                PageType.ANTENNA -> startActivity(antennaNavigation.newIntent(AntennaNavigationArgs(\n                    specifiedAccountId = pt.relatedAccount.accountId,\n                    addTabToAccountId = mPageSettingViewModel.account.value?.accountId\n                )))\n                PageType.CLIP_NOTES -> startActivity(\n                    clipListNavigation.newIntent(\n                        ClipListNavigationArgs(\n                            mode = ClipListNavigationArgs.Mode.AddToTab,\n                            accountId = pt.relatedAccount.accountId,\n                            addTabToAccountId = mPageSettingViewModel.account.value?.accountId\n                        )\n                    )\n                )\n                PageType.USERS_GALLERY_POSTS -> {\n                    val intent =\n                        searchAndSelectUserNavigation.newIntent(\n                            SearchAndSelectUserNavigationArgs(\n                                selectableMaximumSize = 1,\n                                accountId = pt.relatedAccount.accountId,\n                            )\n                        )\n                    launchSearchAndSelectUserForAddGalleryTab.launch(intent)\n                }\n                PageType.CHANNEL_TIMELINE -> {\n                    val intent = channelNavigation.newIntent(\n                        ChannelNavigationArgs(\n                            specifiedAccountId = pt.relatedAccount.accountId,\n                            addTabToAccountId = mPageSettingViewModel.account.value?.accountId\n                        )\n                    )\n                    startActivity(intent)\n                }\n                else -> {\n                    // auto add\n                }\n            }\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                val pageTypes by mPageSettingViewModel.pageTypesGroupedByAccount.collectAsState()\n                val list by mPageSettingViewModel.selectedPages.collectAsState()\n                val scope = rememberCoroutineScope()\n                val dragAndDropState =\n                    rememberDragDropListState(scope = scope, onMove = { from, to ->\n                        val tmp = list[to]\n                        val mutable = list.toMutableList()\n                        mutable[to] = mutable[from]\n                        mutable[from] = tmp\n                        mPageSettingViewModel.setList(mutable)\n                    })\n\n                TabItemsListScreen(\n                    pageTypes = pageTypes,\n                    list = list,\n                    onSelectPage = {\n                        mPageSettingViewModel.add(it)\n                    },\n                    onOptionButtonClicked = {\n                        mPageSettingViewModel.onOptionButtonClicked(it)\n                    },\n                    onNavigateUp = {\n                        finish()\n                    },\n                    dragDropState = dragAndDropState,\n                )\n            }\n        }\n\n        if (savedInstanceState == null) {\n            mPageSettingViewModel.onEditTab(\n                intent.getLongExtra(\n                    EXTRA_EDIT_TAB_ID,\n                    -1,\n                )\n            )\n        }\n\n    }\n\n    override fun onPause() {\n        super.onPause()\n        mPageSettingViewModel.save()\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> finish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n\n    private val launchSearchAndSelectUserForAddGalleryTab =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n            if (it.resultCode == RESULT_OK && it.data != null) {\n                val changeDiff =\n                    it.data!!.getSerializableExtra(EXTRA_SELECTED_USER_CHANGED_DIFF) as ChangedDiffResult\n                mPageSettingViewModel.addUsersGalleryByIds(changeDiff.selected)\n            }\n        }\n\n    private val launchSearchAndSelectUserForAddUserTimelineTab =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {\n            if (it.resultCode == RESULT_OK && it.data != null) {\n                val changeDiff =\n                    it.data!!.getSerializableExtra(EXTRA_SELECTED_USER_CHANGED_DIFF) as ChangedDiffResult\n                mPageSettingViewModel.addUserPageByIds(changeDiff.selected)\n            }\n        }\n\n\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/ReactionSettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.KeyEvent\nimport android.view.MenuItem\nimport android.view.View\nimport android.widget.AdapterView\nimport android.widget.ArrayAdapter\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.ItemTouchHelper\nimport androidx.recyclerview.widget.RecyclerView\nimport com.google.android.flexbox.*\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android.ui.text.CustomEmojiDecorator\nimport net.pantasystem.milktea.common_android_ui.reaction.ReactionAutoCompleteArrayAdapter\nimport net.pantasystem.milktea.common_android_ui.reaction.ReactionChoicesAdapter\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.setting.ReactionPickerType\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.databinding.ActivityReactionSettingBinding\nimport net.pantasystem.milktea.setting.viewmodel.reaction.ReactionPickerSettingViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n@AndroidEntryPoint\nclass ReactionSettingActivity : AppCompatActivity() {\n\n    private lateinit var mCustomEmojiDecorator: CustomEmojiDecorator\n\n\n    val mReactionPickerSettingViewModel: ReactionPickerSettingViewModel by viewModels()\n\n    @Inject\n    internal lateinit var accountStore: AccountStore\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var customEmojiRepository: CustomEmojiRepository\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        val binding = DataBindingUtil.setContentView<ActivityReactionSettingBinding>(\n            this,\n            R.layout.activity_reaction_setting\n        )\n        binding.lifecycleOwner = this\n        setSupportActionBar(binding.reactionSettingToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.reactionSettingToolbar.updatePadding(top = insets.top)\n            binding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n\n        mCustomEmojiDecorator = CustomEmojiDecorator()\n        val flexBoxLayoutManager = FlexboxLayoutManager(this)\n        flexBoxLayoutManager.flexDirection = FlexDirection.ROW\n        flexBoxLayoutManager.flexWrap = FlexWrap.WRAP\n        flexBoxLayoutManager.justifyContent = JustifyContent.FLEX_START\n        flexBoxLayoutManager.alignItems = AlignItems.STRETCH\n        binding.reactionSettingListView.layoutManager = flexBoxLayoutManager\n\n        val touchHelper = ItemTouchHelper(ItemTouchCallback())\n        touchHelper.attachToRecyclerView(binding.reactionSettingListView)\n        binding.reactionSettingListView.addItemDecoration(touchHelper)\n        binding.reactionPickerSettingViewModel = mReactionPickerSettingViewModel\n        val reactionsAdapter = ReactionChoicesAdapter(\n            mReactionPickerSettingViewModel\n        )\n        binding.reactionSettingListView.adapter = reactionsAdapter\n        mReactionPickerSettingViewModel.reactionSettingsList.observe(this) { list ->\n            reactionsAdapter.submitList(list.map { rus ->\n                rus.reaction\n            })\n        }\n\n        mReactionPickerSettingViewModel.reactionSelectEvent.onEach { rus ->\n            showConfirmDeleteReactionDialog(rus.reaction)\n        }.flowWithLifecycle(lifecycle).launchIn(lifecycleScope)\n\n        binding.reactionPickerType.setSelection(mReactionPickerSettingViewModel.reactionPickerType.ordinal)\n\n\n        accountStore.observeCurrentAccount.filterNotNull().onEach { account ->\n            val reactionAutoCompleteArrayAdapter = ReactionAutoCompleteArrayAdapter(\n                account,\n                this,\n                customEmojiRepository,\n            )\n            binding.reactionSettingField.setAdapter(reactionAutoCompleteArrayAdapter)\n            binding.reactionSettingField.setOnItemClickListener { _, _, position, _ ->\n                val emoji = reactionAutoCompleteArrayAdapter.suggestions[position]\n                mReactionPickerSettingViewModel.addReaction(emoji)\n                binding.reactionSettingField.setText(\"\")\n            }\n        }.launchIn(lifecycleScope)\n\n        binding.reactionSettingField.setOnEditorActionListener { textView, _, keyEvent ->\n            val text = textView.text\n            if (keyEvent?.keyCode == KeyEvent.KEYCODE_ENTER && text != null) {\n                if (keyEvent.action == KeyEvent.ACTION_UP) {\n                    if (text.isNotBlank()) {\n                        mReactionPickerSettingViewModel.addReaction(text.toString())\n                        binding.reactionSettingField.setText(\"\")\n\n                    }\n                }\n                return@setOnEditorActionListener true\n            }\n            false\n        }\n\n\n        binding.reactionPickerType.onItemSelectedListener =\n            object : AdapterView.OnItemSelectedListener {\n                override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {\n                    val pickerType = when (p2) {\n                        0 -> ReactionPickerType.LIST\n                        1 -> ReactionPickerType.SIMPLE\n                        else -> throw IllegalArgumentException(\"error\")\n                    }\n                    mReactionPickerSettingViewModel.setReactionPickerType(pickerType)\n                }\n\n                override fun onNothingSelected(p0: AdapterView<*>?) {\n\n                }\n            }\n\n\n        binding.importReactionFromWebButton.setOnClickListener {\n            val intent = Intent(this, ImportReactionFromWebViewActivity::class.java)\n            intent.putExtra(EXTRA_ACCOUNT_HOST, accountStore.currentAccount?.getHost())\n            startActivity(intent)\n            finish()\n        }\n\n        val emojiSizes = (18..48).toList()\n        val emojiSizeSelection = emojiSizes.map {\n            \"${it}dp\"\n        }\n\n        binding.emojiDisplaySizeSelection.adapter = ArrayAdapter(\n            this,\n            android.R.layout.simple_spinner_dropdown_item,\n            emojiSizeSelection,\n        )\n        binding.emojiDisplaySizeSelection.setSelection(mReactionPickerSettingViewModel.config.value.emojiPickerEmojiDisplaySize - 18)\n        binding.emojiDisplaySizeSelection.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {\n            override fun onItemSelected(\n                parent: AdapterView<*>?,\n                view: View?,\n                position: Int,\n                id: Long,\n            ) {\n                mReactionPickerSettingViewModel.onEmojiSizeSelected(emojiSizes[position])\n            }\n\n            override fun onNothingSelected(parent: AdapterView<*>?) {\n\n            }\n        }\n\n    }\n\n    override fun onStop() {\n        super.onStop()\n        mReactionPickerSettingViewModel.save()\n    }\n\n    inner class ItemTouchCallback : ItemTouchHelper.SimpleCallback(\n        ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.RIGHT or ItemTouchHelper.LEFT,\n        ItemTouchHelper.ACTION_STATE_IDLE\n    ) {\n        override fun onMove(\n            recyclerView: RecyclerView,\n            viewHolder: RecyclerView.ViewHolder,\n            target: RecyclerView.ViewHolder,\n        ): Boolean {\n            val from = viewHolder.absoluteAdapterPosition\n            val to = target.absoluteAdapterPosition\n            val exList = mReactionPickerSettingViewModel.reactionSettingsList.value ?: emptyList()\n            val list = ArrayList(exList)\n            val d = list.removeAt(from)\n            list.add(to, d)\n            //mReactionPickerSettingViewModel?.reactionSettingsList?.postValue(list)\n            mReactionPickerSettingViewModel.putSortedList(list)\n            return true\n        }\n\n        override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) = Unit\n\n    }\n\n\n    private fun showConfirmDeleteReactionDialog(reaction: String) {\n        MaterialAlertDialogBuilder(this)\n            .setTitle(getString(R.string.confirm_delete_reaction))\n            .setMessage(getString(R.string.delete_reaction) + \" $reaction\")\n            .setNegativeButton(android.R.string.cancel) { _, _ ->\n\n            }\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                mReactionPickerSettingViewModel.deleteReaction(reaction)\n            }\n            .show()\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> finish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/RenoteMuteSettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.setting.compose.renote.mute.RenoteMuteSettingScreen\nimport net.pantasystem.milktea.setting.viewmodel.RenoteMuteSettingViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass RenoteMuteSettingActivity : AppCompatActivity() {\n\n    @Inject\n    internal lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var userDetailNavigation: UserDetailNavigation\n\n    private val viewModel: RenoteMuteSettingViewModel by viewModels()\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                val uiState by viewModel.uiState.collectAsState()\n\n                RenoteMuteSettingScreen(\n                    uiState = uiState,\n                    onRemoveRenoteMuteButtonClicked = viewModel::onRemoveRenoteMute,\n                    onUserClicked = {\n                        startActivity(\n                            userDetailNavigation.newIntent(UserDetailNavigationArgs.UserId(it.id))\n                        )\n                    },\n                    onRefresh = {\n                        when(val account = uiState.currentAccount) {\n                            null -> Unit\n                            else -> {\n                                viewModel.onRefresh(account)\n                            }\n                        }\n                    },\n                    onNavigateUp = {\n                        finish()\n                    }\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/SecuritySettingActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.activity.compose.setContent\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.SettingSection\nimport net.pantasystem.milktea.setting.compose.SettingSwitchTile\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass SecuritySettingActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var localConfigRepository: LocalConfigRepository\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        setContent {\n            val configState by settingStore.configState.collectAsState()\n\n            var currentConfigState by remember {\n                mutableStateOf(configState)\n            }\n\n\n            LaunchedEffect(key1 = currentConfigState) {\n                localConfigRepository.save(currentConfigState).onFailure {\n                    Log.d(\"SettingAppearance\", \"save error\", it)\n                }\n            }\n            MilkteaStyleConfigApplyAndTheme(configRepository = localConfigRepository) {\n\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            navigationIcon = {\n                                IconButton(onClick = {\n                                    finish()\n                                }) {\n                                    Icon(Icons.Default.ArrowBack, contentDescription = \"Back\")\n                                }\n                            },\n                            title = {\n                                Text(stringResource(id = R.string.security_setting))\n                            }\n                        )\n                    }\n                ) { padding ->\n                    Column(\n                        modifier = Modifier\n                            .padding(padding)\n                            .verticalScroll(rememberScrollState())\n                    ) {\n                        SettingSection(title = \"Tracking\") {\n                            SettingSwitchTile(checked = configState.isCrashlyticsCollectionEnabled.isEnable, onChanged = {\n                                currentConfigState = configState.setCrashlyticsCollectionEnabled(it)\n                            }) {\n                                Text(stringResource(id = R.string.send_a_crash_report))\n                            }\n\n                            SettingSwitchTile(checked = configState.isAnalyticsCollectionEnabled.isEnabled, onChanged = {\n                                currentConfigState = configState.setAnalyticsCollectionEnabled(it)\n                            }) {\n                                Text(stringResource(id = R.string.enable_google_analytics))\n                            }\n                        }\n                    }\n\n\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/SettingAppearanceActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.activity.compose.setContent\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.annotation.StringRes\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.AddToPhotos\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.Remove\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.lifecycle.lifecycleScope\nimport coil.compose.rememberAsyncImagePainter\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_navigation.DriveNavigation\nimport net.pantasystem.milktea.common_navigation.DriveNavigationArgs\nimport net.pantasystem.milktea.common_navigation.EXTRA_SELECTED_FILE_PROPERTY_IDS\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.setting.AvatarIconShapeType\nimport net.pantasystem.milktea.model.setting.Theme\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.SettingSection\nimport net.pantasystem.milktea.setting.compose.SettingRadioTile\nimport net.pantasystem.milktea.setting.compose.SettingSwitchTile\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\ndata class ThemeUiState(\n    val type: Theme,\n    @StringRes val label: Int,\n)\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass SettingAppearanceActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var mSettingStore: SettingStore\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var driveFileRepository: DriveFileRepository\n\n    @Inject\n    lateinit var localConfigRepository: LocalConfigRepository\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    lateinit var driveNavigation: DriveNavigation\n\n    private val themes: List<ThemeUiState> by lazy {\n        listOf(\n            ThemeUiState(\n                Theme.White,\n                R.string.theme_white\n            ),\n            ThemeUiState(\n                Theme.Dark,\n                R.string.theme_dark,\n            ),\n            ThemeUiState(\n                Theme.Black,\n                R.string.theme_black\n            ),\n            ThemeUiState(\n                Theme.Bread,\n                R.string.theme_bread,\n            ),\n            ThemeUiState(\n                Theme.ElephantDark,\n                R.string.theme_mastodon_dark,\n            )\n        )\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContent {\n            val configState by settingStore.configState.collectAsState()\n\n            var currentConfigState by remember {\n                mutableStateOf(configState)\n            }\n\n\n            LaunchedEffect(key1 = currentConfigState) {\n                localConfigRepository.save(currentConfigState).onFailure {\n                    Log.d(\"SettingAppearance\", \"save error\", it)\n                }\n            }\n            MilkteaStyleConfigApplyAndTheme(configRepository = localConfigRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            title = {\n                                Text(stringResource(id = R.string.appearance))\n                            },\n                            navigationIcon = {\n                                IconButton(onClick = { finish() }) {\n                                    Icon(Icons.Default.ArrowBack, contentDescription = null)\n                                }\n                            }\n                        )\n                    }\n                ) { padding ->\n                    Column(\n                        modifier = Modifier\n                            .padding(padding)\n                            .verticalScroll(rememberScrollState())\n                    ) {\n                        SettingSection(title = stringResource(id = R.string.theme)) {\n                            Text(\n                                stringResource(id = R.string.settings_app_restart_required),\n                                modifier = Modifier.padding(horizontal = 16.dp),\n                                color = MaterialTheme.colorScheme.error,\n                                fontSize = 14.sp\n                            )\n                            for (theme in themes) {\n                                SettingRadioTile(\n                                    selected = currentConfigState.theme == theme.type,\n                                    onClick = {\n                                        currentConfigState =\n                                            currentConfigState.copy(theme = theme.type)\n                                    }\n                                ) {\n                                    Text(stringResource(theme.label))\n                                }\n                            }\n                        }\n\n                        SettingSection(title = \"UI\") {\n                            SettingSwitchTile(\n\n                                checked = !currentConfigState.isClassicUI, onChanged = {\n                                    currentConfigState = currentConfigState.copy(isClassicUI = !it)\n                                }) {\n                                Text(stringResource(R.string.settings_show_bottom_menu))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isSimpleEditorEnabled,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isSimpleEditorEnabled = it)\n                                }\n                            ) {\n                                Text(stringResource(R.string.use_simple_editor))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isUserNameDefault, onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isUserNameDefault = it)\n                                }) {\n                                Text(stringResource(id = R.string.user_name_as_default_display_name))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isPostButtonAtTheBottom,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isPostButtonAtTheBottom = it)\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.post_button_at_the_bottom))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isEnableInstanceTicker,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isEnableInstanceTicker = it)\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.is_enable_instance_ticker))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isVisibleInstanceUrlInToolbar,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isVisibleInstanceUrlInToolbar = it)\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.settings_visible_instance_domain_in_toolbar))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isDisplayTimestampsAsAbsoluteDates,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isDisplayTimestampsAsAbsoluteDates = it)\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.settings_display_timestamps_as_absolute_dates))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.avatarIconShapeType == AvatarIconShapeType.Square,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(avatarIconShapeType = if (it) AvatarIconShapeType.Square else AvatarIconShapeType.Circle)\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.settings_display_icons_as_squares))\n                            }\n                        }\n                        SettingSection(\n                            title = stringResource(id = R.string.background_image),\n                            paddingBottom = 16.dp\n                        ) {\n                            if (configState.backgroundImagePath != null) {\n                                Image(\n                                    rememberAsyncImagePainter(configState.backgroundImagePath),\n                                    contentDescription = null,\n                                    modifier = Modifier\n                                        .fillMaxWidth()\n                                        .aspectRatio(16f / 9)\n                                )\n                            }\n\n                            Row(\n                                modifier = Modifier.padding(horizontal = 16.dp)\n                            ) {\n                                Button(onClick = { showFileManager() }) {\n                                    Icon(Icons.Filled.AddToPhotos, contentDescription = null)\n                                    Text(stringResource(id = R.string.pick_image))\n                                }\n                                IconButton(onClick = {\n                                    currentConfigState =\n                                        currentConfigState.copy(backgroundImagePath = null)\n                                }) {\n                                    Icon(Icons.Filled.Remove, contentDescription = null)\n                                }\n                            }\n                        }\n                        SettingSection(title = stringResource(id = R.string.settings_note)) {\n                            Column(Modifier.padding(horizontal = 16.dp)) {\n                                Text(\n                                    text = stringResource(id = R.string.auto_note_folding),\n                                    fontWeight = FontWeight.Bold\n                                )\n                                Text(text = \"${stringResource(id = R.string.height_limit)}(${currentConfigState.noteExpandedHeightSize}dp)\")\n                                Slider(\n                                    value = currentConfigState.noteExpandedHeightSize.let {\n                                        val v =\n                                            currentConfigState.noteExpandedHeightSize.toFloat() / 1000f\n                                        if (it in 0..1000) {\n                                            v\n                                        } else {\n                                            1f\n                                        }\n                                    },\n                                    onValueChange = {\n                                        val v = (it * 1000f).toInt()\n                                        currentConfigState = currentConfigState.copy(\n                                            noteExpandedHeightSize = if (v > 50) {\n                                                v\n                                            } else 50\n                                        )\n\n                                    },\n                                    modifier = Modifier.fillMaxWidth(),\n                                )\n                            }\n                            Text(\n                                stringResource(id = R.string.note_opacity),\n                                modifier = Modifier.padding(horizontal = 16.dp)\n                            )\n                            Slider(\n                                value = currentConfigState.surfaceColorOpacity.toFloat() / 0xff,\n                                onValueChange = {\n                                    currentConfigState =\n                                        currentConfigState.copy(surfaceColorOpacity = (it * 255).toInt())\n                                },\n                                modifier = Modifier.padding(horizontal = 16.dp)\n                            )\n\n                            Column(Modifier.fillMaxWidth()) {\n                                Text(\n                                    stringResource(\n                                        id = R.string.settings_note_header_font_size,\n                                        currentConfigState.noteHeaderFontSize\n                                    ),\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n                                Text(\n                                    stringResource(id = R.string.settings_app_restart_required),\n                                    modifier = Modifier.padding(horizontal = 16.dp),\n                                    color = MaterialTheme.colorScheme.error,\n                                    fontSize = 14.sp\n                                )\n                                Slider(\n                                    value = currentConfigState.noteHeaderFontSize,\n                                    valueRange = 10f..24f,\n                                    onValueChange = {\n                                        currentConfigState =\n                                            currentConfigState.copy(noteHeaderFontSize = it)\n                                    },\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n                            }\n\n                            Column(Modifier.fillMaxWidth()) {\n                                Text(\n                                    stringResource(\n                                        id = R.string.settings_note_content_font_size,\n                                        currentConfigState.noteContentFontSize\n                                    ),\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n                                Text(\n                                    stringResource(id = R.string.settings_app_restart_required),\n                                    modifier = Modifier.padding(horizontal = 16.dp),\n                                    color = MaterialTheme.colorScheme.error,\n                                    fontSize = 14.sp\n                                )\n                                Slider(\n                                    value = currentConfigState.noteContentFontSize,\n                                    valueRange = 10f..24f,\n                                    onValueChange = {\n                                        currentConfigState =\n                                            currentConfigState.copy(noteContentFontSize = it)\n                                    },\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n                            }\n\n\n                            Column(Modifier.fillMaxWidth()) {\n                                Text(\n                                    stringResource(\n                                        id = R.string.settings_note_reaction_counter_font_size,\n                                        currentConfigState.noteReactionCounterFontSize * 1.2f,\n                                        currentConfigState.noteReactionCounterFontSize\n                                    ),\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n                                Text(\n                                    stringResource(id = R.string.settings_app_restart_required),\n                                    modifier = Modifier.padding(horizontal = 16.dp),\n                                    color = MaterialTheme.colorScheme.error,\n                                    fontSize = 14.sp\n                                )\n                                Slider(\n                                    value = currentConfigState.noteReactionCounterFontSize,\n                                    valueRange = 10f..24f,\n                                    onValueChange = {\n                                        currentConfigState =\n                                            currentConfigState.copy(noteReactionCounterFontSize = it)\n                                    },\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n\n                            }\n\n                            Column(Modifier.fillMaxWidth()) {\n                                Text(\n                                    stringResource(\n                                        id = R.string.settings_note_custom_emoji_scale_size_in_text,\n                                        configState.noteCustomEmojiScaleSizeInText,\n                                    ),\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n                                Text(\n                                    stringResource(id = R.string.settings_app_restart_required),\n                                    modifier = Modifier.padding(horizontal = 16.dp),\n                                    color = MaterialTheme.colorScheme.error,\n                                    fontSize = 14.sp\n                                )\n                                Slider(\n                                    value = currentConfigState.noteCustomEmojiScaleSizeInText,\n                                    valueRange = 0.5f..2f,\n                                    onValueChange = {\n                                        currentConfigState =\n                                            currentConfigState.copy(noteCustomEmojiScaleSizeInText = it)\n                                    },\n                                    modifier = Modifier.padding(horizontal = 16.dp)\n                                )\n                            }\n\n\n\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isEnableNoteDivider,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isEnableNoteDivider = it)\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.settings_note_divider))\n                            }\n                        }\n\n                    }\n                }\n            }\n        }\n\n\n    }\n\n    private fun showFileManager() {\n        val intent = driveNavigation.newIntent(\n            DriveNavigationArgs(\n                selectableFileMaxSize = 1,\n                accountId = accountStore.currentAccountId\n            )\n        )\n        intent.action = Intent.ACTION_OPEN_DOCUMENT\n        openDriveActivityResult.launch(intent)\n    }\n\n    @Suppress(\"DEPRECATION\")\n    private val openDriveActivityResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n            val ids =\n                (result?.data?.getSerializableExtra(EXTRA_SELECTED_FILE_PROPERTY_IDS) as List<*>?)?.mapNotNull {\n                    it as? FileProperty.Id\n                }\n            val fileId = ids?.firstOrNull() ?: return@registerForActivityResult\n            lifecycleScope.launch(Dispatchers.IO) {\n                val file = runCancellableCatching {\n                    driveFileRepository.find(fileId)\n                }.onFailure {\n                    Log.e(\"SettingAppearanceACT\", \"画像の取得に失敗\", it)\n                }.getOrNull()\n                    ?: return@launch\n                runCancellableCatching {\n                    localConfigRepository.save(\n                        localConfigRepository.get().getOrThrow().copy(\n                            backgroundImagePath = file.url\n                        )\n                    )\n                }\n\n            }\n        }\n\n\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/SettingMovementActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.MenuItem\nimport androidx.activity.compose.setContent\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.KeyboardArrowDown\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.MediaDisplayMode\nimport net.pantasystem.milktea.model.setting.RememberVisibility\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.SettingSection\nimport net.pantasystem.milktea.setting.compose.SettingSwitchTile\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass SettingMovementActivity : AppCompatActivity() {\n\n    companion object {\n        const val EXTRA_HIGHLIGHT_SAFE_SEARCH = \"EXTRA_HIGHLIGHT_SAFE_SEARCH\"\n\n    }\n\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var localConfigRepository: LocalConfigRepository\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        val isHighlightSafeSearch = intent.getBooleanExtra(EXTRA_HIGHLIGHT_SAFE_SEARCH, false)\n        setContent {\n            val configState by settingStore.configState.collectAsState()\n            val currentAccount by accountStore.observeCurrentAccount.collectAsState(initial = null)\n\n            var currentConfigState by remember {\n                mutableStateOf(configState)\n            }\n\n            val rv: RememberVisibility by accountStore.observeCurrentRememberVisibility()\n                .collectAsState(initial = RememberVisibility.None)\n\n            val scope = rememberCoroutineScope()\n\n\n            LaunchedEffect(key1 = currentConfigState) {\n                Log.d(\"SettingMovementActivity\", \"save:$currentConfigState\")\n                localConfigRepository.save(\n                    currentConfigState\n                ).onFailure {\n                    Log.d(\"SettingMovementActivity\", \"error\", it)\n                }\n            }\n\n\n            MilkteaStyleConfigApplyAndTheme(configRepository = localConfigRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            navigationIcon = {\n                                IconButton(onClick = { finish() }) {\n                                    Icon(Icons.Default.ArrowBack, contentDescription = null)\n                                }\n                            },\n                            title = {\n                                Text(stringResource(id = R.string.movement))\n                            }\n                        )\n                    },\n                ) { padding ->\n\n                    Column(\n                        modifier = Modifier\n                            .fillMaxWidth()\n                            .padding(padding)\n                            .verticalScroll(\n                                rememberScrollState()\n                            )\n                    ) {\n\n                        SettingSection(title = stringResource(id = R.string.timeline)) {\n                            SettingSwitchTile(\n                                checked = currentConfigState.isIncludeLocalRenotes,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isIncludeLocalRenotes = it)\n                                },\n                            ) {\n                                Text(text = stringResource(id = R.string.include_local_renotes))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isIncludeRenotedMyNotes,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isIncludeRenotedMyNotes = it)\n                                },\n                            ) {\n                                Text(text = stringResource(id = R.string.include_renoted_my_notes))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isIncludeMyRenotes,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isIncludeMyRenotes = it)\n                                },\n                            ) {\n                                Text(text = stringResource(id = R.string.include_my_renotes))\n                            }\n\n                            SettingSwitchTile(\n                                checked = currentConfigState.isEnableSafeSearch.isEnabled,\n                                modifier = Modifier.then(\n                                    if (isHighlightSafeSearch)\n                                        Modifier.background(MaterialTheme.colorScheme.primary.copy(alpha = 0.2f))\n                                    else Modifier\n                                ),\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(\n                                            isEnableSafeSearch = currentConfigState.isEnableSafeSearch.copy(\n                                                isEnabled = it\n                                            ),\n                                        )\n                                },\n                            ) {\n                                Text(text = stringResource(id = R.string.enable_safe_search))\n                            }\n                        }\n\n\n\n                        if (currentAccount != null) {\n                            SettingSection(title = stringResource(id = R.string.learn_note_visibility)) {\n                                SettingSwitchTile(\n                                    checked = rv is RememberVisibility.Remember,\n                                    onChanged = {\n                                        val config = if (it) {\n                                            DefaultConfig.getRememberVisibilityConfig(currentAccount!!.accountId)\n                                        } else {\n                                            RememberVisibility.None\n                                        }\n                                        scope.launch(Dispatchers.IO) {\n                                            localConfigRepository.save(config)\n                                        }\n\n                                    }) {\n                                    Text(\n                                        text = stringResource(id = R.string.learn_note_visibility)\n                                    )\n                                }\n                            }\n\n                        }\n\n\n                        SettingSection(title = stringResource(id = R.string.notification_sound)) {\n                            SettingSwitchTile(\n                                checked = currentConfigState.isEnableNotificationSound,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isEnableNotificationSound = it)\n                                }) {\n                                Text(stringResource(id = R.string.inapp_notification_sound))\n                            }\n\n                        }\n\n                        SettingSection(title = stringResource(id = R.string.streaming)) {\n                            SettingSwitchTile(\n                                checked = currentConfigState.isEnableStreamingAPIAndNoteCapture,\n                                onChanged = {\n                                    currentConfigState = currentConfigState.copy(\n                                        isEnableStreamingAPIAndNoteCapture = it\n                                    )\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.enable_automic_updates))\n                            }\n                            if (currentConfigState.isEnableStreamingAPIAndNoteCapture) {\n                                SettingSwitchTile(\n                                    checked = currentConfigState.isStopStreamingApiWhenBackground,\n                                    onChanged = {\n                                        currentConfigState =\n                                            currentConfigState.copy(isStopStreamingApiWhenBackground = it)\n                                    }) {\n                                    Text(stringResource(id = R.string.is_stop_timeline_streaming_when_background))\n                                }\n                                SettingSwitchTile(\n                                    checked = currentConfigState.isStopNoteCaptureWhenBackground,\n                                    onChanged = {\n                                        currentConfigState =\n                                            currentConfigState.copy(isStopNoteCaptureWhenBackground = it)\n                                    }) {\n                                    Text(stringResource(id = R.string.is_stop_note_capture_when_background))\n                                }\n                            }\n                            SettingSwitchTile(\n                                checked = currentConfigState.isEnableHapticFeedbackOnNewPost,\n                                onChanged = {\n                                    currentConfigState =\n                                        currentConfigState.copy(isEnableHapticFeedbackOnNewPost = it)\n                                }\n                            ) {\n                                Text(stringResource(id = R.string.settings_enable_haptic_feedback_on_new_post))\n                            }\n                        }\n                        SettingSection(title = stringResource(id = R.string.media)) {\n                            Box(\n                                modifier = Modifier\n                                    .fillMaxWidth()\n                                    .padding(horizontal = 16.dp)\n                            ) {\n                                var isVisibleDropdown by remember {\n                                    mutableStateOf(false)\n                                }\n                                TextButton(\n                                    onClick = { isVisibleDropdown = true },\n                                    Modifier.fillMaxWidth()\n                                ) {\n                                    Row(\n                                        Modifier.fillMaxWidth(),\n                                        verticalAlignment = Alignment.CenterVertically,\n                                        horizontalArrangement = Arrangement.SpaceBetween,\n                                    ) {\n                                        Text(stringFromDisplayMode(displayMode = currentConfigState.mediaDisplayMode))\n                                        Icon(\n                                            Icons.Default.KeyboardArrowDown,\n                                            contentDescription = null\n                                        )\n                                    }\n                                }\n                                DropdownMenu(\n                                    expanded = isVisibleDropdown,\n                                    onDismissRequest = { isVisibleDropdown = false },\n                                    modifier = Modifier.fillMaxWidth()\n                                ) {\n                                    MediaDisplayMode.values().forEach {\n                                        DropdownMenuItem(\n                                            text = { Text(stringFromDisplayMode(displayMode = it)) },\n                                            onClick = {\n                                                currentConfigState =\n                                                    currentConfigState.copy(mediaDisplayMode = it)\n                                                isVisibleDropdown = false\n                                            }\n                                        )\n                                    }\n                                }\n                            }\n                        }\n\n                    }\n\n                }\n            }\n        }\n\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> finish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    fun AccountStore.observeCurrentRememberVisibility(): Flow<RememberVisibility> {\n        return this.observeCurrentAccount.filterNotNull()\n            .flatMapLatest {\n                localConfigRepository.observeRememberVisibility(it.accountId)\n            }\n    }\n}\n\n@Composable\nprivate fun stringFromDisplayMode(displayMode: MediaDisplayMode): String {\n    return when (displayMode) {\n        MediaDisplayMode.AUTO -> stringResource(R.string.media_display_mode_default)\n        MediaDisplayMode.ALWAYS_HIDE -> stringResource(id = R.string.media_display_mode_always)\n        MediaDisplayMode.ALWAYS_HIDE_WHEN_MOBILE_NETWORK -> stringResource(id = R.string.settings_hide_media_when_mobile_network)\n        MediaDisplayMode.ALWAYS_SHOW -> stringResource(id = R.string.settings_always_show_media)\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/activities/SettingsActivity.kt",
    "content": "package net.pantasystem.milktea.setting.activities\n\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.rememberScrollState\nimport androidx.compose.foundation.verticalScroll\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.Scaffold\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TopAppBar\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.runtime.getValue\nimport com.google.android.gms.oss.licenses.OssLicensesMenuActivity\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.FlowPreview\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.compose.SettingListTileLayout\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@AndroidEntryPoint\nclass SettingsActivity : AppCompatActivity() {\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                Scaffold(\n                    contentWindowInsets = WindowInsets.safeDrawing,\n                    topBar = {\n                        TopAppBar(\n                            navigationIcon = {\n                                IconButton(onClick = {\n                                    finish()\n                                }) {\n                                    Icon(Icons.Default.ArrowBack, contentDescription = null)\n                                }\n                            },\n                            title = {\n                                Text(stringResource(id = R.string.setting))\n                            }\n                        )\n                    }\n                ) {\n                    Column(\n                        Modifier\n                            .padding(it)\n                            .verticalScroll(rememberScrollState())\n                    ) {\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        AccountSettingActivity::class.java,\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.account))\n                        }\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        SettingMovementActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.movement))\n                        }\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        PageSettingActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.nav_setting_tab))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        SettingAppearanceActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.appearance))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        SecuritySettingActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(R.string.security_setting))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        RenoteMuteSettingActivity::class.java,\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.settings_renote_mute_title))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        ReactionSettingActivity::class.java,\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.settings_emoji_picker))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        ClientWordFilterSettingActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.client_word_mute))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        AboutMilkteaActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.settings_about_milktea))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        CacheSettingActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.settings_cache_config))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        OssLicensesMenuActivity::class.java\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.license))\n                        }\n\n                        SettingListTileLayout(\n                            verticalPadding = 12.dp,\n                            onClick = {\n                                startActivity(\n                                    Intent(\n                                        this@SettingsActivity,\n                                        DeveloperSettingActivity::class.java,\n                                    )\n                                )\n                            }\n                        ) {\n                            Text(stringResource(id = R.string.settings_developer_options))\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/SettingRadioTile.kt",
    "content": "package net.pantasystem.milktea.setting.compose\n\nimport androidx.compose.foundation.layout.ColumnScope\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.material3.RadioButton\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\n\n@Composable\nfun SettingRadioTile(\n    selected: Boolean,\n    modifier: Modifier = Modifier,\n    onClick: () -> Unit,\n    subtitle: (@Composable ColumnScope.() -> Unit)? = null,\n    leading: (@Composable RowScope.() -> Unit)? = null,\n    title: @Composable ColumnScope.() -> Unit,\n) {\n    SettingListTileLayout(\n        modifier = modifier,\n        leading = leading,\n        onClick = onClick,\n        subtitle = subtitle,\n        title = title,\n        trailing = {\n\n            RadioButton(selected = selected, onClick = onClick)\n        }\n    )\n}\n\n@Preview\n@Composable\nfun Preview_SettingRadioTile() {\n    SettingRadioTile(selected = true, onClick = {}) {\n        Text(\"testtest\")\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/SettingSwitchTile.kt",
    "content": "package net.pantasystem.milktea.setting.compose\n\nimport androidx.compose.foundation.layout.ColumnScope\nimport androidx.compose.foundation.layout.RowScope\nimport androidx.compose.material3.Switch\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\n\n@Composable\nfun SettingSwitchTile(\n    checked: Boolean,\n    modifier: Modifier = Modifier,\n    onChanged: (Boolean) -> Unit,\n    subtitle: (@Composable ColumnScope.() -> Unit)? = null,\n    leading: (@Composable RowScope.() -> Unit)? = null,\n    title: @Composable ColumnScope.() -> Unit,\n) {\n    SettingListTileLayout(\n        modifier = modifier,\n        leading = leading,\n        onClick = {\n            onChanged(!checked)\n        },\n        subtitle = subtitle,\n        title = title,\n        trailing = {\n            Switch(checked = checked, onCheckedChange = onChanged)\n        }\n    )\n}\n\n@Preview\n@Composable\nfun Preview_SettingSwitchTile() {\n    SettingSwitchTile(checked = true, onChanged = {}) {\n        Text(\"testtest\")\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/SettingTIleLayoutBase.kt",
    "content": "package net.pantasystem.milktea.setting.compose\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.LocalTextStyle\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Add\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.CompositionLocalProvider\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.text.TextStyle\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.Dp\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\n\n@Composable\nfun SettingListTileLayout(\n    modifier: Modifier = Modifier,\n    verticalPadding: Dp = 12.dp,\n    horizontalPadding: Dp = 14.dp,\n    subtitle: (@Composable ColumnScope.() -> Unit)? = null,\n    leading: (@Composable RowScope.() -> Unit)? = null,\n    trailing: (@Composable RowScope.() -> Unit)? = null,\n    title: @Composable ColumnScope.() -> Unit,\n) {\n    Row(\n        modifier.padding(vertical = verticalPadding, horizontal = horizontalPadding),\n        verticalAlignment = Alignment.CenterVertically\n    ) {\n        leading?.invoke(this)\n        if (leading != null) {\n            Spacer(modifier = Modifier.width(4.dp))\n        }\n        Column(Modifier.weight(1f)) {\n            CompositionLocalProvider(\n                LocalTextStyle provides TextStyle(\n                    fontSize = 18.sp,\n                )\n            ) {\n                title.invoke(this@Column)\n            }\n\n            CompositionLocalProvider(LocalTextStyle provides TextStyle(fontSize = 14.sp)) {\n                subtitle?.invoke(this@Column)\n            }\n        }\n        if (trailing != null) {\n            Spacer(modifier = Modifier.width(4.dp))\n        }\n        trailing?.invoke(this)\n    }\n}\n\n@Composable\nfun SettingListTileLayout(\n    modifier: Modifier = Modifier,\n    onClick: () -> Unit,\n    verticalPadding: Dp = 8.dp,\n    horizontalPadding: Dp = 14.dp,\n    subtitle: (@Composable ColumnScope.() -> Unit)? = null,\n    leading: (@Composable RowScope.() -> Unit)? = null,\n    trailing: (@Composable RowScope.() -> Unit)? = null,\n    title: @Composable ColumnScope.() -> Unit,\n) {\n    SettingListTileLayout(\n        modifier = modifier.clickable {\n            onClick()\n        },\n        verticalPadding = verticalPadding,\n        horizontalPadding = horizontalPadding,\n        subtitle = subtitle,\n        leading = leading,\n        trailing = trailing,\n        title = title,\n    )\n}\n\n@Preview\n@Composable\nfun Preview_SettingTileLayout() {\n    SettingListTileLayout(\n        onClick = {},\n        trailing = {\n            Icon(Icons.Default.Add, contentDescription = null)\n        },\n        leading = {\n            Icon(Icons.Default.Add, contentDescription = null)\n        },\n        subtitle = {\n            Text(\"hogehogehogehogheo\")\n        }\n    ) {\n        Text(\"testtest\")\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/SettingTitleTile.kt",
    "content": "package net.pantasystem.milktea.setting.compose\n\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\n\n@Composable\nfun SettingTitleTile(text: String) {\n    Text(\n        text = text,\n        fontSize = 24.sp,\n        modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 8.dp)\n    )\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/account/AccountSettingScreen.kt",
    "content": "package net.pantasystem.milktea.setting.compose.account\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common_android_ui.account.AccountSwitchingDialogLayout\nimport net.pantasystem.milktea.common_android_ui.account.AccountTile\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountInfo\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModelUiState\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.setting.R\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun AccountSettingScreen(\n    uiState: AccountViewModelUiState,\n    onAccountClicked: (AccountInfo) -> Unit,\n    onAddAccountButtonClicked: () -> Unit,\n    onNavigateUp: () -> Unit,\n    onShowUser: (UserDetailNavigationArgs) -> Unit,\n    onSignOutButtonClicked: (AccountInfo) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    val sheetState = rememberModalBottomSheetState()\n    val scope = rememberCoroutineScope()\n    var showBottomSheet by remember { mutableStateOf(false) }\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            TopAppBar(\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = null)\n                    }\n                },\n                title = {\n                    Text(stringResource(id = R.string.account))\n                },\n            )\n        },\n        modifier = modifier,\n    ) { paddingValues ->\n        Column(\n            modifier = Modifier\n                .padding(paddingValues)\n                .fillMaxSize(),\n            verticalArrangement = Arrangement.SpaceBetween\n        ) {\n            Column(modifier = Modifier.fillMaxWidth()) {\n                if (uiState.currentAccountInfo != null) {\n                    AccountTile(\n                        account = uiState.currentAccountInfo!!,\n                        onClick = {\n                            showBottomSheet = true\n                        },\n                        onAvatarClick = {\n                            onShowUser(\n                                UserDetailNavigationArgs.UserName(it.user?.userName ?: it.account.userName)\n                            )\n                        }\n                    )\n                    TextButton(\n                        onClick = {\n                            onSignOutButtonClicked(uiState.currentAccountInfo!!)\n                        },\n                        modifier = Modifier.fillMaxWidth()\n                    ) {\n                        Text(stringResource(id = R.string.sign_out), color = Color.Red)\n                    }\n                }\n            }\n\n            Column(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(horizontal = 32.dp)\n            ) {\n                Button(\n                    onClick = {\n                        showBottomSheet = true\n                    },\n                    modifier = Modifier.fillMaxWidth(),\n                    shape = RoundedCornerShape(32.dp)\n                ) {\n                    Text(stringResource(id = R.string.switch_account))\n                }\n                Spacer(modifier = Modifier.width(16.dp))\n                Button(\n                    onClick = onAddAccountButtonClicked,\n                    modifier = Modifier.fillMaxWidth(),\n                    shape = RoundedCornerShape(32.dp)\n                ) {\n                    Text(stringResource(id = R.string.add_account))\n                }\n            }\n        }\n    }\n\n    if (showBottomSheet) {\n        ModalBottomSheet(\n            onDismissRequest = { showBottomSheet = false },\n            sheetState = sheetState,\n        ) {\n            AccountSwitchingDialogLayout(\n                uiState = uiState,\n                onSettingButtonClicked = {\n                    scope.launch { sheetState.hide() }.invokeOnCompletion {\n                        showBottomSheet = false\n                    }\n                },\n                onAvatarIconClicked = { accountInfo ->\n                    scope.launch { sheetState.hide() }.invokeOnCompletion {\n                        showBottomSheet = false\n                    }\n                    onShowUser(UserDetailNavigationArgs.UserName(accountInfo.user?.let {\n                        \"@${it.userName}@${it.host}\"\n                    } ?: \"@${accountInfo.account.userName}@${accountInfo.account.getHost()}\"))\n                },\n                onAccountClicked = {\n                    scope.launch { sheetState.hide() }.invokeOnCompletion {\n                        showBottomSheet = false\n                    }\n                    onAccountClicked(it)\n                },\n                onAddAccountButtonClicked = {\n                    scope.launch { sheetState.hide() }.invokeOnCompletion {\n                        showBottomSheet = false\n                    }\n                    onAddAccountButtonClicked()\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/renote/mute/RenoteMuteSettingScreen.kt",
    "content": "package net.pantasystem.milktea.setting.compose.renote.mute\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.material.icons.filled.Delete\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.viewmodel.RenoteMuteSettingUiState\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun RenoteMuteSettingScreen(\n    uiState: RenoteMuteSettingUiState,\n    onRemoveRenoteMuteButtonClicked: (RenoteMute) -> Unit,\n    onUserClicked: (User) -> Unit,\n    onRefresh: () -> Unit,\n    onNavigateUp: () -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        modifier = modifier,\n        topBar = {\n            TopAppBar(\n                title = {\n                    Text(text = stringResource(id = R.string.settings_renote_mute_title))\n                },\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = \"navigate up\")\n                    }\n                }\n            )\n        }\n    ) { paddingValues ->\n        PullToRefreshBox(\n            isRefreshing = uiState.syncState is ResultState.Loading,\n            onRefresh = onRefresh,\n            modifier = Modifier\n                .fillMaxSize()\n                .padding(paddingValues)\n        ) {\n            LazyColumn(\n                modifier = Modifier.fillMaxSize()\n            ) {\n                items(uiState.renoteMutes.size) {\n                    val item = uiState.renoteMutes[it]\n                    RemovableSimpleUserCard(\n                        user = item.user,\n                        accountHost = uiState.currentAccount?.getHost(),\n                        onClick = {\n                            when (val user = item.user) {\n                                null -> Unit\n                                else -> {\n                                    onUserClicked(user)\n                                }\n                            }\n                        },\n                        onDeleteButtonClicked = {\n                            onRemoveRenoteMuteButtonClicked(item.renoteMute)\n                        },\n                    )\n                }\n            }\n        }\n    }\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun RemovableSimpleUserCard(\n    user: User?,\n    accountHost: String?,\n    onClick: () -> Unit,\n    onDeleteButtonClicked: () -> Unit,\n) {\n\n    Card(\n        onClick = onClick,\n        shape = RoundedCornerShape(0.dp),\n        modifier = Modifier.padding(0.5.dp),\n        colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface)\n    ) {\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            horizontalArrangement = Arrangement.SpaceBetween,\n            modifier = Modifier\n                .fillMaxWidth()\n        ) {\n            Row(\n                verticalAlignment = Alignment.CenterVertically,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(8.dp)\n                    .weight(1f),\n            ) {\n                AvatarIcon(url = user?.avatarUrl, size = 48.dp)\n                Spacer(modifier = Modifier.width(4.dp))\n                Column {\n                    CustomEmojiText(\n                        text = user?.displayName ?: \"\",\n                        emojis = user?.emojis ?: emptyList(),\n                        sourceHost = user?.host,\n                        accountHost = accountHost,\n                        parsedResult = user?.parsedResult,\n                    )\n                    Spacer(modifier = Modifier.height(4.dp))\n                    Text(text = user?.displayUserName ?: \"\")\n                }\n            }\n            IconButton(onClick = onDeleteButtonClicked) {\n                Icon(Icons.Default.Delete, contentDescription = null)\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/tab/DragAndDropState.kt",
    "content": "package net.pantasystem.milktea.setting.compose.tab\n\nimport androidx.compose.foundation.gestures.detectDragGesturesAfterLongPress\nimport androidx.compose.foundation.gestures.scrollBy\nimport androidx.compose.foundation.lazy.LazyListItemInfo\nimport androidx.compose.foundation.lazy.LazyListState\nimport androidx.compose.foundation.lazy.rememberLazyListState\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.input.pointer.PointerInputChange\nimport androidx.compose.ui.input.pointer.pointerInput\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.launch\n\n\ninternal fun LazyListState.getVisibleItemInfoFor(absoluteIndex: Int): LazyListItemInfo? {\n    return this\n        .layoutInfo\n        .visibleItemsInfo\n        .getOrNull(absoluteIndex - this.layoutInfo.visibleItemsInfo.first().index)\n}\n\n@Composable\ninternal fun rememberDragDropListState(\n    lazyListState: LazyListState = rememberLazyListState(),\n    scope: CoroutineScope,\n    onMove: (Int, Int) -> Unit\n): DragAndDropState {\n    return remember { DragAndDropState(listState = lazyListState, scope = scope, onMove = onMove) }\n}\n\ninternal fun Modifier.dragAndDrop(dragDropState: DragAndDropState): Modifier {\n    return then(\n        Modifier.pointerInput(\n            Unit\n        ) {\n            detectDragGesturesAfterLongPress(\n                onDrag = dragDropState::onDrag,\n                onDragStart = dragDropState::onDragStart,\n                onDragEnd = dragDropState::onDragEnd,\n                onDragCancel = dragDropState::onDragCancel\n            )\n        }\n    )\n}\n\n\ninternal class DragAndDropState(\n    val listState: LazyListState,\n    val scope: CoroutineScope,\n    val onMove: (fromIndex: Int, toIndex: Int) -> Unit,\n) {\n    private var initiallyDraggedElement by mutableStateOf<LazyListItemInfo?>(null)\n    var currentIndexOfDraggedItem by mutableStateOf<Int?>(null)\n        private set\n    private var draggedDistance by mutableStateOf(0f)\n\n    private var overscrollJob: Job? = null\n\n    val targetElementTranslateY\n        get() = currentIndexOfDraggedItem\n            ?.let {\n                listState.getVisibleItemInfoFor(it)\n            }\n            ?.let { item ->\n                (initiallyDraggedElement?.offset ?: 0f).toFloat() + draggedDistance - item.offset\n            }\n\n\n    private val currentElementItemInfo\n        get() = currentIndexOfDraggedItem?.let {\n            listState.getVisibleItemInfoFor(it)\n        }\n\n\n    fun onDrag(change: PointerInputChange, offset: Offset) {\n        change.consume()\n        draggedDistance += offset.y\n\n\n        initiallyDraggedElement?.let {\n            val startOffset = it.offset + draggedDistance\n            val endOffset = it.offset + it.size + draggedDistance\n\n            currentElementItemInfo?.let { hovered ->\n                listState.layoutInfo.visibleItemsInfo.filterNot { item ->\n                    (item.offset + item.size) < startOffset || item.offset > endOffset\n                }.firstOrNull { item ->\n                    val delta = startOffset - hovered.offset\n                    when {\n                        delta > 0 -> (endOffset > (item.offset + item.size))\n                        else -> (startOffset < item.offset)\n                    }\n                }?.also { item ->\n                    currentIndexOfDraggedItem?.let { current ->\n                        onMove(current, item.index)\n                    }\n                    currentIndexOfDraggedItem = item.index\n                }\n            }\n        }\n        if (overscrollJob?.isActive == true) {\n            return\n        }\n        checkForOverScroll().takeIf { o -> o != 0f }\n            ?.let {\n                overscrollJob = scope.launch {\n                    listState.scrollBy(it)\n                }\n            } ?: run { overscrollJob?.cancel() }\n    }\n\n    fun onDragStart(offset: Offset) {\n        listState.layoutInfo.visibleItemsInfo\n            .firstOrNull { item ->\n                offset.y.toInt() in item.offset..(item.offset + item.size)\n            }?.also {\n                currentIndexOfDraggedItem = it.index\n                initiallyDraggedElement = it\n            }\n    }\n\n    fun startDrag(currentIndexOfDraggedItem: Int, initiallyDraggedElement: LazyListItemInfo) {\n        this.currentIndexOfDraggedItem = currentIndexOfDraggedItem\n        this.initiallyDraggedElement = initiallyDraggedElement\n    }\n\n    fun onDragEnd() {\n        draggedDistance = 0f\n        currentIndexOfDraggedItem = null\n        initiallyDraggedElement = null\n        overscrollJob?.cancel()\n    }\n\n    fun onDragCancel() {\n        draggedDistance = 0f\n        currentIndexOfDraggedItem = null\n        initiallyDraggedElement = null\n        overscrollJob?.cancel()\n    }\n\n    private fun checkForOverScroll(): Float {\n        return initiallyDraggedElement?.let {\n            val startOffset = it.offset + draggedDistance\n            val endOffset = (it.offset + it.size) + draggedDistance\n            val viewPortStart = listState.layoutInfo.viewportStartOffset\n            val viewPortEnd = listState.layoutInfo.viewportEndOffset\n\n            when {\n                draggedDistance > 0 -> (endOffset - viewPortEnd).takeIf { diff -> diff > 0 }\n                draggedDistance < 0 -> (startOffset - viewPortStart).takeIf { diff -> diff < 0 }\n                else -> null\n            }\n        } ?: 0f\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/tab/TabItemSelectionDialog.kt",
    "content": "package net.pantasystem.milktea.setting.compose.tab\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport getStringFromStringSource\nimport net.pantasystem.milktea.setting.viewmodel.page.PageCandidate\nimport net.pantasystem.milktea.setting.viewmodel.page.PageCandidateGroup\n\n\n@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)\n@Composable\ninternal fun TabItemSelectionDialog(\n    modifier: Modifier = Modifier,\n    items: List<PageCandidateGroup>,\n    onClick: (PageCandidate) -> Unit,\n) {\n    LazyColumn(\n        modifier\n    ) {\n        for (group in items) {\n            stickyHeader {\n                Surface(\n                    Modifier.fillMaxWidth(),\n                    color = MaterialTheme.colorScheme.surface,\n                ) {\n                    Text(\n                        \"@${group.relatedAccount.userName}@${group.relatedAccount.getHost()}\",\n                        modifier = Modifier.padding(16.dp)\n                    )\n                }\n            }\n\n            items(group.candidates) { pageType ->\n                Surface(\n                    onClick = {\n                        onClick(pageType)\n                    },\n                ) {\n                    Box(\n                        contentAlignment = Alignment.CenterStart,\n                        modifier = Modifier\n                            .padding(horizontal = 32.dp, vertical = 16.dp)\n                            .fillMaxWidth(),\n                    ) {\n                        Text(\n                            getStringFromStringSource(pageType.name),\n                            fontWeight = FontWeight.Bold,\n                            fontSize = 16.sp\n                        )\n                    }\n                }\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/tab/TabItemsList.kt",
    "content": "package net.pantasystem.milktea.setting.compose.tab\n\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.gestures.detectDragGestures\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.itemsIndexed\nimport androidx.compose.material3.HorizontalDivider\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.contentColorFor\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Menu\nimport androidx.compose.material.icons.filled.MoreVert\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.graphicsLayer\nimport androidx.compose.ui.input.pointer.pointerInput\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.ui.zIndex\nimport net.pantasystem.milktea.model.account.page.Page\n\n\n@Composable\ninternal fun TabItemsList(\n    dragDropState: DragAndDropState,\n    modifier: Modifier,\n    list: List<Page>,\n    onOptionButtonClicked: (Page) -> Unit\n) {\n\n\n    LazyColumn(modifier = modifier.dragAndDrop(dragDropState), state = dragDropState.listState) {\n        itemsIndexed(list) { index, item ->\n            Column(\n                modifier = Modifier\n                    .graphicsLayer {\n                        translationY = dragDropState.targetElementTranslateY\n                            .takeIf {\n                                index == dragDropState.currentIndexOfDraggedItem\n                            } ?: 0f\n                    }\n                    .fillMaxWidth()\n                    .background(MaterialTheme.colorScheme.surface)\n                    .zIndex(if (index == dragDropState.currentIndexOfDraggedItem) 1f else 0f)\n            ) {\n                TabItem(\n                    dragDropState = dragDropState,\n                    index = index,\n                    item = item,\n                    onOptionButtonClicked = onOptionButtonClicked\n                )\n                HorizontalDivider(modifier = Modifier.fillMaxWidth())\n            }\n        }\n    }\n}\n\n@Composable\nprivate fun TabItem(\n    dragDropState: DragAndDropState,\n    index: Int,\n    item: Page,\n    onOptionButtonClicked: (Page) -> Unit,\n) {\n    Row(\n        Modifier\n            .fillMaxWidth()\n            .padding(8.dp),\n        horizontalArrangement = Arrangement.SpaceBetween,\n        verticalAlignment = Alignment.CenterVertically,\n    ) {\n        Row {\n            Icon(\n                Icons.Default.Menu,\n                contentDescription = null,\n                modifier = Modifier.pointerInput(Unit) {\n\n                    detectDragGestures(\n                        onDrag = dragDropState::onDrag,\n                        onDragStart = {\n                            dragDropState.listState.getVisibleItemInfoFor(index)?.run {\n                                dragDropState.startDrag(index, this)\n                            }\n                        },\n                        onDragEnd = dragDropState::onDragEnd,\n                        onDragCancel = dragDropState::onDragCancel\n                    )\n                },\n            )\n            Spacer(modifier = Modifier.width(8.dp))\n            Text(\n                item.title,\n                fontSize = 18.sp,\n                color = MaterialTheme.colorScheme.contentColorFor(MaterialTheme.colorScheme.surface)\n            )\n        }\n\n        IconButton(onClick = {\n            onOptionButtonClicked(item)\n        }) {\n            Icon(Icons.Default.MoreVert, contentDescription = null)\n        }\n\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/compose/tab/TabItemsListScreen.kt",
    "content": "package net.pantasystem.milktea.setting.compose.tab\n\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.setting.R\nimport net.pantasystem.milktea.setting.viewmodel.page.PageCandidate\nimport net.pantasystem.milktea.setting.viewmodel.page.PageCandidateGroup\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\ninternal fun TabItemsListScreen(\n    dragDropState: DragAndDropState,\n    pageTypes: List<PageCandidateGroup>,\n    list: List<Page>,\n    onSelectPage: (PageCandidate) -> Unit,\n    onOptionButtonClicked: (Page) -> Unit,\n    onNavigateUp: () -> Unit\n) {\n    val sheetState = rememberModalBottomSheetState()\n    val scope = rememberCoroutineScope()\n    var showBottomSheet by remember { mutableStateOf(false) }\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            TopAppBar(\n                title = {\n                    Text(stringResource(R.string.add_to_tab))\n                },\n                navigationIcon = {\n                    IconButton(\n                        onClick = {\n                            onNavigateUp()\n                        }\n                    ) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = null)\n                    }\n                }\n            )\n        },\n        floatingActionButton = {\n            ExtendedFloatingActionButton(\n                text = {\n                    Text(stringResource(R.string.add_tab))\n                },\n                icon = {\n                    Icon(painter = painterResource(R.drawable.ic_add_to_tab_24px), contentDescription = null)\n                },\n                onClick = {\n                    showBottomSheet = true\n                }\n            )\n        },\n        floatingActionButtonPosition = FabPosition.Center,\n    ) {\n        TabItemsList(\n            modifier = Modifier\n                .fillMaxSize()\n                .padding(it),\n            list = list,\n            onOptionButtonClicked = { page ->\n                onOptionButtonClicked(page)\n            },\n            dragDropState = dragDropState\n        )\n    }\n\n    if (showBottomSheet) {\n        ModalBottomSheet(\n            onDismissRequest = { showBottomSheet = false },\n            sheetState = sheetState,\n        ) {\n            TabItemSelectionDialog(\n                modifier = Modifier.fillMaxSize(),\n                items = pageTypes,\n                onClick = {\n                    scope.launch { sheetState.hide() }.invokeOnCompletion {\n                        showBottomSheet = false\n                    }\n                    onSelectPage(it)\n                }\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/CacheSettingViewModel.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\n\n@HiltViewModel\nclass CacheSettingViewModel @Inject constructor(\n    private val imageCacheRepository: ImageCacheRepository,\n    private val noteDataSource: NoteDataSource,\n    private val userDataSource: UserDataSource,\n    loggerFac: Logger.Factory,\n) : ViewModel() {\n\n    private val logger = loggerFac.create(\"CacheSettingVM\")\n\n    private val _refreshEvent = MutableStateFlow(0L)\n\n    val uiState = _refreshEvent.map {\n        CacheSettingUiState(\n            imageCacheSize = imageCacheRepository.findCachedFileCount().getOrElse { 0L },\n            noteCacheSize = noteDataSource.findLocalCount().getOrElse { 0L },\n            userCacheSize = userDataSource.count().getOrElse { 0L },\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        CacheSettingUiState(),\n    )\n\n\n    fun onClearNoteCache() {\n        viewModelScope.launch {\n            noteDataSource.clear().onFailure { e ->\n                logger.error(\"Failed to clear note cache\", e)\n            }\n            _refreshEvent.value = System.currentTimeMillis()\n        }\n    }\n\n    fun onClearCustomEmojiCache() {\n        viewModelScope.launch {\n            try {\n                imageCacheRepository.clear()\n            } catch (e: Exception) {\n                logger.error(\"Failed to clear custom emoji cache\", e)\n            }\n            _refreshEvent.value = System.currentTimeMillis()\n        }\n    }\n\n    fun onClearUserCache() {\n        viewModelScope.launch {\n            userDataSource.clear().onFailure { e->\n                logger.error(\"Failed to clear user cache\", e)\n            }\n            _refreshEvent.value = System.currentTimeMillis()\n        }\n    }\n}\n\ndata class CacheSettingUiState(\n    val imageCacheSize: Long = 0L,\n    val noteCacheSize: Long = 0L,\n    val userCacheSize: Long = 0L\n)"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/ImportReactionFromWebViewViewModel.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.launch\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.api.misskey.register.WebClientBaseRequest\nimport net.pantasystem.milktea.api.misskey.register.WebClientRegistries\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common.throwIfHasError\nimport net.pantasystem.milktea.data.api.misskey.MisskeyAPIProvider\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSetting\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSettingDao\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ImportReactionFromWebViewViewModel @Inject constructor(\n    val accountStore: AccountStore,\n    loggerFactory: Logger.Factory,\n    private val reactionUserSettingDao: ReactionUserSettingDao,\n    private val accountRepository: AccountRepository,\n    private val misskeyAPIProvider: MisskeyAPIProvider,\n) : ViewModel() {\n\n    val logger = loggerFactory.create(\"IRFWVViewModel\")\n\n    private val _reactions = MutableStateFlow(listOf<String>())\n    val reactions: StateFlow<List<String>> = _reactions\n\n    fun onOverwriteButtonClicked() {\n        viewModelScope.launch {\n            try {\n\n                val account = accountRepository.getCurrentAccount().getOrThrow()\n                reactionUserSettingDao.deleteAll(reactionUserSettingDao.findByInstanceDomain(account.normalizedInstanceUri) ?: emptyList())\n                val settings = reactions.value.mapIndexed { i, reaction ->\n                    ReactionUserSetting(\n                        reaction,\n                        account.normalizedInstanceUri,\n                        i\n                    )\n                }\n                reactionUserSettingDao.insertAll(settings)\n            } catch (e: Exception) {\n                Log.e(\"ReactionPickerSettingVM\", \"save error\", e)\n            }\n        }\n    }\n\n    fun onGotWebClientToken(account: Account, token: String?) {\n        if (token == null) {\n            return\n        }\n\n        viewModelScope.launch {\n            getReactions(account, token).onSuccess {\n                _reactions.value = it.reactions\n            }.onFailure {\n                logger.error(\"fetch reactions error\", it)\n            }\n        }\n    }\n\n    private suspend fun getReactions(account: Account, token: String): Result<WebClientRegistries> = runCancellableCatching{\n        withContext(Dispatchers.IO) {\n            val body = misskeyAPIProvider.get(account).getReactionsFromGetAll(WebClientBaseRequest(\n                i = token,\n                scope = listOf(\"client\", \"base\")\n            )).throwIfHasError().body()\n            requireNotNull(body)\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/RenoteMuteSettingViewModel.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMute\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMuteRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass RenoteMuteSettingViewModel @Inject constructor(\n    accountStore: AccountStore,\n    private val renoteMuteRepository: RenoteMuteRepository,\n    private val userDataSource: UserDataSource,\n) : ViewModel() {\n\n    private val currentAccount = accountStore.observeCurrentAccount\n        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val renoteMutes = currentAccount.filterNotNull().flatMapLatest {\n        renoteMuteRepository.observeBy(it.accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val relatedUsers =\n        combine(currentAccount.filterNotNull(), renoteMutes) { account, mutes ->\n            AccountWithMutes(\n                account,\n                mutes,\n            )\n        }.flatMapLatest {\n            userDataSource.observeIn(it.account.accountId, it.userIds)\n        }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    private val refreshEvent = MutableSharedFlow<Account>(extraBufferCapacity = 5)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val syncState = refreshEvent.flatMapLatest {\n        suspend {\n            renoteMuteRepository.syncBy(it.accountId)\n        }.asLoadingStateFlow()\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        ResultState.initialState(),\n    )\n\n    val uiState = combine(\n        currentAccount,\n        renoteMutes,\n        relatedUsers,\n        syncState,\n    ) { account, renoteMutes, users, _ ->\n        RenoteMuteSettingUiState(\n            currentAccount = account,\n            renoteMutes = renoteMutes.map { renoteMute ->\n                RenoteMuteWithUser(\n                    renoteMute = renoteMute,\n                    user = users.firstOrNull {\n                        it.id == renoteMute.userId\n                    }\n                )\n            }\n\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        RenoteMuteSettingUiState()\n    )\n\n    private val _errors = MutableSharedFlow<Throwable>(\n        extraBufferCapacity = 100,\n        onBufferOverflow = BufferOverflow.DROP_OLDEST\n    )\n\n    val errors = _errors.asSharedFlow()\n\n    fun onRemoveRenoteMute(renoteMute: RenoteMute) {\n        viewModelScope.launch {\n            renoteMuteRepository.delete(renoteMute.userId).onFailure {\n                _errors.tryEmit(it)\n            }\n        }\n    }\n\n    fun onRefresh(account: Account) {\n        refreshEvent.tryEmit(account)\n    }\n}\n\n\ndata class RenoteMuteSettingUiState(\n    val currentAccount: Account? = null,\n    val renoteMutes: List<RenoteMuteWithUser> = emptyList(),\n    val syncState: ResultState<Unit> = ResultState.Fixed(StateContent.NotExist()),\n)\n\ndata class RenoteMuteWithUser(\n    val renoteMute: RenoteMute,\n    val user: User?,\n)\n\nprivate data class AccountWithMutes(\n    val account: Account,\n    val mutes: List<RenoteMute>,\n) {\n    val userIds = mutes.map {\n        it.userId.id\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/muteword/ClientWordFilterSettingViewModel.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel.muteword\n\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfigRepository\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfigTextParser\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ClientWordFilterSettingViewModel @Inject constructor(\n    private val repository: WordFilterConfigRepository\n) : ViewModel() {\n\n\n    var muteWordsFieldState by mutableStateOf(\"\")\n        private set\n\n    init {\n        viewModelScope.launch {\n            repository.get().flatMapCancellableCatching {\n                WordFilterConfigTextParser.fromConfig(it)\n            }.onSuccess {\n                muteWordsFieldState = it\n            }\n        }\n    }\n\n    fun updateText(text: String) {\n        muteWordsFieldState = text\n    }\n\n    fun save() {\n        viewModelScope.launch {\n            WordFilterConfigTextParser.fromText(muteWordsFieldState).flatMapCancellableCatching {\n                repository.save(it)\n            }.onSuccess {\n\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/page/PageCandidateGenerator.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel.page\n\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.PageType\nimport net.pantasystem.milktea.model.instance.Version\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.nodeinfo.getVersion\nimport net.pantasystem.milktea.setting.R\nimport javax.inject.Inject\n\nclass PageCandidateGenerator @Inject constructor(\n    private val nodeInfoRepository: NodeInfoRepository,\n) {\n\n    suspend fun createPageCandidates(\n        related: Account,\n        currentAccount: Account?,\n    ): List<PageCandidate> {\n\n        val isSameAccount = related.accountId == currentAccount?.accountId || currentAccount == null\n        val restrictionTypes = setOf(\n            PageType.SEARCH,\n            PageType.SEARCH_HASH,\n            PageType.USER,\n            PageType.DETAIL,\n        )\n        return when (related.instanceType) {\n            Account.InstanceType.MISSKEY -> {\n                generateMisskeyTabs(related)\n            }\n            Account.InstanceType.FIREFISH -> {\n                generateFirefishTabs(related)\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                generateMastodonTabs(related)\n            }\n        }.filter {\n            isSameAccount || !restrictionTypes.contains(it.type)\n        }\n    }\n\n    private fun generateMastodonTabs(related: Account): List<PageCandidate> {\n        return listOf(\n            PageCandidate(\n                related,\n                PageType.MASTODON_HOME_TIMELINE,\n                StringSource(R.string.home_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.MASTODON_LOCAL_TIMELINE,\n                StringSource(R.string.local_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.MASTODON_PUBLIC_TIMELINE,\n                StringSource(R.string.global_timeline),\n            ),\n            PageCandidate(\n                related,\n                PageType.NOTIFICATION,\n                StringSource(R.string.notification)\n            ),\n            PageCandidate(\n                related,\n                PageType.FAVORITE,\n                StringSource(R.string.favorite)\n            ),\n//                    PageType.MASTODON_HASHTAG_TIMELINE,\n            PageCandidate(\n                related,\n                PageType.MASTODON_LIST_TIMELINE,\n                StringSource(R.string.list),\n            ),\n            PageCandidate(\n                related,\n                PageType.MASTODON_BOOKMARK_TIMELINE,\n                StringSource(R.string.bookmark)\n            )\n        )\n    }\n\n    private fun generateFirefishTabs(related: Account): List<PageCandidate> {\n        return listOfNotNull(\n            PageCandidate(\n                related,\n                PageType.HOME,\n                StringSource(R.string.home_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.LOCAL,\n                StringSource(R.string.local_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.SOCIAL,\n                StringSource(R.string.hybrid_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.GLOBAL,\n                StringSource(R.string.global_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.CALCKEY_RECOMMENDED_TIMELINE,\n                StringSource(R.string.calckey_recomended_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.ANTENNA,\n                StringSource(R.string.antenna)\n            ),\n            PageCandidate(\n                related,\n                PageType.NOTIFICATION,\n                StringSource(R.string.notification)\n            ),\n            PageCandidate(\n                related,\n                PageType.USER_LIST,\n                StringSource(R.string.user_list)\n            ),\n            PageCandidate(\n                related,\n                PageType.MENTION,\n                StringSource(R.string.mention)\n            ),\n            PageCandidate(\n                related,\n                PageType.FAVORITE,\n                StringSource(R.string.favorite)\n            ),\n            PageCandidate(\n                related,\n                PageType.CHANNEL_TIMELINE,\n                StringSource(R.string.channel)\n            ),\n            PageCandidate(\n                related,\n                PageType.CLIP_NOTES,\n                StringSource(R.string.clip)\n            ),\n            PageCandidate(\n                related,\n                PageType.SEARCH,\n                StringSource(R.string.search)\n            ),\n            PageCandidate(\n                related,\n                PageType.SEARCH_HASH,\n                StringSource(R.string.tag)\n            ),\n            PageCandidate(\n                related,\n                PageType.FEATURED,\n                StringSource(R.string.featured)\n            ),\n            PageCandidate(\n                related,\n                PageType.USER,\n                StringSource(R.string.user)\n            ),\n            PageCandidate(\n                related,\n                PageType.DETAIL,\n                StringSource(R.string.detail)\n            ),\n            PageCandidate(\n                related,\n                PageType.GALLERY_FEATURED,\n                StringSource(R.string.featured) + StringSource(\"(\") + StringSource(R.string.gallery) + StringSource(\n                    \")\"\n                )\n            ),\n            PageCandidate(\n                related,\n                PageType.GALLERY_POPULAR,\n                StringSource(R.string.popular_posts) + StringSource(\"(\") + StringSource(\n                    R.string.gallery\n                ) + StringSource(\")\")\n            ),\n            PageCandidate(\n                related,\n                PageType.GALLERY_POSTS,\n                StringSource(R.string.gallery),\n            ),\n            PageCandidate(\n                related,\n                PageType.MY_GALLERY_POSTS,\n                StringSource(R.string.my_posts) + StringSource(\"(\") + StringSource(R.string.gallery) + StringSource(\n                    \")\"\n                ),\n            ),\n            PageCandidate(\n                related,\n                PageType.USERS_GALLERY_POSTS,\n                StringSource(R.string.gallery) + StringSource(\"(User)\")\n            ),\n            PageCandidate(\n                related,\n                PageType.I_LIKED_GALLERY_POSTS,\n                StringSource(R.string.my_liking) + StringSource(\"(\") + StringSource(R.string.gallery) + StringSource(\n                    \")\"\n                ),\n            ),\n        )\n    }\n\n\n    private suspend fun generateMisskeyTabs(related: Account): List<PageCandidate> {\n        val nodeInfo = nodeInfoRepository.find(related.getHost()).getOrNull()\n        val version = nodeInfo?.type?.getVersion() ?: Version(\"0\")\n        val isCalckey = nodeInfo?.type is NodeInfo.SoftwareType.Misskey.Calckey\n        return listOfNotNull(\n            PageCandidate(\n                related,\n                PageType.HOME,\n                StringSource(R.string.home_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.LOCAL,\n                StringSource(R.string.local_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.SOCIAL,\n                StringSource(R.string.hybrid_timeline)\n            ),\n            PageCandidate(\n                related,\n                PageType.GLOBAL,\n                StringSource(R.string.global_timeline)\n            ),\n            if (isCalckey) PageCandidate(\n                related,\n                PageType.CALCKEY_RECOMMENDED_TIMELINE,\n                StringSource(R.string.calckey_recomended_timeline)\n            ) else null,\n            if (version >= Version(\"12\")) PageCandidate(\n                related,\n                PageType.ANTENNA,\n                StringSource(R.string.antenna)\n            ) else null,\n            PageCandidate(\n                related,\n                PageType.NOTIFICATION,\n                StringSource(R.string.notification)\n            ),\n            PageCandidate(\n                related,\n                PageType.USER_LIST,\n                StringSource(R.string.user_list)\n            ),\n            PageCandidate(\n                related,\n                PageType.MENTION,\n                StringSource(R.string.mention)\n            ),\n            PageCandidate(\n                related,\n                PageType.FAVORITE,\n                StringSource(R.string.favorite)\n            ),\n            if (version >= Version(\"12\")) PageCandidate(\n                related,\n                PageType.CHANNEL_TIMELINE,\n                StringSource(R.string.channel)\n            ) else null,\n            if (version >= Version(\"12\")) PageCandidate(\n                related,\n                PageType.CLIP_NOTES,\n                StringSource(R.string.clip)\n            ) else null,\n            PageCandidate(\n                related,\n                PageType.SEARCH,\n                StringSource(R.string.search)\n            ),\n            PageCandidate(\n                related,\n                PageType.SEARCH_HASH,\n                StringSource(R.string.tag)\n            ),\n            PageCandidate(\n                related,\n                PageType.FEATURED,\n                StringSource(R.string.featured)\n            ),\n            PageCandidate(\n                related,\n                PageType.USER,\n                StringSource(R.string.user)\n            ),\n            PageCandidate(\n                related,\n                PageType.DETAIL,\n                StringSource(R.string.detail)\n            ),\n        ) + if (version >= Version(\"12.75.0\")) {\n            listOf(\n                PageCandidate(\n                    related,\n                    PageType.GALLERY_FEATURED,\n                    StringSource(R.string.featured) + StringSource(\"(\") + StringSource(R.string.gallery) + StringSource(\n                        \")\"\n                    )\n                ),\n                PageCandidate(\n                    related,\n                    PageType.GALLERY_POPULAR,\n                    StringSource(R.string.popular_posts) + StringSource(\"(\") + StringSource(\n                        R.string.gallery\n                    ) + StringSource(\")\")\n                ),\n                PageCandidate(\n                    related,\n                    PageType.GALLERY_POSTS,\n                    StringSource(R.string.gallery),\n                ),\n                PageCandidate(\n                    related,\n                    PageType.MY_GALLERY_POSTS,\n                    StringSource(R.string.my_posts) + StringSource(\"(\") + StringSource(R.string.gallery) + StringSource(\n                        \")\"\n                    ),\n                ),\n                PageCandidate(\n                    related,\n                    PageType.USERS_GALLERY_POSTS,\n                    StringSource(R.string.gallery) + StringSource(\"(User)\")\n                ),\n                PageCandidate(\n                    related,\n                    PageType.I_LIKED_GALLERY_POSTS,\n                    StringSource(R.string.my_liking) + StringSource(\"(\") + StringSource(R.string.gallery) + StringSource(\n                        \")\"\n                    ),\n                ),\n\n                )\n        } else {\n            emptyList()\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/page/PageSettingAction.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel.page\n\nimport net.pantasystem.milktea.model.account.page.Page\n\ninterface PageSettingAction {\n\n    fun action(page: Page?)\n\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/page/PageSettingViewModel.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel.page\n\nimport android.util.Log\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.PageType\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.account.page.PageableTemplate\nimport net.pantasystem.milktea.model.account.page.newPage\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.setting.PageTypeNameMap\nimport javax.inject.Inject\n\n@HiltViewModel\nclass PageSettingViewModel @Inject constructor(\n    val settingStore: SettingStore,\n    private val pageTypeNameMap: PageTypeNameMap,\n    private val userRepository: UserRepository,\n    private val accountStore: AccountStore,\n    private val accountRepository: AccountRepository,\n    private val pageCandidateGenerator: PageCandidateGenerator,\n) : ViewModel(), SelectPageTypeToAdd, PageSettingAction {\n\n    val selectedPages = MutableStateFlow<List<Page>>(emptyList())\n\n    val account =\n        accountStore.observeCurrentAccount.stateIn(viewModelScope, SharingStarted.Eagerly, null)\n\n    private val _pageAddedEvent = MutableSharedFlow<PageCandidate>(extraBufferCapacity = 10)\n    val pageAddedEvent = _pageAddedEvent.asSharedFlow()\n\n    private val _pageOnActionEvent = MutableSharedFlow<Page>(extraBufferCapacity = 10)\n    val pageOnActionEvent = _pageOnActionEvent.asSharedFlow()\n\n\n    private val _pageOnUpdateEvent = MutableSharedFlow<Page>(extraBufferCapacity = 10)\n    val pageOnUpdateEvent = _pageOnUpdateEvent.asSharedFlow()\n\n    val pageTypesGroupedByAccount = combine(\n        accountStore.observeCurrentAccount,\n        accountStore.observeAccounts,\n    ) { ca, accounts ->\n        (listOfNotNull(\n            ca\n        ) + accounts.filterNot {\n            it.accountId == ca?.accountId\n        }).map {\n            PageCandidateGroup(\n                ca,\n                it,\n                pageCandidateGenerator.createPageCandidates(it, ca)\n            )\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    init {\n        viewModelScope.launch {\n            account.collect {\n                selectedPages.value = it?.pages ?: emptyList()\n            }\n        }\n    }\n\n    fun setList(pages: List<Page>) {\n        selectedPages.value = pages.mapIndexed { index, page ->\n            page.apply {\n                weight = index + 1\n            }\n        }\n    }\n\n    fun save() {\n        val list = selectedPages.value\n        list.forEachIndexed { index, page ->\n            page.weight = index + 1\n        }\n        Log.d(\"PageSettingVM\", \"pages:$list\")\n        viewModelScope.launch {\n            accountStore.replaceAllPage(list).onFailure {\n                Log.e(\"PageSettingVM\", \"保存失敗\", it)\n            }\n        }\n    }\n\n    fun updatePage(page: Page) {\n        val pages = ArrayList(selectedPages.value)\n\n        var pageIndex = pages.indexOfFirst {\n            it.pageId == page.pageId && it.pageId > 0\n        }\n        if (pageIndex < 0) {\n            pageIndex = pages.indexOfFirst {\n                it.weight == page.weight && page.weight > 0\n            }\n        }\n        if (pageIndex >= 0 && pageIndex < pages.size) {\n            pages[pageIndex] = page.copy()\n        }\n\n        setList(pages)\n\n    }\n\n    private fun addPage(page: Page, relatedAccount: Account?) {\n        val p = if (relatedAccount == null || page.accountId == relatedAccount.accountId) {\n            page\n        } else {\n            page.copy(\n                attachedAccountId = relatedAccount.accountId,\n                title = page.title + (\"(@${relatedAccount.userName}@${relatedAccount.getHost()})\")\n            )\n        }\n        val list = ArrayList<Page>(selectedPages.value)\n        p.weight = list.size\n        list.add(p)\n        setList(list)\n    }\n\n    fun addUserPageByIds(userIds: List<User.Id>) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                userIds.map {\n                    async {\n                        userRepository.find(it)\n                    }\n                }.awaitAll()\n            }.onSuccess { list ->\n                list.map(::addUserPage)\n            }.onFailure { t ->\n                Log.e(\"PageSettingVM\", \"ユーザーの取得に失敗した\", t)\n            }\n\n        }\n    }\n\n    private fun addUserPage(user: User) {\n        val page = if (settingStore.isUserNameDefault) {\n            PageableTemplate(account.value!!)\n                .user(user.id.id, title = user.shortDisplayName)\n        } else {\n            PageableTemplate(account.value!!)\n                .user(user.id.id, title = user.displayName)\n        }\n        addPage(page, null)\n    }\n\n    fun addUsersGalleryByIds(userIds: List<User.Id>) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                val account = requireNotNull(account.value)\n                userIds.map {\n                    async {\n                        userRepository.find(it)\n                    }\n                }.awaitAll().map { user ->\n                    val relatedAccount = accountRepository.get(user.id.accountId).getOrThrow()\n                    val name = if (settingStore.isUserNameDefault) user.shortDisplayName else user.displayName\n                    val title = if (relatedAccount.accountId == account.accountId) {\n                        name\n                    } else {\n                        \"$name(${relatedAccount.getAcct()})\"\n                    }\n                    account.newPage(Pageable.Gallery.User(userId = user.id.id), name = title) to relatedAccount\n                }.forEach { (page, relatedAccount) ->\n                    addPage(page, relatedAccount)\n                }\n            }\n        }\n    }\n\n    fun removePage(page: Page) {\n        val list = ArrayList<Page>(selectedPages.value)\n        list.remove(page)\n        setList(list)\n    }\n\n\n    override fun add(type: PageCandidate) {\n        _pageAddedEvent.tryEmit(type)\n        val name = pageTypeNameMap.get(type.type)\n        when (type.type) {\n            PageType.GLOBAL -> {\n                addPage(PageableTemplate(account.value!!).globalTimeline(name), type.relatedAccount)\n            }\n            PageType.SOCIAL -> {\n                addPage(PageableTemplate(account.value!!).hybridTimeline(name), type.relatedAccount)\n            }\n            PageType.LOCAL -> {\n                addPage(PageableTemplate(account.value!!).localTimeline(name), type.relatedAccount)\n            }\n            PageType.HOME -> {\n                addPage(PageableTemplate(account.value!!).homeTimeline(name), type.relatedAccount)\n            }\n            PageType.NOTIFICATION -> {\n                addPage(PageableTemplate(account.value!!).notification(name), type.relatedAccount)\n            }\n            PageType.FAVORITE -> {\n                addPage(PageableTemplate(account.value!!).favorite(name), type.relatedAccount)\n            }\n            PageType.FEATURED -> {\n                addPage(PageableTemplate(account.value!!).featured(name), type.relatedAccount)\n            }\n            PageType.MENTION -> {\n                addPage(PageableTemplate(account.value!!).mention(name), type.relatedAccount)\n            }\n            PageType.GALLERY_FEATURED -> addPage(\n                account.value!!.newPage(\n                    Pageable.Gallery.Featured, name\n                ),\n                type.relatedAccount\n            )\n            PageType.GALLERY_POPULAR -> addPage(\n                account.value!!.newPage(\n                    Pageable.Gallery.Popular, name\n                ),\n                type.relatedAccount\n            )\n            PageType.GALLERY_POSTS -> addPage(\n                account.value!!.newPage(\n                    Pageable.Gallery.Posts, name\n                ),\n                type.relatedAccount\n            )\n            PageType.MY_GALLERY_POSTS -> addPage(\n                account.value!!.newPage(\n                    Pageable.Gallery.MyPosts, name\n                ),\n                type.relatedAccount\n            )\n            PageType.I_LIKED_GALLERY_POSTS -> addPage(\n                account.value!!.newPage(\n                    Pageable.Gallery.ILikedPosts,\n                    name\n                ),\n                type.relatedAccount\n            )\n            PageType.MASTODON_HOME_TIMELINE -> addPage(\n                account.value!!.newPage(\n                    Pageable.Mastodon.HomeTimeline(),\n                    name,\n                ),\n                type.relatedAccount\n            )\n            PageType.MASTODON_LOCAL_TIMELINE -> addPage(\n                account.value!!.newPage(\n                    Pageable.Mastodon.LocalTimeline(),\n                    name,\n                ),\n                type.relatedAccount\n            )\n            PageType.MASTODON_PUBLIC_TIMELINE -> addPage(\n                account.value!!.newPage(\n                    Pageable.Mastodon.PublicTimeline(),\n                    name,\n                ),\n                type.relatedAccount\n            )\n            PageType.CALCKEY_RECOMMENDED_TIMELINE -> addPage(\n                account.value!!.newPage(\n                    Pageable.CalckeyRecommendedTimeline,\n                    name,\n                ),\n                type.relatedAccount\n            )\n            PageType.MASTODON_BOOKMARK_TIMELINE -> addPage(\n                account.value!!.newPage(\n                    Pageable.Mastodon.BookmarkTimeline,\n                    name,\n                ),\n                type.relatedAccount\n            )\n            else -> {\n                Log.d(\"PageSettingViewModel\", \"管轄外な設定パターン:$type, name:$name\")\n            }\n        }\n    }\n\n    override fun action(page: Page?) {\n        page ?: return\n        _pageOnActionEvent.tryEmit(page)\n    }\n\n    fun onOptionButtonClicked(page: Page) {\n        _pageOnActionEvent.tryEmit(page)\n    }\n\n    fun onEditButtonClicked(page: Page) {\n        _pageOnUpdateEvent.tryEmit(page)\n    }\n\n    fun onEditTab(pageId: Long) {\n        viewModelScope.launch {\n            accountRepository.findAll().mapCancellableCatching { accounts ->\n                accounts.map {\n                    it.pages\n                }.flatten().firstOrNull {\n                    it.pageId == pageId\n                }\n            }.onSuccess { page ->\n                if (page != null) {\n                    _pageOnUpdateEvent.tryEmit(page)\n                }\n            }\n\n        }\n    }\n\n}\n\ndata class PageCandidate(\n    val relatedAccount: Account,\n    val type: PageType,\n    val name: StringSource,\n)\n\ndata class PageCandidateGroup(\n    val currentAccount: Account?,\n    val relatedAccount: Account,\n    val candidates: List<PageCandidate>,\n)"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/page/SelectPageTypeToAdd.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel.page\n\ninterface SelectPageTypeToAdd {\n\n    fun add(type: PageCandidate)\n}"
  },
  {
    "path": "modules/features/setting/src/main/java/net/pantasystem/milktea/setting/viewmodel/reaction/ReactionPickerSettingViewModel.kt",
    "content": "package net.pantasystem.milktea.setting.viewmodel.reaction\n\nimport android.util.Log\nimport androidx.lifecycle.MutableLiveData\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.asSharedFlow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSetting\nimport net.pantasystem.milktea.data.infrastructure.note.reaction.impl.usercustom.ReactionUserSettingDao\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.note.reaction.LegacyReaction\nimport net.pantasystem.milktea.model.note.reaction.ReactionSelection\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.ReactionPickerType\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ReactionPickerSettingViewModel @Inject constructor(\n    private val reactionUserSettingDao: ReactionUserSettingDao,\n    private val settingStore: SettingStore,\n    val accountStore: AccountStore,\n    private val configRepository: LocalConfigRepository,\n) : ViewModel(), ReactionSelection {\n\n\n    companion object\n\n    var reactionPickerType = settingStore.reactionPickerType\n        private set\n    val reactionSettingsList = MutableLiveData<List<ReactionUserSetting>>()\n\n    private val _reactionSelectEvent = MutableSharedFlow<ReactionUserSetting>(extraBufferCapacity = 10)\n    val reactionSelectEvent = _reactionSelectEvent.asSharedFlow()\n\n    private var mExistingSettingList: List<ReactionUserSetting>? = null\n    private val mReactionSettingReactionNameMap = LinkedHashMap<String, ReactionUserSetting>()\n\n    val config = configRepository.observe().stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        configRepository.get().getOrNull() ?: DefaultConfig.config\n    )\n\n    init {\n        viewModelScope.launch(Dispatchers.IO) {\n            accountStore.observeCurrentAccount.filterNotNull().collect {\n                loadSetReactions(it)\n            }\n        }\n\n    }\n\n    private fun loadSetReactions(account: Account) {\n        viewModelScope.launch(Dispatchers.IO) {\n            try {\n                val rawSettings = reactionUserSettingDao\n                    .findByInstanceDomain(account.normalizedInstanceUri)\n                mExistingSettingList = rawSettings ?: emptyList()\n                var settingReactions = rawSettings\n                    ?: LegacyReaction.defaultReaction.mapIndexed { index, str ->\n                        toReactionUserSettingFromTextTypeReaction(account, index, str)\n                    }\n                if (settingReactions.isEmpty()) {\n                    settingReactions =\n                        LegacyReaction.defaultReaction.mapIndexed { index, str ->\n                            toReactionUserSettingFromTextTypeReaction(account, index, str)\n                        }\n                }\n                mReactionSettingReactionNameMap.clear()\n                mReactionSettingReactionNameMap.putAll(settingReactions.map {\n                    it.reaction to it\n                })\n                reactionSettingsList.postValue(settingReactions)\n\n\n            } catch (e: Exception) {\n                Log.e(\"ReactionPickerSettingVM\", \"load set reaction error\", e)\n            }\n        }\n    }\n\n    fun save() {\n        val userSettings = this.reactionSettingsList.value\n        userSettings?.forEachIndexed { index, reactionUserSetting ->\n            reactionUserSetting.weight = index\n        }\n        val ex = mExistingSettingList ?: emptyList()\n        val removed = ex.filter { out ->\n            userSettings?.any { inner ->\n                out.instanceDomain == inner.instanceDomain && out.reaction == inner.reaction\n            } == false\n        }\n        viewModelScope.launch(Dispatchers.IO) {\n            try {\n                reactionUserSettingDao.deleteAll(removed)\n                userSettings?.let {\n                    reactionUserSettingDao.insertAll(userSettings)\n                }\n            } catch (e: Exception) {\n                Log.e(\"ReactionPickerSettingVM\", \"save error\", e)\n            }\n        }\n    }\n\n    // delete reaction\n    override fun selectReaction(reaction: String) {\n        mReactionSettingReactionNameMap[reaction]?.let {\n            _reactionSelectEvent.tryEmit(it)\n        }\n    }\n\n    fun deleteReaction(reaction: String) {\n        mReactionSettingReactionNameMap.remove(reaction)\n        reactionSettingsList.postValue(\n            mReactionSettingReactionNameMap.values.toList()\n        )\n    }\n\n    fun addReaction(reaction: String) {\n        val account = accountStore.currentAccount ?: return\n        mReactionSettingReactionNameMap[reaction] =\n            ReactionUserSetting(\n                reaction,\n                account.normalizedInstanceUri,\n                mReactionSettingReactionNameMap.size\n            )\n        reactionSettingsList.postValue(mReactionSettingReactionNameMap.values.toList())\n    }\n\n    fun putSortedList(list: List<ReactionUserSetting>) {\n        mReactionSettingReactionNameMap.clear()\n        mReactionSettingReactionNameMap.putAll(list.map {\n            it.reaction to it\n        })\n        reactionSettingsList.postValue(mReactionSettingReactionNameMap.values.toList())\n    }\n\n    fun setReactionPickerType(type: ReactionPickerType) {\n        settingStore.reactionPickerType = type\n        reactionPickerType = type\n    }\n\n    fun onEmojiSizeSelected(size: Int) {\n        viewModelScope.launch {\n            val c = configRepository.get().getOrNull() ?: DefaultConfig.config\n            configRepository.save(\n                c.copy(\n                    emojiPickerEmojiDisplaySize = size\n                )\n            )\n        }\n    }\n\n    private fun toReactionUserSettingFromTextTypeReaction(\n        account: Account,\n        index: Int,\n        reaction: String,\n    ): ReactionUserSetting {\n        return ReactionUserSetting(\n            reaction,\n            account.normalizedInstanceUri,\n            index\n        )\n    }\n}\n"
  },
  {
    "path": "modules/features/setting/src/main/res/layout/activity_import_reaction_from_web_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\".activities.ImportReactionFromWebViewActivity\">\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/topToolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"56dp\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"/>\n\n        <WebView\n                android:id=\"@+id/webView\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintTop_toBottomOf=\"@id/topToolbar\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintBottom_toTopOf=\"@id/bottomToolbar\"/>\n        <androidx.constraintlayout.widget.ConstraintLayout\n                android:id=\"@+id/bottomToolbar\"\n\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                android:padding=\"8dp\">\n            <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/reactionsAdapter\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintBottom_toTopOf=\"@id/importButton\"\n                    app:layout_constraintEnd_toEndOf=\"parent\" />\n            <Button\n                    android:id=\"@+id/overrideSaveButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_constraintEnd_toStartOf=\"@id/importButton\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    android:text=\"@string/overwrite_save\"/>\n            <Button\n                    android:id=\"@+id/importButton\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    app:layout_constraintBottom_toBottomOf=\"parent\"\n                    android:text=\"@string/import_reactions\"/>\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/setting/src/main/res/layout/activity_reaction_setting.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        tools:context=\"net.pantasystem.milktea.setting.activities.ReactionSettingActivity\">\n    <data>\n        <variable\n                name=\"reactionPickerSettingViewModel\"\n                type=\"net.pantasystem.milktea.setting.viewmodel.reaction.ReactionPickerSettingViewModel\" />\n    </data>\n    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            >\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/reactionSettingToolbar\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"?attr/actionBarSize\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toTopOf=\"parent\"\n                app:title=\"@string/settings_emoji_picker\"/>\n\n        <ScrollView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"0dp\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                app:layout_constraintStart_toStartOf=\"parent\"\n                app:layout_constraintTop_toBottomOf=\"@+id/reactionSettingToolbar\">\n\n            <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    android:padding=\"16dp\">\n                <TextView\n                        android:id=\"@+id/textView25\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/reaction_picker\"\n                        android:textSize=\"20sp\"\n                        android:textColor=\"?android:textColorPrimary\"/>\n\n                <Spinner\n                        android:id=\"@+id/reactionPickerType\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"16dp\"\n                        android:entries=\"@array/reaction_picker_type\"/>\n\n                <TextView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:textSize=\"20sp\"\n                    android:textColor=\"?android:textColorPrimary\"\n                    android:text=\"@string/settings_emoji_display_size\"/>\n                <Spinner\n                    android:id=\"@+id/emojiDisplaySizeSelection\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginBottom=\"16dp\"\n                    />\n\n                <TextView\n                        android:id=\"@+id/textView24\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:textSize=\"20sp\"\n                        android:text=\"@string/standard_reaction\"\n                        android:textColor=\"?android:textColorPrimary\"/>\n                <androidx.recyclerview.widget.RecyclerView\n                        android:id=\"@+id/reactionSettingListView\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"/>\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/click_to_delete_the_reaction\"\n                        android:layout_marginBottom=\"8dp\"\n                    />\n                <AutoCompleteTextView\n                        android:id=\"@+id/reactionSettingField\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:hint=\"@string/enter_reaction\"\n                        android:focusable=\"true\"\n                        android:focusableInTouchMode=\"true\"\n                        android:singleLine=\"true\"\n                        android:imeOptions=\"actionSend\"\n\n                    />\n\n\n                <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/set_the_reaction_displayed_in_the_reaction_picker\"/>\n\n\n                <Button\n                        android:id=\"@+id/importReactionFromWebButton\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/import_reactions_from_the_web\"/>\n\n\n            </LinearLayout>\n        </ScrollView>\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/saveButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                app:layout_constraintBottom_toBottomOf=\"parent\"\n                app:layout_constraintEnd_toEndOf=\"parent\"\n                android:src=\"@drawable/ic_save_black_24dp\"\n                android:contentDescription=\"@string/save_setting\"\n                android:layout_marginEnd=\"16dp\"\n                android:layout_marginBottom=\"16dp\"\n                android:onClick=\"@{() -> reactionPickerSettingViewModel.save()}\"/>\n    </androidx.constraintlayout.widget.ConstraintLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/setting/src/main/res/layout/activity_settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.setting.activities.SettingsActivity\"\n            android:orientation=\"vertical\"\n            >\n\n        <androidx.appcompat.widget.Toolbar\n                android:id=\"@+id/settingToolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:minHeight=\"?attr/actionBarSize\"\n                android:theme=\"?attr/actionBarTheme\" />\n\n        <FrameLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n            <androidx.recyclerview.widget.RecyclerView\n                    android:id=\"@+id/setting_list\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\" />\n        </FrameLayout>\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/setting/src/main/res/layout/dialog_edit_tab_name.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        >\n\n    <RelativeLayout\n            android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\">\n        <TextView\n                android:id=\"@+id/titleView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:textSize=\"24sp\"\n                android:textColor=\"?android:attr/textColorPrimary\"\n                android:layout_marginBottom=\"8dp\"\n                android:text=\"@string/edit_tab\"\n                />\n\n        <com.google.android.material.switchmaterial.SwitchMaterial\n                android:id=\"@+id/toggleOnlyMedia\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/titleView\"\n                android:text=\"@string/settings_edit_tab_only_media\"/>\n\n        <com.google.android.material.switchmaterial.SwitchMaterial\n            android:id=\"@+id/toggleSavePagePosition\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/toggleOnlyMedia\"\n            android:text=\"@string/remember_scroll_position\"/>\n\n        <com.google.android.material.switchmaterial.SwitchMaterial\n            android:id=\"@+id/toggleExcludeReplies\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/toggleSavePagePosition\"\n            android:text=\"@string/exclude_replies\"/>\n\n        <com.google.android.material.switchmaterial.SwitchMaterial\n            android:id=\"@+id/toggleExcludeReposts\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/toggleExcludeReplies\"\n            android:text=\"@string/exclude_reposts\"/>\n\n        <com.google.android.material.switchmaterial.SwitchMaterial\n            android:id=\"@+id/toggleExcludeIfExistsSensitiveMedia\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/toggleExcludeReposts\"\n            android:text=\"@string/exclude_if_exists_sensitive_media\"/>\n\n        <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/tabNameInput\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:layout_below=\"@id/toggleExcludeIfExistsSensitiveMedia\"\n                style=\"?textInputOutlinedStyle\"\n                >\n            <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/editTabName\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/edit_tab\"\n                    android:singleLine=\"true\"/>\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <com.google.android.material.button.MaterialButton\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/tabNameInput\"\n                android:id=\"@+id/cancelButton\"\n                android:layout_toStartOf=\"@id/okButton\"\n                android:layout_marginEnd=\"8dp\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:text=\"@android:string/cancel\"/>\n        <com.google.android.material.button.MaterialButton\n                android:id=\"@+id/okButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/tabNameInput\"\n                android:layout_alignParentEnd=\"true\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:text=\"@android:string/ok\"/>\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/setting/src/main/res/layout/dialog_page_setting_action.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <LinearLayout\n            android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"?attr/colorSurface\"\n            android:padding=\"8dp\">\n\n\n        <TextView\n                android:id=\"@+id/editPage\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/edit\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                android:gravity=\"start|center_vertical\"\n                android:layout_marginBottom=\"8dp\"\n                android:drawablePadding=\"8dp\"\n                drawableTintCompat=\"@{null}\"\n                app:drawableStartCompat=\"@drawable/ic_edit_black_24dp\" />\n\n        <TextView\n                android:id=\"@+id/deletePage\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/delete\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                android:gravity=\"start|center_vertical\"\n                android:layout_marginBottom=\"8dp\"\n                app:drawableTintCompat=\"@{null}\"\n\n\n                app:drawableStartCompat=\"@drawable/ic_delete_black_24dp\" />\n    </LinearLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/setting/src/main/res/layout/settings_activity.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n    <FrameLayout\n            android:id=\"@+id/settings\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n</LinearLayout>"
  },
  {
    "path": "modules/features/user/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/user/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        compose true\n        dataBinding true\n    }\n\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.user'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:features:note')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_navigation')\n\n\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    implementation libs.lifecycle.runtime\n    kapt libs.lifecycle.compiler\n    implementation libs.lifecycle.viewmodel\n    implementation libs.lifecycle.livedata\n    implementation libs.activity.ktx\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    implementation libs.coil.svg\n    implementation libs.compose.constraintlayout\n\n\n\n    implementation libs.kotlin.datetime\n\n    implementation libs.wada811.databinding\n    implementation libs.fragment.ktx\n\n    implementation 'com.google.android.gms:play-services-oss-licenses:17.0.1'\n\n    implementation libs.flexbox\n    implementation libs.recyclerview\n    implementation libs.retrofit\n\n    implementation libs.glide.glide\n    kapt libs.glide.compiler\n    implementation libs.accompanist.glide\n\n    implementation libs.androidx.swiperefreshlayout\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n\n    implementation 'com.github.kenglxn.QRGen:android:3.0.1'\n\n    implementation libs.konfetti\n}"
  },
  {
    "path": "modules/features/user/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/user/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/user/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/FollowButton.kt",
    "content": "package net.pantasystem.milktea.user\n\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.OutlinedButton\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.model.user.FollowState\n\n@Composable\nfun FollowButton(\n    userState: FollowState?,\n    isMine: Boolean,\n    modifier: Modifier = Modifier,\n    onClick: () -> Unit,\n) {\n    val buttonText = getFollowStateString(userState)\n    if (!isMine) {\n        when (userState) {\n            FollowState.UNFOLLOWING, FollowState.UNFOLLOWING_LOCKED -> {\n                OutlinedButton(\n                    shape = RoundedCornerShape(32.dp),\n                    onClick = onClick,\n                ) {\n                    Text(buttonText)\n                }\n            }\n            FollowState.FOLLOWING, FollowState.PENDING_FOLLOW_REQUEST -> {\n                Button(\n                    shape = RoundedCornerShape(32.dp),\n                    onClick = onClick,\n                ) {\n                    Text(buttonText)\n                }\n            }\n            null -> {  }\n        }\n    }\n}\n\n@Composable\nprivate fun getFollowStateString(state: FollowState?): String = when (state) {\n    FollowState.FOLLOWING -> stringResource(R.string.unfollow)\n    FollowState.UNFOLLOWING -> stringResource(R.string.follow)\n    FollowState.UNFOLLOWING_LOCKED -> stringResource(R.string.request_follow_from_u)\n    FollowState.PENDING_FOLLOW_REQUEST -> stringResource(R.string.follow_approval_pending)\n    else -> \"\"\n}\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/ReportStateHandler.kt",
    "content": "package net.pantasystem.milktea.user\n\nimport android.view.View\nimport com.google.android.material.snackbar.Snackbar\nimport net.pantasystem.milktea.model.user.report.ReportState\n\nclass ReportStateHandler {\n\n    operator fun invoke(view: View, state: ReportState) {\n        if (state is ReportState.Sending.Success) {\n            Snackbar.make(\n                view,\n                R.string.successful_report,\n                Snackbar.LENGTH_SHORT\n            ).show()\n        } else if (state is ReportState.Sending.Failed) {\n            Snackbar.make(\n                view,\n                R.string.report_failed,\n                Snackbar.LENGTH_SHORT\n            ).show()\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/UserCardListActionHandler.kt",
    "content": "package net.pantasystem.milktea.user\n\nimport android.app.Activity\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.putActivity\nimport net.pantasystem.milktea.user.followlist.FollowFollowerActivity\nimport net.pantasystem.milktea.user.compose.UserDetailCardAction\nimport net.pantasystem.milktea.user.compose.UserDetailCardListAction\nimport net.pantasystem.milktea.user.profile.UserDetailActivity\nimport net.pantasystem.milktea.user.viewmodel.ToggleFollowViewModel\n\nclass UserCardListActionHandler(\n    activity: Activity,\n    toggleFollowViewModel: ToggleFollowViewModel,\n    private val onRefresh: () -> Unit,\n) {\n\n    private val cardActionHandler = UserCardActionHandler(activity, toggleFollowViewModel)\n    fun onAction(it: UserDetailCardListAction) {\n        when (it) {\n            is UserDetailCardListAction.CardAction -> {\n                cardActionHandler.onAction(it.cardAction)\n            }\n            UserDetailCardListAction.Refresh -> {\n                onRefresh()\n            }\n        }\n    }\n\n}\n\nclass UserCardActionHandler(\n    private val activity: Activity,\n    private val toggleFollowViewModel: ToggleFollowViewModel,\n) {\n\n    fun onAction(it: UserDetailCardAction) {\n        when (it) {\n            is UserDetailCardAction.FollowersCountClicked -> {\n                activity.startActivity(\n                    FollowFollowerActivity.newIntent(\n                        activity,\n                        userId = it.userId,\n                        isFollowing = false,\n                    )\n                )\n            }\n            is UserDetailCardAction.FollowingsCountClicked -> {\n                activity.startActivity(\n                    FollowFollowerActivity.newIntent(\n                        activity,\n                        userId = it.userId,\n                        isFollowing = true,\n                    )\n                )\n            }\n            is UserDetailCardAction.NotesCountClicked -> {\n                val intent = UserDetailActivity.newInstance(\n                    activity,\n                    userId = it.userId\n                )\n                intent.putActivity(Activities.ACTIVITY_IN_APP)\n\n                activity.startActivity(intent)\n            }\n            is UserDetailCardAction.OnCardClicked -> {\n                val intent = UserDetailActivity.newInstance(\n                    activity,\n                    userId = it.userId\n                )\n                intent.putActivity(Activities.ACTIVITY_IN_APP)\n\n                activity.startActivity(intent)\n            }\n            is UserDetailCardAction.ToggleFollow -> {\n                toggleFollowViewModel.toggleFollow(it.userId)\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/compose/SimpleUsers.kt",
    "content": "package net.pantasystem.milktea.user.compose\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.Card\nimport androidx.compose.material3.CardDefaults\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.user.User\n\n@Composable\nfun SimpleUserListView(\n    modifier: Modifier = Modifier,\n    users: List<User>,\n    accountHost: String?,\n    onSelected: (User) -> Unit,\n    selectedUserIds: Set<User.Id> = emptySet(),\n) {\n    LazyColumn(modifier) {\n        items(count = users.size) { index ->\n            ItemSimpleUserCard(\n                user = users[index],\n                onSelected = onSelected,\n                isSelected = selectedUserIds.contains(users[index].id),\n                accountHost = accountHost,\n            )\n        }\n    }\n}\n\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun ItemSimpleUserCard(\n    user: User,\n    accountHost: String?,\n    onSelected: (User) -> Unit,\n    isSelected: Boolean = false,\n) {\n\n    Card(\n        onClick = {\n            onSelected.invoke(user)\n        },\n        shape = RoundedCornerShape(0.dp),\n        modifier = Modifier.padding(0.5.dp),\n        colors = CardDefaults.cardColors(containerColor = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface)\n    ) {\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(vertical = 12.dp, horizontal = 16.dp),\n        ) {\n            AvatarIcon(url = user.avatarUrl, size = 50.dp)\n            Spacer(modifier = Modifier.width(4.dp))\n            Column {\n                CustomEmojiText(\n                    text = user.displayName,\n                    emojis = user.emojis,\n                    accountHost = accountHost,\n                    sourceHost = user.host,\n                    parsedResult = user.parsedResult,\n                )\n                Spacer(modifier = Modifier.height(4.dp))\n                Text(text = user.displayUserName)\n            }\n        }\n    }\n}\n\n\n@Preview\n@Composable\nfun PreviewItemSimpleUser() {\n    ItemSimpleUserCard(user = User.Simple(\n        avatarUrl = \"https://pbs.twimg.com/profile_images/1377726964404908032/nHtGMU-X_400x400.jpg\",\n        userName = \"harunon\",\n        name = null,\n        emojis = emptyList(),\n        host = \"misskey.io\",\n        id = User.Id(0L, \"\"),\n        isBot = true,\n        isCat = true,\n        nickname = null,\n        isSameHost = true,\n        instance = null,\n        avatarBlurhash = null,\n        badgeRoles = emptyList(),\n    ), onSelected = {}, accountHost = \"misskey.io\"\n    )\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/compose/UserDetailCard.kt",
    "content": "package net.pantasystem.milktea.user.compose\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.background\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.draw.clip\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.layout.ContentScale\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextAlign\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.constraintlayout.compose.ConstraintLayout\nimport coil.compose.rememberAsyncImagePainter\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.user.FollowState\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.make\nimport net.pantasystem.milktea.user.R\n\nsealed interface UserDetailCardAction {\n    val userId: User.Id\n\n    data class ToggleFollow(override val userId: User.Id) : UserDetailCardAction\n    data class NotesCountClicked(override val userId: User.Id) : UserDetailCardAction\n    data class FollowersCountClicked(override val userId: User.Id) : UserDetailCardAction\n    data class FollowingsCountClicked(override val userId: User.Id) : UserDetailCardAction\n    data class OnCardClicked(override val userId: User.Id) : UserDetailCardAction\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun UserDetailCard(\n    userDetail: User.Detail,\n    isUserNameMain: Boolean,\n    accountHost: String?,\n    myId: String?,\n    onAction: (UserDetailCardAction) -> Unit,\n) {\n    Card(\n        modifier = Modifier\n            .fillMaxWidth()\n            .padding(8.dp),\n        shape = RoundedCornerShape(16.dp),\n        onClick = {\n            onAction(UserDetailCardAction.OnCardClicked(userDetail.id))\n        }\n    ) {\n        ConstraintLayout(\n            Modifier.fillMaxWidth()\n        ) {\n            val (\n                headerRef,\n                avatarIconRef,\n                mainNameRef,\n                subNameRef,\n                descriptionRef,\n                aggregationRef,\n                actionButton,\n\n                followingULabel,\n            ) = createRefs()\n\n            Image(\n                painter = rememberAsyncImagePainter(userDetail.info.bannerUrl),\n                contentDescription = null,\n                contentScale = ContentScale.Crop,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .height(92.dp)\n                    .constrainAs(headerRef) {\n                        top.linkTo(parent.top)\n                        start.linkTo(parent.start)\n                        end.linkTo(parent.end)\n\n                    }\n            )\n\n            if (userDetail.related?.isFollower == true) {\n                Text(\n                    text = stringResource(id = R.string.follower),\n                    color = Color.White,\n                    modifier = Modifier\n                        .clip(RoundedCornerShape(12.dp))\n                        .background(Color.Black.copy(alpha = 0.75f))\n                        .padding(4.dp)\n                        .constrainAs(followingULabel) {\n                            start.linkTo(parent.start, margin = 8.dp)\n                            top.linkTo(parent.top, margin = 8.dp)\n                        }\n                )\n            }\n\n            if (myId != userDetail.id.id) {\n                UserStateActionButton(\n                    userState = userDetail.followState,\n                    modifier = Modifier.constrainAs(actionButton) {\n                        end.linkTo(parent.end, margin = 8.dp)\n                        top.linkTo(parent.top, margin = 8.dp)\n                    },\n                    onClick = {\n                        onAction(UserDetailCardAction.ToggleFollow(userDetail.id))\n                    }\n                )\n            }\n\n            AvatarIcon(\n                url = userDetail.avatarUrl,\n                size = 64.dp,\n                modifier = Modifier.constrainAs(avatarIconRef) {\n                    start.linkTo(parent.start, margin = 8.dp)\n                    bottom.linkTo(subNameRef.bottom)\n                },\n                borderStrokeColor = MaterialTheme.colorScheme.surface,\n                borderStrokeWidth = 2.dp\n            )\n\n            CustomEmojiText(\n                text = if (isUserNameMain) userDetail.displayUserName else userDetail.displayName,\n                fontWeight = FontWeight.Bold,\n                emojis = userDetail.emojis,\n                parsedResult = if (isUserNameMain) null else userDetail.parsedResult,\n                accountHost = accountHost,\n                sourceHost = userDetail.host,\n                modifier = Modifier\n                    .constrainAs(mainNameRef) {\n                        start.linkTo(avatarIconRef.end, margin = 4.dp)\n                        top.linkTo(headerRef.bottom)\n                    }\n            )\n            CustomEmojiText(\n                text = if (!isUserNameMain) userDetail.displayUserName else userDetail.displayName,\n                fontWeight = FontWeight.Bold,\n                emojis = userDetail.emojis,\n                parsedResult = if(isUserNameMain) userDetail.parsedResult else null,\n                accountHost = accountHost,\n                sourceHost = userDetail.host,\n                modifier = Modifier\n                    .constrainAs(subNameRef) {\n                        start.linkTo(avatarIconRef.end, margin = 4.dp)\n                        top.linkTo(mainNameRef.bottom)\n                    }\n            )\n\n            CustomEmojiText(\n                text = userDetail.info.description ?: \"\",\n                maxLines = 5,\n                textAlign = TextAlign.Start,\n                emojis = userDetail.emojis,\n                accountHost = accountHost,\n                sourceHost = userDetail.host,\n                modifier = Modifier\n                    .padding(start = 8.dp, end = 8.dp)\n                    .constrainAs(descriptionRef) {\n                        start.linkTo(avatarIconRef.start)\n                        top.linkTo(subNameRef.bottom, margin = 2.dp)\n                        end.linkTo(parent.end)\n                    }\n            )\n\n\n            Row(\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(start = 8.dp, end = 8.dp, bottom = 8.dp)\n                    .constrainAs(aggregationRef) {\n                        start.linkTo(parent.start)\n                        end.linkTo(parent.end)\n                        top.linkTo(descriptionRef.bottom, margin = 4.dp)\n                    }\n            ) {\n                Text(\n                    \"${userDetail.info.notesCount ?: 0} ${stringResource(id = R.string.post)}\",\n                    color = MaterialTheme.colorScheme.primary,\n                    modifier = Modifier\n                        .padding(2.dp)\n                        .clickable {\n                            onAction(UserDetailCardAction.NotesCountClicked(userDetail.id))\n                        },\n                )\n                Spacer(modifier = Modifier.width(4.dp))\n                Text(\n                    \"${userDetail.info.followingCount ?: 0} ${stringResource(id = R.string.following)}\",\n                    color = MaterialTheme.colorScheme.primary,\n                    modifier = Modifier\n                        .padding(2.dp)\n                        .clickable {\n                            onAction(UserDetailCardAction.FollowingsCountClicked(userDetail.id))\n                        },\n                )\n\n                Spacer(modifier = Modifier.width(4.dp))\n                Text(\n                    \"${userDetail.info.followersCount ?: 0} ${stringResource(id = R.string.follower)}\",\n                    color = MaterialTheme.colorScheme.primary,\n                    modifier = Modifier\n                        .padding(2.dp)\n                        .clickable {\n                            onAction(UserDetailCardAction.FollowersCountClicked(userDetail.id))\n                        }\n                )\n\n            }\n\n\n        }\n    }\n}\n\n\n@Composable\nfun UserStateActionButton(\n    userState: FollowState,\n    modifier: Modifier,\n    onClick: () -> Unit,\n) {\n    when (userState) {\n        FollowState.PENDING_FOLLOW_REQUEST -> {\n            Button(\n                onClick = onClick,\n                modifier = modifier,\n                shape = RoundedCornerShape(32.dp)\n            ) {\n                Text(stringResource(id = R.string.follow_approval_pending))\n            }\n        }\n        FollowState.FOLLOWING -> {\n            Button(\n                onClick = onClick,\n                modifier = modifier,\n                shape = RoundedCornerShape(32.dp)\n            ) {\n                Text(stringResource(id = R.string.unfollow))\n            }\n        }\n        FollowState.UNFOLLOWING -> {\n            OutlinedButton(\n                onClick = onClick,\n                modifier = modifier,\n                shape = RoundedCornerShape(32.dp)\n            ) {\n                Text(stringResource(id = R.string.follow))\n            }\n        }\n        FollowState.UNFOLLOWING_LOCKED -> {\n            OutlinedButton(\n                onClick = onClick,\n                modifier = modifier,\n                shape = RoundedCornerShape(32.dp)\n            ) {\n                Text(stringResource(id = R.string.request_follow_from_u))\n            }\n        }\n    }\n}\n\n@Preview\n@Composable\nfun Preview_UserDetail() {\n    UserDetailCard(\n        User.Detail.make(\n            User.Id(0L, \"id\"),\n            name = \"harunon\",\n            userName = \"harunon\",\n            host = \"misskey.io\",\n            description = \"ioawejfioawjfiojwaoefjioawejofawiofjawefawefoawijfoiawjfaefawoifjoawifjioawjfoijawoifjoawjefoiajwioefjioawjefiojaweiofjoiawjfnaiuefjaiowfjioawejfioajfiojaowijfoiawjnfojawoiejfoawejfiowaeijifoawjefijaowfjoiwjfioawjfojaowe\",\n            avatarUrl = \"https://pbs.twimg.com/profile_images/1377726964404908032/nHtGMU-X_400x400.jpg\",\n            bannerUrl = \"https://pbs.twimg.com/profile_banners/795973980721004546/1559754364/1500x500\",\n            followersCount = 5000,\n            followingCount = 100,\n            notesCount = 100000,\n\n            isFollower = true,\n        ),\n        isUserNameMain = true,\n        accountHost = \"misskey.io\",\n        myId = null,\n    ) {}\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/compose/UserDetailCardList.kt",
    "content": "package net.pantasystem.milktea.user.compose\n\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid\nimport androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells\nimport androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.model.user.User\n\nsealed interface UserDetailCardListAction {\n    data class CardAction(\n        val cardAction: UserDetailCardAction\n    ) : UserDetailCardListAction\n\n    object Refresh : UserDetailCardListAction\n}\n\n@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)\n@Composable\nfun UserDetailCardList(\n    pageableState: ResultState<List<User.Id>>,\n    users: List<User.Detail>,\n    accountHost: String?,\n    myId: String?,\n    isUserNameMain: Boolean,\n    onAction: (UserDetailCardListAction) -> Unit,\n) {\n    val scrollController = rememberLazyStaggeredGridState()\n\n\n    when (pageableState.content) {\n        is StateContent.Exist -> {\n            PullToRefreshBox(\n                isRefreshing = pageableState is ResultState.Loading,\n                onRefresh = { onAction(UserDetailCardListAction.Refresh) },\n                modifier = Modifier\n                    .nestedScroll(rememberNestedScrollInteropConnection())\n                    .fillMaxSize()\n            ) {\n                LazyVerticalStaggeredGrid(\n                    modifier = Modifier.fillMaxSize(),\n                    state = scrollController,\n                    columns = StaggeredGridCells.Adaptive(350.dp)\n                ) {\n                    items(count = users.size) { i ->\n                        UserDetailCard(\n                            userDetail = users[i],\n                            isUserNameMain = isUserNameMain,\n                            accountHost = accountHost,\n                            myId = myId,\n                            onAction = {\n                                onAction(UserDetailCardListAction.CardAction(it))\n                            },\n                        )\n                    }\n                }\n            }\n        }\n\n        is StateContent.NotExist -> {\n            Column(\n                modifier = Modifier.fillMaxSize(),\n                verticalArrangement = Arrangement.Center,\n                horizontalAlignment = Alignment.CenterHorizontally\n            ) {\n                when (pageableState) {\n                    is ResultState.Error -> {\n                        Text(\"Error\")\n                        Text(pageableState.throwable.toString())\n                    }\n\n                    is ResultState.Fixed -> {\n                        Text(\"Content is empty\")\n                    }\n\n                    is ResultState.Loading -> {\n                        CircularProgressIndicator()\n                    }\n                }\n            }\n\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/compose/UserDetailCardPageableList.kt",
    "content": "package net.pantasystem.milktea.user.compose\n\nimport androidx.compose.foundation.ExperimentalFoundationApi\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.lazy.staggeredgrid.LazyVerticalStaggeredGrid\nimport androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridCells\nimport androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan\nimport androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.snapshotFlow\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport kotlinx.coroutines.flow.distinctUntilChanged\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.ui.isScrollToTheEnd\nimport net.pantasystem.milktea.model.user.User\n\nsealed interface UserDetailCardPageableListAction {\n    data class CardAction(\n        val cardAction: UserDetailCardAction\n    ) : UserDetailCardPageableListAction\n\n    object OnBottomReached : UserDetailCardPageableListAction\n    object Refresh : UserDetailCardPageableListAction\n}\n\n@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)\n@Composable\nfun UserDetailCardPageableList(\n    pageableState: PageableState<List<User.Id>>,\n    users: List<User.Detail>,\n    isUserNameMain: Boolean,\n    accountHost: String?,\n    myId: String?,\n    onAction: (UserDetailCardPageableListAction) -> Unit,\n) {\n    val scrollController = rememberLazyStaggeredGridState()\n    LaunchedEffect(key1 = null) {\n        snapshotFlow {\n            scrollController.isScrollToTheEnd()\n        }.distinctUntilChanged().onEach {\n            if (it) {\n                onAction(UserDetailCardPageableListAction.OnBottomReached)\n            }\n        }.launchIn(this)\n    }\n\n    when (pageableState.content) {\n        is StateContent.Exist -> {\n            PullToRefreshBox(\n                isRefreshing = pageableState is PageableState.Loading.Init,\n                onRefresh = { onAction(UserDetailCardPageableListAction.Refresh) },\n                modifier = Modifier\n                    .nestedScroll(rememberNestedScrollInteropConnection())\n                    .fillMaxSize()\n            ) {\n                LazyVerticalStaggeredGrid(columns = StaggeredGridCells.Adaptive(350.dp), state = scrollController) {\n                    items(count = users.size) { i ->\n                        UserDetailCard(\n                            userDetail = users[i],\n                            isUserNameMain = isUserNameMain,\n                            onAction = {\n                                onAction(UserDetailCardPageableListAction.CardAction(it))\n                            },\n                            accountHost = accountHost,\n                            myId = myId,\n                        )\n                    }\n\n                    item(span = StaggeredGridItemSpan.FullLine){\n                        Row(\n                            Modifier.fillMaxWidth(),\n                            horizontalArrangement = Arrangement.Center\n                        ) {\n                            CircularProgressIndicator()\n                        }\n                    }\n                }\n            }\n        }\n        is StateContent.NotExist -> {\n            Column(\n                modifier = Modifier.fillMaxSize(),\n                verticalArrangement = Arrangement.Center,\n                horizontalAlignment = Alignment.CenterHorizontally\n            ) {\n                when (pageableState) {\n                    is PageableState.Error -> {\n                        Text(\"Error\")\n                        Text(pageableState.throwable.toString())\n                    }\n                    is PageableState.Fixed -> {\n                        Text(\"Content is empty\")\n                    }\n                    is PageableState.Loading -> {\n                        CircularProgressIndicator()\n                    }\n                }\n            }\n\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/compose/screen/FollowFollowerScreen.kt",
    "content": "package net.pantasystem.milktea.user.compose.screen\n\nimport androidx.annotation.StringRes\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.text.style.TextOverflow\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.foundation.pager.HorizontalPager\nimport androidx.compose.foundation.pager.PagerState\nimport androidx.compose.foundation.pager.rememberPagerState\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.compose.UserDetailCardAction\nimport net.pantasystem.milktea.user.compose.UserDetailCardPageableList\nimport net.pantasystem.milktea.user.compose.UserDetailCardPageableListAction\nimport net.pantasystem.milktea.user.followlist.FollowFollowerUiState\nimport net.pantasystem.milktea.user.followlist.FollowFollowerViewModel\nimport net.pantasystem.milktea.user.followlist.LoadType\nimport net.pantasystem.milktea.user.viewmodel.ToggleFollowViewModel\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@Composable\nfun FollowFollowerRoute(\n    initialTabIndex: Int,\n    followFollowerViewModel: FollowFollowerViewModel,\n    toggleFollowViewModel: ToggleFollowViewModel,\n    onCardAction: (UserDetailCardAction) -> Unit,\n    onNavigateUp: () -> Unit\n) {\n    val uiState by followFollowerViewModel.uiState.collectAsState()\n    val snackBarHostState = remember { SnackbarHostState() }\n\n    LaunchedEffect(null) {\n        followFollowerViewModel.loadInit()\n    }\n\n    val errorMessage = stringResource(id = R.string.failure)\n    val retryMessage = stringResource(id = R.string.retry)\n\n    LaunchedEffect(null) {\n        toggleFollowViewModel.errors.filterNotNull().collect {\n            val result = snackBarHostState.showSnackbar(\n                message = errorMessage,\n                actionLabel = retryMessage\n            )\n            when(result) {\n                SnackbarResult.Dismissed -> {}\n                SnackbarResult.ActionPerformed -> {\n                    toggleFollowViewModel.toggleFollow(it.userId)\n                }\n            }\n        }\n    }\n\n    FollowFollowerScreen(\n        uiState = uiState,\n        initialTabIndex = initialTabIndex,\n        onLoadInit = {\n            followFollowerViewModel.loadInit()\n        },\n        onLoadPrevious = {\n            followFollowerViewModel.loadOld(it)\n        },\n        onNavigateUp = onNavigateUp,\n        onCardAction = onCardAction,\n        snackBarHostState = snackBarHostState\n    )\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun FollowFollowerScreen(\n    uiState: FollowFollowerUiState,\n    initialTabIndex: Int = 0,\n    onLoadInit: () -> Unit,\n    onLoadPrevious: (LoadType) -> Unit,\n    onNavigateUp: () -> Unit,\n    onCardAction: (UserDetailCardAction) -> Unit,\n    snackBarHostState: SnackbarHostState,\n) {\n    val pagerState = rememberPagerState(initialPage = initialTabIndex) { 2 }\n    val tabTitles = remember {\n        listOf(FollowFollowerTabItem(R.string.follow, LoadType.Follow), FollowFollowerTabItem(R.string.follower, LoadType.Follower))\n    }\n    val scope = rememberCoroutineScope()\n\n    fun onAction(type: LoadType, it: UserDetailCardPageableListAction) {\n        when (it) {\n            is UserDetailCardPageableListAction.CardAction -> {\n                onCardAction(it.cardAction)\n            }\n            UserDetailCardPageableListAction.OnBottomReached -> {\n                onLoadPrevious(type)\n            }\n            UserDetailCardPageableListAction.Refresh -> {\n                onLoadInit()\n            }\n        }\n    }\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        snackbarHost = { SnackbarHost(snackBarHostState) },\n        topBar = {\n            FollowFollowerTopBar(\n                modifier = Modifier.fillMaxWidth(),\n                uiState = uiState,\n                pagerState = pagerState,\n                tabTitles = tabTitles,\n                onNavigateUp = onNavigateUp,\n                scope = scope,\n            )\n        },\n\n    ) {\n        Pager(\n            modifier = Modifier\n                .padding(it)\n                .fillMaxSize(),\n            pagerState = pagerState,\n            tabTitles = tabTitles,\n            uiState = uiState,\n            onAction = ::onAction\n        )\n    }\n}\n\n@Composable\nprivate fun Pager(\n    modifier: Modifier,\n    pagerState: PagerState,\n    tabTitles: List<FollowFollowerTabItem>,\n    uiState: FollowFollowerUiState,\n    onAction: (type: LoadType, it: UserDetailCardPageableListAction) -> Unit,\n) {\n    HorizontalPager(\n        modifier = modifier,\n        state = pagerState\n    ) { pageIndex ->\n        val item = tabTitles[pageIndex]\n        when (item.type) {\n            LoadType.Follow -> {\n                UserDetailCardPageableList(\n                    pageableState = uiState.followUsersState,\n                    users = uiState.followUsers,\n                    isUserNameMain = false,\n                    accountHost = uiState.accountHost,\n                    myId = uiState.myId,\n                    onAction = { action ->\n                        onAction(LoadType.Follow, action)\n                    }\n                )\n            }\n            LoadType.Follower -> {\n                UserDetailCardPageableList(\n                    pageableState = uiState.followerUsersState,\n                    users = uiState.followerUsers,\n                    isUserNameMain = false,\n                    accountHost = uiState.accountHost,\n                    myId = uiState.myId,\n                    onAction = { action ->\n                        onAction(LoadType.Follower, action)\n                    }\n                )\n            }\n        }\n\n    }\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nprivate fun FollowFollowerTopBar(\n    modifier: Modifier,\n    uiState: FollowFollowerUiState,\n    pagerState: PagerState,\n    tabTitles: List<FollowFollowerTabItem>,\n    onNavigateUp: () -> Unit,\n    scope: CoroutineScope,\n) {\n    Column(modifier.fillMaxWidth()) {\n        TopAppBar(\n            colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),\n            navigationIcon = {\n                IconButton(onClick = onNavigateUp) {\n                    Icon(Icons.Default.ArrowBack, contentDescription = null)\n                }\n            },\n            title = {\n                if (uiState.user == null) {\n                    Text(\n                        stringResource(id = if(pagerState.currentPage == 0) R.string.follow else R.string.follower)\n                    )\n                } else {\n                    CustomEmojiText(\n                        text = uiState.user.displayName,\n                        emojis = uiState.user.emojis,\n                        sourceHost = uiState.user.host,\n                        accountHost = uiState.accountHost,\n                        parsedResult = uiState.user.parsedResult,\n                        fontSize = 18.sp,\n                        maxLines = 1,\n                        overflow = TextOverflow.Ellipsis,\n                        fontWeight = FontWeight.Bold,\n                    )\n                }\n\n            },\n        )\n        TabRow(\n            selectedTabIndex = pagerState.currentPage,\n            containerColor = MaterialTheme.colorScheme.surface\n        ) {\n            tabTitles.forEachIndexed { index, s ->\n                Tab(\n                    text = { Text(text = stringResource(id = s.titleRes)) },\n                    selected = index == pagerState.currentPage,\n                    onClick = {\n\n                        scope.launch {\n                            pagerState.animateScrollToPage(index)\n                        }\n                    }\n                )\n            }\n\n        }\n    }\n}\n\ndata class FollowFollowerTabItem(\n    @StringRes val titleRes: Int,\n    val type: LoadType\n)"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/di/module/FollowRequestModule.kt",
    "content": "package net.pantasystem.milktea.user.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.android.components.ActivityComponent\nimport net.pantasystem.milktea.common_android_ui.user.FollowRequestsFragmentFactory\nimport net.pantasystem.milktea.user.followrequests.FollowRequestFragmentFactoryImpl\n\n@InstallIn(ActivityComponent::class)\n@Module\nabstract class FollowRequestModule {\n\n    @Binds\n    abstract fun bindFollowRequestFragmentFactory(impl: FollowRequestFragmentFactoryImpl): FollowRequestsFragmentFactory\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/followlist/FollowFollowerActivity.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage net.pantasystem.milktea.user.followlist\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_compose.haptic.rememberHapticFeedback\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.UserCardActionHandler\nimport net.pantasystem.milktea.user.compose.screen.FollowFollowerRoute\nimport net.pantasystem.milktea.user.viewmodel.ToggleFollowViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass FollowFollowerActivity : AppCompatActivity() {\n\n    companion object {\n        private const val EXTRA_USER_ID =\n            \"net.pantasystem.milktea.user.followlist.FollowFollowerActivity.EXTRA_USER_ID\"\n        private const val EXTRA_VIEW_CURRENT =\n            \"net.pantasystem.milktea.user.followlist.FollowFollowerActivity.EXTRA_VIEW_CURRENT\"\n        private const val FOLLOWING_VIEW_MODE = 0\n        private const val FOLLOWER_VIEW_MODE = 1\n\n        fun newIntent(context: Context, userId: User.Id, isFollowing: Boolean): Intent {\n            return Intent(context, FollowFollowerActivity::class.java).apply {\n                putExtra(EXTRA_USER_ID, userId)\n                putExtra(\n                    EXTRA_VIEW_CURRENT,\n                    if (isFollowing) FOLLOWING_VIEW_MODE else FOLLOWER_VIEW_MODE\n                )\n            }\n        }\n    }\n\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val toggleFollowFollowerViewModel: ToggleFollowViewModel by viewModels()\n\n    @Inject\n    lateinit var viewModelFactory: FollowFollowerViewModel.ViewModelAssistedFactory\n    private val followFollowerViewModel by viewModels<FollowFollowerViewModel> {\n        val userId = intent.getSerializableExtra(EXTRA_USER_ID) as User.Id\n        FollowFollowerViewModel.provideFactory(viewModelFactory, userId)\n    }\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                val feedback = rememberHapticFeedback()\n                FollowFollowerRoute(\n                    followFollowerViewModel = followFollowerViewModel,\n                    toggleFollowViewModel = toggleFollowFollowerViewModel,\n                    onCardAction = {\n                        feedback.performClickHapticFeedback()\n                        UserCardActionHandler(this, toggleFollowFollowerViewModel).onAction(it)\n                    },\n                    onNavigateUp = {\n                        finish()\n                    },\n                    initialTabIndex = intent.getIntExtra(EXTRA_VIEW_CURRENT, FOLLOWER_VIEW_MODE)\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/followlist/FollowFollowerViewModel.kt",
    "content": "package net.pantasystem.milktea.user.followlist\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.FlowPreview\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.user.FollowFollowerPagingStore\nimport net.pantasystem.milktea.app_store.user.RequestType\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\n\nclass FollowFollowerViewModel @AssistedInject constructor(\n    followFollowerPagingStoreFactory: FollowFollowerPagingStore.Factory,\n    private val userRepository: UserRepository,\n    private val accountRepository: AccountRepository,\n    loggerFactory: Logger.Factory,\n    @Assisted val userId: User.Id\n) : ViewModel() {\n\n    companion object\n\n    @AssistedFactory\n    interface ViewModelAssistedFactory {\n        fun create(userId: User.Id): FollowFollowerViewModel\n    }\n\n    val logger = loggerFactory.create(\"FollowFollowerVM\")\n\n    private val followingPagingStore =\n        followFollowerPagingStoreFactory.create(RequestType.Following(userId))\n    private val followerPagingStore =\n        followFollowerPagingStoreFactory.create(RequestType.Follower(userId))\n\n    private val user = userRepository.observe(userId).flowOn(Dispatchers.IO).catch {\n        logger.error(\"observeに失敗\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val followUsers = followingPagingStore.users.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n    private val followerUsers = followerPagingStore.users.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        emptyList()\n    )\n    private val followUsersState = followingPagingStore.state.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init()\n    )\n    private val followerUsersState = followerPagingStore.state.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init()\n    )\n\n    @OptIn(FlowPreview::class)\n    private val account = suspend {\n        accountRepository.get(userId.accountId).getOrNull()\n    }.asFlow().stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    private val states = combine(\n        followUsers,\n        followerUsers,\n        followerUsersState,\n        followUsersState\n    ) { follows, followers, followerState, followState ->\n        States(\n            followerUsers = followers,\n            followUsers = follows,\n            followerUsersState = followerState,\n            followUsersState = followState,\n        )\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), States())\n\n    val uiState = combine(\n        account,\n        user,\n        states,\n    ) { a, u, (follows, followers, followerState, followState) ->\n        FollowFollowerUiState(\n            accountHost = a?.getHost(),\n            user = u,\n            followerUsers = followers,\n            followUsers = follows,\n            followerUsersState = followerState,\n            followUsersState = followState,\n            myId = a?.remoteId,\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        FollowFollowerUiState()\n    )\n\n    fun loadInit() = viewModelScope.launch {\n        launch {\n            followerPagingStore.clear()\n            followerPagingStore.loadPrevious()\n        }\n        launch {\n            followingPagingStore.clear()\n            followingPagingStore.loadPrevious()\n        }\n        launch {\n            userRepository.sync(userId)\n        }\n\n    }\n\n\n    fun loadOld(loadType: LoadType) = viewModelScope.launch {\n        when(loadType) {\n            LoadType.Follow -> {\n                followingPagingStore.loadPrevious()\n            }\n            LoadType.Follower -> {\n                followerPagingStore.loadPrevious()\n            }\n        }\n    }\n\n\n}\n\nenum class LoadType {\n    Follow, Follower\n}\ndata class FollowFollowerUiState(\n    val user: User? = null,\n    val accountHost: String? = null,\n    val myId: String? = null,\n    val followUsers: List<User.Detail> = emptyList(),\n    val followerUsers: List<User.Detail> = emptyList(),\n    val followerUsersState: PageableState<List<User.Id>> = PageableState.Loading.Init(),\n    val followUsersState: PageableState<List<User.Id>> = PageableState.Loading.Init()\n)\n\nprivate data class States(\n    val followUsers: List<User.Detail> = emptyList(),\n    val followerUsers: List<User.Detail> = emptyList(),\n    val followerUsersState: PageableState<List<User.Id>> = PageableState.Loading.Init(),\n    val followUsersState: PageableState<List<User.Id>> = PageableState.Loading.Init()\n)\n\nfun FollowFollowerViewModel.Companion.provideFactory(\n    factory: FollowFollowerViewModel.ViewModelAssistedFactory,\n    userId: User.Id,\n) = object : ViewModelProvider.Factory {\n    override fun <T : ViewModel> create(modelClass: Class<T>): T {\n        @Suppress(\"UNCHECKED_CAST\")\n        return factory.create(userId) as T\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/followrequests/FollowRequestItem.kt",
    "content": "package net.pantasystem.milktea.user.followrequests\n\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.width\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.IconButton\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Check\nimport androidx.compose.material.icons.filled.Close\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.R\n\n@Composable\nfun FollowRequestItem(\n    currentAccount: Account?,\n    user: User,\n    isUserNameDefault: Boolean,\n    onAccept: (User.Id) -> Unit,\n    onReject: (User.Id) -> Unit,\n    onAvatarClicked: (User.Id) -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    Surface(\n        modifier = modifier.fillMaxWidth(),\n        color = MaterialTheme.colorScheme.surface\n    ) {\n        Row(\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(\n                    vertical = 12.dp,\n                    horizontal = 14.dp,\n                ),\n            verticalAlignment = Alignment.CenterVertically,\n        ) {\n            AvatarIcon(\n                url = user.avatarUrl, size = 64.dp,\n                onAvatarClick = {\n                    onAvatarClicked(user.id)\n                },\n                borderStrokeColor = MaterialTheme.colorScheme.surface,\n                borderStrokeWidth = 2.dp,\n            )\n            Spacer(modifier = Modifier.width(4.dp))\n            Column(\n                modifier = Modifier.weight(1f)\n            ) {\n                if (isUserNameDefault) {\n                    Text(text = user.displayUserName, fontSize = 16.sp)\n                    CustomEmojiText(\n                        text = user.displayName,\n                        emojis = user.emojis,\n                        accountHost = currentAccount?.getHost(),\n                        sourceHost = user.host,\n                        fontSize = 14.sp\n                    )\n                } else {\n                    CustomEmojiText(\n                        text = user.displayName,\n                        emojis = user.emojis,\n                        accountHost = currentAccount?.getHost(),\n                        sourceHost = user.host,\n                        fontSize = 16.sp\n                    )\n                    Text(text = user.displayUserName, fontSize = 14.sp)\n                }\n\n            }\n            Spacer(modifier = Modifier.width(4.dp))\n            Row {\n                IconButton(onClick = {\n                    onAccept(user.id)\n                }) {\n                    Icon(\n                        Icons.Default.Check,\n                        contentDescription = stringResource(id = R.string.accept)\n                    )\n                }\n                Spacer(modifier = Modifier.width(4.dp))\n                IconButton(onClick = {\n                    onReject(user.id)\n                }) {\n                    Icon(\n                        Icons.Default.Close,\n                        contentDescription = stringResource(id = R.string.reject)\n                    )\n                }\n            }\n\n        }\n    }\n}\n\n@Preview\n@Composable\nfun Preview_FollowRequestItem() {\n    FollowRequestItem(\n        currentAccount = Account(\n            remoteId = \"\",\n            instanceDomain = \"\",\n            userName = \"\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"\"\n        ),\n        isUserNameDefault = true,\n        user = User.Simple(\n            id = User.Id(accountId = 0, id = \"\"),\n            userName = \"Panta\",\n            name = \"Panta\",\n            avatarUrl = null,\n            emojis = listOf(),\n            isCat = null,\n            isBot = null,\n            host = \"\",\n            nickname = null,\n            isSameHost = false,\n            instance = null,\n            avatarBlurhash = null,\n            badgeRoles = emptyList(),\n        ), onAccept = {}, onReject = {}, onAvatarClicked = {}\n    )\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/followrequests/FollowRequestsErrorHandler.kt",
    "content": "package net.pantasystem.milktea.user.followrequests\n\nimport android.content.Context\nimport android.widget.Toast\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.APIErrorStringConverter\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.note.R\n\nclass FollowRequestsErrorHandler(val context: Context) {\n\n    operator fun invoke(throwable: Throwable) {\n        when (throwable) {\n            is APIError -> {\n                Toast.makeText(context, APIErrorStringConverter()(throwable).getString(context), Toast.LENGTH_LONG)\n                    .show()\n            }\n\n            is UnauthorizedException -> {\n                Toast.makeText(\n                    context,\n                    R.string.unauthorized_error,\n                    Toast.LENGTH_LONG\n                ).show()\n            }\n            else -> Unit\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/followrequests/FollowRequestsFragment.kt",
    "content": "package net.pantasystem.milktea.user.followrequests\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.ExperimentalComposeUiApi\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.rememberNestedScrollInteropConnection\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common_android_ui.user.FollowRequestsFragmentFactory\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass FollowRequestsFragment : Fragment() {\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel by viewModels<FollowRequestsViewModel>()\n\n    @OptIn(ExperimentalComposeUiApi::class)\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View {\n        viewModel.errors.onEach {\n            FollowRequestsErrorHandler(requireContext())(it)\n        }.flowWithLifecycle(\n            viewLifecycleOwner.lifecycle,\n            Lifecycle.State.RESUMED\n        ).launchIn(viewLifecycleOwner.lifecycleScope)\n\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val uiState by viewModel.uiState.collectAsState()\n                    FollowRequestsScreen(\n                        modifier = Modifier\n                            .fillMaxSize()\n                            .nestedScroll(\n                                rememberNestedScrollInteropConnection()\n                            ),\n                        uiState = uiState,\n                        onAccept = viewModel::onAccept,\n                        onReject = viewModel::onReject,\n                        onAvatarClicked = {\n                            startActivity(\n                                userDetailNavigation.newIntent(UserDetailNavigationArgs.UserId(it))\n                            )\n                        },\n                        onRefresh = viewModel::onRefresh\n                    )\n                }\n            }\n        }\n    }\n}\n\nclass FollowRequestFragmentFactoryImpl @Inject constructor() : FollowRequestsFragmentFactory {\n    override fun create(): Fragment {\n        return FollowRequestsFragment()\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/followrequests/FollowRequestsScreen.kt",
    "content": "package net.pantasystem.milktea.user.followrequests\n\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.material3.CircularProgressIndicator\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.material3.ExperimentalMaterial3Api\nimport androidx.compose.material3.pulltorefresh.PullToRefreshBox\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.R\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun FollowRequestsScreen(\n    uiState: FollowRequestsUiState,\n    onAccept: (User.Id) -> Unit,\n    onReject: (User.Id) -> Unit,\n    onAvatarClicked: (User.Id) -> Unit,\n    onRefresh: () -> Unit,\n    modifier: Modifier = Modifier,\n) {\n    LaunchedEffect(null) {\n        onRefresh()\n    }\n    PullToRefreshBox(\n        isRefreshing = uiState.pagingState is PageableState.Loading.Init,\n        onRefresh = onRefresh\n    ) {\n        LazyColumn(modifier) {\n            when(val content = uiState.pagingState.content) {\n                is StateContent.Exist -> {\n                    if (content.rawContent.isNotEmpty()) {\n                        items(content.rawContent) { item ->\n                            FollowRequestItem(\n                                currentAccount = uiState.currentAccount,\n                                user = item,\n                                isUserNameDefault = uiState.config.isUserNameDefault,\n                                onAccept = onAccept,\n                                onReject = onReject,\n                                onAvatarClicked = onAvatarClicked\n                            )\n                        }\n                    }\n                }\n                is StateContent.NotExist -> Unit\n            }\n\n            item {\n                Box(\n                    modifier = Modifier.fillMaxWidth(),\n                    contentAlignment = Alignment.Center,\n                ) {\n                    when(uiState.pagingState) {\n                        is PageableState.Error -> {\n                            Text(stringResource(id = R.string.error_s, uiState.pagingState.throwable.localizedMessage ?: \"\"))\n                        }\n                        is PageableState.Fixed -> {\n                            val showMessage = when(val content = uiState.pagingState.content) {\n                                is StateContent.Exist -> {\n                                    content.rawContent.isEmpty()\n                                }\n                                is StateContent.NotExist -> true\n                            }\n                            if (showMessage) {\n                                Text(stringResource(id = R.string.content_not_exists_message))\n                            }\n                        }\n                        is PageableState.Loading -> {\n                            CircularProgressIndicator()\n                        }\n                    }\n                }\n\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/followrequests/FollowRequestsViewModel.kt",
    "content": "package net.pantasystem.milktea.user.followrequests\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.setting.Config\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.FollowRequestRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.follow.requests.FollowRequestPagingStore\nimport javax.inject.Inject\n\n@HiltViewModel\nclass FollowRequestsViewModel @Inject constructor(\n    accountRepository: AccountRepository,\n    followRequestPagingStoreFactory: FollowRequestPagingStore.Factory,\n    configRepository: LocalConfigRepository,\n    private val accountStore: AccountStore,\n    private val userDataSource: UserDataSource,\n    private val followRequestRepository: FollowRequestRepository,\n) : ViewModel() {\n\n    private val _errors = MutableSharedFlow<Throwable>(extraBufferCapacity = 10, onBufferOverflow = BufferOverflow.DROP_OLDEST)\n    val errors = _errors.asSharedFlow()\n\n    private val pagingStore = followRequestPagingStoreFactory.create {\n        accountRepository.getCurrentAccount().getOrThrow()\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val users = pagingStore.state.map { state ->\n        (state.content as? StateContent.Exist)?.rawContent ?: emptyList()\n    }.flatMapLatest { ids ->\n        accountStore.observeCurrentAccount.filterNotNull().flatMapLatest { account ->\n            userDataSource.observeIn(account.accountId, ids.map { it.id })\n        }.onStart {\n            emit(emptyList())\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    val state = combine(users, pagingStore.state) { users, state ->\n        state.convert {\n            users\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), PageableState.Loading.Init())\n\n    val uiState = combine(\n        accountStore.observeCurrentAccount.filterNotNull(),\n        state,\n        users,\n        configRepository.observe()\n    ) { ac, state, users, config ->\n        FollowRequestsUiState(\n            ac,\n            users,\n            state,\n            config\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        FollowRequestsUiState(\n            null,\n            emptyList(),\n            PageableState.Loading.Init(),\n            DefaultConfig.config,\n        )\n    )\n\n    init {\n        accountStore.observeCurrentAccount.distinctUntilChanged().onEach {\n            onRefresh()\n        }.launchIn(viewModelScope)\n    }\n\n    fun onRefresh() {\n        viewModelScope.launch {\n            pagingStore.clear()\n            pagingStore.loadPrevious().onFailure {\n                _errors.tryEmit(it)\n            }\n        }\n    }\n\n    fun onAccept(userId: User.Id) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                followRequestRepository.accept(userId)\n            }.onFailure {\n                _errors.tryEmit(it)\n            }.onSuccess {\n                onRefresh()\n            }\n        }\n    }\n\n    fun onReject(userId: User.Id) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                followRequestRepository.reject(userId)\n            }.onFailure {\n                _errors.tryEmit(it)\n            }.onSuccess {\n                onRefresh()\n            }\n        }\n    }\n\n}\n\ndata class FollowRequestsUiState(\n    val currentAccount: Account?,\n    val users: List<User>,\n    val pagingState: PageableState<List<User>>,\n    val config: Config,\n)"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/helper/HeaderImageHelper.kt",
    "content": "package net.pantasystem.milktea.user.helper\n\nimport android.widget.ImageView\nimport androidx.databinding.BindingAdapter\nimport com.bumptech.glide.Glide\n\nobject HeaderImageHelper {\n\n    @BindingAdapter(\"headerImageUrl\")\n    @JvmStatic\n    fun ImageView.putImage(headerImageUrl: String?){\n        if(headerImageUrl == null){\n            return\n        }else{\n            Glide.with(this)\n                .load(headerImageUrl)\n                .centerCrop()\n                .into(this)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/nickname/EditNicknameDialog.kt",
    "content": "package net.pantasystem.milktea.user.nickname\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.lifecycle.ViewModelProvider\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.databinding.DialogEditNicknameBinding\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\n\n@AndroidEntryPoint\nclass EditNicknameDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"EditNicknameDialog\"\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n        val view = View.inflate(context, R.layout.dialog_edit_nickname, null)\n        val binding = DialogEditNicknameBinding.bind(view)\n\n        val viewModel = ViewModelProvider(requireActivity())[UserDetailViewModel::class.java]\n        dialog.setContentView(view)\n\n        binding.sendButton.setOnClickListener {\n            val text = binding.input.text?.toString() ?: \"\"\n            viewModel.changeNickname(text)\n            dismiss()\n        }\n        binding.cancelButton.setOnClickListener {\n            dismiss()\n        }\n        return dialog\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/ConfirmUserBlockDialog.kt",
    "content": "package net.pantasystem.milktea.user.profile\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\n\n@AndroidEntryPoint\nclass ConfirmUserBlockDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"ConfirmUserBlockDialog\"\n    }\n\n    val viewModel: UserDetailViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext()).apply {\n            setTitle(R.string.confirm_user_block_title)\n            setMessage(getString(R.string.confirm_user_block_description, viewModel.userState.value?.displayUserName))\n            setPositiveButton(android.R.string.ok) { _ ,_ ->\n                viewModel.block()\n                dismiss()\n            }\n            setNegativeButton(android.R.string.cancel) { _, _ ->\n                dismiss()\n            }\n        }.create()\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/ProfileAccountSwitchDialog.kt",
    "content": "package net.pantasystem.milktea.user.profile\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.bottomsheet.BottomSheetDialogFragment\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_android_ui.account.AccountSwitchingDialogLayout\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.AccountSettingNavigation\nimport net.pantasystem.milktea.common_navigation.AuthorizationArgs\nimport net.pantasystem.milktea.common_navigation.AuthorizationNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigationArgs\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass ProfileAccountSwitchDialog : BottomSheetDialogFragment() {\n    companion object {\n        const val FRAGMENT_TAG = \"ProfileAccountSwitchDialog\"\n    }\n\n    @Inject\n    lateinit var authorizationNavigation: AuthorizationNavigation\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    lateinit var accountSettingNavigation: AccountSettingNavigation\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val userDetailViewModel: UserDetailViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return super.onCreateDialog(savedInstanceState).apply {\n            val view = ComposeView(requireContext()).apply {\n                setContent {\n                    MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                        val uiState by userDetailViewModel.accountUiState.collectAsState()\n                        AccountSwitchingDialogLayout(\n                            uiState = uiState,\n                            onSettingButtonClicked = {\n                                startActivity(accountSettingNavigation.newIntent(Unit))\n                                dismiss()\n                            },\n                            onAvatarIconClicked = { accountInfo ->\n                                startActivity(\n                                    userDetailNavigation.newIntent(UserDetailNavigationArgs.UserName(accountInfo.user?.let {\n                                        \"@${it.userName}@${it.host}\"\n                                    } ?: \"@${accountInfo.account.userName}@${accountInfo.account.getHost()}\"))\n                                )\n                                dismiss()\n                            },\n                            onAccountClicked = {\n                                userDetailViewModel.setCurrentAccount(it.account.accountId)\n                                dismiss()\n                            },\n                            onAddAccountButtonClicked = {\n                                requireActivity().startActivity(authorizationNavigation.newIntent(\n                                    AuthorizationArgs.New))\n                                dismiss()\n                            }\n                        )\n                    }\n                }\n            }\n            setContentView(view)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/ProfileTabPagerAdapter.kt",
    "content": "package net.pantasystem.milktea.user.profile\n\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.viewpager2.adapter.FragmentStateAdapter\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.UserPinnedNotesFragmentFactory\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.user.reaction.UserReactionsFragment\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailTabType\n\nclass ProfileTabPagerAdapter(\n    private val pageableFragmentFactory: PageableFragmentFactory,\n    private val userPinnedNotesFragmentFactory: UserPinnedNotesFragmentFactory,\n    activity: FragmentActivity,\n) : FragmentStateAdapter(activity) {\n\n    var tabs: List<UserDetailTabType> = emptyList()\n        private set\n\n    override fun createFragment(position: Int): Fragment {\n        return when (val tab = tabs[position]) {\n            is UserDetailTabType.Gallery -> pageableFragmentFactory.create(\n                tab.accountId,\n                Pageable.Gallery.User(tab.userId.id),\n            )\n            is UserDetailTabType.Media -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    withFiles = true\n                )\n            )\n            is UserDetailTabType.PinNote -> userPinnedNotesFragmentFactory.create(tab.userId)\n            is UserDetailTabType.Reactions -> UserReactionsFragment.newInstance(tab.userId)\n            is UserDetailTabType.UserTimeline -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    includeReplies = false\n                )\n            )\n            is UserDetailTabType.UserTimelineWithReplies -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    includeReplies = true\n                )\n            )\n            is UserDetailTabType.MastodonMedia -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    isOnlyMedia = true,\n                )\n            )\n            is UserDetailTabType.MastodonUserTimeline -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    excludeReplies = true,\n                )\n            )\n            is UserDetailTabType.MastodonUserTimelineWithReplies -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    excludeReplies = false,\n                )\n            )\n            is UserDetailTabType.MastodonUserTimelineOnlyPosts -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.Mastodon.UserTimeline(\n                    tab.userId.id,\n                    excludeReblogs = true,\n                )\n            )\n            is UserDetailTabType.UserTimelineOnlyPosts -> pageableFragmentFactory.create(\n                tab.userId.accountId,\n                Pageable.UserTimeline(\n                    tab.userId.id,\n                    includeMyRenotes = false,\n                ),\n            )\n        }\n\n    }\n\n    override fun getItemCount(): Int {\n        return tabs.size\n    }\n\n    fun submitList(list: List<UserDetailTabType>) {\n\n        val old = tabs\n        tabs = list\n        val callback = object : DiffUtil.Callback() {\n            override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n\n            override fun getNewListSize(): Int {\n                return list.size\n            }\n\n            override fun getOldListSize(): Int {\n                return old.size\n            }\n\n            override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {\n                return old[oldItemPosition] == list[newItemPosition]\n            }\n        }\n        val result = DiffUtil.calculateDiff(callback)\n        result.dispatchUpdatesTo(this)\n    }\n\n\n}\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/UserDetailActivity.kt",
    "content": "package net.pantasystem.milktea.user.profile\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.util.Log\nimport android.util.TypedValue\nimport android.view.Menu\nimport android.view.MenuItem\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.core.app.TaskStackBuilder\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.*\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport com.google.android.material.tabs.TabLayout\nimport com.google.android.material.tabs.TabLayoutMediator\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.distinctUntilChangedBy\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.mapNotNull\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android.ui.Activities\nimport net.pantasystem.milktea.common_android.ui.getParentActivity\nimport net.pantasystem.milktea.common_android.ui.haptic.HapticFeedbackController\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.UserPinnedNotesFragmentFactory\nimport net.pantasystem.milktea.common_android_ui.error.UserActionAppGlobalErrorListener\nimport net.pantasystem.milktea.common_android_ui.report.ReportDialog\nimport net.pantasystem.milktea.common_compose.haptic.rememberHapticFeedback\nimport net.pantasystem.milktea.common_navigation.*\nimport net.pantasystem.milktea.model.setting.Config\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.Theme\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.NoteEditorActivity\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport net.pantasystem.milktea.user.FollowButton\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.databinding.ActivityUserDetailBinding\nimport net.pantasystem.milktea.user.followlist.FollowFollowerActivity\nimport net.pantasystem.milktea.user.nickname.EditNicknameDialog\nimport net.pantasystem.milktea.user.profile.mute.SpecifyMuteExpiredAtDialog\nimport net.pantasystem.milktea.user.profile.view.ProfileBadgeRoleData\nimport net.pantasystem.milktea.user.profile.view.ProfileBadgeRoles\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\nimport net.pantasystem.milktea.user.qrshare.QRShareDialog\nimport nl.dionsegijn.konfetti.core.Angle\nimport nl.dionsegijn.konfetti.core.Party\nimport nl.dionsegijn.konfetti.core.Position\nimport nl.dionsegijn.konfetti.core.Spread\nimport nl.dionsegijn.konfetti.core.emitter.Emitter\nimport java.util.concurrent.TimeUnit\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\nimport androidx.core.view.ViewCompat\nimport androidx.core.view.WindowInsetsCompat\nimport androidx.core.view.updatePadding\n\n\n@AndroidEntryPoint\nclass UserDetailActivity : AppCompatActivity() {\n    companion object {\n        internal const val EXTRA_USER_ID =\n            \"net.pantasystem.milktea.user.profile.UserDetailActivity.EXTRA_USER_ID\"\n        internal const val EXTRA_USER_NAME =\n            \"net.pantasystem.milktea.user.profile.UserDetailActivity.EXTRA_USER_NAME\"\n        internal const val EXTRA_ACCOUNT_ID =\n            \"jp.panta.misskeyandroiclient.UserDetailActivity.EXTRA_ACCOUNT_ID\"\n        const val EXTRA_IS_MAIN_ACTIVE = \"jp.panta.misskeyandroidclient.EXTRA_IS_MAIN_ACTIVE\"\n\n        fun newInstance(context: Context, userId: User.Id): Intent {\n            return Intent(context, UserDetailActivity::class.java).apply {\n\n                putExtra(EXTRA_USER_ID, userId.id)\n                putExtra(EXTRA_ACCOUNT_ID, userId.accountId)\n            }\n        }\n\n        fun newInstance(context: Context, userName: String): Intent {\n            return Intent(context, UserDetailActivity::class.java).apply {\n                putExtra(EXTRA_USER_NAME, userName)\n\n            }\n        }\n    }\n\n\n    @Inject\n    internal lateinit var accountStore: AccountStore\n\n    @Inject\n    internal lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    internal lateinit var searchNavigation: SearchNavigation\n\n\n    private val mViewModel: UserDetailViewModel by viewModels()\n\n\n    private var mUserId: User.Id? = null\n    private var mIsMainActive: Boolean = true\n\n    private var mParentActivity: Activities? = null\n    private val notesViewModel by viewModels<NotesViewModel>()\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    lateinit var applyMenuTint: ApplyMenuTint\n\n    @Inject\n    lateinit var mainActivityNavigation: MainNavigation\n\n    @Inject\n    lateinit var userListNavigation: UserListNavigation\n\n    @Inject\n    lateinit var userPinnedNotesFragmentFactory: UserPinnedNotesFragmentFactory\n\n    @Inject\n    internal lateinit var userActionAppGlobalErrorListener: UserActionAppGlobalErrorListener\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n        userActionAppGlobalErrorListener(lifecycle, supportFragmentManager)\n        val binding = DataBindingUtil.setContentView<ActivityUserDetailBinding>(\n            this,\n            R.layout.activity_user_detail\n        )\n        binding.lifecycleOwner = this\n        binding.userViewModel = mViewModel\n\n        binding.badgeRoles.apply {\n            setContent {\n                val userDetail by mViewModel.userState.collectAsState()\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    ProfileBadgeRoles(\n                        (userDetail?.badgeRoles ?: emptyList()).map {\n                            ProfileBadgeRoleData(\n                                name = it.name,\n                                iconUri = it.iconUri,\n                                displayOrder = it.displayOrder\n                            )\n                        }\n                    )\n                }\n            }\n        }\n\n        binding.followButton.apply {\n            setContent {\n                val userDetail by mViewModel.userState.collectAsState()\n                val isMine by mViewModel.isMine.collectAsState()\n                val feedback = rememberHapticFeedback()\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    FollowButton(\n                        userState = userDetail?.followState,\n                        isMine = isMine,\n                        onClick = {\n                            feedback.performClickHapticFeedback()\n                            mViewModel.changeFollow()\n                        }\n                    )\n                }\n            }\n        }\n\n        setSupportActionBar(binding.userDetailToolbar)\n        ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets ->\n            val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())\n            binding.userDetailToolbar.updatePadding(top = insets.top)\n            binding.root.updatePadding(bottom = insets.bottom)\n            windowInsets\n        }\n\n        supportActionBar?.setDisplayHomeAsUpEnabled(true)\n        supportActionBar?.setDisplayShowTitleEnabled(false)\n        mParentActivity = intent.getParentActivity()\n\n        val remoteUserId: String? = intent.getStringExtra(EXTRA_USER_ID)\n        val accountId: Long = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1)\n        val userId: User.Id? = if (!(remoteUserId == null || accountId == -1L)) {\n            User.Id(accountId, remoteUserId)\n        } else {\n            null\n        }\n        mUserId = userId\n\n        val userName = intent.data?.getQueryParameter(\"userName\")\n            ?: intent.getStringExtra(EXTRA_USER_NAME)\n            ?: intent.data?.path?.let { path ->\n                if (path.startsWith(\"/\")) {\n                    path.substring(1, path.length)\n                } else {\n                    path\n                }\n            }\n        Log.d(\"UserDetailActivity\", \"userName:$userName\")\n        mIsMainActive = intent.getBooleanExtra(EXTRA_IS_MAIN_ACTIVE, true)\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n\n        val adapter = ProfileTabPagerAdapter(\n            pageableFragmentFactory,\n            userPinnedNotesFragmentFactory,\n            this\n        )\n        binding.userTimelinePager.adapter = adapter\n\n        TabLayoutMediator(\n            binding.userTimelineTab,\n            binding.userTimelinePager\n        ) { tab, position ->\n            tab.text = getString(adapter.tabs[position].title)\n        }.attach()\n\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                mViewModel.tabTypes.collect { tabs ->\n                    binding.userTimelineTab.tabMode = if (tabs.size > 4) {\n                        TabLayout.MODE_SCROLLABLE\n                    } else {\n                        TabLayout.MODE_FIXED\n                    }\n                    adapter.submitList(tabs)\n                }\n            }\n        }\n\n        binding.followsText.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            showFollowings()\n        }\n\n        binding.followingCounter.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            showFollowings()\n        }\n\n        binding.followersCounter.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            showFollowers()\n        }\n\n        binding.followersText.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            showFollowers()\n        }\n\n        lifecycleScope.launch {\n            mViewModel.userState.collect {\n                invalidateOptionsMenu()\n                supportActionBar?.title = it?.displayUserName\n            }\n        }\n\n        mViewModel.renoteMuteState.onEach {\n            invalidateOptionsMenu()\n        }.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED).launchIn(lifecycleScope)\n\n        invalidateOptionsMenu()\n\n\n        binding.showRemoteUser.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            val account = accountStore.currentAccount\n            if (account != null) {\n                mViewModel.userState.value?.getProfileUrl(account)?.let {\n                    val uri = Uri.parse(it)\n                    startActivity(\n                        Intent(Intent.ACTION_VIEW, uri)\n                    )\n                }\n            }\n        }\n\n        binding.showRemoteUserInRemotePage.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            val account = accountStore.currentAccount\n            if (account != null) {\n\n                mViewModel.userState.value?.getRemoteProfileUrl(account)?.let {\n                    val uri = Uri.parse(it)\n                    startActivity(\n                        Intent(Intent.ACTION_VIEW, uri)\n                    )\n                }\n            }\n        }\n\n        binding.createMention.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            mViewModel.userState.value?.displayUserName?.let {\n                val intent = NoteEditorActivity.newBundle(this, mentions = listOf(it))\n                startActivity(intent)\n            }\n\n        }\n\n\n        binding.editNicknameButton.setOnClickListener {\n            HapticFeedbackController.performClickHapticFeedback(it)\n            EditNicknameDialog().show(supportFragmentManager, EditNicknameDialog.FRAGMENT_TAG)\n        }\n\n\n        val userFieldsAdapter = UserProfileFieldListAdapter()\n        binding.userFields.adapter = userFieldsAdapter\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.CREATED) {\n                launch {\n                    mViewModel.userState.mapNotNull {\n                        it?.info?.fields\n                    }.collect {\n                        userFieldsAdapter.submitList(it)\n                    }\n                }\n                launch {\n                    mViewModel.isTodayBirthday.collect {\n                        if (it) {\n                            binding.konfettiView.bringToFront()\n                            binding.konfettiView.start(rain())\n                        }\n                    }\n                }\n            }\n        }\n\n        lifecycleScope.launch {\n            repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                configRepository.observe().distinctUntilChangedBy {\n                    it.theme\n                }.collect {\n                    applyRemoteUserStateLayoutBackgroundColor(binding, it)\n                }\n            }\n        }\n\n//        mViewModel.errors.onEach {\n//            UserDetailErrorHandler(this@UserDetailActivity)(it)\n//        }.flowWithLifecycle(lifecycle, Lifecycle.State.RESUMED).launchIn(lifecycleScope)\n\n    }\n\n\n    override fun onCreateOptionsMenu(menu: Menu): Boolean {\n        menuInflater.inflate(R.menu.activity_user_menu, menu)\n\n        UserDetailActivityMenuBinder(this, mViewModel, applyMenuTint, accountStore)\n            .bind(menu)\n\n        return super.onCreateOptionsMenu(menu)\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        Log.d(\"UserDetail\", \"mParentActivity: $mParentActivity\")\n\n        when (item.itemId) {\n            android.R.id.home -> {\n                finishAndGoToMainActivity()\n                return true\n            }\n            R.id.block -> {\n                ConfirmUserBlockDialog().show(supportFragmentManager, ConfirmUserBlockDialog.FRAGMENT_TAG)\n            }\n            R.id.mute -> {\n                SpecifyMuteExpiredAtDialog()\n                    .show(supportFragmentManager, SpecifyMuteExpiredAtDialog.FRAGMENT_TAG)\n            }\n            R.id.unblock -> {\n                mViewModel.unblock()\n            }\n            R.id.unmute -> {\n                mViewModel.unmute()\n            }\n            R.id.nav_add_to_tab -> {\n                addPageToTab()\n            }\n            R.id.add_list -> {\n                val intent = userListNavigation.newIntent(UserListArgs(mUserId))\n\n                startActivity(intent)\n            }\n            R.id.report_user -> {\n                mUserId?.let {\n                    ReportDialog.newInstance(it).show(supportFragmentManager, ReportDialog.FRAGMENT_TAG)\n                }\n            }\n            R.id.share -> {\n                val account = accountStore.currentAccount\n                val url = account?.let {\n                    mViewModel.userState.value?.getRemoteProfileUrl(it)\n                } ?: return false\n\n\n                val intent = Intent().apply {\n                    action = Intent.ACTION_SEND\n                    type = \"text/plain\"\n                    putExtra(Intent.EXTRA_TEXT, url)\n                }\n                startActivity(Intent.createChooser(intent, getString(R.string.share)))\n            }\n            R.id.renoteUnmute -> {\n                mViewModel.unMuteRenotes()\n            }\n            R.id.renoteMute -> {\n                mViewModel.muteRenotes()\n            }\n            R.id.nav_search_by_user -> {\n                startActivity(searchNavigation.newIntent(\n                    SearchNavType.SearchScreen(\n                        acct = mViewModel.userState.value?.let {\n                                \"@${it.userName}@${it.host}\"\n                            }\n                        )\n                    )\n                )\n            }\n            R.id.nav_switch_account -> {\n                ProfileAccountSwitchDialog().show(supportFragmentManager, ProfileAccountSwitchDialog.FRAGMENT_TAG)\n            }\n            R.id.show_qr_code -> {\n                QRShareDialog().show(supportFragmentManager, QRShareDialog.FRAGMENT_TAG)\n            }\n            R.id.notify_about_new_posts -> {\n                mViewModel.toggleNotifyUserPosts()\n            }\n            R.id.stop_notify_about_new_posts -> {\n                mViewModel.toggleNotifyUserPosts()\n            }\n            else -> return false\n\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n\n    private fun finishAndGoToMainActivity() {\n        if (mParentActivity == null || mParentActivity == Activities.ACTIVITY_OUT_APP) {\n            val upIntent = mainActivityNavigation.newIntent(Unit)\n            upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)\n\n            if (shouldUpRecreateTask(upIntent)) {\n                TaskStackBuilder.create(this)\n                    .addNextIntentWithParentStack(upIntent)\n                    .startActivities()\n                finish()\n            } else {\n                navigateUpTo(upIntent)\n            }\n\n\n            return\n        }\n        finish()\n    }\n\n    private fun applyRemoteUserStateLayoutBackgroundColor(\n        binding: ActivityUserDetailBinding,\n        config: Config,\n    ) {\n        val typed = TypedValue()\n        if (config.theme is Theme.Bread) {\n            theme.resolveAttribute(R.attr.colorSurface, typed, true)\n        } else {\n            theme.resolveAttribute(R.attr.background, typed, true)\n        }\n        binding.remoteUserState.setBackgroundColor(typed.data)\n    }\n\n    @ExperimentalCoroutinesApi\n    private fun addPageToTab() {\n        mViewModel.toggleUserTimelineTab()\n    }\n\n    private fun showFollowers() {\n        mViewModel.userState.value?.let {\n            val intent = FollowFollowerActivity.newIntent(this, it.id, isFollowing = false)\n            startActivity(intent)\n        }\n    }\n\n    private fun showFollowings() {\n        mViewModel.userState.value?.let {\n            val intent = FollowFollowerActivity.newIntent(this, it.id, isFollowing = true)\n            startActivity(intent)\n        }\n    }\n\n//  紙吹雪のアニメーションを制御する\n    private fun rain(): List<Party> {\n        return listOf(\n            Party(\n                speed = 2f,\n                maxSpeed = 4f,\n                damping = 0.9f,\n                angle = Angle.BOTTOM,\n                spread = Spread.ROUND,\n                colors = listOf(0xfce18a, 0xff726d, 0xf4306d, 0xb48def),\n                emitter = Emitter(duration = 9, TimeUnit.SECONDS).perSecond(50),\n                position = Position.Relative(0.0, 0.0).between(Position.Relative(1.0, 0.0))\n            )\n        )\n    }\n}\n\n\nclass UserDetailNavigationImpl @Inject constructor(\n    val activity: Activity,\n) : UserDetailNavigation {\n\n    override fun newIntent(args: UserDetailNavigationArgs): Intent {\n        return when (args) {\n            is UserDetailNavigationArgs.UserId -> UserDetailActivity.newInstance(\n                activity,\n                args.userId\n            )\n            is UserDetailNavigationArgs.UserName -> UserDetailActivity.newInstance(\n                activity,\n                args.userName\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/UserDetailActivityMenuBinder.kt",
    "content": "package net.pantasystem.milktea.user.profile\n\nimport android.app.Activity\nimport android.util.Log\nimport android.view.Menu\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\n\nclass UserDetailActivityMenuBinder(\n    val activity: Activity,\n    val userDetailViewModel: UserDetailViewModel,\n    val applyMenuTint: ApplyMenuTint,\n    val accountStore: AccountStore,\n) {\n\n    fun bind(menu: Menu) {\n\n        val state = userDetailViewModel.userState.value\n        Log.d(\"UserDetailActivity\", \"onCreateOptionsMenu: state:$state\")\n\n        val block = menu.findItem(R.id.block)\n        val mute = menu.findItem(R.id.mute)\n        val unblock = menu.findItem(R.id.unblock)\n        val unmute = menu.findItem(R.id.unmute)\n        val report = menu.findItem(R.id.report_user)\n        mute?.isVisible = !(state?.related?.isMuting ?: false)\n        block?.isVisible = !(state?.related?.isBlocking ?: false)\n        unblock?.isVisible = (state?.related?.isBlocking ?: false)\n        unmute?.isVisible = (state?.related?.isMuting ?: false)\n        if (userDetailViewModel.isMine.value) {\n            block?.isVisible = false\n            mute?.isVisible = false\n            unblock?.isVisible = false\n            unmute?.isVisible = false\n            report?.isVisible = false\n        }\n\n        if (userDetailViewModel.renoteMuteState.value == null) {\n            menu.findItem(R.id.renoteMute).isVisible = true\n            menu.findItem(R.id.renoteUnmute).isVisible = false\n        } else {\n            menu.findItem(R.id.renoteMute).isVisible = false\n            menu.findItem(R.id.renoteUnmute).isVisible = true\n        }\n\n        if (state?.related?.isNotify == null) {\n            menu.findItem(R.id.notify_about_new_posts).isVisible = false\n            menu.findItem(R.id.stop_notify_about_new_posts).isVisible = false\n        } else {\n            menu.findItem(R.id.notify_about_new_posts).isVisible = state.related?.isNotify == false\n            menu.findItem(R.id.stop_notify_about_new_posts).isVisible = state.related?.isNotify == true\n        }\n\n        val tab = menu.findItem(R.id.nav_add_to_tab)\n        val page = accountStore.currentAccount?.pages?.firstOrNull {\n            val pageable = it.pageable()\n            if (pageable is Pageable.UserTimeline) {\n                pageable.userId == state?.id?.id\n            } else {\n                false\n            }\n        }\n        if (page == null) {\n            tab?.setIcon(R.drawable.ic_add_to_tab_24px)\n        } else {\n            tab?.setIcon(R.drawable.ic_remove_to_tab_24px)\n        }\n\n        applyMenuTint(activity, menu)\n    }\n\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/UserDetailErrorHandler.kt",
    "content": "package net.pantasystem.milktea.user.profile\n\nimport android.content.Context\nimport android.widget.Toast\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common_android.resource.getString\nimport net.pantasystem.milktea.common_android_ui.APIErrorStringConverter\nimport net.pantasystem.milktea.model.account.UnauthorizedException\nimport net.pantasystem.milktea.note.R\nimport java.io.IOException\n\nclass UserDetailErrorHandler(val context: Context) {\n    operator fun invoke(throwable: Throwable) {\n        when (throwable) {\n            is IOException -> {\n                Toast.makeText(context, R.string.network_error, Toast.LENGTH_LONG)\n                    .show()\n            }\n            is APIError -> {\n                Toast.makeText(context, APIErrorStringConverter()(throwable).getString(context), Toast.LENGTH_LONG)\n                    .show()\n            }\n\n            is UnauthorizedException -> {\n                Toast.makeText(\n                    context,\n                    R.string.unauthorized_error,\n                    Toast.LENGTH_LONG\n                ).show()\n            }\n            else -> {\n\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/UserProfileFieldListAdapter.kt",
    "content": "package net.pantasystem.milktea.user.profile\n\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.databinding.ItemUserProfileFieldBinding\n\nclass UserProfileFieldListAdapter : ListAdapter<User.Field, UserProfileFieldListAdapter.VH>(\n    object : DiffUtil.ItemCallback<User.Field>() {\n        override fun areContentsTheSame(oldItem: User.Field, newItem: User.Field): Boolean {\n            return oldItem == newItem\n        }\n\n        override fun areItemsTheSame(oldItem: User.Field, newItem: User.Field): Boolean {\n            return oldItem == newItem\n        }\n    }\n) {\n    class VH(val binding: ItemUserProfileFieldBinding) : RecyclerView.ViewHolder(binding.root) {\n        fun onBind(field: User.Field) {\n            binding.field = field\n            binding.copyValueButton.setOnClickListener {\n                val clipboardManager = binding.root.context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager\n                clipboardManager.setPrimaryClip(ClipData.newPlainText(field.name, field.value))\n            }\n        }\n\n    }\n\n    override fun onBindViewHolder(holder: VH, position: Int) {\n        holder.onBind(getItem(position))\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {\n        val binding = ItemUserProfileFieldBinding.inflate(LayoutInflater.from(parent.context), parent, false)\n        return VH(binding)\n    }\n\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/mute/MuteUserViewModel.kt",
    "content": "package net.pantasystem.milktea.user.profile.mute\n\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.setValue\nimport androidx.lifecycle.ViewModel\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport java.util.Calendar\nimport java.util.Date\nimport javax.inject.Inject\nimport kotlin.time.Duration\n\n@HiltViewModel\nclass MuteUserViewModel @Inject constructor(): ViewModel() {\n    var state by mutableStateOf<SpecifyUserMuteUiState>(SpecifyUserMuteUiState.IndefinitePeriod)\n        private set\n    val expiredAt: Instant\n        get() {\n            return (state as? SpecifyUserMuteUiState.Specified)?.dateTime\n                ?: Clock.System.now()\n        }\n\n    fun setDate(year: Int, month: Int, dayOfMonth: Int) {\n        val dateTime = (state as? SpecifyUserMuteUiState.Specified)?.dateTime ?: Clock.System.now()\n        val calendar = Calendar.getInstance()\n        calendar.time = Date(dateTime.toEpochMilliseconds())\n        calendar.set(Calendar.YEAR, year)\n        calendar.set(Calendar.MONTH, month)\n        calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth)\n        state = SpecifyUserMuteUiState.Specified(Instant.fromEpochMilliseconds(calendar.time.time))\n    }\n\n    fun setTime(hour: Int, minutes: Int) {\n        val dateTime = (state as? SpecifyUserMuteUiState.Specified)?.dateTime ?: Clock.System.now()\n        val calendar = Calendar.getInstance()\n        calendar.time = Date(dateTime.toEpochMilliseconds())\n        calendar.set(Calendar.HOUR_OF_DAY, hour)\n        calendar.set(Calendar.MINUTE, minutes)\n        state = SpecifyUserMuteUiState.Specified(Instant.fromEpochMilliseconds(calendar.time.time))\n    }\n\n    fun onConfirmed() {\n        state = SpecifyUserMuteUiState.IndefinitePeriod\n    }\n\n    fun onCanceled() {\n        state = SpecifyUserMuteUiState.IndefinitePeriod\n    }\n\n    fun onUpdateState(state: SpecifyUserMuteUiState) {\n        this.state = state\n    }\n}\n\nsealed interface SpecifyUserMuteUiState {\n    object IndefinitePeriod : SpecifyUserMuteUiState\n    data class Specified(val dateTime: Instant) : SpecifyUserMuteUiState {\n        val localDateTime by lazy {\n            dateTime.toLocalDateTime(TimeZone.currentSystemDefault())\n        }\n\n        fun applyDuration(duration: Duration): Specified {\n            return copy(dateTime = Clock.System.now() + duration)\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/mute/SpecifyMuteExpiredAtDialog.kt",
    "content": "package net.pantasystem.milktea.user.profile.mute\n\nimport android.app.DatePickerDialog\nimport android.app.Dialog\nimport android.app.TimePickerDialog\nimport android.os.Bundle\nimport android.widget.DatePicker\nimport android.widget.TimePicker\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.activityViewModels\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\n\n@AndroidEntryPoint\nclass SpecifyMuteExpiredAtDialog : AppCompatDialogFragment() {\n\n    companion object {\n        const val FRAGMENT_TAG = \"SpecifyMuteExpiredAtDialog\"\n    }\n\n    @javax.inject.Inject\n    lateinit var configRepository: LocalConfigRepository\n\n    val userDetailViewModel by activityViewModels<UserDetailViewModel>()\n    val viewModel by activityViewModels<MuteUserViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n\n        return MaterialAlertDialogBuilder(requireContext())\n            .setTitle(R.string.mute)\n            .setView(ComposeView(requireContext()).apply {\n                setContent {\n                    MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                        SpecifyMuteExpiredAtDialogContent(\n                            state = viewModel.state,\n                            onAction = { action ->\n                                when(action) {\n                                    is SpecifyMuteUserAction.OnChangeState -> {\n                                        viewModel.onUpdateState(action.state)\n                                    }\n                                    SpecifyMuteUserAction.OnDateChangeButtonClicked -> {\n                                        UserMuteExpiredDatePickerDialog()\n                                            .show(childFragmentManager, UserMuteExpiredDatePickerDialog.FRAGMENT_TAG)\n                                    }\n                                    SpecifyMuteUserAction.OnTimeChangeButtonClicked -> {\n                                        UserMuteExpiredTimePickerDialog()\n                                            .show(childFragmentManager, UserMuteExpiredTimePickerDialog.FRAGMENT_TAG)\n                                    }\n                                }\n                            }\n                        )\n                    }\n                }\n            })\n            .setPositiveButton(android.R.string.ok) { _, _ ->\n                val expiredAt = when(val state = viewModel.state) {\n                    SpecifyUserMuteUiState.IndefinitePeriod -> {\n                        null\n                    }\n                    is SpecifyUserMuteUiState.Specified -> {\n                        state.dateTime\n                    }\n                }\n                userDetailViewModel.mute(expiredAt)\n                viewModel.onConfirmed()\n            }\n            .setNegativeButton(android.R.string.cancel) { _, _ ->\n                viewModel.onCanceled()\n            }\n            .create()\n    }\n}\n\n@AndroidEntryPoint\nclass UserMuteExpiredDatePickerDialog : AppCompatDialogFragment(), DatePickerDialog.OnDateSetListener {\n\n    companion object {\n        const val FRAGMENT_TAG = \"UserMuteExpiredDatePickerDialog\"\n    }\n\n    val viewModel: MuteUserViewModel by activityViewModels()\n\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val local = viewModel.expiredAt.toLocalDateTime(TimeZone.currentSystemDefault())\n        return DatePickerDialog(requireActivity(), this, local.year, local.monthNumber - 1, local.dayOfMonth)\n    }\n\n    override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {\n        viewModel.setDate(year, month, dayOfMonth)\n    }\n}\n\n@AndroidEntryPoint\nclass UserMuteExpiredTimePickerDialog : AppCompatDialogFragment(), TimePickerDialog.OnTimeSetListener {\n    companion object {\n        const val FRAGMENT_TAG = \"UserMuteExpiredTimePickerDialog\"\n    }\n    val viewModel: MuteUserViewModel by activityViewModels()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val local = viewModel.expiredAt.toLocalDateTime(TimeZone.currentSystemDefault())\n        return TimePickerDialog(requireActivity(), this, local.hour, local.minute, true)\n    }\n    override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {\n        viewModel.setTime(hourOfDay, minute)\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/mute/SpecifyMuteExpiredAtDialogContent.kt",
    "content": "package net.pantasystem.milktea.user.profile.mute\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.Button\nimport androidx.compose.material3.Switch\nimport androidx.compose.material3.Text\nimport androidx.compose.material3.TextButton\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.user.R\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\n\n@Composable\nfun SpecifyMuteExpiredAtDialogContent(\n    state: SpecifyUserMuteUiState,\n    onAction: (SpecifyMuteUserAction) -> Unit,\n) {\n\n    Column(Modifier.fillMaxWidth()) {\n        Row(\n            Modifier\n                .fillMaxWidth()\n                .padding(horizontal = 16.dp)\n                .clickable {\n                    onAction(\n                        SpecifyMuteUserAction.OnChangeState(\n                            if (state is SpecifyUserMuteUiState.Specified) {\n                                SpecifyUserMuteUiState.IndefinitePeriod\n                            } else {\n                                SpecifyUserMuteUiState.Specified(Clock.System.now() + 15.minutes)\n                            }\n                        )\n                    )\n                },\n            horizontalArrangement = Arrangement.SpaceBetween,\n            verticalAlignment = Alignment.CenterVertically\n        ) {\n            Text(stringResource(R.string.user_mute_specify_time_indefinite_period))\n            Switch(\n                checked = state is SpecifyUserMuteUiState.IndefinitePeriod,\n                onCheckedChange = {\n                    onAction(\n                        SpecifyMuteUserAction.OnChangeState(\n                            if (it) {\n                                SpecifyUserMuteUiState.IndefinitePeriod\n                            } else {\n                                SpecifyUserMuteUiState.Specified(Clock.System.now() + 15.hours)\n                            }\n                        )\n                    )\n                })\n\n\n        }\n\n        when (state) {\n            is SpecifyUserMuteUiState.Specified -> {\n                val localDateTime = state.localDateTime\n\n                TextButton(\n                    onClick = {\n                        onAction(\n                            SpecifyMuteUserAction.OnChangeState(\n                                state.applyDuration(15.minutes)\n                            )\n                        )\n                    },\n                    Modifier.fillMaxWidth()\n                ) {\n                    Text(stringResource(R.string.user_mute_specify_time_15_minutes_later))\n                }\n                TextButton(\n                    onClick = {\n                        onAction(\n                            SpecifyMuteUserAction.OnChangeState(\n                                state.applyDuration(30.minutes)\n                            )\n                        )\n                    },\n                    Modifier.fillMaxWidth()\n                ) {\n                    Text(stringResource(R.string.user_mute_specify_time_30_minutes_later))\n                }\n                TextButton(\n                    onClick = {\n                        onAction(\n                            SpecifyMuteUserAction.OnChangeState(\n                                state.applyDuration(1.hours)\n                            )\n                        )\n                    },\n                    Modifier.fillMaxWidth()\n                ) {\n                    Text(stringResource(R.string.user_mute_specify_time_1_hours_later))\n                }\n                TextButton(\n                    onClick = {\n                        onAction(\n                            SpecifyMuteUserAction.OnChangeState(\n                                state.applyDuration(7.days)\n                            )\n                        )\n                    },\n                    Modifier.fillMaxWidth()\n                ) {\n                    Text(stringResource(R.string.user_mute_specify_time_1_week_later))\n                }\n                TextButton(\n                    onClick = {\n                        onAction(\n                            SpecifyMuteUserAction.OnChangeState(\n                                state.applyDuration(30.days)\n                            )\n                        )\n                    },\n                    Modifier.fillMaxWidth()\n                ) {\n                    Text(stringResource(R.string.user_mute_specify_time_1_month_later))\n                }\n\n                Row(\n                    Modifier\n                        .fillMaxWidth()\n                        .padding(horizontal = 16.dp)\n                ) {\n                    Button(\n                        onClick = {\n                            onAction(SpecifyMuteUserAction.OnDateChangeButtonClicked)\n                        },\n                        Modifier.weight(1f),\n                    ) {\n                        Text(\"${localDateTime.year}/${localDateTime.monthNumber}/${localDateTime.dayOfMonth}\")\n                    }\n                    Spacer(Modifier.width(4.dp))\n                    Button(\n                        onClick = {\n                            onAction(SpecifyMuteUserAction.OnTimeChangeButtonClicked)\n                        },\n                        Modifier.weight(1f),\n                    ) {\n                        Text(\"${localDateTime.hour}:${localDateTime.minute}\")\n                    }\n                }\n            }\n            is SpecifyUserMuteUiState.IndefinitePeriod -> {}\n        }\n\n    }\n}\n\nsealed interface SpecifyMuteUserAction {\n    data class OnChangeState(val state: SpecifyUserMuteUiState) : SpecifyMuteUserAction\n    object OnDateChangeButtonClicked : SpecifyMuteUserAction\n    object OnTimeChangeButtonClicked : SpecifyMuteUserAction\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/view/ProfileBadgeRoles.kt",
    "content": "package net.pantasystem.milktea.user.profile.view\n\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.border\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.Box\nimport androidx.compose.foundation.layout.ExperimentalLayoutApi\nimport androidx.compose.foundation.layout.FlowRow\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.aspectRatio\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.foundation.layout.wrapContentHeight\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.MaterialTheme\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.Color\nimport androidx.compose.ui.platform.LocalContext\nimport androidx.compose.ui.unit.TextUnit\nimport androidx.compose.ui.unit.TextUnitType\nimport androidx.compose.ui.unit.dp\nimport androidx.constraintlayout.compose.ConstraintLayout\nimport androidx.constraintlayout.compose.Dimension\nimport coil.compose.rememberAsyncImagePainter\nimport coil.decode.SvgDecoder\nimport coil.request.ImageRequest\n\nprivate val defaultSvgDecoderFactory = SvgDecoder.Factory()\n\n@OptIn(ExperimentalLayoutApi::class)\n@Composable\nfun ProfileBadgeRoles(\n    badgeRoles: List<ProfileBadgeRoleData>\n) {\n\n    Surface(\n        color = MaterialTheme.colorScheme.primary,\n    ) {\n        FlowRow(\n            horizontalArrangement = Arrangement.spacedBy(4.dp),\n            verticalArrangement = Arrangement.Center,\n\n        ) {\n            for (it in badgeRoles) {\n                Box(\n                    Modifier.padding(bottom = 2.dp)\n                ) {\n                    ProfileBadgeRole(it)\n                }\n            }\n        }\n    }\n}\n\n@Composable\nfun ProfileBadgeRole(\n    data: ProfileBadgeRoleData,\n    modifier: Modifier = Modifier,\n) {\n    Box(\n        modifier = modifier\n            .border(\n                color = Color.LightGray,\n                width = 0.5.dp,\n                shape = RoundedCornerShape(4.dp)\n            )\n    ) {\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            modifier = Modifier.padding(2.dp)\n        ) {\n            ConstraintLayout {\n                val (image, text) = createRefs()\n\n                ProfileBadgeRoleImage(\n                    data = data,\n                    modifier = Modifier\n                        .constrainAs(image) {\n                            // startの位置だけ固定して、高さはラベルと合わせる\n                            top.linkTo(text.top)\n                            bottom.linkTo(text.bottom)\n                            start.linkTo(parent.start)\n\n                            width = Dimension.wrapContent\n                            height = Dimension.fillToConstraints\n                        }\n                        .padding(2.dp) // textと高さを揃えているが、それでも気持ちデカイので調節\n                )\n\n                ProfileBadgeRoleText(\n                    data = data,\n                    modifier = Modifier\n                        .constrainAs(text) {\n                            // startの位置だけ固定して、高さ・幅は中の文字列とフォントの高さにまかせる\n                            start.linkTo(image.end)\n\n                            width = Dimension.wrapContent\n                            height = Dimension.wrapContent\n                        }\n                )\n            }\n        }\n    }\n}\n\n@Composable\nfun ProfileBadgeRoleImage(data: ProfileBadgeRoleData, modifier: Modifier = Modifier) {\n    data.iconUri?.let {\n        Image(\n            painter = rememberAsyncImagePainter(\n                model = ImageRequest.Builder(LocalContext.current)\n                    .data(data.iconUri)\n                    .decoderFactory(defaultSvgDecoderFactory)\n                    .build(),\n            ),\n            contentDescription = data.name,\n            modifier = modifier.aspectRatio(1.0f)\n        )\n    }\n}\n\n@Composable\nfun ProfileBadgeRoleText(data: ProfileBadgeRoleData, modifier: Modifier = Modifier) {\n    Text(\n        text = data.name,\n        fontSize = TextUnit(13F, TextUnitType.Sp),\n        modifier = modifier.wrapContentHeight()\n    )\n}\n\ndata class ProfileBadgeRoleData(\n    val name: String,\n    val iconUri: String?,\n    val displayOrder: Int,\n)"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/viewmodel/UserDetailTabType.kt",
    "content": "package net.pantasystem.milktea.user.profile.viewmodel\n\nimport androidx.annotation.StringRes\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.instance.FeatureEnables\nimport net.pantasystem.milktea.model.instance.FeatureType\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.R\nimport javax.inject.Inject\n\n\nsealed class UserDetailTabType(\n    @StringRes val title: Int,\n) {\n\n    data class UserTimeline(val userId: User.Id) : UserDetailTabType(R.string.post)\n    data class UserTimelineWithReplies(val userId: User.Id) :\n        UserDetailTabType(R.string.notes_and_replies)\n\n    data class UserTimelineOnlyPosts(val userId: User.Id) : UserDetailTabType(R.string.post_only)\n\n    data class PinNote(val userId: User.Id) : UserDetailTabType(R.string.pin)\n    data class Gallery(val userId: User.Id, val accountId: Long) :\n        UserDetailTabType(R.string.gallery)\n\n    data class Reactions(val userId: User.Id) : UserDetailTabType(R.string.reaction)\n    data class Media(val userId: User.Id) : UserDetailTabType(R.string.media)\n\n    data class MastodonUserTimeline(val userId: User.Id) : UserDetailTabType(R.string.post)\n    data class MastodonUserTimelineWithReplies(val userId: User.Id) :\n        UserDetailTabType(R.string.notes_and_replies)\n\n    data class MastodonUserTimelineOnlyPosts(val userId: User.Id) :\n        UserDetailTabType(R.string.post_only)\n\n    data class MastodonMedia(val userId: User.Id) : UserDetailTabType(R.string.media)\n}\n\n\nclass UserDetailTabTypeFactory @Inject constructor(\n    private val featureEnables: FeatureEnables,\n) {\n\n\n    suspend fun createTabsForInstanceType(account: Account, user: User.Detail): List<UserDetailTabType> {\n        return when (account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> createMisskeyTabs(account, user)\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> createMastodonPleromaTabs(user)\n        }\n    }\n\n    private suspend fun createMisskeyTabs(account: Account, user: User.Detail): List<UserDetailTabType> {\n        return listOfNotNull(\n            UserDetailTabType.UserTimeline(user.id),\n            UserDetailTabType.UserTimelineOnlyPosts(user.id),\n            UserDetailTabType.UserTimelineWithReplies(user.id),\n            UserDetailTabType.PinNote(user.id),\n            UserDetailTabType.Media(user.id),\n            createGalleryTabIfEnabled(account, user),\n            createReactionTabIfPublic(account, user)\n        )\n    }\n\n    private fun createMastodonPleromaTabs(user: User): List<UserDetailTabType> {\n        return listOf(\n            UserDetailTabType.MastodonUserTimeline(user.id),\n            UserDetailTabType.MastodonUserTimelineOnlyPosts(user.id),\n            UserDetailTabType.MastodonUserTimelineWithReplies(user.id),\n            UserDetailTabType.MastodonMedia(user.id)\n        )\n    }\n\n    private suspend fun createGalleryTabIfEnabled(account: Account, user: User.Detail): UserDetailTabType? {\n        return if (isGalleryEnabled(account)) {\n            UserDetailTabType.Gallery(user.id, accountId = account.accountId)\n        } else null\n    }\n\n    private suspend fun createReactionTabIfPublic(account: Account, user: User.Detail): UserDetailTabType? {\n        return if (isReactionPublic(account, user)) {\n            UserDetailTabType.Reactions(user.id)\n        } else null\n    }\n\n    private suspend fun isGalleryEnabled(account: Account): Boolean {\n        return featureEnables.isEnable(account.normalizedInstanceUri, FeatureType.Gallery)\n    }\n\n    private suspend fun isReactionPublic(account: Account, user: User.Detail): Boolean {\n        return featureEnables.isEnable(account.normalizedInstanceUri, FeatureType.UserReactionHistory) && (user.info.isPublicReactions || user.id == User.Id(account.accountId, account.remoteId))\n    }\n}\n\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/viewmodel/UserDetailViewModel.kt",
    "content": "package net.pantasystem.milktea.user.profile.viewmodel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.TimeZone\nimport kotlinx.datetime.toLocalDateTime\nimport kotlinx.datetime.todayIn\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.handler.AppGlobalError\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.common_android_ui.account.viewmodel.AccountViewModelUiStateHelper\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.ap.ApResolverService\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.*\nimport net.pantasystem.milktea.model.user.block.BlockUserUseCase\nimport net.pantasystem.milktea.model.user.block.UnBlockUserUseCase\nimport net.pantasystem.milktea.model.user.follow.ToggleNotifyUserPostsUseCase\nimport net.pantasystem.milktea.model.user.mute.CreateMute\nimport net.pantasystem.milktea.model.user.mute.MuteUserUseCase\nimport net.pantasystem.milktea.model.user.mute.UnMuteUserUseCase\nimport net.pantasystem.milktea.model.user.nickname.DeleteNicknameUseCase\nimport net.pantasystem.milktea.model.user.nickname.UpdateNicknameUseCase\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMuteRepository\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.profile.UserDetailActivity\nimport javax.inject.Inject\n\n@HiltViewModel\nclass UserDetailViewModel @Inject constructor(\n    private val deleteNicknameUseCase: DeleteNicknameUseCase,\n    private val updateNicknameUseCase: UpdateNicknameUseCase,\n    private val accountStore: AccountStore,\n    private val accountRepository: AccountRepository,\n    private val renoteMuteRepository: RenoteMuteRepository,\n    private val blockUserUseCase: BlockUserUseCase,\n    private val unBlockUserUseCase: UnBlockUserUseCase,\n    private val muteUserUseCase: MuteUserUseCase,\n    private val unMuteUserUseCase: UnMuteUserUseCase,\n    loggerFactory: Logger.Factory,\n    instanceInfoService: InstanceInfoService,\n    private val userRepository: UserRepository,\n    private val toggleFollowUseCase: ToggleFollowUseCase,\n    private val apResolverService: ApResolverService,\n    private val savedStateHandle: SavedStateHandle,\n    private val userDetailTabTypeFactory: UserDetailTabTypeFactory,\n    private val toggleUserTimelineAddTabUseCase: ToggleUserTimelineAddTabUseCase,\n    private val toggleNotifyUserPostsUseCase: ToggleNotifyUserPostsUseCase,\n    private val userIdResolver: UserIdResolver,\n    private val userActionAppGlobalErrorStore: UserActionAppGlobalErrorStore,\n    configRepository: LocalConfigRepository,\n) : ViewModel() {\n\n    companion object;\n\n    private val logger = loggerFactory.create(\"UserDetailViewModel\")\n\n    private val userId =\n        savedStateHandle.getStateFlow<String?>(UserDetailActivity.EXTRA_USER_ID, null)\n    private val specifiedAccountId =\n        savedStateHandle.getStateFlow<Long?>(UserDetailActivity.EXTRA_ACCOUNT_ID, null)\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val currentAccount = specifiedAccountId.flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null,\n    )\n\n    private val fqdnUserName =\n        savedStateHandle.getStateFlow<String?>(UserDetailActivity.EXTRA_USER_NAME, null)\n\n//    private val _errors = MutableSharedFlow<Throwable>(extraBufferCapacity = 100)\n//    val errors = _errors.asSharedFlow()\n\n    private val userProfileArgType = UserProfileArgTypeCombiner(viewModelScope).create(\n        userId,\n        fqdnUserName,\n        currentAccount,\n    ).stateIn(viewModelScope, SharingStarted.Lazily, UserProfileArgType.None)\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val userState = userProfileArgType.flatMapLatest {\n        when (val type = it) {\n            is UserProfileArgType.FqdnUserName -> {\n                userRepository.observe(type.currentAccount.accountId, type.fqdnUserName)\n            }\n\n            UserProfileArgType.None -> flowOf(null)\n            is UserProfileArgType.UserId -> {\n                userRepository.observe(type.userId)\n            }\n        }\n    }.mapNotNull {\n        it?.castAndPartiallyFill()\n    }.catch {\n        logger.error(\"observe user error\", it)\n        userActionAppGlobalErrorStore.dispatch(\n            AppGlobalError(\n                \"UserDetailViewModel.userState\",\n                AppGlobalError.ErrorLevel.Warning,\n                StringSource(\"Load user failed\"),\n                it\n            )\n        )\n    }.stateIn(viewModelScope, SharingStarted.Lazily, null)\n\n    val isTodayBirthday = userState.map {\n        val today = Clock.System.todayIn(TimeZone.currentSystemDefault())\n        it?.info?.birthday?.let { birthday ->\n            birthday.monthNumber == today.monthNumber && birthday.dayOfMonth == today.dayOfMonth\n        } ?: false\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), false)\n\n    val originProfileUrl = userState.filterNotNull().map {\n        val account = accountRepository.get(it.id.accountId).getOrThrow()\n        it.getRemoteProfileUrl(account)\n    }.catch {\n        logger.error(\"get profile url error\", it)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, null)\n\n    val isMine = combine(userState, currentAccount) { userState, account ->\n        userState?.id?.id == account?.remoteId\n    }.stateIn(viewModelScope, SharingStarted.Lazily, false)\n\n    val birthday = userState.map {\n        it?.info?.birthday\n    }.filterNotNull().map {\n        StringSource(R.string.user_birthday, \"${it.year}/${it.monthNumber}/${it.dayOfMonth}\")\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val registrationDate = userState.map {\n        it?.info?.createdAt?.toLocalDateTime(TimeZone.currentSystemDefault())?.date\n    }.filterNotNull().map {\n        StringSource(\n            R.string.user_registration_date,\n            \"${it.year}/${it.monthNumber}/${it.dayOfMonth}\"\n        )\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val tabTypes = combine(\n        currentAccount.filterNotNull(), userState.filterNotNull()\n    ) { account, user ->\n        userDetailTabTypeFactory.createTabsForInstanceType(\n            account,\n            user,\n        )\n    }.catch {\n        logger.error(\"ユーザープロフィールのタブの取得に失敗\", it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    val config = configRepository.observe().stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        DefaultConfig.config,\n    )\n\n    val accountUiState = AccountViewModelUiStateHelper(\n        currentAccount,\n        accountStore,\n        userRepository,\n        instanceInfoService,\n        viewModelScope,\n    ).uiState\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val renoteMuteState = userState.filterNotNull().flatMapLatest {\n        renoteMuteRepository.observeOne(it.id)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val canVisibleFollowFollower = combine(\n        userState.filterNotNull(),\n        currentAccount.filterNotNull(),\n    ) { user, account ->\n        val isFollowing = user.related?.isFollowing ?: false\n        val isMe = user.id.id == account.remoteId\n        when(user.info.ffVisibility) {\n            User.FollowerFollowerVisibility.Public -> true\n            User.FollowerFollowerVisibility.Followers -> isMe || isFollowing\n            User.FollowerFollowerVisibility.Private -> isMe\n            null -> true\n        }\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), false)\n\n\n    init {\n        sync()\n    }\n\n\n    private fun sync() {\n        viewModelScope.launch {\n            getUserId().flatMapCancellableCatching { userId ->\n                userRepository.sync(userId)\n            }.onFailure {\n                logger.error(\"user sync error\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.sync\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"User data sync failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n\n    fun changeFollow() {\n        viewModelScope.launch {\n            userState.value?.let { user ->\n                toggleFollowUseCase(user.id).onFailure {\n                    logger.error(\"unmute failed\", e = it)\n                    userActionAppGlobalErrorStore.dispatch(\n                        AppGlobalError(\n                            \"UserDetailViewModel.changeFollow\",\n                            AppGlobalError.ErrorLevel.Warning,\n                            StringSource(\"follow/unfollow failed\"),\n                            it\n                        )\n                    )\n                }\n            }\n\n        }\n    }\n\n    fun mute(expiredAt: Instant?) {\n        viewModelScope.launch {\n            userState.value?.let { user ->\n                muteUserUseCase(CreateMute(user.id, expiredAt)).onFailure {\n                    logger.error(\"unmute\", e = it)\n                    userActionAppGlobalErrorStore.dispatch(\n                        AppGlobalError(\n                            \"UserDetailViewModel.mute\",\n                            AppGlobalError.ErrorLevel.Warning,\n                            StringSource(\"mute failed\"),\n                            it\n                        )\n                    )\n                }\n            }\n        }\n    }\n\n    fun unmute() {\n        viewModelScope.launch {\n            userState.value?.let { user ->\n                unMuteUserUseCase(user.id).onFailure {\n                    logger.error(\"unmute\", e = it)\n                    userActionAppGlobalErrorStore.dispatch(\n                        AppGlobalError(\n                            \"UserDetailViewModel.unmute\",\n                            AppGlobalError.ErrorLevel.Warning,\n                            StringSource(\"unmute failed\"),\n                            it\n                        )\n                    )\n                }\n            }\n        }\n    }\n\n    fun block() {\n        viewModelScope.launch {\n            userState.value?.let { user ->\n                blockUserUseCase(user.id).onFailure {\n                    logger.error(\"block failed\", it)\n                    userActionAppGlobalErrorStore.dispatch(\n                        AppGlobalError(\n                            \"UserDetailViewModel.block\",\n                            AppGlobalError.ErrorLevel.Warning,\n                            StringSource(\"block failed\"),\n                            it\n                        )\n                    )\n                }\n            }\n        }\n    }\n\n    fun unblock() {\n        viewModelScope.launch {\n            userState.value?.let { user ->\n                unBlockUserUseCase(user.id).onFailure {\n                    logger.info(\"unblock failed\", e = it)\n                    userActionAppGlobalErrorStore.dispatch(\n                        AppGlobalError(\n                            \"UserDetailViewModel.unblock\",\n                            AppGlobalError.ErrorLevel.Warning,\n                            StringSource(\"unblock failed\"),\n                            it\n                        )\n                    )\n                }\n            }\n        }\n    }\n\n    fun changeNickname(name: String) {\n        viewModelScope.launch {\n            findUser().mapCancellableCatching { user ->\n                updateNicknameUseCase(user, name)\n            }.onSuccess {\n                logger.debug(\"ニックネーム更新処理成功\")\n            }.onFailure {\n                logger.error(\"ニックネーム更新処理失敗\", e = it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.changeNickname\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"change nickname failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n    fun deleteNickname() {\n        viewModelScope.launch {\n            findUser().mapCancellableCatching { user ->\n                deleteNicknameUseCase(user)\n            }.onSuccess {\n                logger.debug(\"ニックネーム削除処理成功\")\n            }.onFailure {\n                logger.error(\"ニックネーム削除失敗\", e = it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.deleteNickname\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"delete nickname failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n    fun toggleUserTimelineTab() {\n        viewModelScope.launch {\n            getUserId().flatMapCancellableCatching {\n                toggleUserTimelineAddTabUseCase(it)\n            }.onFailure {\n                logger.error(\"toggle user timeline tab failed\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.toggleUserTimelineTab\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"add/remove user timeline tab failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n    fun toggleNotifyUserPosts() {\n        viewModelScope.launch {\n            getUserId().flatMapCancellableCatching {\n                toggleNotifyUserPostsUseCase(it)\n            }.onFailure {\n                logger.error(\"toggle user notify posts failed\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.toggleNotifyUserPosts\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"on/off notify user posts failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n    fun muteRenotes() {\n        viewModelScope.launch {\n            getUserId().flatMapCancellableCatching {\n                renoteMuteRepository.create(it)\n            }.onFailure {\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.muteRenotes\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"mute renote failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n    fun unMuteRenotes() {\n        viewModelScope.launch {\n            getUserId().flatMapCancellableCatching {\n                renoteMuteRepository.delete(it)\n            }.onFailure {\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.unMuteRenotes\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"unmute renote failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n    fun setCurrentAccount(accountId: Long) {\n        viewModelScope.launch {\n            accountRepository.get(accountId).mapCancellableCatching {\n                it to apResolverService.resolve(getUserId().getOrThrow(), accountId).getOrThrow()\n            }.onSuccess { (account, resolved) ->\n                savedStateHandle[UserDetailActivity.EXTRA_USER_ID] = resolved.id.id\n                savedStateHandle[UserDetailActivity.EXTRA_ACCOUNT_ID] = resolved.id.accountId\n                accountStore.setCurrent(account)\n            }.onFailure {\n                logger.error(\"setCurrentAccount failed\", it)\n                userActionAppGlobalErrorStore.dispatch(\n                    AppGlobalError(\n                        \"UserDetailViewModel.setCurrentAccount\",\n                        AppGlobalError.ErrorLevel.Warning,\n                        StringSource(\"switch account failed\"),\n                        it\n                    )\n                )\n            }\n        }\n    }\n\n    private suspend fun findUser(): Result<User> = runCancellableCatching {\n        userRepository.find(getUserId().getOrThrow())\n    }\n\n\n    private suspend fun getUserId(): Result<User.Id> = runCancellableCatching {\n        val strUserId = savedStateHandle.get<String?>(UserDetailActivity.EXTRA_USER_ID)\n        val specifiedAccountId = savedStateHandle.get<Long?>(UserDetailActivity.EXTRA_ACCOUNT_ID)\n        val fqdnUserName = savedStateHandle.get<String?>(UserDetailActivity.EXTRA_USER_NAME)\n        userIdResolver(\n            userId = strUserId,\n            acct = fqdnUserName,\n            specifiedAccountId = specifiedAccountId,\n        ).getOrThrow()\n    }\n}\n\nsealed interface UserProfileArgType {\n    data class UserId(val userId: User.Id) : UserProfileArgType\n\n    data class FqdnUserName(val fqdnUserName: String, val currentAccount: Account) :\n        UserProfileArgType\n\n    object None : UserProfileArgType\n\n}\n\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/viewmodel/UserIdResolver.kt",
    "content": "package net.pantasystem.milktea.user.profile.viewmodel\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.Acct\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass UserIdResolver @Inject constructor(\n    val accountRepository: AccountRepository,\n    val userRepository: UserRepository,\n) {\n\n    suspend operator fun invoke(\n        userId: String?,\n        acct: String?,\n        specifiedAccountId: Long?,\n    ): Result<User.Id> = runCancellableCatching {\n        val currentAccount = specifiedAccountId?.let {\n            accountRepository.get(it).getOrThrow()\n        } ?: accountRepository.getCurrentAccount().getOrThrow()\n        val argType = when {\n            userId != null -> {\n                UserProfileArgType.UserId(User.Id(currentAccount.accountId, userId\n                ))\n            }\n\n            acct != null -> {\n                UserProfileArgType.FqdnUserName(acct, currentAccount)\n            }\n\n            else -> {\n                UserProfileArgType.None\n            }\n        }\n\n        when (argType) {\n            is UserProfileArgType.FqdnUserName -> {\n                val (userName, host) = Acct(argType.fqdnUserName).let {\n                    it.userName to it.host\n                }\n                userRepository.findByUserName(currentAccount.accountId, userName, host).id\n            }\n\n            is UserProfileArgType.UserId -> {\n                argType.userId\n            }\n\n            UserProfileArgType.None -> throw IllegalStateException()\n        }\n\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/profile/viewmodel/UserProfileArgTypeCombiner.kt",
    "content": "package net.pantasystem.milktea.user.profile.viewmodel\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.stateIn\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\n\nclass UserProfileArgTypeCombiner(\n    private val scope: CoroutineScope,\n) {\n    fun create(\n        userIdFlow: StateFlow<String?>,\n        fqdnUserNameFlow: StateFlow<String?>,\n        currentAccountFlow: StateFlow<Account?>\n    ): StateFlow<UserProfileArgType> {\n        return combine(\n            userIdFlow,\n            fqdnUserNameFlow,\n            currentAccountFlow,\n        ) { userId, fqdnUserName, currentAccount ->\n            when {\n                userId != null && currentAccount != null -> {\n                    UserProfileArgType.UserId(User.Id(currentAccount.accountId, userId))\n                }\n\n                fqdnUserName != null && currentAccount != null -> {\n                    UserProfileArgType.FqdnUserName(fqdnUserName, currentAccount)\n                }\n\n                else -> {\n                    UserProfileArgType.None\n                }\n            }\n        }.stateIn(\n            scope,\n            SharingStarted.WhileSubscribed(5_000),\n            UserProfileArgType.None\n        )\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/qrshare/QRCodeBitmapGenerator.kt",
    "content": "package net.pantasystem.milktea.user.qrshare\n\nimport android.content.ContentValues\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Canvas\nimport android.net.Uri\nimport android.os.Build\nimport android.provider.MediaStore\nimport com.bumptech.glide.Glide\nimport com.bumptech.glide.request.FutureTarget\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.glxn.qrgen.android.QRCode\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport kotlin.coroutines.resume\nimport kotlin.coroutines.suspendCoroutine\n\n\nclass QRCodeBitmapGenerator @Inject constructor(\n    @ApplicationContext private val context: Context,\n    private val accountRepository: AccountRepository,\n) {\n    suspend fun generateBitmap(\n        user: User,\n        size: Int,\n    ): Result<Bitmap?> = runCancellableCatching {\n        val qrCode = QRCode.from(\n            user.getProfileUrl(accountRepository.get(user.id.accountId).getOrThrow()),\n        ).withSize(size, size).bitmap()\n            ?: return@runCancellableCatching null\n\n        val avatarIcon = user.avatarUrl?.let {\n            withContext(Dispatchers.IO) {\n                loadProfileGlide(it, size / 8)\n            }\n        }\n        overlayBitmapsCentered(avatarIcon, qrCode)\n    }\n\n    suspend fun exportToFile(\n        user: User,\n        size: Int,\n    ): Result<Uri?> = runCancellableCatching {\n        val bitmap = generateBitmap(user, size).getOrThrow()\n            ?: return@runCancellableCatching null\n        val mediaCollection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            MediaStore.Images.Media.getContentUri(\n                MediaStore.VOLUME_EXTERNAL_PRIMARY\n            )\n        } else {\n            MediaStore.Images.Media.EXTERNAL_CONTENT_URI\n        }\n        val contentDetail = ContentValues().apply {\n            put(MediaStore.Images.Media.DISPLAY_NAME, \"qr-code-${user.displayUserName}.png\")\n        }\n\n        val uri = context.contentResolver.insert(mediaCollection, contentDetail)\n            ?: return@runCancellableCatching null\n\n        withContext(Dispatchers.IO) {\n            context.contentResolver.openOutputStream(uri)?.use { outputStream ->\n                bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)\n            }\n        }\n        uri\n    }\n\n\n    private fun overlayBitmapsCentered(avatarIcon: Bitmap?, qrCode: Bitmap): Bitmap {\n        // 重ねるための新しいBitmapを生成\n        val result = Bitmap.createBitmap(\n            qrCode.width,\n            qrCode.height,\n            qrCode.config ?: Bitmap.Config.ARGB_8888\n        )\n\n        val canvas = Canvas(result)\n        canvas.drawBitmap(qrCode, 0f, 0f, null)\n\n        if (avatarIcon != null) {\n            val left = (qrCode.width - avatarIcon.width) / 2.0f\n            val top = (qrCode.height - avatarIcon.height) / 2.0f\n\n            canvas.drawBitmap(avatarIcon, left, top, null)\n        }\n        // Bitmap AをBitmap Bの中央に描画するための座標を計算\n\n\n        return result\n    }\n\n    private suspend fun loadProfileGlide(\n        avatarUrl: String,\n        size: Int,\n    ): Bitmap? {\n        return suspendCoroutine<Bitmap?> { continuation ->\n            val futureTarget: FutureTarget<Bitmap> = Glide\n                .with(context)\n                .asBitmap()\n                .circleCrop()\n                .override(size)\n                .load(avatarUrl)\n                .submit()\n\n            try {\n                val bitmap = futureTarget.get()  // この呼び出しはブロックされ、ロードが完了するまで待機します\n                continuation.resume(bitmap)\n            } catch (e: Exception) {\n                continuation.resume(null)  // エラーが発生した場合、nullを返す\n            } finally {\n                Glide.with(context).clear(futureTarget)  // 必ずクリアすること\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/qrshare/QRShareDialog.kt",
    "content": "package net.pantasystem.milktea.user.qrshare\n\nimport android.app.Dialog\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport androidx.compose.foundation.Image\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.Arrangement\nimport androidx.compose.foundation.layout.BoxWithConstraints\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.Row\nimport androidx.compose.foundation.layout.Spacer\nimport androidx.compose.foundation.layout.aspectRatio\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.fillMaxWidth\nimport androidx.compose.foundation.layout.heightIn\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.Icon\nimport androidx.compose.material3.Surface\nimport androidx.compose.material3.Text\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Link\nimport androidx.compose.material.icons.filled.Save\nimport androidx.compose.material.icons.filled.Share\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.LaunchedEffect\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.graphics.ImageBitmap\nimport androidx.compose.ui.graphics.asImageBitmap\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.text.font.FontWeight\nimport androidx.compose.ui.unit.dp\nimport androidx.fragment.app.activityViewModels\nimport com.google.android.material.dialog.MaterialAlertDialogBuilder\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass QRShareDialog : AppCompatDialogFragment() {\n    companion object {\n        const val FRAGMENT_TAG = \"QRShareDialog\"\n    }\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    lateinit var qrCodeBitmapGenerator: QRCodeBitmapGenerator\n\n    val viewModel by activityViewModels<UserDetailViewModel>()\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        return MaterialAlertDialogBuilder(requireContext()).also { builder ->\n            builder.setView(\n                ComposeView(requireContext()).apply {\n                    setContent {\n                        MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                            val user by viewModel.userState.collectAsState()\n                            val url by viewModel.originProfileUrl.collectAsState()\n                            val scope = rememberCoroutineScope()\n\n                            QRShareDialogLayout(\n                                user,\n                                url,\n                                qrCodeBitmapGenerator,\n                                onCopyUrlButtonClicked = {\n                                    // クリップボードにuserのurlをコピーする\n                                    val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager\n                                    clipboardManager.setPrimaryClip(ClipData.newPlainText(\"url\", it))\n                                },\n                                onShareButtonClicked = { shareTarget ->\n                                    // urlとbitmapを共有する\n                                    scope.launch {\n                                        qrCodeBitmapGenerator.exportToFile(shareTarget, 512).onSuccess { uri ->\n                                            val sendIntent = Intent().apply {\n                                                action = Intent.ACTION_SEND\n                                                putExtra(Intent.EXTRA_STREAM, uri)\n                                                type = \"image/png\"\n                                            }\n                                            requireContext().startActivity(Intent.createChooser(sendIntent, null))\n                                        }\n                                    }\n                                },\n                                onSaveButtonClicked = { exportTargetUser ->\n                                    // bitmapを保存する\n                                    scope.launch {\n                                        qrCodeBitmapGenerator.exportToFile(exportTargetUser, 512).onSuccess {\n                                            Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()\n                                        }.onFailure {\n                                            Toast.makeText(context, R.string.failure, Toast.LENGTH_SHORT).show()\n                                        }\n                                    }\n                                },\n                            )\n                        }\n                    }\n                }\n            )\n        }.create()\n    }\n}\n\n@Composable\nfun QRShareDialogLayout(\n    user: User?,\n    url: String?,\n    qrCodeBitmapGenerator: QRCodeBitmapGenerator,\n    onCopyUrlButtonClicked: (String) -> Unit = {},\n    onShareButtonClicked: (User) -> Unit = {},\n    onSaveButtonClicked: (User) -> Unit = {},\n) {\n    Surface {\n        var qrBitmap by remember {\n            mutableStateOf<ImageBitmap?>(null)\n        }\n\n        Column(\n            Modifier.padding(32.dp),\n            horizontalAlignment = Alignment.CenterHorizontally,\n        ) {\n            BoxWithConstraints(\n                Modifier\n                    .fillMaxWidth()\n                    .aspectRatio(1f),\n            ) {\n                val height = this.maxHeight\n                val width = this.maxWidth\n\n                val density = LocalDensity.current\n                val size = remember(height, width) {\n                    if (height > width) width else height\n                }\n                val sizePx = with(density) {\n                    size.toPx()\n                }\n                LaunchedEffect(user?.displayUserName) {\n\n                    if (user != null) {\n                        qrBitmap = qrCodeBitmapGenerator.generateBitmap(user, sizePx.toInt()).getOrNull()\n                            ?.asImageBitmap()\n                    }\n\n                }\n                when (val bitmap = qrBitmap) {\n                    null -> Unit\n                    else -> Image(\n                        bitmap,\n                        contentDescription = null,\n                        Modifier.fillMaxSize()\n                    )\n                }\n            }\n            Spacer(modifier = Modifier.heightIn(16.dp))\n            Text(user?.displayUserName ?: \"\", fontWeight = FontWeight.Bold)\n            Spacer(modifier = Modifier.heightIn(16.dp))\n            Row(\n                Modifier\n                    .fillMaxWidth(),\n                horizontalArrangement = Arrangement.SpaceBetween,\n            ) {\n                Column(\n                    Modifier\n                        .clickable {\n                            url?.let {\n                                onCopyUrlButtonClicked(it)\n                            }\n                        },\n                    horizontalAlignment = Alignment.CenterHorizontally,\n                ) {\n                    Icon(Icons.Default.Link, contentDescription = null)\n                    Text(stringResource(id = R.string.copy))\n                }\n\n                Column(\n                    Modifier\n                        .clickable {\n                            user?.let { exportTargetUser ->\n                                onShareButtonClicked(exportTargetUser)\n                            }\n                        },\n                    horizontalAlignment = Alignment.CenterHorizontally,\n                ) {\n                    Icon(Icons.Default.Share, contentDescription = null)\n                    Text(stringResource(id = R.string.share))\n                }\n\n                Column(\n                    Modifier\n                        .clickable {\n                            user?.let(onSaveButtonClicked)\n                        },\n                    horizontalAlignment = Alignment.CenterHorizontally,\n                ) {\n                    Icon(Icons.Default.Save, contentDescription = null)\n                    Text(stringResource(id = R.string.save))\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/reaction/UserReactionBindingModel.kt",
    "content": "package net.pantasystem.milktea.user.reaction\n\nimport kotlinx.coroutines.flow.StateFlow\nimport net.pantasystem.milktea.model.note.reaction.Reaction\nimport net.pantasystem.milktea.model.setting.Config\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.reaction.UserReaction\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewData\n\nclass UserReactionBindingModel(\n    val reaction: UserReaction,\n    val note: PlaneNoteViewData,\n    val user: StateFlow<User>,\n    val config: StateFlow<Config>,\n) {\n    val emojis\n        get() = note.toShowNote.note.emojis\n\n    val isCustomEmoji\n        get() = Reaction(reaction.type).isCustomEmojiFormat()\n\n    val isNotCustomEmojiFormat\n        get() = !isCustomEmoji\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/reaction/UserReactionsFragment.kt",
    "content": "package net.pantasystem.milktea.user.reaction\n\nimport android.os.Bundle\nimport android.view.View\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.activityViewModels\nimport androidx.fragment.app.viewModels\nimport androidx.lifecycle.Lifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.lifecycle.repeatOnLifecycle\nimport androidx.recyclerview.widget.LinearLayoutManager\nimport androidx.recyclerview.widget.RecyclerView\nimport com.wada811.databinding.dataBinding\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common_navigation.ChannelDetailNavigation\nimport net.pantasystem.milktea.common_navigation.SearchNavigation\nimport net.pantasystem.milktea.common_navigation.UserDetailNavigation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.note.view.NoteCardActionHandler\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.databinding.FragmentUserReactionsBinding\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass UserReactionsFragment : Fragment(R.layout.fragment_user_reactions) {\n\n    companion object {\n        fun newInstance(userId: User.Id): Fragment {\n            return UserReactionsFragment().apply {\n                arguments = Bundle().apply {\n                    putLong(UserReactionsViewModel.ACCOUNT_ID, userId.accountId)\n                    putString(UserReactionsViewModel.USER_ID, userId.id)\n                }\n            }\n        }\n    }\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var userDetailNavigation: UserDetailNavigation\n\n    @Inject\n    lateinit var channelDetailNavigation: ChannelDetailNavigation\n\n    @Inject\n    lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var searchNavigation: SearchNavigation\n\n    private val binding: FragmentUserReactionsBinding by dataBinding()\n    private val viewModel by viewModels<UserReactionsViewModel>()\n    private val notesViewModel by activityViewModels<NotesViewModel>()\n\n    private lateinit var layoutManager: LinearLayoutManager\n\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n\n        val adapter = UserReactionsListAdapter(\n            configRepository,\n            lifecycleOwner = viewLifecycleOwner,\n            noteCardActionHandler = NoteCardActionListenerAdapter {\n                NoteCardActionHandler(\n                    requireActivity() as AppCompatActivity,\n                    notesViewModel,\n                    settingStore,\n                    userDetailNavigation,\n                    channelDetailNavigation,\n                    searchNavigation,\n                ).onAction(it)\n            }\n        )\n        binding.userReactionsListView.adapter = adapter\n        layoutManager = LinearLayoutManager(requireContext())\n        binding.userReactionsListView.layoutManager = layoutManager\n\n        viewLifecycleOwner.lifecycleScope.launch {\n            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.RESUMED) {\n                viewModel.state.collect {\n                    val list = (it.content as? StateContent.Exist)?.rawContent ?: emptyList()\n                    adapter.submitList(list)\n\n                    binding.swipeRefreshLayout.isRefreshing = it is PageableState.Loading\n                }\n            }\n        }\n\n        binding.userReactionsListView.addOnScrollListener(_scrollListener)\n\n        binding.swipeRefreshLayout.setOnRefreshListener {\n            viewModel.clearAndLoadPrevious()\n        }\n\n    }\n\n    private val _scrollListener = object : RecyclerView.OnScrollListener() {\n\n\n        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {\n            super.onScrollStateChanged(recyclerView, newState)\n\n            val endVisibleItemPosition = layoutManager.findLastVisibleItemPosition()\n            val itemCount = layoutManager.itemCount\n\n            if (endVisibleItemPosition == (itemCount - 1)) {\n                viewModel.loadPrevious()\n            }\n\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/reaction/UserReactionsListAdapter.kt",
    "content": "package net.pantasystem.milktea.user.reaction\n\nimport android.view.LayoutInflater\nimport android.view.ViewGroup\nimport androidx.databinding.DataBindingUtil\nimport androidx.lifecycle.LifecycleOwner\nimport androidx.lifecycle.flowWithLifecycle\nimport androidx.lifecycle.lifecycleScope\nimport androidx.recyclerview.widget.DiffUtil\nimport androidx.recyclerview.widget.ListAdapter\nimport androidx.recyclerview.widget.RecyclerView\nimport kotlinx.coroutines.Job\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.timeline.NoteFontSizeBinder\nimport net.pantasystem.milktea.note.timeline.ReactionCountItemsFlexboxLayoutBinder\nimport net.pantasystem.milktea.note.timeline.ViewRecycler\nimport net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.databinding.ItemUserReactionBinding\n\nclass UserReactionsListAdapter(\n    private val configRepository: LocalConfigRepository,\n    private val lifecycleOwner: LifecycleOwner,\n    private val noteCardActionHandler: NoteCardActionListenerAdapter,\n) : ListAdapter<UserReactionBindingModel, UserReactionViewHolder>(\n    object : DiffUtil.ItemCallback<UserReactionBindingModel>() {\n        override fun areContentsTheSame(\n            oldItem: UserReactionBindingModel,\n            newItem: UserReactionBindingModel,\n        ): Boolean {\n            return oldItem.reaction == newItem.reaction\n        }\n\n        override fun areItemsTheSame(\n            oldItem: UserReactionBindingModel,\n            newItem: UserReactionBindingModel,\n        ): Boolean {\n            return oldItem.reaction.id == newItem.reaction.id\n        }\n    }\n) {\n    val binder = ReactionCountItemsFlexboxLayoutBinder(ViewRecycler()) {\n        noteCardActionHandler.onReactionCountAction(it)\n    }\n    override fun onBindViewHolder(holder: UserReactionViewHolder, position: Int) {\n        holder.bind(getItem(position))\n    }\n\n    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UserReactionViewHolder {\n        val config = configRepository.get().getOrElse {\n            DefaultConfig.config\n        }\n        val binding = DataBindingUtil.inflate<ItemUserReactionBinding>(\n            LayoutInflater.from(parent.context),\n            R.layout.item_user_reaction,\n            parent,\n            false\n        )\n        NoteFontSizeBinder.from(binding.simpleNote).bind(\n            headerFontSize = config.noteHeaderFontSize,\n            contentFontSize = config.noteContentFontSize\n        )\n        return UserReactionViewHolder(lifecycleOwner, binding, noteCardActionHandler, binder)\n    }\n}\n\nclass UserReactionViewHolder(\n    val lifecycleOwner: LifecycleOwner,\n    val binding: ItemUserReactionBinding,\n    val noteCardActionListenerAdapter: NoteCardActionListenerAdapter,\n    val binder: ReactionCountItemsFlexboxLayoutBinder,\n) : RecyclerView.ViewHolder(binding.root) {\n\n    private var job: Job? = null\n    fun bind(item: UserReactionBindingModel) {\n        val listView = binding.simpleNote.reactionView\n//        listView.layoutManager = FlexboxLayoutManager(binding.root.context)\n\n//        listView.adapter = adapter\n        binding.noteCardActionListener = noteCardActionListenerAdapter\n        binding.bindingModel = item\n\n        job?.cancel()\n        job = item.note.reactionCountsViewData.onEach {\n            binder.bindReactionCounts(listView, item.note, it)\n        }.flowWithLifecycle(lifecycleOwner.lifecycle).launchIn(lifecycleOwner.lifecycleScope)\n\n        binding.lifecycleOwner = lifecycleOwner\n        binding.simpleNote.lifecycleOwner = lifecycleOwner\n        binding.executePendingBindings()\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/reaction/UserReactionsViewModel.kt",
    "content": "package net.pantasystem.milktea.user.reaction\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.stateIn\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.user.UserReactionPagingStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.CurrentAccountWatcher\nimport net.pantasystem.milktea.model.setting.DefaultConfig\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.note.viewmodel.PlaneNoteViewDataCache\nimport javax.inject.Inject\n\n@HiltViewModel\nclass UserReactionsViewModel @Inject constructor(\n    accountRepository: AccountRepository,\n    private val userRepository: UserRepository,\n    storeFactory: UserReactionPagingStore.Factory,\n    loggerFactory: Logger.Factory,\n    planeNoteViewDataCacheFactory: PlaneNoteViewDataCache.Factory,\n    private val savedStateHandle: SavedStateHandle,\n    configRepository: LocalConfigRepository,\n) : ViewModel() {\n    //    private val _userId = MutableStateFlow<User.Id?>(null)\n    companion object {\n        const val ACCOUNT_ID = \"accountId\"\n        const val USER_ID = \"userId\"\n    }\n    val logger = loggerFactory.create(\"UserReactionsViewModel\")\n\n    private val userId by lazy {\n        User.Id(\n            accountId = savedStateHandle[ACCOUNT_ID]!!,\n            id = savedStateHandle[USER_ID]!!\n        )\n    }\n\n    private val currentAccountWatcher = CurrentAccountWatcher(\n        accountRepository = accountRepository,\n        currentAccountId = null\n    )\n\n    private val cache = planeNoteViewDataCacheFactory.create(currentAccountWatcher::getAccount, viewModelScope)\n\n    private val config = configRepository.observe().stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000),  DefaultConfig.config)\n\n\n    private val store = storeFactory.create(userId)\n    val state = store.state.map { pageableState ->\n        pageableState.suspendConvert { list ->\n            list.map {\n                UserReactionBindingModel(\n                    reaction = it.reaction,\n                    user = userRepository.observe(it.user.id)\n                        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), it.user),\n                    note = cache.get(it.note),\n                    config = config,\n                )\n            }\n        }\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        PageableState.Loading.Init()\n    )\n\n    init {\n        loadPrevious()\n    }\n\n    fun loadPrevious() {\n        viewModelScope.launch {\n            store.loadPrevious().onFailure {\n                logger.error(\"loadPrevious error\", it)\n            }\n        }\n    }\n\n    fun clearAndLoadPrevious() {\n        viewModelScope.launch {\n            store.clear()\n            loadPrevious()\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/search/SearchAndSelectUserActivity.kt",
    "content": "package net.pantasystem.milktea.user.search\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.MenuItem\nimport androidx.activity.addCallback\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigationArgs\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport java.io.Serializable\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\nclass SearchAndSelectUserNavigationImpl @Inject constructor(\n    val activity: Activity\n) : SearchAndSelectUserNavigation {\n    override fun newIntent(args: SearchAndSelectUserNavigationArgs): Intent {\n        return SearchAndSelectUserActivity.newIntent(\n            activity,\n            args.selectableMaximumSize,\n            args.selectedUserIds,\n            args.accountId,\n        )\n    }\n}\n\n@AndroidEntryPoint\nclass SearchAndSelectUserActivity : AppCompatActivity() {\n\n    companion object {\n        private const val EXTRA_SELECTABLE_MAXIMUM_SIZE =\n            SearchAndSelectUserNavigation.EXTRA_SELECTABLE_MAXIMUM_SIZE\n        private const val EXTRA_SELECTED_USER_IDS =\n            SearchAndSelectUserNavigation.EXTRA_SELECTED_USER_IDS\n\n        const val EXTRA_SELECTED_USER_CHANGED_DIFF =\n            SearchAndSelectUserNavigation.EXTRA_SELECTED_USER_CHANGED_DIFF\n\n        fun newIntent(\n            context: Context,\n            selectableMaximumSize: Int = Int.MAX_VALUE,\n            selectedUserIds: List<User.Id> = emptyList(),\n            accountId: Long? = null,\n        ): Intent {\n            return Intent(context, SearchAndSelectUserActivity::class.java).apply {\n                putExtra(EXTRA_SELECTABLE_MAXIMUM_SIZE, selectableMaximumSize)\n                putExtra(EXTRA_SELECTED_USER_IDS, ArrayList<Serializable>(selectedUserIds))\n                putExtra(SearchUserViewModel.EXTRA_ACCOUNT_ID, accountId)\n            }\n        }\n    }\n\n    @Inject\n    lateinit var factory: SelectedUserViewModel.AssistedViewModelFactory\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val selectedUserViewModel: SelectedUserViewModel by viewModels {\n        val selectedUserIdList =\n            (intent.getSerializableExtra(EXTRA_SELECTED_USER_IDS) as? ArrayList<*>)?.mapNotNull {\n                it as? User.Id\n            } ?: emptyList()\n        SelectedUserViewModel.provideViewModel(factory, selectedUserIdList, emptyList())\n    }\n\n    private val searchUserViewModel: SearchUserViewModel by viewModels()\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                SearchAndSelectUserScreen(\n                    searchUserViewModel = searchUserViewModel,\n                    selectedUserViewModel = selectedUserViewModel,\n                    onNavigateUp = {\n                        setResultFinish()\n                    }\n                )\n            }\n\n        }\n\n        onBackPressedDispatcher.addCallback {\n            setResultFinish()\n        }\n    }\n\n    override fun onOptionsItemSelected(item: MenuItem): Boolean {\n        when (item.itemId) {\n            android.R.id.home -> setResultFinish()\n        }\n        return super.onOptionsItemSelected(item)\n    }\n\n    private fun setResultFinish() {\n        val selectedDiff = selectedUserViewModel.getSelectedUserIdsChangedDiff()\n\n        val intent = Intent()\n\n        Log.d(\"SearchAndSelectAC\", \"新たに追加:${selectedDiff.added}, 削除:${selectedDiff.removed}\")\n        intent.putExtra(EXTRA_SELECTED_USER_CHANGED_DIFF, selectedDiff)\n        setResult(RESULT_OK, intent)\n        finish()\n\n    }\n\n\n}\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/search/SearchAndSelectUserScreen.kt",
    "content": "package net.pantasystem.milktea.user.search\n\nimport androidx.compose.foundation.clickable\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.runtime.mutableStateOf\nimport androidx.compose.runtime.remember\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.runtime.setValue\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.user.R\nimport net.pantasystem.milktea.user.compose.SimpleUserListView\n\n@Composable\n@OptIn(ExperimentalMaterial3Api::class)\nfun SearchAndSelectUserScreen(\n    searchUserViewModel: SearchUserViewModel,\n    selectedUserViewModel: SelectedUserViewModel,\n    onNavigateUp: () -> Unit,\n) {\n\n    val uiState by searchUserViewModel.uiState.collectAsState()\n\n    val users by searchUserViewModel.users.collectAsState()\n    val selectedUserIds by selectedUserViewModel.selectedUserIds.collectAsState()\n    val selectedUsers by selectedUserViewModel.selectedUserList.collectAsState()\n\n    val scope = rememberCoroutineScope()\n    val sheetState = rememberModalBottomSheetState()\n    var showBottomSheet by remember { mutableStateOf(false) }\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeContent,\n        topBar = {\n            TopAppBar(\n                navigationIcon = {\n                    IconButton(\n                        onClick = {\n                            onNavigateUp.invoke()\n                        },\n                    ) {\n                        Icon(imageVector = Icons.Filled.ArrowBack, contentDescription = \"Back\")\n                    }\n                },\n                title = {\n                    Text(stringResource(R.string.select_user))\n                },\n            )\n        },\n        bottomBar = {\n            if (!showBottomSheet) {\n                Surface {\n                    Row(\n                        Modifier\n                            .fillMaxWidth()\n                            .padding(8.dp)\n                            .clickable {\n                                showBottomSheet = true\n                            },\n                        verticalAlignment = Alignment.CenterVertically,\n                    ) {\n                        Icon(\n                            painter = painterResource(id = R.drawable.ic_person_add_black_24dp),\n                            contentDescription = null,\n                        )\n                        Spacer(modifier = Modifier.width(4.dp))\n                        Text(\n                            text = \"${stringResource(R.string.select_user)}(${selectedUserIds.size})\",\n                            fontSize = 24.sp\n                        )\n                    }\n                }\n            }\n        }\n    ) { padding ->\n        Column(\n            modifier = Modifier\n                .fillMaxSize()\n                .padding(padding)\n        ) {\n            Row(\n                verticalAlignment = Alignment.CenterVertically,\n                modifier = Modifier.padding(16.dp)\n            ) {\n                Text(\"@\")\n                TextField(\n                    value = uiState.query.word,\n                    modifier = Modifier.weight(1f),\n                    placeholder = {\n                        Text(stringResource(id = R.string.user_name))\n                    },\n                    onValueChange = { text ->\n                        searchUserViewModel.setUserName(text)\n                    },\n                )\n                Text(\"@\")\n                TextField(\n                    value = uiState.query.sourceHost ?: \"\",\n                    modifier = Modifier.weight(1f),\n                    placeholder = {\n                        Text(stringResource(id = R.string.host))\n                    },\n                    onValueChange = { text ->\n                        searchUserViewModel.setHost(text)\n                    }\n                )\n            }\n            SimpleUserListView(\n                users = users,\n                selectedUserIds = selectedUserIds,\n                onSelected = {\n                    selectedUserViewModel.toggleSelectUser(it)\n                },\n                modifier = Modifier.weight(1f),\n                accountHost = uiState.account?.getHost(),\n            )\n        }\n    }\n\n    if (showBottomSheet) {\n        ModalBottomSheet(\n            onDismissRequest = { showBottomSheet = false },\n            sheetState = sheetState,\n        ) {\n            SimpleUserListView(\n                users = selectedUsers.toList(),\n                onSelected = { selectedUserViewModel.toggleSelectUser(it) },\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .fillMaxHeight(),\n                accountHost = uiState.account?.getHost()\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/search/SearchUserFragment.kt",
    "content": "package net.pantasystem.milktea.user.search\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport androidx.compose.ui.platform.ComposeView\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.viewModels\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.user.UserCardListActionHandler\nimport net.pantasystem.milktea.user.compose.UserDetailCardList\nimport net.pantasystem.milktea.user.compose.UserDetailCardListAction\nimport net.pantasystem.milktea.user.viewmodel.ToggleFollowViewModel\nimport javax.inject.Inject\n\n@AndroidEntryPoint\nclass SearchUserFragment : Fragment() {\n\n    companion object {\n        private const val EXTRA_USER_NAME = \"jp.panta.misskeyandroidclient.ui.users.SearchUserFragment\"\n\n        @JvmStatic\n        fun newInstance(userName: String): SearchUserFragment {\n            return SearchUserFragment().apply {\n                arguments = Bundle().apply {\n                    putString(EXTRA_USER_NAME, userName)\n                }\n            }\n        }\n    }\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    val viewModel: SearchUserViewModel by viewModels()\n\n    private val toggleFollowViewModel: ToggleFollowViewModel by viewModels()\n\n    val username: String? by lazy {\n        arguments?.getString(EXTRA_USER_NAME)\n    }\n\n    override fun onCreateView(\n        inflater: LayoutInflater,\n        container: ViewGroup?,\n        savedInstanceState: Bundle?\n    ): View? {\n        return ComposeView(requireContext()).apply {\n            setContent {\n                MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                    val users by viewModel.users.collectAsState()\n                    val state by viewModel.searchState.collectAsState()\n                    val account by viewModel.currentAccount.collectAsState()\n\n                    UserDetailCardList(\n                        pageableState = state,\n                        users = users,\n                        isUserNameMain = false,\n                        accountHost = account?.getHost(),\n                        myId = account?.remoteId,\n                        onAction = ::onAction\n                    )\n                }\n            }\n        }.rootView\n    }\n\n    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {\n        super.onViewCreated(view, savedInstanceState)\n        if (username != null) {\n            viewModel.setUserName(username!!)\n        }\n\n    }\n\n\n\n    fun onAction(it: UserDetailCardListAction) {\n        UserCardListActionHandler(requireActivity(), toggleFollowViewModel) {\n            viewModel.search()\n        }.onAction(it)\n\n    }\n\n\n\n\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/search/SearchUserViewModel.kt",
    "content": "package net.pantasystem.milktea.user.search\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.ResultState\nimport net.pantasystem.milktea.common.StateContent\nimport net.pantasystem.milktea.common.asLoadingStateFlow\nimport net.pantasystem.milktea.common.initialState\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport net.pantasystem.milktea.model.user.UserRepository\nimport java.util.regex.Pattern\nimport javax.inject.Inject\n\n\n@HiltViewModel\nclass SearchUserViewModel @Inject constructor(\n    accountStore: AccountStore,\n    loggerFactory: Logger.Factory,\n    private val userRepository: UserRepository,\n    userDataSource: UserDataSource,\n    savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_ACCOUNT_ID = \"SearchUserViewModel.EXTRA_ACCOUNT_ID\"\n    }\n\n    private val logger = loggerFactory.create(\"SearchUserViewModel\")\n\n\n    private val searchUserRequests = MutableStateFlow<SearchUser>(SearchUser(\"\", null))\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val account = savedStateHandle.getStateFlow<Long?>(EXTRA_ACCOUNT_ID, null).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val syncByUserNameLoadingState = account.filterNotNull()\n        .flatMapLatest { account ->\n            searchUserRequests.flatMapLatest { query ->\n                suspend {\n                    userRepository.syncByUserName(\n                        account.accountId,\n                        query.getNameOrUserName(),\n                        host = query.getHost()\n                    ).getOrThrow()\n                }.asLoadingStateFlow().map {\n                    SyncRemoteResult.from(account, query, it)\n                }\n            }\n        }\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val filteredByNameLoadingState =\n        syncByUserNameLoadingState.distinctUntilChanged().flatMapLatest {\n            suspend {\n                userRepository.searchByNameOrUserName(it.account.accountId, it.word, host = it.host)\n            }.asLoadingStateFlow()\n        }.map { state ->\n            state.convert { list ->\n                list.map { it.id }\n            }\n        }.flowOn(Dispatchers.IO).stateIn(\n            viewModelScope,\n            SharingStarted.WhileSubscribed(5_000),\n            ResultState.initialState(),\n        )\n\n    val searchState = filteredByNameLoadingState.stateIn(\n        viewModelScope, SharingStarted.WhileSubscribed(5_000), ResultState.Fixed(\n            StateContent.NotExist()\n        )\n    )\n\n\n    val uiState = combine(searchState, searchUserRequests, account) { state, request, a ->\n        SearchUserUiState(request, state, a)\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.Lazily,\n        SearchUserUiState(\n            SearchUser(\"\", null),\n            ResultState.initialState(),\n            account = null\n        )\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val users = searchState.map {\n        (it.content as? StateContent.Exist)?.rawContent\n            ?: emptyList()\n    }.flatMapLatest { ids ->\n        userDataSource.observeIn(account.value?.accountId!!, ids.map { it.id }).map { users ->\n            users.mapNotNull { user ->\n                user as? User.Detail?\n            }\n        }\n    }.catch {\n        logger.error(\"observe error\", it)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())\n\n    val currentAccount = account.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        null\n    )\n\n    fun setUserName(text: String) {\n        searchUserRequests.update {\n            it.copy(word = text)\n        }\n    }\n\n    fun setHost(text: String?) {\n        searchUserRequests.update {\n            it.copy(sourceHost = text)\n        }\n    }\n\n    fun search() {\n        searchUserRequests.update {\n            it\n        }\n    }\n\n\n}\n\n\ndata class SearchUser(\n    val word: String,\n    val sourceHost: String?\n) {\n    val isUserName: Boolean\n        get() = Pattern.compile(\"\"\"^[a-zA-Z_\\-0-9]+$\"\"\")\n            .matcher(word)\n            .find()\n\n    fun getNameOrUserName(): String {\n        return word.split(\"@\").filterNot {\n            it.isBlank()\n        }.firstOrNull() ?: word\n    }\n\n    fun getHost(): String? {\n        return word.split(\"@\").filterNot {\n            it.isBlank()\n        }.getOrElse(1) {\n            sourceHost\n        }\n    }\n}\n\ndata class SearchUserUiState(\n    val query: SearchUser,\n    val result: ResultState<List<User.Id>>,\n    val account: Account?,\n)\n\ndata class SyncRemoteResult(\n    val word: String = \"\",\n    val host: String? = null,\n    val isSuccess: Boolean = false,\n    val isInitial: Boolean = true,\n    val account: Account,\n) {\n    companion object {\n        fun from(account: Account, query: SearchUser, state: ResultState<Unit>): SyncRemoteResult {\n            return when (state) {\n                is ResultState.Error -> SyncRemoteResult(\n                    query.getNameOrUserName(),\n                    query.getHost(),\n                    isSuccess = false,\n                    isInitial = false,\n                    account = account\n                )\n                is ResultState.Fixed -> SyncRemoteResult(\n                    query.getNameOrUserName(),\n                    query.getHost(),\n                    isSuccess = true,\n                    isInitial = false,\n                    account = account\n                )\n                is ResultState.Loading -> SyncRemoteResult(\n                    query.getNameOrUserName(),\n                    query.getHost(),\n                    isSuccess = false,\n                    isInitial = false,\n                    account = account\n                )\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/search/SelectedUserViewModel.kt",
    "content": "package net.pantasystem.milktea.user.search\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.ViewModelProvider\nimport androidx.lifecycle.viewModelScope\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedFactory\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common_navigation.ChangedDiffResult\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\n\ndata class SelectedUserUiState(\n    val selectedUserIds: Set<User.Id>\n) {\n    fun toggle(userId: User.Id): SelectedUserUiState {\n\n        return copy(\n            selectedUserIds = selectedUserIds.toMutableSet().also {\n                if (it.contains(userId)) {\n                    it.remove(userId)\n                } else {\n                    it.add(userId)\n                }\n            }\n        )\n    }\n}\n\n@OptIn(ExperimentalCoroutinesApi::class)\nclass SelectedUserViewModel @AssistedInject constructor(\n    val userRepository: UserRepository,\n    val loggerFactory: Logger.Factory,\n    val accountStore: AccountStore,\n    @Assisted val exSelectedUserIds: List<User.Id>,\n    @Assisted val exSelectedUsers: List<User>,\n) : ViewModel() {\n\n\n    @AssistedFactory\n    interface AssistedViewModelFactory {\n        fun create(\n            exSelectedUserIds: List<User.Id>,\n            exSelectedUsers: List<User>\n        ): SelectedUserViewModel\n    }\n\n\n\n    companion object;\n\n    private val _state = MutableStateFlow(\n        SelectedUserUiState(\n            exSelectedUserIds.toSet()\n        )\n    )\n\n    val selectedUserIds = _state.map {\n        it.selectedUserIds\n    }.stateIn(viewModelScope, SharingStarted.Lazily, emptySet())\n\n    val selectedUserList = selectedUserIds.flatMapLatest { ids ->\n        val accountId = ids.map { it.accountId }.distinct().firstOrNull()\n            ?: accountStore.currentAccountId!!\n        userRepository.observeIn(accountId, ids.toList().map { it.id })\n    }.catch {\n        loggerFactory.create(\"SelectedUserVM\").error(\"failed observe selected user list\", it)\n    }.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())\n\n\n    fun toggleSelectUser(user: User?) {\n        user ?: return\n\n        _state.update { state ->\n            state.toggle(user.id)\n        }\n\n    }\n\n\n    fun getSelectedUserIdsChangedDiff(): ChangedDiffResult {\n        val selectedBeforeIds = exSelectedUserIds.toSet()\n        val selectedBeforeUsers = exSelectedUsers.map {\n            it.id\n        }.toSet()\n        val exSelected = HashSet<User.Id>().apply {\n            addAll(selectedBeforeIds)\n            addAll(selectedBeforeUsers)\n        }\n\n        val selected = _state.value.selectedUserIds\n\n        val selectedUsers = selectedUserList.value\n\n\n        val added = selected.filter { s ->\n            !exSelected.contains(s)\n        }\n\n        val removed = exSelected.filter { ex ->\n            !selected.contains(ex)\n        }\n        return ChangedDiffResult(\n            selected.toList().toList(),\n            added,\n            removed,\n            selectedUsers.map {\n                it.displayUserName\n            })\n    }\n}\n\n@Suppress(\"UNCHECKED_CAST\")\nfun SelectedUserViewModel.Companion.provideViewModel(\n    factory: SelectedUserViewModel.AssistedViewModelFactory,\n    selectedUserIds: List<User.Id>,\n    selectedUsers: List<User>\n) = object : ViewModelProvider.Factory {\n    override fun <T : ViewModel> create(modelClass: Class<T>): T {\n        return factory.create(selectedUserIds, selectedUsers) as T\n    }\n}"
  },
  {
    "path": "modules/features/user/src/main/java/net/pantasystem/milktea/user/viewmodel/ToggleFollowViewModel.kt",
    "content": "package net.pantasystem.milktea.user.viewmodel\n\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.model.user.ToggleFollowUseCase\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\n\ndata class ToggleFollowErrorUiState(\n    val userId: User.Id,\n    val throwable: Throwable,\n)\n@HiltViewModel\nclass ToggleFollowViewModel @Inject constructor(\n    val toggleFollowUseCase: ToggleFollowUseCase,\n) : ViewModel(){\n\n    private val _errors = MutableStateFlow<ToggleFollowErrorUiState?>(null)\n    val errors: StateFlow<ToggleFollowErrorUiState?> = _errors\n\n    fun toggleFollow(userId: User.Id){\n        viewModelScope.launch {\n\n            toggleFollowUseCase(userId).onFailure {\n                _errors.value = ToggleFollowErrorUiState(userId, it)\n            }\n\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/user/src/main/res/drawable/ic_baseline_cake_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M12,6c1.11,0 2,-0.9 2,-2 0,-0.38 -0.1,-0.73 -0.29,-1.03L12,0l-1.71,2.97c-0.19,0.3 -0.29,0.65 -0.29,1.03 0,1.1 0.9,2 2,2zM16.6,15.99l-1.07,-1.07 -1.08,1.07c-1.3,1.3 -3.58,1.31 -4.89,0l-1.07,-1.07 -1.09,1.07C6.75,16.64 5.88,17 4.96,17c-0.73,0 -1.4,-0.23 -1.96,-0.61L3,21c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-4.61c-0.56,0.38 -1.23,0.61 -1.96,0.61 -0.92,0 -1.79,-0.36 -2.44,-1.01zM18,9h-5L13,7h-2v2L6,9c-1.66,0 -3,1.34 -3,3v1.54c0,1.08 0.88,1.96 1.96,1.96 0.52,0 1.02,-0.2 1.38,-0.57l2.14,-2.13 2.13,2.13c0.74,0.74 2.03,0.74 2.77,0l2.14,-2.13 2.13,2.13c0.37,0.37 0.86,0.57 1.38,0.57 1.08,0 1.96,-0.88 1.96,-1.96L20.99,12C21,10.34 19.66,9 18,9z\"/>\n</vector>\n"
  },
  {
    "path": "modules/features/user/src/main/res/drawable/ic_baseline_calendar_month_24.xml",
    "content": "<vector android:height=\"24dp\" android:tint=\"#000000\"\n    android:viewportHeight=\"24\" android:viewportWidth=\"24\"\n    android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"@android:color/white\" android:pathData=\"M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4 3.01,4.9 3.01,6L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V6C21,4.9 20.1,4 19,4zM19,20H5V10h14V20zM9,14H7v-2h2V14zM13,14h-2v-2h2V14zM17,14h-2v-2h2V14zM9,18H7v-2h2V18zM13,18h-2v-2h2V18zM17,18h-2v-2h2V18z\"/>\n</vector>\n"
  },
  {
    "path": "modules/features/user/src/main/res/drawable/shape_follower_state_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <corners\n                    android:topRightRadius=\"4dp\"\n                    android:bottomRightRadius=\"4dp\"\n                    android:topLeftRadius=\"4dp\"\n                    android:bottomLeftRadius=\"4dp\"\n\n                    />\n            <solid\n                    android:color=\"#BF000000\"\n                    tools:ignore=\"PrivateResource\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "modules/features/user/src/main/res/layout/activity_user_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\">\n    <data>\n        <import type=\"android.view.View\"/>\n        <variable\n                name=\"userViewModel\"\n                type=\"net.pantasystem.milktea.user.profile.viewmodel.UserDetailViewModel\" />\n        <import type=\"net.pantasystem.milktea.common_android.ui.SafeUnbox\" />\n    </data>\n\n    <androidx.coordinatorlayout.widget.CoordinatorLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            tools:context=\"net.pantasystem.milktea.user.profile.UserDetailActivity\"\n            >\n\n        <com.google.android.material.appbar.AppBarLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n            <com.google.android.material.appbar.CollapsingToolbarLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_scrollFlags=\"scroll|exitUntilCollapsed\"\n                    >\n\n                <androidx.constraintlayout.widget.ConstraintLayout\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginTop=\"?attr/actionBarSize\"\n                        app:user=\"@{userViewModel.userState}\"\n                        app:account=\"@{userViewModel.currentAccount}\"\n                        app:mainNameView=\"@{mainName}\"\n                        app:subNameView=\"@{subName}\"\n                        >\n                    <nl.dionsegijn.konfetti.xml.KonfettiView\n                        android:id=\"@+id/konfettiView\"\n                        android:layout_width=\"0px\"\n                        android:layout_height=\"0px\"\n                        app:layout_constraintTop_toTopOf=\"parent\"\n                        app:layout_constraintBottom_toBottomOf=\"parent\"\n                        app:layout_constraintLeft_toLeftOf=\"parent\"\n                        app:layout_constraintRight_toRightOf=\"parent\"\n                        />\n                    <LinearLayout\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:orientation=\"horizontal\"\n                            android:id=\"@+id/remoteUserState\"\n                            android:paddingStart=\"16dp\"\n                            android:paddingEnd=\"16dp\"\n                            android:paddingTop=\"4dp\"\n                            android:paddingBottom=\"4dp\"\n                            app:layout_constraintTop_toTopOf=\"parent\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintEnd_toEndOf=\"parent\">\n\n                        <com.google.android.material.button.MaterialButton\n                                android:id=\"@+id/showRemoteUser\"\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"wrap_content\"\n                                android:text=\"@string/view_in_browser\"\n                                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                                android:layout_weight=\"1\"\n                                />\n                        <com.google.android.material.button.MaterialButton\n                                android:id=\"@+id/showRemoteUserInRemotePage\"\n                                android:layout_width=\"match_parent\"\n                                android:layout_height=\"wrap_content\"\n                                android:text=\"@string/view_remotely\"\n                                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                                android:layout_weight=\"1\"\n                                android:visibility=\"@{userViewModel.userState.remoteUser ? View.VISIBLE : View.GONE}\"\n                                \n                                />\n                    </LinearLayout>\n                    <ImageView\n                            android:id=\"@+id/headerView\"\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"140dp\"\n                            app:headerImageUrl=\"@{userViewModel.userState.info.bannerUrl}\"\n                            tools:ignore=\"ContentDescription\"\n                            app:layout_constraintTop_toBottomOf=\"@id/remoteUserState\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n\n                            />\n\n                    <TextView\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:text=\"@string/follows_you\"\n                            app:layout_constraintTop_toTopOf=\"@id/headerView\"\n                            app:layout_constraintStart_toStartOf=\"@id/headerView\"\n                            android:layout_marginStart=\"8dp\"\n                            android:layout_marginTop=\"8dp\"\n                            android:visibility=\"@{userViewModel.userState.related.follower ? View.VISIBLE : View.GONE}\"\n                            android:background=\"@drawable/shape_follower_state_background\"\n                            android:padding=\"4dp\"\n                            android:textColor=\"@android:color/white\"\n                        />\n\n                    <net.pantasystem.milktea.common.ui.AvatarIconView\n                            android:id=\"@+id/avatarIcon\"\n                            android:layout_width=\"100dp\"\n                            android:layout_height=\"100dp\"\n                            android:layout_marginTop=\"-50dp\"\n                            android:layout_marginStart=\"16dp\"\n                            app:imageUrl=\"@{userViewModel.userState.avatarUrl}\"\n                            app:blurhash=\"@{userViewModel.userState.avatarBlurhash}\"\n                            app:iconShape=\"@{userViewModel.config.avatarIconShapeType.value}\"\n                            tools:srcCompat=\"@drawable/ic_follow\"\n                            android:layout_marginBottom=\"8dp\"\n                            tools:ignore=\"ContentDescription\"\n                            android:transitionName=\"user\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintTop_toBottomOf=\"@id/headerView\"\n                            android:scaleType=\"centerCrop\"\n                            />\n                    <LinearLayout\n                            android:layout_width=\"match_parent\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_toEndOf=\"@id/avatarIcon\"\n                            android:gravity=\"end\"\n                            android:layout_alignBottom=\"@id/avatarIcon\"\n                            android:layout_marginEnd=\"16dp\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            app:layout_constraintTop_toTopOf=\"@id/avatarIcon\"\n                            app:layout_constraintBottom_toBottomOf=\"@id/avatarIcon\"\n                            >\n                        <androidx.compose.ui.platform.ComposeView\n                            android:id=\"@+id/followButton\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_gravity=\"bottom\"\n                            />\n                    </LinearLayout>\n\n                    <TextView\n                            android:id=\"@+id/mainName\"\n                            android:layout_width=\"0dp\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_alignStart=\"@id/avatarIcon\"\n                            android:textSize=\"24sp\"\n                            android:textStyle=\"bold\"\n                            tools:text=\"Panta\"\n                            app:layout_constraintTop_toBottomOf=\"@id/avatarIcon\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            android:layout_marginStart=\"16dp\"\n\n                            app:layout_constraintEnd_toStartOf=\"@+id/deleteNicknameButton\" />\n\n                    <TextView\n                            android:id=\"@+id/subName\"\n                            android:layout_width=\"0dp\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_alignStart=\"@id/avatarIcon\"\n                            tools:text=\"userName\"\n                            android:textSize=\"20sp\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintTop_toBottomOf=\"@id/mainName\"\n                            android:layout_marginStart=\"16dp\"\n\n                            app:layout_constraintEnd_toStartOf=\"@+id/deleteNicknameButton\" />\n                    <ImageButton\n                            android:id=\"@+id/deleteNicknameButton\"\n                            android:layout_width=\"40dp\"\n                            android:layout_height=\"40dp\"\n                            app:layout_constraintTop_toTopOf=\"@id/mainName\"\n                            app:layout_constraintBottom_toBottomOf=\"@id/subName\"\n                            app:layout_constraintEnd_toStartOf=\"@id/editNicknameButton\"\n                            android:layout_marginEnd=\"8dp\"\n                            android:src=\"@drawable/ic_delete_black_24dp\"\n                            android:contentDescription=\"@string/delete_nickname\"\n                            android:visibility=\"@{ userViewModel.userState.nickname == null ? View.GONE : View.VISIBLE }\"\n                            android:onClick=\"@{() -> userViewModel.deleteNickname() }\"/>\n                    <ImageButton\n                            android:id=\"@+id/editNicknameButton\"\n                            android:layout_width=\"40dp\"\n                            android:layout_height=\"40dp\"\n                            app:layout_constraintTop_toTopOf=\"@id/mainName\"\n                            app:layout_constraintBottom_toBottomOf=\"@id/subName\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            android:layout_marginEnd=\"16dp\"\n                            android:src=\"@drawable/ic_edit_black_24dp\"\n                            android:contentDescription=\"@string/change_nickname\"\n                            />\n\n                    <androidx.compose.ui.platform.ComposeView\n                        android:id=\"@+id/badgeRoles\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginEnd=\"16dp\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toBottomOf=\"@+id/subName\" />\n\n                    <TextView\n                        android:id=\"@+id/profileText\"\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_alignStart=\"@id/avatarIcon\"\n                        android:layout_marginStart=\"16dp\"\n                        android:layout_marginTop=\"8dp\"\n                        android:layout_marginEnd=\"16dp\"\n                        android:visibility=\"@{userViewModel.userState.info.description == null ? View.GONE : View.VISIBLE}\"\n                        app:account=\"@{userViewModel.currentAccount}\"\n                        app:emojis=\"@{userViewModel.userState.emojis}\"\n                        app:host=\"@{userViewModel.userState.host}\"\n                        app:layout_constraintEnd_toEndOf=\"parent\"\n                        app:layout_constraintStart_toStartOf=\"parent\"\n                        app:layout_constraintTop_toBottomOf=\"@id/badgeRoles\"\n                        app:sourceText=\"@{userViewModel.userState.info.description}\"\n                        tools:text=\"awoijfoiwaehfoaiwehfoiawjefoiawjefiojawioefjioawhfoiawehfoiawef\"\n\n\n                        />\n\n                    <TextView\n                            android:layout_width=\"0dp\"\n                            android:layout_height=\"wrap_content\"\n                            tools:text=\"Birthday: 2001/06/23\"\n                            app:layout_constraintTop_toBottomOf=\"@id/profileText\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            android:layout_marginTop=\"4dp\"\n                            android:layout_marginHorizontal=\"16dp\"\n                            android:id=\"@+id/birthdayText\"\n                            android:visibility=\"@{ userViewModel.birthday == null ? View.GONE : View.VISIBLE }\"\n                            android:gravity=\"center_vertical\"\n                            app:drawableLeftCompat=\"@drawable/ic_baseline_cake_24\"\n                            stringSource=\"@{userViewModel.birthday}\"\n\n                            app:drawableTint=\"?attr/normalIconTint\" />\n                    <TextView\n                            android:id=\"@+id/userCreatedAtText\"\n                            android:layout_width=\"0dp\"\n                            android:layout_height=\"wrap_content\"\n                            tools:text=\"Registration date: 2020/02/06\"\n                            app:layout_constraintTop_toBottomOf=\"@id/birthdayText\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            android:layout_marginTop=\"4dp\"\n                            android:layout_marginHorizontal=\"16dp\"\n\n                            app:drawableLeftCompat=\"@drawable/ic_baseline_calendar_month_24\"\n                            android:visibility=\"@{ userViewModel.userState.info.createdAt == null ? View.GONE : View.VISIBLE }\"\n                            stringSource=\"@{userViewModel.registrationDate}\"\n                            app:drawableTint=\"?attr/normalIconTint\" />\n\n                    <androidx.recyclerview.widget.RecyclerView\n                            android:id=\"@+id/userFields\"\n                            android:layout_width=\"0dp\"\n                            android:layout_height=\"wrap_content\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            app:layout_constraintTop_toBottomOf=\"@id/userCreatedAtText\"\n                            android:layout_marginHorizontal=\"16dp\"\n                            tools:listitem=\"@layout/item_user_profile_field\"\n                            tools:itemCount=\"4\"\n                            android:visibility=\"@{userViewModel.userState.info.fields.empty ? View.GONE : View.VISIBLE }\"\n                            app:layoutManager=\"androidx.recyclerview.widget.LinearLayoutManager\"\n                        />\n                    <LinearLayout\n                            android:layout_width=\"0dp\"\n                            android:layout_height=\"wrap_content\"\n                            android:layout_marginTop=\"8dp\"\n                            android:layout_alignStart=\"@id/avatarIcon\"\n                            android:layout_marginEnd=\"16dp\"\n                            app:layout_constraintTop_toBottomOf=\"@id/userFields\"\n                            android:layout_marginStart=\"16dp\"\n                            app:layout_constraintStart_toStartOf=\"parent\"\n                            app:layout_constraintEnd_toEndOf=\"parent\"\n                            android:id=\"@+id/countersLayout\"\n\n                            >\n                        <TextView\n                                android:id=\"@+id/notesCounter\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                tools:text=\"500\"\n                                android:layout_marginEnd=\"4dp\"\n                                android:text=\"@{Integer.toString(userViewModel.userState.info.notesCount)}\"\n                                />\n                        <TextView\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:text=\"@string/post\"\n                                android:layout_marginEnd=\"8dp\" />\n                        <TextView\n                                android:id=\"@+id/followingCounter\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:layout_marginEnd=\"4dp\"\n                                tools:text=\"20\"\n                                android:text=\"@{Integer.toString(userViewModel.userState.info.followingCount)}\"\n                                android:visibility=\"@{userViewModel.canVisibleFollowFollower ? View.VISIBLE : View.GONE}\"\n                                />\n                        <TextView\n                                android:id=\"@+id/followsText\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:text=\"@string/follow\"\n                                android:layout_marginEnd=\"8dp\"\n                                android:visibility=\"@{userViewModel.canVisibleFollowFollower ? View.VISIBLE : View.GONE}\"\n                                />\n                        <TextView\n                                android:id=\"@+id/followersCounter\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                tools:text=\"40\"\n                                android:text=\"@{Integer.toString(userViewModel.userState.info.followersCount)}\"\n                                android:layout_marginEnd=\"4dp\"\n                                android:visibility=\"@{userViewModel.canVisibleFollowFollower ? View.VISIBLE : View.GONE}\"\n                                />\n                        <TextView\n                                android:id=\"@+id/followersText\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\"\n                                android:text=\"@string/follower\"\n                                android:visibility=\"@{userViewModel.canVisibleFollowFollower ? View.VISIBLE : View.GONE}\"\n                            />\n                    </LinearLayout>\n\n\n                </androidx.constraintlayout.widget.ConstraintLayout>\n                <androidx.appcompat.widget.Toolbar\n                        android:id=\"@+id/userDetailToolbar\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:minHeight=\"?attr/actionBarSize\"\n                        app:layout_collapseMode=\"pin\"\n                        />\n\n\n\n            </com.google.android.material.appbar.CollapsingToolbarLayout>\n\n\n            <com.google.android.material.tabs.TabLayout\n                    android:id=\"@+id/userTimelineTab\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"/>\n\n\n\n\n        </com.google.android.material.appbar.AppBarLayout>\n\n\n        <FrameLayout\n                android:id=\"@+id/fragment_base\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n\n                >\n\n            <androidx.viewpager2.widget.ViewPager2\n                    android:id=\"@+id/userTimelinePager\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\" />\n        </FrameLayout>\n        <com.google.android.material.floatingactionbutton.FloatingActionButton\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"end|bottom\"\n                android:layout_marginEnd=\"16dp\"\n                android:layout_marginBottom=\"16dp\"\n                android:id=\"@+id/create_mention\"\n                app:srcCompat=\"@drawable/ic_mention\"\n                android:contentDescription=\"@string/create_mention\" />\n\n    </androidx.coordinatorlayout.widget.CoordinatorLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/user/src/main/res/layout/dialog_edit_nickname.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n    <data>\n\n    </data>\n\n    <RelativeLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\">\n        <TextView\n                android:id=\"@+id/titleView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/change_nickname\"\n                android:textSize=\"24sp\"\n                android:textColor=\"?android:attr/textColorPrimary\"\n                android:layout_marginBottom=\"8dp\"\n                />\n        <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/inputReportDetailLayout\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:layout_below=\"@id/titleView\"\n                style=\"?textInputOutlinedStyle\"\n                >\n            <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/input\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/nickname\"\n                    android:singleLine=\"true\"\n                    android:inputType=\"textMultiLine\"\n                    />\n        </com.google.android.material.textfield.TextInputLayout>\n        <Button\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/inputReportDetailLayout\"\n                android:id=\"@+id/cancelButton\"\n                android:layout_toStartOf=\"@id/sendButton\"\n                android:layout_marginEnd=\"8dp\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:text=\"@android:string/cancel\"\n                />\n        <Button\n                android:id=\"@+id/sendButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/inputReportDetailLayout\"\n                android:layout_alignParentEnd=\"true\"\n                style=\"@style/Widget.MaterialComponents.Button.TextButton\"\n                android:text=\"@string/send\"\n                />\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "modules/features/user/src/main/res/layout/fragment_user_reactions.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout\n            android:id=\"@+id/swipeRefreshLayout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n        <androidx.recyclerview.widget.RecyclerView\n                android:id=\"@+id/userReactionsListView\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>\n\n</layout>\n"
  },
  {
    "path": "modules/features/user/src/main/res/layout/item_user_profile_field.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data>\n\n        <variable\n                name=\"field\"\n                type=\"net.pantasystem.milktea.model.user.User.Field\" />\n    </data>\n\n    <LinearLayout\n            android:orientation=\"horizontal\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center_vertical\"\n            android:paddingTop=\"4dp\">\n\n        <TextView\n                android:layout_height=\"wrap_content\"\n                android:layout_width=\"match_parent\"\n                tools:text=\"name\"\n                android:layout_weight=\"3\"\n                android:paddingEnd=\"4dp\"\n                android:text=\"@{field.name}\" />\n\n        <TextView\n                android:layout_height=\"wrap_content\"\n                android:layout_width=\"match_parent\"\n                tools:text=\"namenamenamename\"\n                android:layout_weight=\"1\"\n                android:text=\"@{field.value}\"\n                android:autoLink=\"all\"\n                android:layout_marginEnd=\"4dp\" />\n\n        <ImageButton\n                android:id=\"@+id/copyValueButton\"\n                android:layout_width=\"28dp\"\n                android:layout_height=\"28dp\"\n\n                app:srcCompat=\"@drawable/ic_content_copy_black_24dp\"\n                tools:ignore=\"ContentDescription\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                app:tint=\"?attr/normalIconTint\" />\n    </LinearLayout>\n</layout>"
  },
  {
    "path": "modules/features/user/src/main/res/layout/item_user_reaction.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:tools=\"http://schemas.android.com/tools\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <data>\n        <variable\n                name=\"bindingModel\"\n                type=\"net.pantasystem.milktea.user.reaction.UserReactionBindingModel\" />\n        <variable\n                name=\"noteCardActionListener\"\n                type=\"net.pantasystem.milktea.note.view.NoteCardActionListenerAdapter\" />\n        <import type=\"android.view.View\" />\n    </data>\n    <androidx.cardview.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"0.1dp\"\n            setCardViewSurfaceColor=\"@{null}\" >\n        <androidx.constraintlayout.widget.ConstraintLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                >\n            <LinearLayout\n                    android:id=\"@+id/reactionState\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_constraintTop_toTopOf=\"parent\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n\n                    tools:ignore=\"UseCompoundDrawables\"\n                    android:paddingStart=\"8dp\"\n                    android:paddingEnd=\"8dp\"\n                    android:paddingTop=\"8dp\"\n                    android:paddingBottom=\"4dp\"\n                    android:gravity=\"center_vertical\"\n                    >\n                <ImageView\n                        android:id=\"@+id/reactionImageView\"\n                        android:layout_width=\"32dp\"\n                        android:layout_height=\"32dp\"\n\n                        emojis=\"@{bindingModel.emojis}\"\n                        reaction=\"@{bindingModel.reaction.type}\"\n                        tools:ignore=\"ContentDescription\"\n                        android:visibility=\"@{bindingModel.customEmoji ? View.VISIBLE : View.GONE }\"/>\n                <TextView\n                        android:textSize=\"24sp\"\n                        android:id=\"@+id/reactionTextView\"\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n\n                        android:visibility=\"@{bindingModel.notCustomEmojiFormat ? View.VISIBLE : View.GONE }\"\n                        android:text=\"@{bindingModel.reaction.type}\"\n                        />\n\n                <TextView\n                        android:layout_width=\"0dp\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@{bindingModel.user.displayUserName}\"\n                        android:layout_weight=\"1\"\n                        android:layout_marginStart=\"4dp\"\n                        android:layout_marginEnd=\"4dp\"\n                        />\n                <TextView\n                        android:layout_width=\"wrap_content\"\n                        android:layout_height=\"wrap_content\"\n                        elapsedTime=\"@{bindingModel.reaction.createdAt}\"\n                        isDisplayTimestampsAsAbsoluteDates=\"@{bindingModel.config.displayTimestampsAsAbsoluteDates}\"\n                        android:textColor=\"?attr/colorPrimary\"\n                        app:emojiCompatEnabled=\"false\"\n                    />\n\n            </LinearLayout>\n\n            <FrameLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    app:layout_constraintTop_toBottomOf=\"@id/reactionState\"\n                    app:layout_constraintStart_toStartOf=\"parent\"\n                    app:layout_constraintEnd_toEndOf=\"parent\"\n                    android:id=\"@+id/simpleNoteBase\">\n                <include android:id=\"@+id/simpleNote\"\n                        layout=\"@layout/item_simple_note\"\n                        app:note=\"@{bindingModel.note}\"\n                        app:noteCardActionListener=\"@{noteCardActionListener}\"\n\n                        />\n            </FrameLayout>\n\n\n        </androidx.constraintlayout.widget.ConstraintLayout>\n    </androidx.cardview.widget.CardView>\n</layout>\n"
  },
  {
    "path": "modules/features/userlist/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/features/userlist/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias(libs.plugins.compose.compiler)\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    buildFeatures {\n        dataBinding true\n        compose true\n\n    }\n    composeCompiler {\n        enableStrongSkippingMode = true\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.userlist'\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:api')\n    implementation project(path: ':modules:features:note')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:common_android_ui')\n    implementation project(path: ':modules:common_android')\n    implementation project(path: ':modules:common_viewmodel')\n    implementation project(path: ':modules:common_navigation')\n    implementation project(path: ':modules:common_compose')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:data')\n    implementation project(path: ':modules:app_store')\n    implementation project(path: ':modules:common_resource')\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.fragment.ktx\n    implementation libs.wada811.databinding\n    implementation libs.activity.ktx\n\n    implementation libs.coroutines.android\n    testImplementation libs.coroutines.test\n\n    implementation libs.lifecycle.livedata\n    implementation libs.retrofit\n    implementation libs.recyclerview\n    implementation libs.androidx.constraintlayout\n\n    // compose\n    implementation libs.compose.ui.ui\n    implementation libs.compose.ui.ui.tooling\n\n    implementation libs.compose.foundation.foundation\n    implementation libs.compose.material3\n    implementation libs.compose.material.material.icons.core\n    implementation libs.compose.material.material.icons.extended\n\n    androidTestImplementation libs.compose.ui.ui.test.junit4\n    implementation libs.compose.runtime.runtime.livedata\n    implementation libs.activity.compose\n    implementation libs.coil.compose\n    implementation libs.kotlin.datetime\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/features/userlist/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/features/userlist/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/features/userlist/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/ListListActivity.kt",
    "content": "package net.pantasystem.milktea.userlist\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.activity.compose.setContent\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport dagger.hilt.android.AndroidEntryPoint\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.error.UserActionAppGlobalErrorListener\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.UserListArgs\nimport net.pantasystem.milktea.common_navigation.UserListNavigation\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.userlist.compose.UserListCardScreen\nimport net.pantasystem.milktea.userlist.compose.UserListCardScreenAction\nimport net.pantasystem.milktea.userlist.viewmodel.ListListViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass ListListActivity : AppCompatActivity() {\n\n    companion object {\n\n        private const val EXTRA_ADD_USER_ID = \"jp.panta.misskeyandroidclient.extra.ADD_USER_ID\"\n        private const val EXTRA_ACCOUNT_ID =\n            \"jp.panta.misskeyandroidclient.extra.ADD_USERS_ACCOUNT_ID\"\n\n        fun newInstance(\n            context: Context,\n            addUserId: User.Id?,\n            specifiedAccountId: Long? = null,\n            addTabToAccountId: Long? = null,\n        ): Intent {\n            return Intent(context, ListListActivity::class.java).apply {\n                addUserId?.let {\n                    putExtra(EXTRA_ADD_USER_ID, addUserId.id)\n                    putExtra(EXTRA_ACCOUNT_ID, addUserId.accountId)\n                }\n                putExtra(ListListViewModel.EXTRA_SPECIFIED_ACCOUNT_ID, specifiedAccountId)\n                putExtra(ListListViewModel.EXTRA_ADD_TAB_TO_ACCOUNT_ID, addTabToAccountId)\n\n            }\n        }\n    }\n\n    @ExperimentalCoroutinesApi\n    val mListListViewModel: ListListViewModel by viewModels()\n\n\n    @Inject\n    lateinit var accountStore: AccountStore\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    @Inject\n    internal lateinit var userActionAppGlobalErrorListener: UserActionAppGlobalErrorListener\n\n\n    private val addUserId: User.Id? by lazy {\n        val addUserIdSt = intent.getStringExtra(EXTRA_ADD_USER_ID)\n        val addUserAccountId = intent.getLongExtra(EXTRA_ACCOUNT_ID, -1L)\n        if (addUserIdSt == null || addUserAccountId == -1L) {\n            null\n        } else {\n            User.Id(addUserAccountId, addUserIdSt)\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        userActionAppGlobalErrorListener(\n            lifecycle = lifecycle,\n            fragmentManager = supportFragmentManager\n        )\n\n        mListListViewModel.setAddTargetUserId(addUserId)\n\n        setContent {\n            val uiState by mListListViewModel.uiState.collectAsState()\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                UserListCardScreen(uiState = uiState, onAction = { action ->\n                    when (action) {\n                        UserListCardScreenAction.OnNavigateUp -> {\n                            finish()\n                        }\n                        is UserListCardScreenAction.OnUserListAddToTabToggled -> {\n                            mListListViewModel.toggleTab(action.userList)\n                        }\n                        is UserListCardScreenAction.OnUserListCardClicked -> {\n                            val intent = UserListDetailActivity.newIntent(\n                                this,\n                                action.userList.id,\n                                mListListViewModel.getAddTabToAccountId()\n                            )\n                            startActivity(intent)\n                        }\n                        is UserListCardScreenAction.OnToggleAddUser -> {\n                            mListListViewModel.toggle(action.userList, action.userId)\n                        }\n                        is UserListCardScreenAction.OnSaveNewUserList -> {\n                            mListListViewModel.createUserList(action.name)\n                        }\n                    }\n                })\n            }\n        }\n\n    }\n\n\n}\n\nclass UserListNavigationImpl @Inject constructor(\n    val activity: Activity,\n) : UserListNavigation {\n    override fun newIntent(args: UserListArgs): Intent {\n        return ListListActivity.newInstance(\n            activity,\n            args.userId,\n            specifiedAccountId = args.specifiedAccountId,\n            addTabToAccountId = args.addTabToAccountId,\n        )\n    }\n}\n"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/UserListDetailActivity.kt",
    "content": "@file:Suppress(\"DEPRECATION\")\n\npackage net.pantasystem.milktea.userlist\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport android.util.Log\nimport androidx.activity.compose.setContent\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.activity.viewModels\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.compose.runtime.collectAsState\nimport androidx.compose.runtime.getValue\nimport dagger.hilt.android.AndroidEntryPoint\nimport net.pantasystem.milktea.app_store.setting.SettingStore\nimport net.pantasystem.milktea.common.ui.ApplyMenuTint\nimport net.pantasystem.milktea.common.ui.ApplyTheme\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.common_compose.MilkteaStyleConfigApplyAndTheme\nimport net.pantasystem.milktea.common_navigation.*\nimport net.pantasystem.milktea.common_navigation.SearchAndSelectUserNavigation.Companion.EXTRA_SELECTED_USER_CHANGED_DIFF\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.note.view.NoteActionHandler\nimport net.pantasystem.milktea.note.viewmodel.NotesViewModel\nimport net.pantasystem.milktea.userlist.compose.UserListDetailScreen\nimport net.pantasystem.milktea.userlist.viewmodel.UserListDetailViewModel\nimport javax.inject.Inject\nimport androidx.activity.enableEdgeToEdge\n\n@AndroidEntryPoint\nclass UserListDetailActivity : AppCompatActivity(), UserListEditorDialog.OnSubmittedListener {\n\n    companion object {\n        private const val TAG = \"UserListDetailActivity\"\n\n\n        const val ACTION_SHOW = \"ACTION_SHOW\"\n        const val ACTION_EDIT_NAME = \"ACTION_EDIT_NAME\"\n\n\n        fun newIntent(context: Context, listId: UserList.Id, addTabToAccountId: Long? = null): Intent {\n            return Intent(context, UserListDetailActivity::class.java).apply {\n                putExtra(UserListDetailViewModel.EXTRA_LIST_ID, listId)\n                putExtra(UserListDetailViewModel.EXTRA_ADD_TAB_TO_ACCOUNT_ID, addTabToAccountId)\n            }\n        }\n    }\n\n\n\n    @Inject\n    lateinit var settingStore: SettingStore\n\n    @Inject\n    lateinit var pageableFragmentFactory: PageableFragmentFactory\n\n    @Inject\n    lateinit var searchAndSelectUserNavigation: SearchAndSelectUserNavigation\n\n    @Inject\n    lateinit var userDetailPageNavigation: UserDetailNavigation\n\n    @Inject\n    lateinit var applyTheme: ApplyTheme\n\n    @Inject\n    lateinit var applyMenuTint: ApplyMenuTint\n\n    @Inject\n    internal lateinit var configRepository: LocalConfigRepository\n\n    private val mUserListDetailViewModel: UserListDetailViewModel by viewModels()\n\n    private val notesViewModel by viewModels<NotesViewModel>()\n\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        applyTheme()\n        enableEdgeToEdge()\n\n        NoteActionHandler(\n            this.supportFragmentManager,\n            this,\n            this,\n            notesViewModel,\n        ).initViewModelListener()\n\n        setContent {\n            MilkteaStyleConfigApplyAndTheme(configRepository = configRepository) {\n                val userList by mUserListDetailViewModel.userList.collectAsState()\n\n                val users by mUserListDetailViewModel.users.collectAsState()\n                val isAddedTab by mUserListDetailViewModel.isAddedToTab.collectAsState()\n                val account by mUserListDetailViewModel.account.collectAsState()\n\n                UserListDetailScreen(\n                    listId = mUserListDetailViewModel.getUserListId(),\n                    userList = userList?.userList,\n                    users = users,\n                    isAddedTab = isAddedTab,\n                    onNavigateUp = {\n                        finish()\n                    },\n                    fragmentManager = supportFragmentManager,\n                    pageableFragmentFactory = pageableFragmentFactory,\n                    accountHost = account?.getHost(),\n                    onToggleButtonClicked = {\n                        mUserListDetailViewModel.toggleAddToTab()\n                    },\n                    onEditButtonClicked = {\n                        showEditUserListDialog()\n                    },\n                    onAddUserButtonClicked = {\n                        val selected =\n                            mUserListDetailViewModel.users.value.map {\n                                it.id\n                            }\n                        val intent = searchAndSelectUserNavigation.newIntent(\n                            SearchAndSelectUserNavigationArgs(\n                                selectedUserIds = selected,\n                                accountId = mUserListDetailViewModel.getUserListId().accountId\n                            )\n                        )\n                        requestSelectUserResult.launch(intent)\n                    },\n                    onSelectUser = {\n                        startActivity(\n                            userDetailPageNavigation.newIntent(\n                                UserDetailNavigationArgs.UserId(it.id)\n                            )\n                        )\n                    },\n                    onDeleteUserButtonClicked = {\n                        mUserListDetailViewModel.pullUser(it.id)\n                    },\n                    instanceType = account?.instanceType\n                )\n\n            }\n        }\n\n\n\n        if (intent.action == ACTION_EDIT_NAME) {\n            intent.action = ACTION_SHOW\n            showEditUserListDialog()\n        }\n\n    }\n\n    override fun onSubmit(name: String) {\n        mUserListDetailViewModel.updateName(name)\n    }\n\n\n    private val requestSelectUserResult =\n        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->\n            val resultCode = result.resultCode\n            val data = result.data\n            if (resultCode == RESULT_OK) {\n                val changedDiff =\n                    data?.getSerializableExtra(EXTRA_SELECTED_USER_CHANGED_DIFF) as? ChangedDiffResult\n                val added = changedDiff?.added\n                val removed = changedDiff?.removed\n                Log.d(TAG, \"新たに追加:${added?.toList()}, 削除:${removed?.toList()}\")\n                added?.forEach {\n                    mUserListDetailViewModel.pushUser(it)\n                }\n                removed?.forEach {\n                    mUserListDetailViewModel.pullUser(it)\n                }\n            }\n        }\n\n    private fun showEditUserListDialog() {\n        val dialog = UserListEditorDialog.newInstance(\n            mUserListDetailViewModel.getUserListId().userListId,\n            mUserListDetailViewModel.userList.value?.userList?.name ?: \"\"\n        )\n        dialog.show(supportFragmentManager, UserListEditorDialog.FRAGMENT_TAG)\n    }\n\n\n}\n\n"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/UserListEditorDialog.kt",
    "content": "package net.pantasystem.milktea.userlist\n\nimport android.app.Dialog\nimport android.os.Bundle\nimport android.text.Editable\nimport android.text.TextWatcher\nimport android.util.Log\nimport android.view.View\nimport androidx.appcompat.app.AppCompatDialogFragment\nimport net.pantasystem.milktea.userlist.databinding.DialogUserListEditorBinding\n\nclass UserListEditorDialog : AppCompatDialogFragment(){\n\n    companion object{\n        const val FRAGMENT_TAG = \"UserListEditorDialog\"\n\n        private const val EXTRA_MODE = \"jp.panta.misskeyandroidclient.viewmodel.list.EXTRA_MODE\"\n        private const val EXTRA_LIST_ID = \"jp.panta.misskeyandroidclient.viewmodel.list.EXTRA_LIST_ID\"\n        private const val EXTRA_LIST_NAME = \"jp.panta.misskeyandroidclient.viewmodel.list.EXTRA_LIST_NAME\"\n\n        fun newInstance(): UserListEditorDialog {\n            return UserListEditorDialog().apply{\n                arguments = Bundle().apply{\n                    putInt(EXTRA_MODE, Mode.CREATE.ordinal)\n                }\n            }\n        }\n\n        fun newInstance(listId: String, nowName: String): UserListEditorDialog {\n            return UserListEditorDialog().apply{\n                arguments = Bundle().apply{\n                    putInt(EXTRA_MODE, Mode.UPDATE.ordinal)\n                    putString(EXTRA_LIST_ID, listId)\n                    putString(EXTRA_LIST_NAME, nowName)\n                }\n            }\n        }\n    }\n\n    private enum class Mode{\n        CREATE, UPDATE\n    }\n\n    interface OnSubmittedListener{\n        fun onSubmit(name: String)\n    }\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {\n        val dialog = super.onCreateDialog(savedInstanceState)\n        val view = View.inflate(dialog.context, R.layout.dialog_user_list_editor, null)\n        dialog.setContentView(view)\n        val binding = DialogUserListEditorBinding.bind(view)\n\n        val modeOrdinal = arguments?.getInt(EXTRA_MODE)?: 0\n\n        val mode = Mode.values()[modeOrdinal]\n\n        binding.titleView.text = when(mode){\n            Mode.CREATE -> getString(R.string.create_user_list)\n            Mode.UPDATE -> getString(R.string.update_user_list)\n        }\n\n        if(mode == Mode.UPDATE){\n            binding.editListName.setText(\n                arguments?.getString(EXTRA_LIST_NAME)?: \"\"\n            )\n        }\n\n        binding.okButton.isEnabled = !binding.editListName.text.isNullOrBlank()\n\n        binding.editListName.addTextChangedListener(object : TextWatcher{\n\n            override fun afterTextChanged(s: Editable?) = Unit\n\n            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit\n\n            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {\n                binding.okButton.isEnabled = !s.isNullOrBlank()\n\n            }\n        })\n\n        //val viewModel = ViewModelProvider(requireActivity(), UserListOperateViewModel.Factory(account, miCore))[UserListOperateViewModel::class.java]\n        binding.okButton.setOnClickListener{\n            val name = binding.editListName.text.toString()\n            val context = requireContext()\n            if(context is OnSubmittedListener){\n                context.onSubmit(name)\n            }else{\n                Log.w(\"UserListEditor\", \"コールバックを発見することができませんでした。\")\n            }\n\n            dismiss()\n        }\n        binding.cancelButton.setOnClickListener{\n            dismiss()\n        }\n        return dialog\n    }\n}"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/compose/RemovableSimpleUserCard.kt",
    "content": "package net.pantasystem.milktea.userlist.compose\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.shape.RoundedCornerShape\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Delete\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.unit.dp\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.common_compose.CustomEmojiText\nimport net.pantasystem.milktea.model.user.User\n\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun RemovableSimpleUserCard(\n    user: User,\n    accountHost: String?,\n    onSelected: (User) -> Unit,\n    onDeleteButtonClicked: (User) -> Unit,\n) {\n\n    Card(\n        onClick = {\n            onSelected.invoke(user)\n        },\n        shape = RoundedCornerShape(0.dp),\n        modifier = Modifier.padding(0.5.dp),\n        colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface)\n    ) {\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            horizontalArrangement = Arrangement.SpaceBetween,\n            modifier = Modifier\n                .fillMaxWidth()\n        ) {\n            Row(\n                verticalAlignment = Alignment.CenterVertically,\n                modifier = Modifier\n                    .fillMaxWidth()\n                    .padding(8.dp)\n                    .weight(1f),\n            ) {\n                AvatarIcon(url = user.avatarUrl, modifier = Modifier.size(48.dp))\n                Spacer(modifier = Modifier.width(4.dp))\n                Column {\n                    CustomEmojiText(\n                        text = user.displayName,\n                        emojis = user.emojis,\n                        sourceHost = user.host,\n                        accountHost = accountHost,\n                        parsedResult = user.parsedResult,\n                    )\n                    Spacer(modifier = Modifier.height(4.dp))\n                    Text(text = user.displayUserName)\n                }\n            }\n            IconButton(\n                onClick = {\n                    onDeleteButtonClicked(user)\n                },\n\n                ) {\n\n                Icon(Icons.Default.Delete, contentDescription = null)\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/compose/RemovableSimpleUserCardList.kt",
    "content": "package net.pantasystem.milktea.userlist.compose\n\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.foundation.lazy.items\nimport androidx.compose.runtime.Composable\nimport androidx.compose.ui.Modifier\nimport net.pantasystem.milktea.model.user.User\n\n@Composable\nfun RemovableSimpleUserCardList(\n    modifier: Modifier,\n    users: List<User>,\n    accountHost: String?,\n    onSelectUser: (User) -> Unit,\n    onDeleteButtonClicked: (User) -> Unit,\n) {\n    LazyColumn(modifier.fillMaxSize()) {\n        items(users) { user ->\n            RemovableSimpleUserCard(\n                user = user,\n                accountHost = accountHost,\n                onSelected = { u ->\n                    onSelectUser(u)\n                },\n                onDeleteButtonClicked = { u ->\n                    onDeleteButtonClicked(u)\n                }\n            )\n        }\n    }\n\n}"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/compose/UserListCard.kt",
    "content": "package net.pantasystem.milktea.userlist.compose\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.material3.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.Stable\nimport androidx.compose.ui.Alignment\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.tooling.preview.Preview\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.common_compose.AvatarIcon\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.list.UserListMember\nimport net.pantasystem.milktea.model.list.UserListWithMembers\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.userlist.R\nimport net.pantasystem.milktea.userlist.viewmodel.UserListBindingModel\n\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\n@Stable\nfun UserListCard(userList: UserListBindingModel, onAction: (UserListCardAction) -> Unit) {\n    Card(\n        onClick = {\n            onAction(UserListCardAction.OnClick(userList.userList))\n        },\n        Modifier\n            .fillMaxWidth()\n            .padding(0.5.dp),\n        colors = CardDefaults.cardColors(containerColor = if (userList.isTargetUserAdded) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface)\n    ) {\n        Row(\n            verticalAlignment = Alignment.CenterVertically,\n            horizontalArrangement = Arrangement.SpaceBetween,\n            modifier = Modifier\n                .fillMaxWidth()\n                .padding(\n                    vertical = 12.dp,\n                    horizontal = 16.dp\n                )\n        ) {\n            Column(\n                Modifier\n                    .weight(1f)\n                    .fillMaxWidth()\n            ) {\n                Text(userList.userList.userList.name, fontSize = 18.sp)\n                Spacer(modifier = Modifier.height(2.dp))\n                Row {\n                    for (m in userList.userList.members) {\n                        AvatarIcon(url = m.avatarUrl, size = 32.dp)\n                        Spacer(modifier = Modifier.width(4.dp))\n                    }\n                }\n            }\n            AddToTabButton(isPaged = userList.isAddedTab) {\n                onAction(UserListCardAction.OnClickToggleTab(userList.userList))\n            }\n        }\n\n    }\n}\n\n@Preview\n@Composable\nfun Preview_GroupCard() {\n    UserListCard(\n        userList = UserListBindingModel(\n            UserListWithMembers(\n                UserList(\n                    id = UserList.Id(0, \"\"),\n                    createdAt = Clock.System.now(),\n                    name = \"はるのんファンクラブ\",\n                    userIds = (0 until 6).map { User.Id(0L, \"$it\") }\n                ),\n                members = listOf(\n                    UserListMember(User.Id(0L, \"id\"), \"\"),\n                    UserListMember(User.Id(0L, \"id\"), \"\"),\n                    UserListMember(User.Id(0L, \"id\"), \"\"),\n                    UserListMember(User.Id(0L, \"id\"), \"\"),\n                    UserListMember(User.Id(0L, \"id\"), \"\"),\n                )\n            ),\n            isAddedTab = true,\n            isTargetUserAdded = false,\n        ),\n        onAction = {}\n    )\n\n}\n\n@Composable\n@Stable\nprivate fun AddToTabButton(modifier: Modifier = Modifier, isPaged: Boolean, onPressed: () -> Unit) {\n    IconButton(onClick = onPressed, modifier = modifier) {\n        if (isPaged) {\n            Icon(\n                painter = painterResource(R.drawable.ic_remove_to_tab_24px),\n                contentDescription = \"add to tab\",\n                tint = MaterialTheme.colorScheme.secondary\n            )\n        } else {\n            Icon(\n                painter = painterResource(R.drawable.ic_add_to_tab_24px),\n                contentDescription = \"add to tab\",\n                tint = MaterialTheme.colorScheme.secondary\n            )\n        }\n\n    }\n}\n\nsealed interface UserListCardAction {\n    data class OnClick(val userList: UserListWithMembers) : UserListCardAction\n    data class OnClickToggleTab(val userList: UserListWithMembers) : UserListCardAction\n}"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/compose/UserListCardScreen.kt",
    "content": "package net.pantasystem.milktea.userlist.compose\n\nimport androidx.compose.foundation.layout.*\nimport androidx.compose.foundation.lazy.LazyColumn\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.Add\nimport androidx.compose.material.icons.filled.ArrowBack\nimport androidx.compose.runtime.*\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.geometry.Offset\nimport androidx.compose.ui.input.nestedscroll.NestedScrollConnection\nimport androidx.compose.ui.input.nestedscroll.NestedScrollSource\nimport androidx.compose.ui.input.nestedscroll.nestedScroll\nimport androidx.compose.ui.platform.LocalDensity\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.unit.sp\nimport androidx.compose.ui.window.Dialog\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.userlist.R\nimport net.pantasystem.milktea.userlist.viewmodel.UserListsUiState\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun UserListCardScreen(\n    uiState: UserListsUiState,\n    onAction: (UserListCardScreenAction) -> Unit,\n) {\n    var isShowCreateUserListDialog: Boolean by remember {\n        mutableStateOf(false)\n    }\n\n    val connection = remember {\n        LazyInitialNestedScrollConnection()\n    }\n\n    CreateUserListDialog(isShow = isShowCreateUserListDialog, onDismiss = {\n        isShowCreateUserListDialog = false\n    }, onSave = {\n        isShowCreateUserListDialog = false\n        onAction(UserListCardScreenAction.OnSaveNewUserList(it))\n    })\n\n\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        modifier = Modifier.fillMaxSize(),\n        topBar = {\n            CollapsingTopAppBar(\n                modifier = Modifier,\n                onNavigateUp = { onAction(UserListCardScreenAction.OnNavigateUp) },\n                scrollConnection = connection\n            )\n        },\n        floatingActionButton = {\n            FloatingActionButton(onClick = {\n                isShowCreateUserListDialog = true\n            }) {\n                Icon(Icons.Default.Add, contentDescription = \"Create a User list\")\n            }\n        }\n    ) {\n        UserListList(\n            modifier = Modifier\n                .padding(it)\n                .fillMaxSize()\n                .nestedScroll(connection),\n            uiState = uiState, onAction = onAction\n        )\n    }\n}\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nprivate fun CollapsingTopAppBar(\n    modifier: Modifier,\n    onNavigateUp: () -> Unit,\n    scrollConnection: LazyInitialNestedScrollConnection,\n) {\n\n    var toolbarHeight by remember {\n        mutableStateOf(56.dp)\n    }\n\n\n    val density = LocalDensity.current\n\n    val defaultFontSize = MaterialTheme.typography.titleLarge.fontSize\n\n    var fontSize by remember {\n        mutableStateOf(defaultFontSize)\n    }\n\n    LaunchedEffect(null) {\n        scrollConnection.preScroll = { available, _ ->\n            val delta = available.y\n            toolbarHeight = with(density) {\n                (toolbarHeight.toPx() + delta).coerceIn(0.dp.toPx(), 56.dp.toPx()).toDp()\n            }\n            fontSize = (defaultFontSize.value * (toolbarHeight / 56.dp)).sp\n\n            Offset.Zero\n        }\n    }\n\n    // ステータスバー領域とツールバー領域を分離し、height() がステータスバー inset と\n    // 競合してレイアウトが崩れる問題を解消する\n    Surface(\n        modifier = modifier,\n        color = MaterialTheme.colorScheme.surface,\n    ) {\n        Column {\n            Spacer(modifier = Modifier.windowInsetsTopHeight(WindowInsets.statusBars))\n            TopAppBar(\n                title = {\n                    Text(\n                        text = stringResource(id = R.string.user_list),\n                        style = MaterialTheme.typography.titleLarge.copy(fontSize = fontSize)\n                    )\n                },\n                navigationIcon = {\n                    IconButton(onClick = onNavigateUp) {\n                        Icon(Icons.Default.ArrowBack, contentDescription = null)\n                    }\n                },\n                colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),\n                windowInsets = WindowInsets(0, 0, 0, 0),\n                modifier = Modifier.height(toolbarHeight),\n            )\n        }\n    }\n}\n\n@Composable\n@Stable\nfun UserListList(\n    modifier: Modifier,\n    uiState: UserListsUiState,\n    onAction: (UserListCardScreenAction) -> Unit\n) {\n    LazyColumn(\n        modifier = modifier,\n    ) {\n        items(uiState.userLists.size) { index ->\n            UserListCard(\n                userList = uiState.userLists[index],\n                onAction = { action ->\n                    when (action) {\n                        is UserListCardAction.OnClick -> {\n                            if (uiState.addTargetUserId == null) {\n                                onAction(\n                                    UserListCardScreenAction\n                                        .OnUserListCardClicked(\n                                            uiState.userLists[index].userList.userList\n                                        )\n                                )\n                            } else {\n                                onAction(\n                                    UserListCardScreenAction\n                                        .OnToggleAddUser(\n                                            uiState.userLists[index].userList.userList,\n                                            uiState.addTargetUserId\n                                        )\n                                )\n                            }\n\n                        }\n                        is UserListCardAction.OnClickToggleTab -> {\n                            onAction(\n                                UserListCardScreenAction.OnUserListAddToTabToggled(\n                                    uiState.userLists[index].userList.userList\n                                )\n                            )\n                        }\n                    }\n                }\n            )\n        }\n    }\n}\n\n\n@Composable\nfun CreateUserListDialog(\n    isShow: Boolean,\n    onDismiss: () -> Unit,\n    onSave: (String) -> Unit\n) {\n\n    var name: String by remember(isShow) {\n        mutableStateOf(\"\")\n    }\n\n    if (isShow) {\n        Dialog(onDismissRequest = onDismiss) {\n            Surface(\n                shape = MaterialTheme.shapes.medium,\n                color = MaterialTheme.colorScheme.surface,\n            ) {\n                Column(\n                    modifier = Modifier.padding(16.dp)\n                ) {\n                    Text(\n                        stringResource(R.string.create_user_list),\n                        fontSize = 24.sp,\n                    )\n                    Spacer(modifier = Modifier.height(8.dp))\n                    TextField(\n                        value = name,\n                        placeholder = {\n                            Text(stringResource(R.string.list_name))\n                        },\n                        onValueChange = { text ->\n                            name = text\n                        }\n                    )\n                    Row(\n                        Modifier.fillMaxWidth(),\n                        horizontalArrangement = Arrangement.End\n                    ) {\n                        TextButton(onClick = onDismiss) {\n                            Text(stringResource(R.string.cancel))\n                        }\n                        TextButton(onClick = {\n                            onSave.invoke(name)\n                        }) {\n                            Text(stringResource(R.string.save))\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n}\n\nprivate class LazyInitialNestedScrollConnection(\n    var preScroll: (available: Offset, source: NestedScrollSource) -> Offset = { _, _ -> Offset.Zero }\n) : NestedScrollConnection {\n    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {\n        return preScroll(available, source)\n    }\n}\n\nsealed interface UserListCardScreenAction {\n    data class OnUserListCardClicked(val userList: UserList) : UserListCardScreenAction\n    data class OnUserListAddToTabToggled(val userList: UserList) : UserListCardScreenAction\n    object OnNavigateUp : UserListCardScreenAction\n\n    data class OnToggleAddUser(val userList: UserList, val userId: User.Id) :\n        UserListCardScreenAction\n\n    data class OnSaveNewUserList(val name: String) : UserListCardScreenAction\n}"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/compose/UserListDetailScreen.kt",
    "content": "package net.pantasystem.milktea.userlist.compose\n\nimport android.widget.FrameLayout\nimport androidx.compose.foundation.layout.Column\nimport androidx.compose.foundation.layout.fillMaxSize\nimport androidx.compose.foundation.layout.padding\nimport androidx.compose.material3.*\nimport androidx.compose.material.icons.Icons\nimport androidx.compose.material.icons.filled.*\nimport androidx.compose.runtime.Composable\nimport androidx.compose.runtime.rememberCoroutineScope\nimport androidx.compose.ui.Modifier\nimport androidx.compose.ui.res.painterResource\nimport androidx.compose.ui.res.stringResource\nimport androidx.compose.ui.unit.dp\nimport androidx.compose.ui.viewinterop.AndroidView\nimport androidx.fragment.app.FragmentManager\nimport androidx.compose.foundation.pager.HorizontalPager\nimport androidx.compose.foundation.pager.rememberPagerState\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.common_android_ui.PageableFragmentFactory\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.userlist.R\nimport androidx.compose.foundation.layout.WindowInsets\nimport androidx.compose.foundation.layout.safeDrawing\n\n@OptIn(ExperimentalMaterial3Api::class)\n@Composable\nfun UserListDetailScreen(\n    listId: UserList.Id,\n    userList: UserList?,\n    users: List<User>,\n    accountHost: String?,\n    instanceType: Account.InstanceType?,\n    isAddedTab: Boolean,\n    onNavigateUp: () -> Unit,\n    fragmentManager: FragmentManager,\n    pageableFragmentFactory: PageableFragmentFactory,\n    onToggleButtonClicked: () -> Unit,\n    onEditButtonClicked: () -> Unit,\n    onAddUserButtonClicked: () -> Unit,\n    onSelectUser: (User) -> Unit,\n    onDeleteUserButtonClicked: (User) -> Unit,\n) {\n//    val userList by mUserListDetailViewModel.userList.collectAsState()\n    val titles =\n        listOf(stringResource(R.string.timeline), stringResource(R.string.user_list))\n    val pagerState = rememberPagerState { titles.size }\n////    val users by mUserListDetailViewModel.users.collectAsState()\n//    val isAddedTab by mUserListDetailViewModel.isAddedToTab.collectAsState()\n\n    val scope = rememberCoroutineScope()\n    Scaffold(\n        contentWindowInsets = WindowInsets.safeDrawing,\n        topBar = {\n            Column {\n                TopAppBar(\n                    navigationIcon = {\n                        IconButton(onClick = onNavigateUp) {\n                            Icon(Icons.Default.ArrowBack, contentDescription = null)\n                        }\n                    },\n                    title = {\n                        Text(userList?.name ?: \"\")\n                    },\n                    colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.surface),\n                    actions = {\n                        IconButton(onClick = onAddUserButtonClicked) {\n                            Icon(Icons.Default.PersonAdd, contentDescription = null)\n                        }\n\n                        IconButton(onClick = onEditButtonClicked) {\n                            Icon(Icons.Default.Edit, contentDescription = null)\n                        }\n                        IconButton(onClick = onToggleButtonClicked) {\n                            if (isAddedTab) {\n                                Icon(\n                                    painter = painterResource(R.drawable.ic_remove_to_tab_24px),\n                                    contentDescription = null\n                                )\n                            } else {\n                                Icon(\n                                    painter = painterResource(R.drawable.ic_add_to_tab_24px),\n                                    contentDescription = null\n                                )\n                            }\n                        }\n\n                    }\n\n                )\n                TabRow(\n                    selectedTabIndex = pagerState.currentPage,\n                    containerColor = MaterialTheme.colorScheme.surface,\n                ) {\n                    titles.forEachIndexed { index, s ->\n                        Tab(\n                            text = { Text(text = s) },\n                            selected = index == pagerState.currentPage,\n                            onClick = {\n                                scope.launch {\n                                    pagerState.animateScrollToPage(index)\n                                }\n                            }\n                        )\n                    }\n\n                }\n            }\n        }\n    ) { paddingValues ->\n        HorizontalPager(\n            modifier = Modifier\n                .padding(paddingValues)\n                .fillMaxSize(),\n            state = pagerState,\n        ) {\n            when (pagerState.currentPage) {\n                0 -> {\n                    AndroidView(\n                        modifier = Modifier.fillMaxSize(),\n                        factory = { context ->\n                            FrameLayout(context).apply {\n                                id = R.id.container\n                            }\n                        },\n                        update = { frameLayout ->\n                            val fragment = pageableFragmentFactory.create(\n                                listId.accountId,\n                                when(instanceType) {\n                                    Account.InstanceType.MASTODON -> Pageable.Mastodon.ListTimeline(listId.userListId)\n                                    else -> Pageable.UserListTimeline(listId = listId.userListId)\n                                }\n                            )\n                            val transaction = fragmentManager.beginTransaction()\n                            transaction.replace(frameLayout.id, fragment)\n                            transaction.commit()\n                        }\n                    )\n                }\n                1 -> {\n                    RemovableSimpleUserCardList(\n                        modifier = Modifier.fillMaxSize(),\n                        users = users,\n                        onSelectUser = onSelectUser,\n                        onDeleteButtonClicked = onDeleteUserButtonClicked,\n                        accountHost = accountHost,\n                    )\n\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/viewmodel/ListListViewModel.kt",
    "content": "package net.pantasystem.milktea.userlist.viewmodel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.app_store.handler.AppGlobalError\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorAction\nimport net.pantasystem.milktea.app_store.handler.UserActionAppGlobalErrorStore\nimport net.pantasystem.milktea.common.*\nimport net.pantasystem.milktea.common_android.resource.StringSource\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.list.UserListRepository\nimport net.pantasystem.milktea.model.list.UserListTabToggleAddToTabUseCase\nimport net.pantasystem.milktea.model.list.UserListWithMembers\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\n@HiltViewModel\nclass ListListViewModel @Inject constructor(\n    val accountStore: AccountStore,\n    val accountRepository: AccountRepository,\n    val loggerFactory: Logger.Factory,\n    private val userListRepository: UserListRepository,\n    private val userRepository: UserRepository,\n    private val toggleAddToTabUseCase: UserListTabToggleAddToTabUseCase,\n    private val savedStateHandle: SavedStateHandle,\n    private val userActionAppGlobalErrorStore: UserActionAppGlobalErrorStore,\n) : ViewModel() {\n\n    companion object {\n        const val EXTRA_SPECIFIED_ACCOUNT_ID = \"ListListViewModel.EXTRA_SPECIFIED_ACCOUNT_ID\"\n        const val EXTRA_ADD_TAB_TO_ACCOUNT_ID = \"ListListViewModel.EXTRA_ADD_TAB_TO_ACCOUNT_ID\"\n    }\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val currentAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_SPECIFIED_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val addTabToAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_ADD_TAB_TO_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val userListsFlow =\n        currentAccount.filterNotNull().flatMapLatest { account ->\n            userListRepository.observeByAccountId(account.accountId)\n        }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val userListsSyncState =\n        currentAccount.filterNotNull().flatMapLatest {\n            suspend {\n                userListRepository.syncByAccountId(it.accountId).getOrThrow()\n            }.asLoadingStateFlow()\n        }.stateIn(\n            viewModelScope, SharingStarted.WhileSubscribed(5_000), ResultState.initialState()\n        )\n\n    private val addTargetUserId = MutableStateFlow<User.Id?>(null)\n\n    val uiState = combine(\n        addTabToAccount,\n        userListsFlow,\n        userListsSyncState,\n        addTargetUserId\n    ) { addTabToAccount, userLists, syncState, addUser ->\n        UserListsUiState(\n            userLists.map { userList ->\n                UserListBindingModel(\n                    userList,\n                    addTabToAccount?.pages?.any {\n                        it.pageParams.listId == userList.userList.id.userListId\n                                && userList.userList.id.accountId == (it.attachedAccountId ?: it.accountId)\n                    } ?: false,\n                    isTargetUserAdded = userList.userList.userIds.any { id ->\n                        id == addUser\n                    },\n                )\n            },\n            syncState = syncState,\n            addTargetUserId = addUser,\n        )\n    }.stateIn(\n        viewModelScope,\n        SharingStarted.WhileSubscribed(5_000),\n        UserListsUiState(emptyList(), userListsSyncState.value)\n    )\n\n\n\n    private val logger = loggerFactory.create(\"ListListViewModel\")\n\n    init {\n        viewModelScope.launch {\n            accountStore.observeCurrentAccount.distinctUntilChanged().filterNotNull().map {\n                syncUsers(it.accountId)\n            }.catch {\n                logger.error(\"sync users error\", it)\n            }.collect()\n        }\n    }\n\n    fun toggle(userList: UserList, userId: User.Id) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                if (userList.userIds.contains(userId)) {\n                    userListRepository.removeUser(userList.id, userId)\n                } else {\n                    userListRepository.appendUser(userList.id, userId)\n                }\n                userListRepository.syncOne(userList.id)\n            }.onFailure {\n                logger.error(\"toggle user failed\", it)\n                if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"ListListViewModel.toggle\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\n                                if (userList.userIds.contains(userId)) {\n                                    \"Remove user from list failed\"\n                                } else {\n                                    \"Add user to list failed\"\n                                }\n                            ),\n                            it,\n                            true\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                    )\n                ) {\n                    toggle(userList, userId)\n                }\n            }\n        }\n    }\n\n    fun toggleTab(userList: UserList?) {\n        userList?.let { ul ->\n            viewModelScope.launch {\n                toggleAddToTabUseCase(ul.id, savedStateHandle[EXTRA_ADD_TAB_TO_ACCOUNT_ID]).onFailure {\n                    logger.error(\"タブtoggle処理失敗\", e = it)\n                    if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                            AppGlobalError(\n                                \"ListListViewModel.toggleTab\",\n                                AppGlobalError.ErrorLevel.Error,\n                                StringSource(\"add/remove tab failed\"),\n                                it\n                            ),\n                            UserActionAppGlobalErrorAction.Type.Retry\n                        )\n                    ) {\n                        toggleTab(userList)\n                    }\n                }\n            }\n        }\n    }\n\n    fun createUserList(name: String) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                val account = accountRepository.getCurrentAccount().getOrThrow()\n                val result = userListRepository.create(account.accountId, name)\n                userListRepository.syncOne(result.id).getOrThrow()\n            }.onSuccess {\n                logger.debug(\"作成成功\")\n            }.onFailure {\n                logger.error(\"作成失敗\", it)\n                if (userActionAppGlobalErrorStore.dispatchAndAwaitUserAction(\n                        AppGlobalError(\n                            \"ListListViewModel.createUserList\",\n                            AppGlobalError.ErrorLevel.Error,\n                            StringSource(\"create user list failed\"),\n                            it,\n                            true\n                        ),\n                        UserActionAppGlobalErrorAction.Type.Retry\n                    )\n                ) {\n                    createUserList(name)\n                }\n            }\n        }\n\n    }\n\n    fun setAddTargetUserId(userId: User.Id?) {\n        addTargetUserId.value = userId\n    }\n\n    fun getAddTabToAccountId(): Long? {\n        return savedStateHandle[EXTRA_ADD_TAB_TO_ACCOUNT_ID]\n    }\n\n    private suspend fun syncUsers(accountId: Long) {\n        val userIds = userListRepository.findByAccountId(accountId).map {\n            it.userIds\n        }.flatten().distinct()\n        userRepository.syncIn(userIds)\n    }\n\n}\n\ndata class UserListBindingModel(\n    val userList: UserListWithMembers,\n    val isAddedTab: Boolean,\n    val isTargetUserAdded: Boolean,\n)\n\ndata class UserListsUiState(\n    val userLists: List<UserListBindingModel>,\n    val syncState: ResultState<Unit>,\n    val addTargetUserId: User.Id? = null,\n)"
  },
  {
    "path": "modules/features/userlist/src/main/java/net/pantasystem/milktea/userlist/viewmodel/UserListDetailViewModel.kt",
    "content": "package net.pantasystem.milktea.userlist.viewmodel\n\nimport androidx.lifecycle.SavedStateHandle\nimport androidx.lifecycle.ViewModel\nimport androidx.lifecycle.viewModelScope\nimport dagger.hilt.android.lifecycle.HiltViewModel\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.*\nimport kotlinx.coroutines.launch\nimport net.pantasystem.milktea.app_store.account.AccountStore\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.list.UserListRepository\nimport net.pantasystem.milktea.model.list.UserListTabToggleAddToTabUseCase\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\n\n@HiltViewModel\nclass UserListDetailViewModel @Inject constructor(\n    private val userListRepository: UserListRepository,\n    private val userDataSource: UserDataSource,\n    accountStore: AccountStore,\n    private val toggleAddToTabUseCase: UserListTabToggleAddToTabUseCase,\n    loggerFactory: Logger.Factory,\n    private val savedStateHandle: SavedStateHandle,\n) : ViewModel() {\n\n\n    companion object {\n        const val EXTRA_LIST_ID = \"jp.panta.misskeyandroidclient.EXTRA_LIST_ID\"\n        const val EXTRA_ADD_TAB_TO_ACCOUNT_ID = \"jp.panta.misskeyandroidclient.EXTRA_ADD_TAB_TO_ACCOUNT_ID\"\n    }\n\n    private val listIdFlow = savedStateHandle.getStateFlow<UserList.Id?>(\n        EXTRA_LIST_ID,\n        null\n    )\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val account = listIdFlow.flatMapLatest { listId ->\n        accountStore.getOrCurrent(listId?.accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val userList = listIdFlow.filterNotNull().flatMapLatest {\n        userListRepository.observeOne(it)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    private val addToTabAccount = savedStateHandle.getStateFlow<Long?>(\n        EXTRA_ADD_TAB_TO_ACCOUNT_ID,\n        null\n    ).flatMapLatest { accountId ->\n        accountStore.getOrCurrent(accountId)\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), null)\n\n    val isAddedToTab = combine(account, addToTabAccount,listIdFlow) { account, addTo, listId ->\n        (addTo?.pages ?: account?.pages)?.any {\n            it.pageParams.listId == listId?.userListId\n        } ?: false\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), false)\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    val users = userList.filterNotNull().flatMapLatest {\n        userDataSource.observeIn(\n            it.userList.id.accountId,\n            it.userList.userIds.map { userId -> userId.id })\n    }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList())\n\n\n    private val logger = loggerFactory.create(\"UserListDetailViewModel\")\n\n    init {\n        load()\n    }\n\n    fun load() {\n        viewModelScope.launch {\n            runCancellableCatching {\n                savedStateHandle.get<UserList.Id?>(EXTRA_LIST_ID)?.let {\n                    userListRepository.syncOne(it)\n                }\n            }.onSuccess {\n                logger.info(\"load list success\")\n            }.onFailure {\n                logger.error(\"load list error\", e = it)\n            }\n\n        }\n\n    }\n\n    fun updateName(name: String) {\n        viewModelScope.launch {\n            runCancellableCatching {\n                val listId = savedStateHandle.get<UserList.Id>(EXTRA_LIST_ID)\n                    ?: throw IllegalStateException(\"listId is null\")\n                userListRepository.update(listId, name)\n                userListRepository.syncOne(listId).getOrThrow()\n            }.onSuccess {\n                load()\n            }.onFailure { t ->\n                logger.error(\"名前の更新に失敗した\", e = t)\n            }\n        }\n\n    }\n\n    fun pushUser(userId: User.Id) {\n\n        viewModelScope.launch {\n            runCancellableCatching {\n                val listId = savedStateHandle.get<UserList.Id>(EXTRA_LIST_ID)\n                    ?: throw IllegalStateException(\"listId is null\")\n                userListRepository.appendUser(listId, userId)\n                userListRepository.syncOne(listId).getOrThrow()\n            }.onSuccess {\n                logger.info(\"ユーザーの追加に成功\")\n            }.onFailure {\n                logger.warning(\"ユーザーの追加に失敗\", e = it)\n            }\n        }\n\n    }\n\n\n    fun pullUser(userId: User.Id) {\n\n        viewModelScope.launch {\n            runCancellableCatching {\n                val listId = savedStateHandle.get<UserList.Id>(EXTRA_LIST_ID)\n                    ?: throw IllegalStateException(\"listId is null\")\n                userListRepository.removeUser(listId, userId)\n                userListRepository.syncOne(listId).getOrThrow()\n            }.onFailure { t ->\n                logger.warning(\"ユーザーの除去に失敗\", e = t)\n            }.onSuccess {\n                logger.info(\"ユーザーの除去に成功\")\n            }\n        }\n\n\n    }\n\n    fun toggleAddToTab() {\n        viewModelScope.launch {\n            val listId = savedStateHandle.get<UserList.Id>(EXTRA_LIST_ID)\n                ?: throw IllegalStateException(\"listId is null\")\n\n            toggleAddToTabUseCase(listId, savedStateHandle[EXTRA_ADD_TAB_TO_ACCOUNT_ID]).onFailure {\n                logger.error(\"Page追加に失敗\", it)\n            }\n\n        }\n    }\n\n    fun getUserListId(): UserList.Id {\n        return requireNotNull(savedStateHandle[EXTRA_LIST_ID])\n    }\n\n}"
  },
  {
    "path": "modules/features/userlist/src/main/res/layout/dialog_user_list_editor.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <RelativeLayout\n            xmlns:android=\"http://schemas.android.com/apk/res/android\"\n            xmlns:tools=\"http://schemas.android.com/tools\"\n            android:layout_width=\"match_parent\" android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            android:padding=\"16dp\">\n        <TextView\n                android:id=\"@+id/titleView\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                tools:text=\"リストを作成\"\n                android:textSize=\"@dimen/dialog_title_font_size\"\n                android:textColor=\"?android:attr/textColorPrimary\"\n                android:layout_marginBottom=\"8dp\"\n                />\n        <com.google.android.material.textfield.TextInputLayout\n                android:id=\"@+id/listNameInput\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginBottom=\"8dp\"\n                android:layout_below=\"@id/titleView\"\n                style=\"?textInputOutlinedStyle\"\n                >\n            <com.google.android.material.textfield.TextInputEditText\n                    android:id=\"@+id/editListName\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:hint=\"@string/list_name\"\n                    android:singleLine=\"true\"/>\n        </com.google.android.material.textfield.TextInputLayout>\n\n        <Button\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/listNameInput\"\n                android:id=\"@+id/cancelButton\"\n                android:layout_toStartOf=\"@id/okButton\"\n                android:layout_marginEnd=\"8dp\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                android:text=\"@android:string/cancel\"/>\n        <Button\n                android:id=\"@+id/okButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_below=\"@id/listNameInput\"\n                android:layout_alignParentEnd=\"true\"\n                style=\"@style/Widget.AppCompat.Button.Borderless\"\n                android:text=\"@android:string/ok\"/>\n    </RelativeLayout>\n</layout>\n"
  },
  {
    "path": "modules/model/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/model/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n    alias libs.plugins.kotlin.serialization.plugin\n    id 'kotlin-parcelize'\n\n}\n\nandroid {\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n        freeCompilerArgs += \"-Xopt-in=kotlin.RequiresOptIn\"\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n    namespace 'net.pantasystem.milktea.model'\n\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common')\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    implementation libs.kotlin.datetime\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n\n    // For instrumentation tests\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n\n    // For local unit tests\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n\n    implementation libs.kotlin.serialization\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n    testImplementation \"org.mockito.kotlin:mockito-kotlin:4.1.0\"\n    testImplementation libs.coroutines.test\n    implementation libs.coroutines.android\n\n\n}"
  },
  {
    "path": "modules/model/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/model/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/model/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest>\n\n</manifest>"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/AddResult.kt",
    "content": "package net.pantasystem.milktea.model\n\n/**\n * Repositoryなどでaddした時の結果の戻り値\n */\nsealed interface AddResult {\n    object Updated : AddResult\n    object Created : AddResult\n    object Canceled : AddResult\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/Entity.kt",
    "content": "package net.pantasystem.milktea.model\n\nimport java.io.Serializable\n\n/**\n * Idを表す\n */\ninterface EntityId : Serializable\n\ninterface Entity : Serializable"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/UseCase.kt",
    "content": "package net.pantasystem.milktea.model\n\ninterface UseCase\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/Account.kt",
    "content": "package net.pantasystem.milktea.model.account\n\n\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.user.Acct\nimport java.io.Serializable\n\n\ndata class Account(\n    val remoteId: String,\n    val instanceDomain: String,\n    val userName: String,\n    val token: String,\n    val pages: List<Page>,\n    val instanceType: InstanceType,\n    var accountId: Long = 0\n) : Serializable {\n\n    enum class InstanceType {\n        MISSKEY, MASTODON, PLEROMA, FIREFISH\n    }\n\n    constructor(\n        remoteId: String,\n        instanceDomain: String,\n        userName: String,\n        instanceType: InstanceType,\n        token: String\n    ) :\n            this(\n                remoteId,\n                instanceDomain,\n                userName,\n                token,\n                emptyList(),\n                instanceType\n            )\n\n    val normalizedInstanceUri: String = getNormalizedDomain()\n\n\n    private var _host: String? = null\n\n    private fun getNormalizedDomain(): String {\n        return UrlHelper.getNormalizedDomain(instanceDomain)\n    }\n\n    fun getHost(): String {\n        when(val h = _host) {\n            null -> Unit\n            else -> return h\n        }\n\n        return UrlHelper.getHost(instanceDomain).also {\n            _host = it\n        }\n    }\n\n    fun getAcct(): String {\n        return \"@$userName@${getHost()}\"\n    }\n\n}\n\ninternal object UrlHelper {\n\n    fun getNormalizedDomain(url: String): String {\n        val protocol = getProtocol(url).ifBlank {\n            \"https\"\n        }\n\n        val str = \"${protocol}://${getHost(url)}\"\n\n        return when(val port = getPort(url)) {\n            null -> str\n            else -> \"$str:$port\"\n        }\n    }\n    fun getHost(sourceUrl: String): String {\n\n        val instanceDomain = sourceUrl.trim()\n        val protocolLess = getProtocolLess(sourceUrl).trim()\n\n        val host = if (\n            instanceDomain.startsWith(\"https://\")\n            || instanceDomain.startsWith(\"http://\")\n            || instanceDomain.indexOf(\"://\") > 0\n        ) {\n            var url = protocolLess.lowercase()\n            while(url.lastOrNull() == '/') {\n                url = url.substring(0, url.lastIndex)\n            }\n\n            // check ipv6 address\n            if (!url.startsWith(\"[\") || !url.endsWith(\"]\")) {\n                val portColon = url.indexOf(\":\")\n                if (portColon != -1) {\n                    url = url.substring(0, portColon)\n                }\n            }\n\n            // check domain pattern\n            if (\n                url.contains(\"@\")\n                || url.startsWith(\"\\\\d\")\n            ) {\n                \"\"\n            } else {\n                url\n            }\n        } else {\n            \"\"\n        }\n\n        if (host.isBlank()) {\n            if (protocolLess.startsWith(\"@\")){\n                val acct = Acct(protocolLess)\n                if (!acct.host.isNullOrBlank()) {\n                    return acct.host.lowercase()\n                }\n            }\n        } else {\n            return host\n        }\n        return protocolLess\n    }\n\n    private fun getPort(url: String): String? {\n        val protocolLess = getProtocolLess(url).trim()\n\n        // is ipv6 address\n        if (protocolLess.startsWith(\"[\") && protocolLess.endsWith(\"]\")) {\n            return null\n        }\n\n        val portColon = protocolLess.indexOf(\":\")\n        if (portColon != -1 && portColon < protocolLess.length - 1) {\n            return protocolLess.substring(portColon + 1, protocolLess.length)\n        }\n        return null\n    }\n\n    private fun getProtocol(url: String): String {\n        val instanceDomain = url.trim()\n        if (instanceDomain.startsWith(\"https://\")) {\n            return \"https\"\n        } else if (instanceDomain.startsWith(\"http://\")) {\n            return \"http\"\n        } else if (instanceDomain.indexOf(\"://\") > 0) {\n            var protocol = instanceDomain.substring(0, instanceDomain.indexOf(\"://\"))\n            while(protocol.lastOrNull() == ':') {\n                protocol = protocol.substring(0, protocol.lastIndex)\n            }\n            return protocol.lowercase()\n        }\n        return \"\"\n    }\n    private fun getProtocolLess(url: String): String {\n        val protocol = getProtocol(url)\n        val instanceDomain = url.trim()\n        var protocolLess = instanceDomain.substring(protocol.length, instanceDomain.length)\n        while(protocolLess.startsWith(\":\")) {\n            protocolLess = protocolLess.substring(\":\".length, protocolLess.length)\n        }\n        while(protocolLess.startsWith(\"/\")) {\n            protocolLess = protocolLess.substring(\"/\".length, protocolLess.length)\n        }\n\n        while(protocolLess.lastOrNull() == '/') {\n            protocolLess = protocolLess.substring(0, protocolLess.lastIndex)\n        }\n        return protocolLess\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/AccountExceptions.kt",
    "content": "package net.pantasystem.milktea.model.account\n\ninterface AccountException\n\n/**\n * アカウントが存在しなかった場合に呼び出されます\n */\nclass AccountNotFoundException(accountId: Long? = null) : NoSuchElementException(\"Account not found: $accountId\"), AccountException {\n\n    companion object{\n        @JvmStatic\n        private val serialVersionUID = 1L\n    }\n\n\n\n}\n\nclass AccountRegistrationFailedException(msg: String = \"アカウントの登録に失敗しました\") : IllegalStateException(msg)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/AccountRepository.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.channels.awaitClose\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.channelFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.flow.onStart\n\ninterface AccountRepository{\n\n    sealed class Event {\n        data class Created(val account: Account) : Event()\n        data class Updated(val account: Account) : Event()\n        data class Deleted(val accountId: Long) : Event()\n    }\n\n    fun interface Listener {\n        fun on(e: Event)\n    }\n\n    fun addEventListener(listener: Listener)\n\n    fun removeEventListener(listener: Listener)\n\n    suspend fun get(accountId: Long): Result<Account>\n\n    suspend fun add(account: Account, isUpdatePages: Boolean = false): Result<Account>\n\n    suspend fun delete(account: Account)\n\n    suspend fun findAll(): Result<List<Account>>\n\n    suspend fun setCurrentAccount(account: Account): Result<Account>\n\n    suspend fun getCurrentAccount(): Result<Account>\n}\n\n@ExperimentalCoroutinesApi\nfun AccountRepository.listenEvent(): Flow<AccountRepository.Event> {\n    return channelFlow {\n\n        val listener: (e: AccountRepository.Event)-> Unit = {\n            trySend(it)\n        }\n        addEventListener(listener)\n\n        awaitClose {\n            removeEventListener(listener)\n        }\n    }\n}\n\n\n@ExperimentalCoroutinesApi\nfun AccountRepository.watchCurrentAccount() : Flow<Account> {\n    return this.listenEvent().map {\n        this.getCurrentAccount().getOrThrow()\n    }.onStart {\n        emit(getCurrentAccount().getOrThrow())\n    }\n}\n\n@ExperimentalCoroutinesApi\nfun AccountRepository.watchAccount(accountId: Long) : Flow<Account> {\n    return this.listenEvent().map {\n        this.get(accountId).getOrThrow()\n    }.onStart {\n        emit(get(accountId).getOrThrow())\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/Auth.kt",
    "content": "package net.pantasystem.milktea.model.account\n\ninterface Auth {\n    suspend fun check(): Boolean\n    suspend fun getToken(): String?\n    suspend fun getCurrentAccount(): Account?\n}\n\ninterface AuthById {\n    suspend fun check(id: Long): Boolean\n    suspend fun getToken(id: Long): String?\n}\n\nfun interface GetAccount {\n    suspend fun get(id: Long): Account\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/ClientId.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport java.util.*\n\ndata class ClientId(val clientId: String) {\n    companion object {\n        fun createOrNothing(clientId: ClientId?): ClientId {\n            return if (clientId == null) {\n                ClientId(UUID.randomUUID().toString())\n            } else {\n                clientId\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/ClientIdRepository.kt",
    "content": "package net.pantasystem.milktea.model.account\n\ninterface ClientIdRepository {\n\n    fun getOrCreate(): ClientId\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/CurrentAccountWatcher.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\n\n/**\n * アカウントを指定するとそのアカウントの状態を監視＆イベントを伝えます。\n * アカウントを指定しなかった場合現在のアカウントを返すようになります。\n * @param currentAccountId 監視するアカウントを固定する場合はここに対象のアカウントのIdを指定します。\n */\nclass CurrentAccountWatcher(\n    var currentAccountId: Long?,\n    val accountRepository: AccountRepository\n) {\n    @ExperimentalCoroutinesApi\n    val account\n        get() = currentAccountId?.let {\n            accountRepository.watchAccount(it)\n        }?: accountRepository.watchCurrentAccount()\n\n    suspend fun getAccount() : Account {\n        return currentAccountId?.let {\n            accountRepository.get(it).getOrThrow()\n        }?: accountRepository.getCurrentAccount().getOrThrow()\n    }\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/MakeDefaultPagesUseCase.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.PageableTemplate\nimport net.pantasystem.milktea.model.instance.MetaRepository\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\n\ninterface PageDefaultStrings {\n    val homeTimeline: String\n    val hybridThrowable: String\n    val globalTimeline: String\n    val localTimeline: String\n    val recommendedTimeline: String\n    val media: String\n}\n\n\nclass PageDefaultStringsJp : PageDefaultStrings {\n    override val globalTimeline: String\n        get() = \"グローバル\"\n    override val homeTimeline: String\n        get() = \"ホーム\"\n    override val hybridThrowable: String\n        get() = \"ソーシャル\"\n\n    override val localTimeline: String\n        get() = \"ローカル\"\n    override val recommendedTimeline: String\n        get() = \"一押し\"\n\n    override val media: String\n        get() = \"メディア\"\n}\n\nclass MakeDefaultPagesUseCase(\n    private val pageDefaultStrings: PageDefaultStrings,\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val metaRepository: MetaRepository,\n) : UseCase {\n\n    operator suspend fun invoke(account: Account) : List<Page> {\n        val nodeInfo = nodeInfoRepository.get(account.getHost())\n        val isCalckey = nodeInfo?.type is NodeInfo.SoftwareType.Misskey.Calckey\n        val isFirefish = nodeInfo?.type is NodeInfo.SoftwareType.Firefish\n        return when(account.instanceType) {\n            Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                val meta = metaRepository.find(account.normalizedInstanceUri).getOrNull()\n                val isGlobalEnabled = !(meta?.disableGlobalTimeline ?: false)\n                val isLocalEnabled = !(meta?.disableLocalTimeline ?: false)\n                val defaultPages = ArrayList<Page>()\n                defaultPages.add(PageableTemplate(account).homeTimeline(pageDefaultStrings.homeTimeline))\n                if (isLocalEnabled) {\n                    defaultPages.add(PageableTemplate(account).hybridTimeline(pageDefaultStrings.hybridThrowable))\n                }\n                if (isLocalEnabled) {\n                    defaultPages.add(PageableTemplate(account).hybridTimeline(pageDefaultStrings.media, withFiles = true))\n                } else {\n                    defaultPages.add(PageableTemplate(account).homeTimeline(pageDefaultStrings.media, withFiles = true))\n                }\n                if (isGlobalEnabled) {\n                    defaultPages.add(PageableTemplate(account).globalTimeline(pageDefaultStrings.globalTimeline))\n                }\n                if (isCalckey || isFirefish) {\n                    defaultPages.add(PageableTemplate(account).calckeyRecommendedTimeline(pageDefaultStrings.recommendedTimeline))\n                }\n                defaultPages\n            }\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                listOf(\n                    PageableTemplate(account).mastodonHomeTimeline(pageDefaultStrings.homeTimeline),\n                    PageableTemplate(account).mastodonLocalTimeline(pageDefaultStrings.localTimeline),\n                    PageableTemplate(account).mastodonPublicTimeline(pageDefaultStrings.globalTimeline),\n                )\n            }\n        }.mapIndexed { index, page ->\n            page.also {\n                page.weight = index\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/SignOutUseCase.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport net.pantasystem.milktea.model.UseCase\n\ninterface SignOutUseCase : UseCase {\n    suspend operator fun invoke(account: Account): Result<Unit>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/SyncAccountInfoUseCase.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass SyncAccountInfoUseCase @Inject constructor(\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val userRepository: UserRepository,\n    private val accountRepository: AccountRepository,\n) {\n\n    suspend operator fun invoke(account: Account): Result<Unit> = runCancellableCatching {\n        val nodeInfo = nodeInfoRepository.find(account.getHost()).getOrThrow()\n        val user = userRepository.find(User.Id(account.accountId, account.remoteId))\n        val remoteSoftwareType = when (nodeInfo.type) {\n            is NodeInfo.SoftwareType.Firefish -> Account.InstanceType.FIREFISH\n            is NodeInfo.SoftwareType.Mastodon -> Account.InstanceType.MASTODON\n            is NodeInfo.SoftwareType.Misskey -> Account.InstanceType.MISSKEY\n            is NodeInfo.SoftwareType.Pleroma -> Account.InstanceType.PLEROMA\n            is NodeInfo.SoftwareType.Other -> throw IllegalStateException(\"unknown type of software:${nodeInfo.type}\")\n        }\n        if (account.instanceType != remoteSoftwareType || user.userName != account.userName) {\n            accountRepository.add(\n                account.copy(\n                    instanceType = remoteSoftwareType,\n                    userName = user.userName\n                ), false\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/UnauthorizedException.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nclass UnauthorizedException(s: String? = null) : IllegalAccessException(s ?: \"\")"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/page/Page.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\nimport android.os.Parcelable\nimport kotlinx.parcelize.Parcelize\nimport java.io.Serializable\n\n\n@Parcelize\ndata class Page(\n    var accountId: Long,\n    val title: String,\n    var weight: Int,\n    val pageParams: PageParams,\n    val isSavePagePosition: Boolean,\n    val attachedAccountId: Long?,\n    var pageId: Long,\n) : Serializable, Parcelable {\n\n    constructor(\n        accountId: Long,\n        title: String,\n        weight: Int,\n        pageable: Pageable,\n        isSavePagePosition: Boolean = false,\n        attachedAccountId: Long? = null,\n        pageId: Long = 0,\n    ) : this(\n        accountId,\n        title,\n        weight,\n        pageable.toParams(),\n        isSavePagePosition,\n        attachedAccountId,\n        pageId\n    )\n\n\n    fun pageable(): Pageable {\n        return pageParams.toPageable()\n    }\n\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/page/PageParams.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\n\nimport android.os.Parcelable\nimport kotlinx.parcelize.Parcelize\nimport net.pantasystem.milktea.model.account.page.PageType.*\nimport java.io.Serializable\n\n@Parcelize\ndata class PageParams(\n    val type: PageType = HOME,\n    val withFiles: Boolean? = null,\n    var excludeNsfw: Boolean? = null,\n    var includeLocalRenotes: Boolean? = null,\n    var includeMyRenotes: Boolean? = null,\n    var includeRenotedMyRenotes: Boolean? = null,\n    val listId: String? = null,\n    val following: Boolean? = null,\n    val visibility: String? = null,\n    val noteId: String? = null,\n    val tag: String? = null,\n    var reply: Boolean? = null,\n    var renote: Boolean? = null,\n    var poll: Boolean? = null,\n    val offset: Int? = null,\n    var markAsRead: Boolean? = null,\n    val userId: String? = null,\n    var includeReplies: Boolean? = null,\n    var query: String? = null,\n    var host: String? = null,\n    val antennaId: String? = null,\n    val channelId: String? = null,\n    val clipId: String? = null,\n    val excludeReplies: Boolean? = null,\n    val excludeReposts: Boolean? = null,\n    val excludeIfExistsSensitiveMedia: Boolean? = null,\n) : Serializable, Parcelable {\n\n\n    // * Global, Local, Hybrid, Home, UserList, Mention, Show, SearchByTag, Featured, Notification, UserTimeline, Search, Antenna\n    @Throws(IllegalStateException::class)\n    fun toPageable(): Pageable {\n        try {\n            return when (this.type) {\n                HOME -> {\n                    Pageable.HomeTimeline(\n                        withFiles = withFiles,\n                        includeLocalRenotes = includeLocalRenotes,\n                        includeMyRenotes = includeMyRenotes,\n                        includeRenotedMyRenotes = includeRenotedMyRenotes,\n                        excludeReposts = excludeReposts,\n                        excludeReplies = excludeReplies,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                LOCAL -> {\n                    Pageable.LocalTimeline(\n                        withFiles = withFiles,\n                        excludeNsfw = excludeNsfw,\n                        excludeReplies = excludeReplies,\n                        excludeReposts = excludeReposts,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                SOCIAL -> {\n                    Pageable.HybridTimeline(\n                        withFiles = withFiles,\n                        includeRenotedMyRenotes = includeRenotedMyRenotes,\n                        includeMyRenotes = includeMyRenotes,\n                        includeLocalRenotes = includeLocalRenotes,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                GLOBAL -> {\n                    Pageable.GlobalTimeline(\n                        withFiles = withFiles,\n                        excludeReposts = excludeReposts,\n                        excludeReplies = excludeReplies,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                SEARCH -> {\n                    Pageable.Search(\n                        query = query!!,\n                        host = host,\n                        userId = userId,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                SEARCH_HASH -> {\n                    Pageable.SearchByTag(\n                        tag = tag!!,\n                        reply = reply,\n                        renote = renote,\n                        withFiles = withFiles,\n                        poll = poll,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                USER -> {\n                    Pageable.UserTimeline(\n                        userId = userId!!,\n                        includeMyRenotes = includeMyRenotes,\n                        includeReplies = includeReplies,\n                        withFiles = withFiles,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                FAVORITE -> {\n                    Pageable.Favorite\n                }\n                FEATURED -> {\n                    Pageable.Featured(offset = offset)\n                }\n                DETAIL -> {\n                    Pageable.Show(\n                        noteId = noteId!!\n                    )\n                }\n                USER_LIST -> {\n                    Pageable.UserListTimeline(\n                        listId = listId!!,\n                        withFiles = withFiles,\n                        includeMyRenotes = includeMyRenotes,\n                        includeLocalRenotes = includeLocalRenotes,\n                        includeRenotedMyRenotes = includeRenotedMyRenotes,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia\n                    )\n                }\n                MENTION -> {\n                    Pageable.Mention(\n                        following = following,\n                        visibility = visibility,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia\n                    )\n                }\n                ANTENNA -> {\n                    Pageable.Antenna(\n                        antennaId = antennaId!!,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                NOTIFICATION -> {\n                    Pageable.Notification(\n                        following = following,\n                        markAsRead = markAsRead\n                    )\n\n                }\n                GALLERY_POPULAR -> {\n                    Pageable.Gallery.Popular\n                }\n                GALLERY_FEATURED -> {\n                    Pageable.Gallery.Featured\n                }\n                GALLERY_POSTS -> {\n                    Pageable.Gallery.Posts\n                }\n                USERS_GALLERY_POSTS -> {\n                    Pageable.Gallery.User(userId!!)\n                }\n                I_LIKED_GALLERY_POSTS -> {\n                    Pageable.Gallery.ILikedPosts\n                }\n                MY_GALLERY_POSTS -> {\n                    Pageable.Gallery.MyPosts\n                }\n                CHANNEL_TIMELINE -> {\n                    Pageable.ChannelTimeline(channelId!!, excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia)\n                }\n                MASTODON_LOCAL_TIMELINE -> {\n                    Pageable.Mastodon.LocalTimeline(\n                        isOnlyMedia = withFiles,\n                        excludeReposts = excludeReposts,\n                        excludeReplies = excludeReplies,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                MASTODON_PUBLIC_TIMELINE -> {\n                    Pageable.Mastodon.PublicTimeline(\n                        isOnlyMedia = withFiles,\n                        excludeReposts = excludeReposts,\n                        excludeReplies = excludeReplies,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                MASTODON_HOME_TIMELINE -> {\n                    Pageable.Mastodon.HomeTimeline(\n                        excludeReposts = excludeReposts,\n                        excludeReplies = excludeReplies,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                MASTODON_LIST_TIMELINE -> {\n                    Pageable.Mastodon.ListTimeline(\n                        listId = requireNotNull(listId),\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                MASTODON_USER_TIMELINE -> {\n                    Pageable.Mastodon.UserTimeline(\n                        userId = requireNotNull(userId),\n                        isOnlyMedia = withFiles,\n                        excludeReblogs = includeMyRenotes?.not(),\n                        excludeReplies = includeReplies?.not(),\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                CALCKEY_RECOMMENDED_TIMELINE -> {\n                    Pageable.CalckeyRecommendedTimeline\n                }\n                CLIP_NOTES -> {\n                    Pageable.ClipNotes(\n                        clipId = requireNotNull(clipId)\n                    )\n                }\n                MASTODON_BOOKMARK_TIMELINE -> {\n                    Pageable.Mastodon.BookmarkTimeline\n                }\n                MASTODON_SEARCH_TIMELINE -> {\n                    Pageable.Mastodon.SearchTimeline(\n                        query = requireNotNull(query),\n                        userId = userId,\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                MASTODON_TAG_TIMELINE -> {\n                    Pageable.Mastodon.HashTagTimeline(\n                        requireNotNull(tag),\n                        excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                    )\n                }\n                MASTODON_TREND_TIMELINE -> {\n                    Pageable.Mastodon.TrendTimeline\n                }\n                MASTODON_MENTION_TIMELINE -> {\n                    Pageable.Mastodon.Mention\n                }\n            }\n        } catch (e: NullPointerException) {\n            throw IllegalStateException(\"パラメーターに問題があります: $this\")\n        }\n\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/page/PageType.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\n\nenum class PageType(val defaultName: String, val label: String){\n    HOME(\"Home\", \"HOME\"),\n    LOCAL(\"Local\", \"LOCAL\"),\n    SOCIAL(\"Social\", \"SOCIAL\"),\n    GLOBAL(\"Global\", \"GLOBAL\"),\n    SEARCH(\"Search\", \"SEARCH\"),\n    SEARCH_HASH(\"Hash\", \"SEARCH_HASH\"),\n    USER(\"User\", \"USER\"),\n    FAVORITE(\"Favorite\", \"FAVORITE\"),\n    FEATURED(\"Featured\", \"FEATURED\"),\n    DETAIL(\"Detail\", \"DETAIL\"),\n    USER_LIST(\"List\", \"USER_LIST\"),\n    MENTION(\"Mention\", \"MENTION\"),\n    ANTENNA(\"Antenna\", \"ANTENNA\"),\n    NOTIFICATION(\"Notification\", \"NOTIFICATION\"),\n    GALLERY_FEATURED(\"GalleryFeatured\", \"GALLERY_FEATURED\"),\n    GALLERY_POPULAR(\"GalleryPopular\", \"GALLERY_POPULAR\"),\n    GALLERY_POSTS(\"GalleryPosts\", \"GALLERY_POSTS\"),\n    USERS_GALLERY_POSTS(\"UsersGalleryPosts\", \"USERS_GALLERY_POSTS\"),\n    MY_GALLERY_POSTS(\"MyGalleryPosts\", \"MY_GALLERY_POSTS\"),\n    I_LIKED_GALLERY_POSTS(\"ILikedGalleryPosts\", \"I_LIKED_GALLERY_POSTS\"),\n    CHANNEL_TIMELINE(\"Channel\", \"CHANNEL_TIMELINE\"),\n    MASTODON_LOCAL_TIMELINE(\"MastodonLocalTimeline\", \"MASTODON_LOCAL_TIMELINE\"),\n    MASTODON_PUBLIC_TIMELINE(\"MastodonPublicTimeline\", \"MASTODON_PUBLIC_TIMELINE\"),\n    MASTODON_HOME_TIMELINE(\"MastodonHomeTimeline\", \"MASTODON_HOME_TIMELINE\"),\n    MASTODON_LIST_TIMELINE(\"MastodonListTimeline\", \"MASTODON_LIST_TIMELINE\"),\n    MASTODON_USER_TIMELINE(\"MastodonUserTimeline\", \"MASTODON_USER_TIMELINE\"),\n    MASTODON_BOOKMARK_TIMELINE(\"MastodonBookmarkTimeline\", \"MASTODON_BOOKMARK_TIMELINE\"),\n    MASTODON_SEARCH_TIMELINE(\"MastodonSearchTimeline\", \"MASTODON_SEARCH_TIMELINE\"),\n    MASTODON_TAG_TIMELINE(\"MastodonTagTimeline\", \"MASTODON_TAG_TIMELINE\"),\n    MASTODON_TREND_TIMELINE(\"MastodonTrendTimeline\", \"MASTODON_TREND_TIMELINE\"),\n    CALCKEY_RECOMMENDED_TIMELINE(\"CalckeyRecommendedTimeline\", \"CALCKEY_RECOMMENDED_TIMELINE\"),\n\n    CLIP_NOTES(\"ClipNotes\", \"CLIP_NOTES\"),\n\n    MASTODON_MENTION_TIMELINE(\"MastodonMentionTimeline\", \"MASTODON_MENTION_TIMELINE\"),\n\n    //USER_PINは別\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/page/Pageable.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\nimport java.io.Serializable\n\n/**\n * Global, Local, Hybrid, Home, UserList, Mention, Show, SearchByTag, Featured, Notification, UserTimeline, Search, Antenna\n */\nsealed class Pageable : Serializable {\n\n    data class GlobalTimeline(\n\n        var withFiles: Boolean? = null,\n        var excludeReposts: Boolean? = null,\n        var excludeReplies: Boolean? = null,\n        val excludeIfExistsSensitiveMedia: Boolean? = null\n    ) : Pageable(), UntilPaginate, SincePaginate,\n        CanOnlyMedia<GlobalTimeline>,\n        CanExcludeReplies<GlobalTimeline>,\n        CanExcludeReposts<GlobalTimeline>,\n        CanExcludeIfExistsSensitiveMedia<GlobalTimeline> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                withFiles = withFiles,\n                type = PageType.GLOBAL,\n                excludeReplies = excludeReplies,\n                excludeReposts = excludeReposts,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun setOnlyMedia(isOnlyMedia: Boolean): GlobalTimeline {\n            // NOTE: Misskeyの場合falseを指定してしまうとファイルを除外してしまう\n            // NOTE: setMediaOnlyなのにファイルを除外してしまう挙動をしてしまうのは不自然なのでfalseの場合はnullを指定している\n            return copy(\n                withFiles = isOnlyMedia.takeIf {\n                    it\n                }\n            )\n        }\n\n        override fun getOnlyMedia(): Boolean {\n            return withFiles ?: false\n        }\n\n        override fun getExcludeReplies(): Boolean {\n            return excludeReplies ?: false\n        }\n\n        override fun setExcludeReplies(isExcludeReplies: Boolean): GlobalTimeline {\n            return copy(\n                excludeReplies = isExcludeReplies\n            )\n        }\n\n        override fun getExcludeReposts(): Boolean {\n            return excludeReposts ?: false\n        }\n\n        override fun setExcludeReposts(isExcludeReposts: Boolean): GlobalTimeline {\n            return copy(\n                excludeReposts = isExcludeReposts\n            )\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): GlobalTimeline {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class LocalTimeline(\n\n        var withFiles: Boolean? = null,\n        var excludeNsfw: Boolean? = null,\n        var excludeReplies: Boolean? = null,\n        var excludeReposts: Boolean? = null,\n        var excludeIfExistsSensitiveMedia: Boolean? = null\n\n    ) : Pageable(), UntilPaginate, SincePaginate, CanOnlyMedia<LocalTimeline>,\n        CanExcludeReplies<LocalTimeline>, CanExcludeReposts<LocalTimeline>, CanExcludeIfExistsSensitiveMedia<LocalTimeline> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.LOCAL,\n                withFiles = withFiles,\n                excludeNsfw = excludeNsfw,\n                excludeReplies = excludeReplies,\n                excludeReposts = excludeReposts\n            )\n        }\n\n        override fun setOnlyMedia(isOnlyMedia: Boolean): LocalTimeline {\n            return copy(\n                withFiles = isOnlyMedia.takeIf {\n                    it\n                }\n            )\n        }\n\n        override fun getOnlyMedia(): Boolean {\n            return withFiles ?: false\n        }\n\n        override fun setExcludeReplies(isExcludeReplies: Boolean): LocalTimeline {\n            return copy(\n                excludeReplies = isExcludeReplies\n            )\n        }\n\n        override fun getExcludeReplies(): Boolean {\n            return excludeReplies ?: false\n        }\n\n        override fun setExcludeReposts(isExcludeReposts: Boolean): LocalTimeline {\n            return copy(\n                excludeReposts = isExcludeReposts\n            )\n        }\n\n        override fun getExcludeReposts(): Boolean {\n            return excludeReposts ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): LocalTimeline {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n    }\n\n    data class HybridTimeline(\n\n        var withFiles: Boolean? = null,\n        var includeLocalRenotes: Boolean? = null,\n        var includeMyRenotes: Boolean? = null,\n        var includeRenotedMyRenotes: Boolean? = null,\n        var excludeReplies: Boolean? = null,\n        var excludeReposts: Boolean? = null,\n        var excludeIfExistsSensitiveMedia: Boolean? = null\n\n    ) : Pageable(), UntilPaginate, SincePaginate, CanOnlyMedia<HybridTimeline>,\n        CanExcludeReplies<HybridTimeline>, CanExcludeReposts<HybridTimeline>, CanExcludeIfExistsSensitiveMedia<HybridTimeline> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                type = PageType.SOCIAL,\n                withFiles = withFiles,\n                includeLocalRenotes = includeLocalRenotes,\n                includeMyRenotes = includeMyRenotes,\n                includeRenotedMyRenotes = includeRenotedMyRenotes,\n                excludeReplies = excludeReplies,\n                excludeReposts = excludeReposts,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun setOnlyMedia(isOnlyMedia: Boolean): HybridTimeline {\n            return copy(\n                withFiles = isOnlyMedia.takeIf {\n                    it\n                }\n            )\n        }\n\n        override fun getOnlyMedia(): Boolean {\n            return withFiles ?: false\n        }\n\n        override fun setExcludeReplies(isExcludeReplies: Boolean): HybridTimeline {\n            return copy(\n                excludeReplies = isExcludeReplies\n            )\n        }\n\n        override fun getExcludeReplies(): Boolean {\n            return excludeReplies ?: false\n        }\n\n        override fun setExcludeReposts(isExcludeReposts: Boolean): HybridTimeline {\n            return copy(\n                excludeReposts = isExcludeReposts\n            )\n        }\n\n        override fun getExcludeReposts(): Boolean {\n            return excludeReposts ?: false\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): HybridTimeline {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class HomeTimeline(\n\n        var withFiles: Boolean? = null,\n        var includeLocalRenotes: Boolean? = null,\n        var includeMyRenotes: Boolean? = null,\n        var includeRenotedMyRenotes: Boolean? = null,\n        var excludeReplies: Boolean? = null,\n        var excludeReposts: Boolean? = null,\n        var excludeIfExistsSensitiveMedia: Boolean? = null\n\n    ) : Pageable(), UntilPaginate, SincePaginate, CanOnlyMedia<HomeTimeline>,\n        CanExcludeReplies<HomeTimeline>, CanExcludeReposts<HomeTimeline>, CanExcludeIfExistsSensitiveMedia<HomeTimeline> {\n\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.HOME,\n                withFiles = withFiles,\n                includeRenotedMyRenotes = includeRenotedMyRenotes,\n                includeLocalRenotes = includeLocalRenotes,\n                includeMyRenotes = includeMyRenotes,\n                excludeReplies = excludeReplies,\n                excludeReposts = excludeReposts,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun setOnlyMedia(isOnlyMedia: Boolean): HomeTimeline {\n            return copy(\n                withFiles = isOnlyMedia.takeIf {\n                    it\n                }\n            )\n        }\n\n        override fun getOnlyMedia(): Boolean {\n            return withFiles ?: false\n        }\n\n        override fun setExcludeReplies(isExcludeReplies: Boolean): HomeTimeline {\n            return copy(\n                excludeReplies = isExcludeReplies\n            )\n        }\n\n        override fun getExcludeReplies(): Boolean {\n            return excludeReplies ?: false\n        }\n\n        override fun setExcludeReposts(isExcludeReposts: Boolean): HomeTimeline {\n            return copy(\n                excludeReposts = isExcludeReposts\n            )\n        }\n\n        override fun getExcludeReposts(): Boolean {\n            return excludeReposts ?: false\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): HomeTimeline {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class UserListTimeline(\n\n        val listId: String,\n        var withFiles: Boolean? = null,\n        var includeLocalRenotes: Boolean? = null,\n        var includeMyRenotes: Boolean? = null,\n        var includeRenotedMyRenotes: Boolean? = null,\n        var excludeIfExistsSensitiveMedia: Boolean? = null,\n    ) : Pageable(), UntilPaginate, SincePaginate, CanOnlyMedia<UserListTimeline>, CanExcludeIfExistsSensitiveMedia<UserListTimeline> {\n\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.USER_LIST,\n                listId = listId,\n                withFiles = withFiles,\n                includeLocalRenotes = includeLocalRenotes,\n                includeMyRenotes = includeMyRenotes,\n                includeRenotedMyRenotes = includeRenotedMyRenotes,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun setOnlyMedia(isOnlyMedia: Boolean): UserListTimeline {\n            return copy(\n                withFiles = isOnlyMedia.takeIf {\n                    it\n                }\n            )\n        }\n\n        override fun getOnlyMedia(): Boolean {\n            return withFiles ?: false\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): UserListTimeline {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class ChannelTimeline(\n        val channelId: String,\n        val excludeIfExistsSensitiveMedia: Boolean? = null,\n    ) : Pageable(), UntilPaginate, SincePaginate, CanExcludeIfExistsSensitiveMedia<ChannelTimeline> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.CHANNEL_TIMELINE,\n                channelId = channelId,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): ChannelTimeline {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class Mention(\n\n        val following: Boolean?,\n        val visibility: String? = null,\n        val excludeIfExistsSensitiveMedia: Boolean? = null\n\n    ) : Pageable(), UntilPaginate, SincePaginate, CanExcludeIfExistsSensitiveMedia<Mention> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.MENTION,\n                following = following,\n                visibility = visibility,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): Mention {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class Show(\n\n        val noteId: String\n\n    ) : Pageable() {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.DETAIL,\n                noteId = noteId\n            )\n        }\n    }\n\n    data class SearchByTag(\n\n        val tag: String, var reply: Boolean? = null,\n        var renote: Boolean? = null,\n        var withFiles: Boolean? = null,\n        var poll: Boolean? = null,\n        val excludeIfExistsSensitiveMedia: Boolean? = null\n    ) : Pageable(), UntilPaginate, SincePaginate, CanOnlyMedia<SearchByTag>, CanExcludeIfExistsSensitiveMedia<SearchByTag> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.SEARCH_HASH,\n                tag = tag,\n                reply = reply,\n                renote = renote,\n                withFiles = withFiles,\n                poll = poll,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun setOnlyMedia(isOnlyMedia: Boolean): SearchByTag {\n            return copy(\n                withFiles = isOnlyMedia.takeIf {\n                    it\n                }\n            )\n        }\n\n        override fun getOnlyMedia(): Boolean {\n            return withFiles ?: false\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): SearchByTag {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class Featured(\n\n        val offset: Int?\n\n    ) : Pageable() {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.FEATURED,\n                offset = offset\n            )\n        }\n    }\n\n    data class Notification(\n\n        var following: Boolean? = null,\n        var markAsRead: Boolean? = null\n\n    ) : Pageable(), SincePaginate, UntilPaginate {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.NOTIFICATION,\n                following = following,\n                markAsRead = markAsRead\n            )\n        }\n    }\n\n    data class UserTimeline(\n\n        val userId: String,\n        var includeReplies: Boolean? = true,\n        var includeMyRenotes: Boolean? = true,\n        var withFiles: Boolean? = null,\n        val excludeIfExistsSensitiveMedia: Boolean? = null\n\n    ) : Pageable(), SincePaginate, UntilPaginate, CanOnlyMedia<UserTimeline>, CanExcludeIfExistsSensitiveMedia<UserTimeline> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.USER,\n                includeReplies = includeReplies,\n                includeMyRenotes = includeMyRenotes,\n                withFiles = withFiles,\n                userId = userId,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun setOnlyMedia(isOnlyMedia: Boolean): UserTimeline {\n            return copy(\n                withFiles = isOnlyMedia.takeIf {\n                    it\n                }\n            )\n        }\n\n        override fun getOnlyMedia(): Boolean {\n            return withFiles ?: false\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): UserTimeline {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class Search(\n\n        var query: String,\n        var host: String? = null,\n        var userId: String? = null,\n        val excludeIfExistsSensitiveMedia: Boolean? = null\n\n    ) : Pageable(), SincePaginate, UntilPaginate, CanExcludeIfExistsSensitiveMedia<Search> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.SEARCH,\n                query = query,\n                host = host,\n                userId = userId\n            )\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): Search {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class Antenna(\n\n        val antennaId: String,\n        val excludeIfExistsSensitiveMedia: Boolean? = null,\n    ) : Pageable(), UntilPaginate, SincePaginate, CanExcludeIfExistsSensitiveMedia<Antenna> {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.ANTENNA,\n                antennaId = antennaId,\n                excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n            )\n        }\n\n        override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n            return excludeIfExistsSensitiveMedia ?: false\n        }\n\n        override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): Antenna {\n            return copy(\n                excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n            )\n        }\n    }\n\n    data class ClipNotes(\n        val clipId: String\n    ) : Pageable(), UntilPaginate, SincePaginate {\n        override fun toParams(): PageParams {\n            return PageParams(\n                PageType.CLIP_NOTES,\n                clipId = clipId\n            )\n        }\n    }\n\n    object Favorite : Pageable(), UntilPaginate, SincePaginate {\n        override fun toParams(): PageParams {\n            return PageParams(PageType.FAVORITE)\n        }\n    }\n\n    sealed class Gallery : Pageable() {\n        object Posts : Gallery(), UntilPaginate, SincePaginate {\n            override fun toParams(): PageParams {\n                return PageParams(type = PageType.GALLERY_POSTS)\n            }\n        }\n\n        object Featured : Gallery() {\n            override fun toParams(): PageParams {\n                return PageParams(type = PageType.GALLERY_FEATURED)\n            }\n        }\n\n        object Popular : Gallery() {\n            override fun toParams(): PageParams {\n                return PageParams(type = PageType.GALLERY_POPULAR)\n            }\n        }\n\n        data class User(val userId: String) : Gallery(), UntilPaginate, SincePaginate {\n            override fun toParams(): PageParams {\n                return PageParams(type = PageType.USERS_GALLERY_POSTS, userId = userId)\n            }\n        }\n\n        object MyPosts : Gallery(), UntilPaginate, SincePaginate {\n            override fun toParams(): PageParams {\n                return PageParams(type = PageType.MY_GALLERY_POSTS)\n            }\n        }\n\n        object ILikedPosts : Gallery(), UntilPaginate, SincePaginate {\n            override fun toParams(): PageParams {\n                return PageParams(type = PageType.I_LIKED_GALLERY_POSTS)\n            }\n        }\n    }\n\n    sealed class Mastodon : Pageable() {\n        data class PublicTimeline(\n            val isOnlyMedia: Boolean? = null,\n            val excludeReplies: Boolean? = null,\n            val excludeReposts: Boolean? = null,\n            val excludeIfExistsSensitiveMedia: Boolean? = null,\n        ) : Mastodon(), CanOnlyMedia<PublicTimeline>, UntilPaginate, SincePaginate, CanExcludeReplies<PublicTimeline>, CanExcludeReposts<PublicTimeline>, CanExcludeIfExistsSensitiveMedia<PublicTimeline> {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_PUBLIC_TIMELINE,\n                    withFiles = isOnlyMedia,\n                    excludeReplies = excludeReplies,\n                    excludeReposts = excludeReposts,\n                    excludeIfExistsSensitiveMedia = excludeIfExistsSensitiveMedia,\n                )\n            }\n\n            override fun setOnlyMedia(isOnlyMedia: Boolean): PublicTimeline {\n                return copy(\n                    isOnlyMedia = isOnlyMedia\n                )\n            }\n\n            override fun getOnlyMedia(): Boolean {\n                return isOnlyMedia ?: false\n            }\n\n            override fun setExcludeReplies(isExcludeReplies: Boolean): PublicTimeline {\n                return copy(\n                    excludeReplies = isExcludeReplies\n                )\n            }\n\n            override fun getExcludeReplies(): Boolean {\n                return excludeReplies ?: false\n            }\n\n            override fun setExcludeReposts(isExcludeReposts: Boolean): PublicTimeline {\n                return copy(\n                    excludeReposts = isExcludeReposts\n                )\n            }\n\n            override fun getExcludeReposts(): Boolean {\n                return excludeReposts ?: false\n            }\n\n            override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n                return excludeIfExistsSensitiveMedia ?: false\n            }\n\n            override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): PublicTimeline {\n                return copy(\n                    excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n                )\n            }\n        }\n\n        data class LocalTimeline(\n            val isOnlyMedia: Boolean? = null,\n            val excludeReplies: Boolean? = null,\n            val excludeReposts: Boolean? = null,\n            val excludeIfExistsSensitiveMedia: Boolean? = null,\n        ) : Mastodon(), CanOnlyMedia<LocalTimeline>, UntilPaginate, SincePaginate, CanExcludeReplies<LocalTimeline>, CanExcludeReposts<LocalTimeline>, CanExcludeIfExistsSensitiveMedia<LocalTimeline> {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_LOCAL_TIMELINE,\n                    withFiles = isOnlyMedia,\n                    excludeReplies = excludeReplies,\n                    excludeReposts = excludeReposts\n                )\n            }\n\n            override fun setOnlyMedia(isOnlyMedia: Boolean): LocalTimeline {\n                return copy(\n                    isOnlyMedia = isOnlyMedia\n                )\n            }\n\n            override fun getOnlyMedia(): Boolean {\n                return isOnlyMedia ?: false\n            }\n\n            override fun setExcludeReplies(isExcludeReplies: Boolean): LocalTimeline {\n                return copy(\n                    excludeReplies = isExcludeReplies\n                )\n            }\n\n            override fun getExcludeReplies(): Boolean {\n                return excludeReplies ?: false\n            }\n\n            override fun setExcludeReposts(isExcludeReposts: Boolean): LocalTimeline {\n                return copy(\n                    excludeReposts = isExcludeReposts\n                )\n            }\n\n            override fun getExcludeReposts(): Boolean {\n                return excludeReposts ?: false\n            }\n\n            override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n                return excludeIfExistsSensitiveMedia ?: false\n            }\n\n            override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): LocalTimeline {\n                return copy(\n                    excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n                )\n            }\n        }\n\n        data class HashTagTimeline(val hashtag: String, val isOnlyMedia: Boolean? = null, val excludeIfExistsSensitiveMedia: Boolean? = null) :\n            Mastodon(), CanOnlyMedia<HashTagTimeline>, SincePaginate, UntilPaginate, CanExcludeIfExistsSensitiveMedia<HashTagTimeline> {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_TAG_TIMELINE,\n                    tag = hashtag,\n                    withFiles = isOnlyMedia\n                )\n            }\n\n            override fun setOnlyMedia(isOnlyMedia: Boolean): HashTagTimeline {\n                return copy(\n                    isOnlyMedia = isOnlyMedia\n                )\n            }\n\n            override fun getOnlyMedia(): Boolean {\n                return isOnlyMedia ?: false\n            }\n\n            override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n                return excludeIfExistsSensitiveMedia ?: false\n            }\n\n            override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): HashTagTimeline {\n                return copy(\n                    excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n                )\n            }\n        }\n\n        data class ListTimeline(val listId: String, val excludeIfExistsSensitiveMedia: Boolean? = null) : Mastodon(), SincePaginate, UntilPaginate, CanExcludeIfExistsSensitiveMedia<ListTimeline> {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_LIST_TIMELINE,\n                    listId = listId,\n                )\n            }\n\n            override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n                return excludeIfExistsSensitiveMedia ?: false\n            }\n\n            override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): ListTimeline {\n                return copy(\n                    excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n                )\n            }\n        }\n\n        data class HomeTimeline(\n            val excludeReplies: Boolean? = null,\n            val excludeReposts: Boolean? = null,\n            val excludeIfExistsSensitiveMedia: Boolean? = null,\n        ) : Mastodon(), SincePaginate, UntilPaginate, CanExcludeReposts<HomeTimeline>, CanExcludeReplies<HomeTimeline>, CanExcludeIfExistsSensitiveMedia<HomeTimeline> {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_HOME_TIMELINE,\n                    excludeReplies = excludeReplies,\n                    excludeReposts = excludeReposts\n                )\n            }\n\n            override fun getExcludeReposts(): Boolean {\n                return excludeReposts ?: false\n            }\n\n            override fun getExcludeReplies(): Boolean {\n                return excludeReplies ?: false\n            }\n\n            override fun setExcludeReplies(isExcludeReplies: Boolean): HomeTimeline {\n                return copy(\n                    excludeReplies = isExcludeReplies\n                )\n            }\n\n            override fun setExcludeReposts(isExcludeReposts: Boolean): HomeTimeline {\n                return copy(\n                    excludeReposts = isExcludeReposts\n                )\n            }\n\n            override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n                return excludeIfExistsSensitiveMedia ?: false\n            }\n\n            override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): HomeTimeline {\n                return copy(\n                    excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n                )\n            }\n        }\n\n        data class UserTimeline(\n            val userId: String,\n            val isOnlyMedia: Boolean? = null,\n            val excludeReplies: Boolean? = null,\n            val excludeReblogs: Boolean? = null,\n            val excludeIfExistsSensitiveMedia: Boolean? = null,\n        ) : Mastodon(), CanOnlyMedia<UserTimeline>, SincePaginate, UntilPaginate, CanExcludeIfExistsSensitiveMedia<UserTimeline> {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_USER_TIMELINE,\n                    withFiles = isOnlyMedia,\n                    includeReplies = excludeReplies?.not(),\n                    includeMyRenotes = excludeReblogs?.not(),\n                    userId = userId\n                )\n            }\n\n            override fun setOnlyMedia(isOnlyMedia: Boolean): UserTimeline {\n                return copy(isOnlyMedia = isOnlyMedia)\n            }\n\n            override fun getOnlyMedia(): Boolean {\n                return isOnlyMedia ?: false\n            }\n\n            override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n                return excludeIfExistsSensitiveMedia ?: false\n            }\n\n            override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): UserTimeline {\n                return copy(\n                    excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n                )\n            }\n        }\n\n        object BookmarkTimeline : Mastodon(), SincePaginate, UntilPaginate {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_BOOKMARK_TIMELINE\n                )\n            }\n        }\n\n        data class SearchTimeline(\n            val query: String,\n            val userId: String? = null,\n            val excludeIfExistsSensitiveMedia: Boolean? = null,\n        ) : Mastodon(), CanExcludeIfExistsSensitiveMedia<SearchTimeline> {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_SEARCH_TIMELINE,\n                    query = query,\n                    userId = userId,\n                )\n            }\n\n            override fun getExcludeIfExistsSensitiveMedia(): Boolean {\n                return excludeIfExistsSensitiveMedia ?: false\n            }\n\n            override fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): SearchTimeline {\n                return copy(\n                    excludeIfExistsSensitiveMedia = isExcludeIfExistsSensitiveMedia\n                )\n            }\n        }\n\n        object TrendTimeline : Mastodon() {\n            override fun toParams(): PageParams {\n                return PageParams(\n\n                )\n            }\n        }\n\n        data object Mention : Mastodon() {\n            override fun toParams(): PageParams {\n                return PageParams(\n                    type = PageType.MASTODON_MENTION_TIMELINE\n                )\n            }\n        }\n\n    }\n\n    object CalckeyRecommendedTimeline : Pageable(), UntilPaginate, SincePaginate {\n        override fun toParams(): PageParams {\n            return PageParams(\n                type = PageType.CALCKEY_RECOMMENDED_TIMELINE,\n            )\n        }\n    }\n\n\n    abstract fun toParams(): PageParams\n\n\n}\n\n/**\n * リクエスト時にwithFiles(Misskey)の指定が可能なタイムライン種別であることを表すためのインターフェース\n * これを継承したPageableはメディアのみ、あるいはメディアを除外したリクエストを送信することができる。\n * 注意点がありMisskeyの場合デフォルトがundefined(null)になるがMastodonではfalseがデフォルトになる。\n * またMisskeyの場合trueを指定するとファイルが添付されたノートのみになり、\n * falseを指定するとファイルが添付されていないノートのみになる。\n */\ninterface CanOnlyMedia<T> {\n    fun setOnlyMedia(isOnlyMedia: Boolean): T\n    fun getOnlyMedia(): Boolean\n}\n\ninterface CanExcludeReplies<T> {\n    fun setExcludeReplies(isExcludeReplies: Boolean): T\n    fun getExcludeReplies(): Boolean\n}\n\ninterface CanExcludeReposts<T> {\n    fun setExcludeReposts(isExcludeReposts: Boolean): T\n    fun getExcludeReposts(): Boolean\n}\n\ninterface CanExcludeIfExistsSensitiveMedia<T> {\n    fun setExcludeIfExistsSensitiveMedia(isExcludeIfExistsSensitiveMedia: Boolean): T\n    fun getExcludeIfExistsSensitiveMedia(): Boolean\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/page/PageableTemplate.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.antenna.Antenna\nimport net.pantasystem.milktea.model.list.UserList\nimport net.pantasystem.milktea.model.user.User\n\nclass PageableTemplate(val account: Account?) {\n    fun globalTimeline(title: String): Page {\n        return Page(account?.accountId?: - 1, title, 0, Pageable.GlobalTimeline())\n    }\n    fun hybridTimeline(title: String, withFiles: Boolean? = null) =\n        Page(account?.accountId?: - 1, title, 0, Pageable.HybridTimeline(withFiles = withFiles))\n\n    fun localTimeline(title: String) =\n        Page(account?.accountId?: - 1, title, 0, Pageable.LocalTimeline())\n\n    fun homeTimeline(title: String, withFiles: Boolean? = null) = Page(account?.accountId?: - 1, title, 0, Pageable.HomeTimeline(withFiles = withFiles), isSavePagePosition = true)\n\n    fun userListTimeline(listId: String) = Pageable.UserListTimeline(listId = listId)\n\n    fun userListTimeline(userList: UserList): Page {\n        return Page(account?.accountId?: - 1, userList.name, 0,  Pageable.UserListTimeline(userList.id.userListId))\n    }\n    fun mention(title: String): Page {\n        return Page(account?.accountId?: - 1, title, 0, Pageable.Mention(null))\n    }\n\n    fun show(noteId: String, title: String): Page {\n        return Page(account?.accountId?: - 1, title, 0, Pageable.Show(noteId))\n    }\n    fun tag(tag: String): Page {\n        return when(account?.instanceType) {\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> Page(account.accountId, tag, 0, Pageable.Mastodon.HashTagTimeline(tag.replace(\"#\", \"\")))\n            else -> Page(account?.accountId?: - 1, tag, 0, Pageable.SearchByTag(tag.replace(\"#\", \"\")))\n        }\n    }\n    fun search(query: String): Page {\n        return when(account?.instanceType) {\n            Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> Page(account.accountId, query, 0, Pageable.Mastodon.SearchTimeline(query))\n            else -> Page(account?.accountId?: - 1, query, 0, Pageable.Search(query))\n        }\n    }\n    fun featured(title: String) = Page(account?.accountId?: - 1, title, 0, Pageable.Featured(null))\n    fun notification(title: String) = Page(account?.accountId?: - 1, title, 0, Pageable.Notification())\n    fun user(userId: String, title: String): Page {\n        return Page(account?.accountId?: - 1, title, 0, Pageable.UserTimeline(userId))\n    }\n    fun user(user: User, isUserNameDefault: Boolean): Page {\n        val title = if(isUserNameDefault) user.shortDisplayName else user.displayName\n        return Page(account?.accountId?: - 1, title, 0, Pageable.UserTimeline(userId = user.id.id))\n    }\n    fun favorite(title: String): Page {\n        return Page(account?.accountId?: - 1, title, 0, Pageable.Favorite)\n    }\n    fun antenna(antennaId: String, title: String): Page {\n        return Page(account?.accountId?: - 1, title, 0, Pageable.Antenna(antennaId))\n    }\n    fun antenna(antenna: Antenna): Page {\n        return Page(account?.accountId ?: antenna.id.accountId, antenna.name, 0, Pageable.Antenna(antenna.id.antennaId))\n    }\n\n    fun mastodonPublicTimeline(title: String): Page {\n        return Page(\n            account?.accountId ?: -1,\n            title,\n            0,\n            Pageable.Mastodon.PublicTimeline()\n        )\n    }\n\n    fun mastodonLocalTimeline(title: String): Page {\n        return Page(\n            account?.accountId ?: -1,\n            title,\n            0,\n            Pageable.Mastodon.LocalTimeline(),\n        )\n    }\n\n    fun mastodonHomeTimeline(title: String): Page {\n        return Page(\n            account?.accountId ?: -1,\n            title,\n            0,\n            Pageable.Mastodon.HomeTimeline(),\n            isSavePagePosition = true,\n        )\n    }\n\n    fun calckeyRecommendedTimeline(title: String): Page {\n        return Page(\n            account?.accountId ?: -1,\n            title,\n            0,\n            Pageable.CalckeyRecommendedTimeline\n        )\n    }\n}\n\nfun Account.newPage(pageable: Pageable, name: String): Page {\n    return Page(this.accountId, name, 0, pageable)\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/account/page/Pagenate.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\n/**\n * untilIdによって過去のページを取得ことができることを表すためのインターフェース\n */\ninterface UntilPaginate\n\n/**\n * sinceIdによって新しいページを取得できることを表すためのインターフェース\n */\ninterface SincePaginate\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/antenna/AccountService.kt",
    "content": "package net.pantasystem.milktea.model.antenna\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Page\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass AccountService @Inject constructor(\n    val accountRepository: AccountRepository\n) {\n\n    suspend fun add(page: Page): Result<Unit> = runCancellableCatching {\n        val account: Account = accountRepository.get(page.accountId)\n            .getOrNull() ?: accountRepository.getCurrentAccount().getOrThrow()\n        val updated = account.copy(pages = account.pages.toMutableList().also { list ->\n            list.add(page)\n        })\n        accountRepository.add(updated, true).getOrThrow()\n    }\n\n    suspend fun remove(page: Page): Result<Unit> = runCancellableCatching {\n        val account = accountRepository.get(page.accountId)\n            .getOrNull() ?: accountRepository.getCurrentAccount().getOrThrow()\n        val updated = account.copy(pages = account.pages.filterNot { it.pageId == page.pageId })\n        accountRepository.add(updated, true).getOrThrow()\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/antenna/Antenna.kt",
    "content": "package net.pantasystem.milktea.model.antenna\n\nimport net.pantasystem.milktea.model.Entity\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.list.UserList\n\ndata class Antenna (\n    val id: Id,\n    val name: String,\n    val src: AntennaSource,\n    val userListId: UserList.Id?,\n    val userGroupId: Group.Id?,\n    val keywords: List<List<String>>,\n    val excludeKeywords: List<List<String>>,\n    val users: List<String>,\n    val caseSensitive: Boolean,\n    val withFile: Boolean,\n    val withReplies: Boolean,\n    val notify: Boolean,\n    val hasUnreadNote: Boolean\n) : Entity {\n    data class Id(\n        val accountId: Long,\n        val antennaId: String\n    ) : EntityId\n}\n\nsealed interface AntennaSource {\n    object Home : AntennaSource\n    object All : AntennaSource\n    object Users : AntennaSource\n    object List : AntennaSource\n    object Group : AntennaSource\n    companion object\n}\n\nfun AntennaSource.str(): String {\n    return when(this) {\n        AntennaSource.All -> \"all\"\n        AntennaSource.Group -> \"group\"\n        AntennaSource.Home -> \"home\"\n        AntennaSource.List -> \"list\"\n        AntennaSource.Users -> \"users\"\n    }\n}\n\nfun AntennaSource.Companion.values(): List<AntennaSource> {\n    return listOf(\n        AntennaSource.Home,\n        AntennaSource.All,\n        AntennaSource.Users,\n        AntennaSource.List,\n        AntennaSource.Group,\n    )\n}\n\nfun AntennaSource.Companion.from(src: String): AntennaSource {\n    return when(src) {\n        \"all\" -> AntennaSource.All\n        \"group\" -> AntennaSource.Group\n        \"home\" -> AntennaSource.Home\n        \"list\" -> AntennaSource.List\n        \"users\" -> AntennaSource.Users\n        else -> AntennaSource.All\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/antenna/AntennaRepository.kt",
    "content": "package net.pantasystem.milktea.model.antenna\n\ninterface AntennaRepository {\n    suspend fun findByAccountId(accountId: Long): Result<List<Antenna>>\n    suspend fun delete(antennaId: Antenna.Id): Result<Unit>\n    suspend fun update(antennaId: Antenna.Id, params: SaveAntennaParam): Result<Antenna>\n    suspend fun create(accountId: Long, params: SaveAntennaParam): Result<Antenna>\n    suspend fun find(antennaId: Antenna.Id): Result<Antenna>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/antenna/AntennaToggleAddToTabUseCase.kt",
    "content": "package net.pantasystem.milktea.model.antenna\n\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.PageableTemplate\nimport javax.inject.Inject\n\nclass AntennaToggleAddToTabUseCase @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val accountService: AccountService,\n) {\n    suspend operator fun invoke(antenna: Antenna, addTabToAccountId: Long? = null) {\n        val relatedAccount = accountRepository.get(antenna.id.accountId).getOrThrow()\n        val current = addTabToAccountId?.let {\n            accountRepository.get(it).getOrThrow()\n        } ?: accountRepository.getCurrentAccount().getOrThrow()\n        val paged = current.pages.firstOrNull {\n            it.pageParams.antennaId == antenna.id.antennaId\n                    && (it.attachedAccountId ?: it.accountId) == antenna.id.accountId\n        }\n        val isSameAccount = relatedAccount.accountId == current.accountId\n        val title = if (isSameAccount) {\n            antenna.name\n        } else {\n            \"${antenna.name}(${relatedAccount.getAcct()})\"\n        }\n        if (paged == null) {\n            val page = PageableTemplate(current)\n                .antenna(\n                    antenna\n                ).copy(\n                    attachedAccountId = if (isSameAccount) null else relatedAccount.accountId,\n                    title = title,\n                    weight = -1,\n                    accountId = current.accountId,\n                )\n            accountService.add(\n                page\n            )\n        } else {\n            accountService.remove(paged)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/antenna/SaveAntennaParam.kt",
    "content": "package net.pantasystem.milktea.model.antenna\n\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.list.UserList\n\n/**\n * @param withReplies 返信を含むのか\n * @param name アンテナの名称\n * @param src 受信するソース \"home\" \"all\" \"users\" \"list\" \"group\"\n * @param userListId ユーザーのリストのユーザーのノートを取得リソースにする\n * @param userGroupId 指定したグループのユーザーのノートを取得ソースにする\n * @param keywords 受信キーワード [[\"key\", \"words\"]] \"key\" & \"words\"になる[[\"key\", \"words\"], [\"source\"]]の場合は \"key\" and \"words\" or \"source\"になる\n * @param excludeKeywords 除外ワード 指定方式は受信キーワードと同じ\n * @param users usernameを配列で指定する\n * @param caseSensitive\n * @param withFile ファイルが添付されたーノートのみ\n * @param notify 新しいノートを通知する\n */\ndata class SaveAntennaParam(\n    val name: String,\n    val src: AntennaSource,\n    val userListId: UserList.Id?,\n    val userGroupId: Group.Id?,\n    val keywords: List<List<String>>,\n    val excludeKeywords: List<List<String>>,\n    val users: List<String>,\n    val caseSensitive: Boolean = true,\n    val withFile: Boolean = false,\n    val withReplies: Boolean = false,\n    val notify: Boolean = false,\n    val hasUnreadNote: Boolean = false,\n)\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/ap/ApResolver.kt",
    "content": "package net.pantasystem.milktea.model.ap\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\nsealed interface ApResolver {\n    data class TypeUser(val user: User) : ApResolver\n    data class TypeNote(val note: Note) : ApResolver\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/ap/ApResolverRepository.kt",
    "content": "package net.pantasystem.milktea.model.ap\n\ninterface ApResolverRepository {\n    suspend fun resolve(accountId: Long, uri: String): Result<ApResolver>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/ap/ApResolverService.kt",
    "content": "package net.pantasystem.milktea.model.ap\n\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass ApResolverService @Inject constructor(\n    private val apResolverRepository: ApResolverRepository,\n    private val noteRepository: NoteRepository,\n    private val userRepository: UserRepository,\n    private val accountRepository: AccountRepository,\n) {\n\n    suspend fun resolve(noteId: Note.Id, resolveToAccountId: Long): Result<Note> {\n        return noteRepository.find(noteId).mapCancellableCatching { note ->\n            val host = userRepository.find(note.userId).host\n            val noteUri = note.uri ?: \"https://$host/notes/${note.id.noteId}\"\n            apResolverRepository.resolve(resolveToAccountId, noteUri).mapCancellableCatching {\n                when (it) {\n                    is ApResolver.TypeNote -> it.note\n                    is ApResolver.TypeUser -> throw IllegalStateException(\"Cannot resolve user\")\n                }\n            }.getOrThrow()\n        }\n    }\n\n    suspend fun resolve(userId: User.Id, resolveToAccountId: Long): Result<User> = runCancellableCatching {\n        val user = (userRepository.find(userId, true) as User.Detail)\n        val resolveAccount = accountRepository.get(resolveToAccountId).getOrThrow()\n        if (resolveAccount.getHost() == user.host) {\n            return@runCancellableCatching userRepository.findByUserName(resolveToAccountId, user.userName, user.host)\n        }\n        val uri = user.getRemoteProfileUrl(\n            accountRepository.get(userId.accountId).getOrThrow()\n        )\n        apResolverRepository.resolve(resolveToAccountId, uri).mapCancellableCatching {\n            when (it) {\n                is ApResolver.TypeNote -> throw IllegalStateException(\"Cannot resolve note\")\n                is ApResolver.TypeUser -> it.user\n            }\n        }.getOrThrow()\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/app/AppType.kt",
    "content": "package net.pantasystem.milktea.model.app\n\n\nsealed interface AppType {\n    val callbackUrl: String?\n    val secret: String?\n    val name: String\n\n    data class Misskey(\n        val id: String? = null,\n        override val name: String,\n        override val callbackUrl: String?,\n        val isAuthorized: Boolean? = null,\n        val permission: List<String> = emptyList(),\n        override val secret: String? = null,\n    ) : AppType\n\n    companion object;\n\n    data class Mastodon(\n        val id: String,\n        override val name: String,\n\n        val clientId: String,\n\n        val redirectUri: String,\n\n        val clientSecret: String,\n\n        ) : AppType {\n        override val callbackUrl: String\n            get() = redirectUri\n        override val secret: String\n            get() = clientSecret\n\n        companion object\n    }\n\n    data class Pleroma(\n        val id: String,\n        override val name: String,\n\n        val clientId: String,\n\n        val redirectUri: String,\n\n        val clientSecret: String,\n    ) : AppType {\n        override val callbackUrl: String\n            get() = redirectUri\n        override val secret: String\n            get() = clientSecret\n\n        companion object\n    }\n\n    data class Firefish(\n        val id: String? = null,\n        override val name: String,\n        override val callbackUrl: String?,\n        val isAuthorized: Boolean? = null,\n        val permission: List<String> = emptyList(),\n        override val secret: String? = null,\n    ) : AppType\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/channel/Channel.kt",
    "content": "package net.pantasystem.milktea.model.channel\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.common.getRGB\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.user.User\n\n/**\n * @param isFollowing followしているとtrue,未認証の場合はnullになる\n * @param hasUnreadNote 未読ノートが存在する場合trueになる,未認証の場合はnullになる\n */\ndata class Channel(\n    val id: Id,\n    val createdAt: Instant,\n    val lastNotedAt: Instant?,\n    val name: String,\n    val description: String?,\n    val bannerUrl: String?,\n    val notesCount: Int,\n    val usersCount: Int,\n    val userId: User.Id?,\n    val isFollowing: Boolean?,\n    val hasUnreadNote: Boolean?,\n    val allowRenoteToExternal: Boolean,\n) {\n    companion object;\n\n    data class Id(\n        val accountId: Long,\n        val channelId: String\n    ) : EntityId\n\n\n    val rgpFromName: Triple<Int, Int, Int> by lazy {\n        name.getRGB()\n    }\n\n}\n\nfun Channel.Companion.generateChannelNavUrl(channelId: String, accountId: Long?): String {\n    return if (accountId == null) {\n        \"milktea://channels/${channelId}\"\n    } else {\n        \"milktea://channels/${channelId}?accountId=$accountId\"\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/channel/ChannelRepository.kt",
    "content": "package net.pantasystem.milktea.model.channel\n\ninterface ChannelRepository {\n\n\n    suspend fun findOne(id: Channel.Id): Result<Channel>\n\n    suspend fun create(model: CreateChannel): Result<Channel>\n\n\n    suspend fun follow(id: Channel.Id): Result<Channel>\n\n    suspend fun unFollow(id: Channel.Id): Result<Channel>\n\n    suspend fun update(model: UpdateChannel): Result<Channel>\n\n    suspend fun findFollowedChannels(\n        accountId: Long,\n        sinceId: Channel.Id? = null,\n        untilId: Channel.Id? = null,\n        limit: Int = 99,\n    ): Result<List<Channel>>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/channel/ChannelStateModel.kt",
    "content": "package net.pantasystem.milktea.model.channel\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.flow.StateFlow\nimport kotlinx.coroutines.flow.map\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport javax.inject.Inject\n\ndata class ChannelState(\n    val channels: Map<Channel.Id, Channel>\n) {\n    fun add(channel: Channel): ChannelState {\n        return this.copy(\n            channels = channels.toMutableMap().also { map ->\n                map[channel.id] = channel\n            }\n        )\n    }\n\n    fun addAll(channels: Collection<Channel>): ChannelState {\n        return this.copy(\n            channels = this.channels.toMutableMap().also { map ->\n                map.putAll(channels.map { it.id to it })\n            }\n        )\n    }\n\n    fun remove(channel: Channel.Id): ChannelState {\n        return this.copy(\n            channels = this.channels.toMutableMap().also {\n                it.remove(channel)\n            }\n        )\n    }\n\n    fun get(id: Channel.Id): Channel? {\n        return channels[id]\n    }\n\n    fun getIn(ids: Collection<Channel.Id>): List<Channel> {\n        return channels.filter {\n            ids.contains(it.key)\n        }.values.toList()\n    }\n\n}\ninterface ChannelStateModel  {\n    val state: StateFlow<ChannelState>\n\n    suspend fun addAll(channels: List<Channel>): List<Channel>\n\n    suspend fun add(channel: Channel): Channel\n\n    suspend fun get(id: Channel.Id): Channel?\n\n    suspend fun remove(id: Channel.Id)\n\n    fun observeOne(id: Channel.Id): Flow<Channel?>\n\n    fun observeAll(ids: List<Channel.Id>): Flow<List<Channel>>\n\n}\n\n\nclass ChannelStateModelOnMemory @Inject constructor(): ChannelStateModel {\n    private val _state = MutableStateFlow(ChannelState(emptyMap()))\n    override val state: StateFlow<ChannelState>\n        get() = _state\n\n    private val lock = Mutex()\n\n    override suspend fun add(channel: Channel): Channel {\n         lock.withLock {\n             _state.value = state.value.add(channel)\n         }\n        return channel\n    }\n\n    override suspend fun addAll(channels: List<Channel>): List<Channel> {\n        lock.withLock {\n            _state.value = state.value.addAll(channels)\n        }\n        return channels\n    }\n\n    override suspend fun get(id: Channel.Id): Channel? {\n        return state.value.get(id)\n    }\n\n    override fun observeAll(ids: List<Channel.Id>): Flow<List<Channel>> {\n        val idSets = ids.toSet()\n        return state.map { state ->\n            state.getIn(idSets)\n        }\n    }\n\n    override fun observeOne(id: Channel.Id): Flow<Channel?> {\n        return state.map {\n            it.get(id)\n        }\n    }\n\n    override suspend fun remove(id: Channel.Id) {\n        lock.withLock {\n            _state.value = state.value.remove(id)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/channel/CreateChannel.kt",
    "content": "package net.pantasystem.milktea.model.channel\n\ndata class CreateChannel(\n    val name: String,\n    val description: String?,\n    val accountId: Long,\n    val bannerId: String?\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/channel/UpdateChannel.kt",
    "content": "package net.pantasystem.milktea.model.channel\n\ndata class UpdateChannel(\n    val id: Channel.Id,\n    val name: String,\n    val description: String?,\n    val bannerId: String?,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/clip/Clip.kt",
    "content": "package net.pantasystem.milktea.model.clip\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.user.User\n\ndata class Clip(\n    val id: ClipId,\n    val createdAt: Instant,\n    val userId: User.Id,\n    val name: String,\n    val description: String?,\n    val isPublic: Boolean,\n)\n\ndata class ClipId(\n    val accountId: Long,\n    val clipId: String\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/clip/ClipRepository.kt",
    "content": "package net.pantasystem.milktea.model.clip\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\ninterface ClipRepository {\n\n    suspend fun getMyClips(accountId: Long): Result<List<Clip>>\n\n    suspend fun findBy(\n        userId: User.Id,\n        sinceId: String? = null,\n        untilId: String? = null,\n        limit: Int = 10\n    ): Result<List<Clip>>\n\n    suspend fun findBy(noteId: Note.Id): Result<List<Clip>>\n\n    suspend fun create(createClip: CreateClip): Result<Clip>\n\n    suspend fun update(clipId: ClipId, updateClip: UpdateClip): Result<Clip>\n\n    suspend fun delete(clipId: ClipId): Result<Unit>\n\n    suspend fun appendNote(clipId: ClipId, noteId: Note.Id): Result<Unit>\n\n    suspend fun removeNote(clipId: ClipId, noteId: Note.Id): Result<Unit>\n\n    suspend fun findOne(clipId: ClipId): Result<Clip>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/clip/CreateClip.kt",
    "content": "package net.pantasystem.milktea.model.clip\n\ndata class CreateClip(\n    val name: String,\n    val description: String?,\n    val isPublic: Boolean,\n    val accountId: Long\n)\n\ntypealias UpdateClip = CreateClip"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/clip/ToggleClipAddToTabUseCase.kt",
    "content": "package net.pantasystem.milktea.model.clip\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.antenna.AccountService\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass ToggleClipAddToTabUseCase @Inject constructor(\n    private val accountService: AccountService,\n    private val accountRepository: AccountRepository,\n) : UseCase {\n\n    suspend operator fun invoke(clip: Clip, addTabToAccountId: Long?): Result<Unit> = runCancellableCatching {\n        val account = addTabToAccountId?.let {\n            accountRepository.get(it).getOrThrow()\n        } ?: accountRepository.get(clip.id.accountId).getOrThrow()\n        val existsPage = account.pages.firstOrNull {\n            it.pageParams.clipId == clip.id.clipId\n                    && (it.attachedAccountId ?: it.accountId) == clip.id.accountId\n        }\n        val isSameAccount = account.accountId == clip.id.accountId\n        val relatedAccount = if (isSameAccount) {\n            account\n        } else {\n            accountRepository.get(clip.id.accountId).getOrThrow()\n        }\n        val title = if (isSameAccount) {\n            clip.name\n        } else {\n            \"${clip.name}(${relatedAccount.getAcct()})\"\n        }\n        if (existsPage == null) {\n            accountService.add(\n                Page(\n                    title = title,\n                    weight = -1,\n                    accountId = addTabToAccountId ?: clip.id.accountId,\n                    pageable = Pageable.ClipNotes(\n                        clipId = clip.id.clipId,\n                    ),\n                    attachedAccountId = if (isSameAccount) null else relatedAccount.accountId,\n                )\n            )\n        } else {\n            accountService.remove(existsPage)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/drive/CreateDirectory.kt",
    "content": "package net.pantasystem.milktea.model.drive\n\ndata class CreateDirectory(\n    val accountId: Long,\n    val directoryName: String,\n    val parentId: String? = null,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/drive/Directory.kt",
    "content": "package net.pantasystem.milktea.model.drive\n\nimport java.io.Serializable\n\ndata class Directory(\n    val id: DirectoryId,\n    val createdAt: String,\n    val name: String,\n    val foldersCount: Int? = null,\n    val filesCount: Int? = null,\n    val parentId: DirectoryId? = null,\n    val parent: Directory? = null\n)\n\ndata class DirectoryId(val accountId: Long, val directoryId: String) : Serializable"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/drive/DriveDirectoryRepository.kt",
    "content": "package net.pantasystem.milktea.model.drive\n\ninterface DriveDirectoryRepository {\n\n    suspend fun create(createDirectory: CreateDirectory): Result<Directory>\n\n    /**\n     * ディレクトリの取得を行う\n     */\n    suspend fun findOne(id: DirectoryId): Result<Directory>\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/drive/DriveFileRepository.kt",
    "content": "package net.pantasystem.milktea.model.drive\n\nimport net.pantasystem.milktea.model.file.AppFile\n\n\ninterface DriveFileRepository {\n    suspend fun find(id: FileProperty.Id) : FileProperty\n    suspend fun toggleNsfw(id: FileProperty.Id)\n    suspend fun create(accountId:Long, file: AppFile.Local): Result<FileProperty>\n    suspend fun delete(id: FileProperty.Id): Result<Unit>\n    suspend fun update(updateFileProperty: UpdateFileProperty): Result<FileProperty>\n\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/drive/FileProperty.kt",
    "content": "package net.pantasystem.milktea.model.drive\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.user.User\nimport java.io.Serializable as JSerializable\n\ndata class FileProperty(\n    val id: Id,\n    val name: String,\n    val createdAt: Instant?,\n    val type: String,\n    val md5: String?,\n    val size: Int?,\n    val userId: User.Id? = null,\n    val folderId: String? = null,\n    val comment: String? = null,\n    val properties: Properties? = null,\n    val isSensitive: Boolean = false,\n    val blurhash: String? = null,\n    val url: String,\n    val thumbnailUrl: String? = null,\n) : JSerializable {\n    companion object;\n\n    data class Id(\n        val accountId: Long,\n        val fileId: String,\n    ) : JSerializable\n\n    data class Properties(\n        val width: Float?,\n        val height: Float?,\n    ) : JSerializable\n\n    fun update(\n        name: String = requireNotNull(this.name),\n        comment: String? = null,\n        isSensitive: Boolean? = null,\n        folderId: String? = null,\n    ): UpdateFileProperty {\n        return UpdateFileProperty(\n            fileId = id,\n            name = if (name == this.name) null else ValueType.Some(name),\n            comment = when (comment) {\n                this.comment -> {\n                    null\n                }\n                null -> {\n                    ValueType.Empty()\n                }\n                else -> {\n                    ValueType.Some(comment)\n                }\n            },\n            isSensitive = when (isSensitive) {\n                this.isSensitive -> {\n                    null\n                }\n                null -> {\n                    null\n                }\n                else -> {\n                    ValueType.Some(isSensitive)\n                }\n            },\n            folderId = when (folderId) {\n                this.folderId -> {\n                    null\n                }\n                null -> {\n                    ValueType.Empty()\n                }\n                else -> {\n                    ValueType.Some(folderId)\n                }\n            },\n        )\n    }\n}\n\nfun FileProperty.Companion.make(\n    id: FileProperty.Id = FileProperty.Id(0L, \"\"),\n    name: String = \"\",\n    createdAt: Instant? = null,\n    type: String = \"\",\n    md5: String? = null,\n    size: Int? = null,\n    userId: User.Id? = null,\n    folderId: String? = null,\n    comment: String? = null,\n    properties: FileProperty.Properties? = null,\n    isSensitive: Boolean = false,\n    blurhash: String? = null,\n    url: String = \"\",\n    thumbnailUrl: String? = null,\n): FileProperty {\n    return FileProperty(\n        id = id,\n        name = name,\n        createdAt = createdAt,\n        type = type,\n        md5 = md5,\n        size = size,\n        userId = userId,\n        folderId = folderId,\n        comment = comment,\n        properties = properties,\n        isSensitive = isSensitive,\n        blurhash = blurhash,\n        url = url,\n        thumbnailUrl = thumbnailUrl,\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/drive/FilePropertyDataSource.kt",
    "content": "package net.pantasystem.milktea.model.drive\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.AddResult\n\nclass FilePropertyNotFoundException(filePropertyId: FileProperty.Id) : NoSuchElementException(\"id:$filePropertyId　は存在しません\")\n\ndata class FilePropertyDataSourceState(\n    val map: Map<FileProperty.Id, FileProperty>\n) {\n    fun findIn(ids: List<FileProperty.Id>) : List<FileProperty>{\n        return ids.mapNotNull {\n            map[it]\n        }\n    }\n\n    fun getOrNull(id: FileProperty.Id) : FileProperty? {\n        return map[id]\n    }\n}\n\ninterface FilePropertyDataSource {\n\n\n    suspend fun add(fileProperty: FileProperty) : Result<AddResult>\n\n    suspend fun addAll(list: List<FileProperty>) : Result<List<AddResult>>\n\n    suspend fun remove(fileProperty: FileProperty) : Result<Boolean>\n\n    suspend fun find(filePropertyId: FileProperty.Id) : Result<FileProperty>\n\n    suspend fun clearUnusedCaches(): Result<Unit>\n\n    suspend fun findIn(ids: List<FileProperty.Id>) : Result<List<FileProperty>> = runCancellableCatching {\n        ids.mapNotNull {\n            runCancellableCatching {\n                find(it).getOrNull()\n            }.getOrNull()\n        }\n    }\n\n    fun observe(id: FileProperty.Id) : Flow<FileProperty?>\n\n    fun observeIn(ids: List<FileProperty.Id>): Flow<List<FileProperty>>\n\n\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/drive/UpdateFileProperty.kt",
    "content": "package net.pantasystem.milktea.model.drive\n\ndata class UpdateFileProperty(\n    val fileId: FileProperty.Id,\n    val folderId: ValueType<String>? = null,\n    val name: ValueType<String>? = null,\n    val isSensitive: ValueType<Boolean>? = null,\n    val comment: ValueType<String>? = null,\n)\n\nsealed interface ValueType<T> {\n    class Empty<T> : ValueType<T>\n\n    data class Some<T>(val value: T) : ValueType<T>\n\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/AddEmojiToUserConfigUseCase.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport javax.inject.Inject\n\nclass AddEmojiToUserConfigUseCase @Inject constructor(\n    val userEmojiConfigRepository: UserEmojiConfigRepository,\n    val accountRepository: AccountRepository,\n) : UseCase {\n\n    suspend operator fun invoke(emoji: String): Result<Unit> = runCancellableCatching{\n        val account = accountRepository.getCurrentAccount().getOrThrow()\n        userEmojiConfigRepository.save(\n            UserEmojiConfig(\n                reaction = emoji,\n                instanceDomain = account.normalizedInstanceUri,\n                weight = userEmojiConfigRepository.findByInstanceDomain(account.normalizedInstanceUri).size\n            )\n        ).getOrThrow()\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/CustomEmoji.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport java.io.Serializable\n\ndata class CustomEmoji(\n    val id: String? = null,\n    val name: String,\n    val host: String? = null,\n    val url: String? = null,\n    val uri: String? = null,\n    val type: String? = null,\n    val category: String? = null,\n    val aspectRatio: Float? = null,\n    val cachePath: String? = null,\n): Serializable {\n\n    constructor(name: String) : this(null, name, null, null, null, null, null, null)\n\n    fun getLoadUrl(): String? {\n        return cachePath ?: url ?: uri\n    }\n}\n\ndata class EmojiWithAlias(\n    val emoji: CustomEmoji,\n    val aliases: List<String>?,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/CustomEmojiAspectRatioDataSource.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\ninterface CustomEmojiAspectRatioDataSource {\n    suspend fun save(ratio: CustomEmojiAspectRatio): Result<CustomEmojiAspectRatio>\n\n    suspend fun findIn(uris: List<String>): Result<List<CustomEmojiAspectRatio>>\n\n    suspend fun findOne(uri: String): Result<CustomEmojiAspectRatio>\n\n    suspend fun delete(ratio: CustomEmojiAspectRatio): Result<Unit>\n}\n\n\ndata class CustomEmojiAspectRatio(\n    val uri: String,\n    val aspectRatio: Float\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/CustomEmojiAspectRatioStore.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.Logger\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass CustomEmojiAspectRatioStore @Inject constructor(\n    coroutineScope: CoroutineScope,\n    private val customEmojiAspectRatioDataSource: CustomEmojiAspectRatioDataSource,\n    loggerFactory: Logger.Factory,\n) {\n\n    private val logger by lazy {\n        loggerFactory.create(\"CEARStore\")\n    }\n\n    private val saveEvents = MutableSharedFlow<Pair<CustomEmoji, Float>>(\n        extraBufferCapacity = 200,\n        onBufferOverflow = BufferOverflow.DROP_LATEST\n    )\n\n    init {\n        saveEvents.onEach { (emoji, aspectRatio) ->\n            doSave(emoji, aspectRatio)\n        }.launchIn(coroutineScope)\n    }\n\n    fun save(emoji: CustomEmoji, aspectRatio: Float) {\n        val url = (emoji.url ?: emoji.uri)\n        if (aspectRatio <= 0f || url == null) {\n            logger.debug {\n                \"cancel save emoji aspect. emoji:$emoji, aspect:$aspectRatio\"\n            }\n            return\n        }\n        saveEvents.tryEmit(emoji to aspectRatio)\n    }\n\n    private suspend fun doSave(emoji: CustomEmoji, aspectRatio: Float) {\n        val url = (emoji.url ?: emoji.uri)\n        if (aspectRatio <= 0f || url == null) {\n            logger.debug {\n                \"cancel save emoji aspect. emoji:$emoji, aspect:$aspectRatio\"\n            }\n            return\n        }\n        val ratio = customEmojiAspectRatioDataSource.findOne(url).getOrNull()\n        if (ratio != null) {\n            return\n        }\n        customEmojiAspectRatioDataSource.save(\n            CustomEmojiAspectRatio(\n                uri = url,\n                aspectRatio = aspectRatio,\n            )\n        ).onFailure {\n            logger.error(\"save failure\", it)\n        }.onSuccess {\n            logger.debug {\n                \"success save emoji aspect ratio:$emoji, $aspectRatio, $it\"\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/CustomEmojiRepository.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface CustomEmojiRepository {\n\n    suspend fun findBy(host: String): Result<List<CustomEmoji>>\n\n    suspend fun sync(host: String): Result<Unit>\n\n    /**\n     * 完全一致で絵文字を探索する\n     */\n    suspend fun findByName(host: String, name: String): Result<List<CustomEmoji>>\n\n    suspend fun findByNames(host: String, names: List<String>): Result<List<CustomEmoji>>\n\n\n    suspend fun addEmojis(host: String, emojis: List<EmojiWithAlias>): Result<Unit>\n\n    suspend fun deleteEmojis(host: String, emojis: List<CustomEmoji>): Result<Unit>\n\n    fun observeBy(host: String, withAliases: Boolean = false): Flow<List<CustomEmoji>>\n\n    fun observeWithSearch(host: String, keyword: String): Flow<List<CustomEmoji>>\n\n    suspend fun search(host: String, keyword: String): Result<List<CustomEmoji>>\n\n    fun get(host: String): List<CustomEmoji>?\n\n    fun getAndConvertToMap(host: String): Map<String, CustomEmoji>?\n\n    suspend fun findAndConvertToMap(host: String): Result<Map<String, CustomEmoji>>\n\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/EmojiEventHandler.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport net.pantasystem.milktea.model.account.Account\n\ninterface EmojiEventHandler {\n\n    fun observe(account: Account?)\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/EmojiImageCacheStore.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport kotlinx.coroutines.CancellationException\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.launchIn\nimport kotlinx.coroutines.flow.onEach\nimport net.pantasystem.milktea.common.Logger\nimport javax.inject.Inject\n\nclass EmojiImageCacheStore @Inject constructor(\n    coroutineScope: CoroutineScope,\n    private val saveCustomEmojiImageUseCase: SaveCustomEmojiImageUseCase,\n    private val loggerFactory: Logger.Factory,\n) {\n\n    private val logger by lazy {\n        loggerFactory.create(\"EICStore\")\n    }\n\n    private val queue = MutableSharedFlow<CustomEmoji>(extraBufferCapacity = 25)\n\n    init {\n        queue.onEach { emoji ->\n            try {\n                saveCustomEmojiImageUseCase(emoji).getOrThrow()\n            } catch (e: CancellationException) {\n                throw e\n            } catch (e: Exception) {\n                logger.error(\"save failure\", e)\n            }\n        }.launchIn(coroutineScope)\n    }\n    fun save(emoji: CustomEmoji) {\n        queue.tryEmit(emoji)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/SaveCustomEmojiImageUseCase.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.image.ImageCache\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport javax.inject.Inject\n\nclass SaveCustomEmojiImageUseCase @Inject constructor(\n    val imageCacheRepository: ImageCacheRepository,\n    val customEmojiAspectRatioDataSource: CustomEmojiAspectRatioDataSource,\n) : UseCase {\n    suspend operator fun invoke(emoji: CustomEmoji): Result<ImageCache?> = runCancellableCatching {\n        val url = emoji.url ?: emoji.uri ?: return@runCancellableCatching null\n        val result = imageCacheRepository.save(url).getOrThrow()\n        val width = result.width?.takeIf {\n            it > 0\n        } ?: return@runCancellableCatching result\n        val height = result.height?.takeIf {\n            it > 0\n        } ?: return@runCancellableCatching result\n        val aspectRatio = width.toFloat() / height.toFloat()\n        customEmojiAspectRatioDataSource.save(\n            CustomEmojiAspectRatio(\n                uri = url,\n                aspectRatio = aspectRatio,\n            )\n        ).getOrThrow()\n        result\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/SimpleCustomEmojiParser.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nobject CustomEmojiParser {\n\n    fun parse(sourceHost: String?, emojiMap: Map<String, CustomEmoji>?, text: String, instanceEmojis: Map<String, CustomEmoji>? = null): CustomEmojiParsedResult {\n        var cursor = 0\n        var colonIndex = -1\n        val emojiPosList = mutableListOf<EmojiPos>()\n        while(cursor < text.length) {\n            if (text[cursor] == ':') {\n                if (colonIndex == -1) {\n                    colonIndex = cursor\n                } else {\n                    val subStr = text.substring(colonIndex, cursor + 1)\n                    val tag = if (subStr.length > 2) {\n                        subStr.substring(1, subStr.length - 1)\n                    } else {\n                        null\n                    }\n                    var emoji: EmojiResolvedType? = (emojiMap?.get(tag) ?: instanceEmojis?.get(tag))?.let {\n                        if (sourceHost == null) {\n                            null\n                        } else {\n                            EmojiResolvedType.Resolved(it, sourceHost)\n                        }\n                    }\n                    if (emoji == null) {\n                        if (sourceHost != null) {\n                            if (tag != null){\n                                emoji = EmojiResolvedType.UnResolved(\n                                    tag = tag,\n                                    sourceHost = sourceHost,\n                                )\n                            }\n                        }\n\n                    }\n                    colonIndex = if (emoji == null) {\n                        cursor\n                    } else {\n                        emojiPosList.add(\n                            EmojiPos(\n                                result = emoji,\n                                start = colonIndex,\n                                end = cursor + 1\n                            )\n                        )\n                        -1\n                    }\n                }\n            }\n            cursor ++\n        }\n        return CustomEmojiParsedResult(text, emojiPosList)\n    }\n    fun parse(sourceHost: String?, emojis: List<CustomEmoji>?, text: String, instanceEmojis: Map<String, CustomEmoji>? = null): CustomEmojiParsedResult {\n        val emojiMap = emojis?.associateBy {\n            it.name\n        }\n        return parse(sourceHost, emojiMap, text, instanceEmojis)\n    }\n}\n\ndata class CustomEmojiParsedResult(\n    val text: String,\n    val emojis: List<EmojiPos>,\n)\n\nsealed interface EmojiResolvedType {\n    data class Resolved(val emoji: CustomEmoji, val sourceHost: String) : EmojiResolvedType {\n        override val tag: String = emoji.name\n    }\n    data class UnResolved(override val tag: String, val sourceHost: String) : EmojiResolvedType\n\n    fun getUrl(accountHost: String?): String? {\n        return when(this) {\n            is Resolved -> {\n                emoji.url ?: emoji.uri\n                ?: resolve(accountHost = accountHost, emojiHost = sourceHost, tagName = emoji.name)\n            }\n            is UnResolved -> {\n                return resolve(accountHost = accountHost, emojiHost = sourceHost, tagName = tag)\n            }\n        }\n    }\n\n    val tag: String\n\n\n}\n\n/**\n * MFMParserからの使用を想定\n */\nprivate fun resolve(\n    accountHost: String?,\n    tagName: String,\n    emojiHost: String?,\n): String {\n    if (emojiHost == null || accountHost == emojiHost) {\n        return \"https://$accountHost/emoji/${tagName}.webp\"\n    }\n    return \"https://$accountHost/emoji/${tagName}@${emojiHost}.webp\"\n}\n\ndata class EmojiPos(val start: Int, val end: Int, val result: EmojiResolvedType)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/UserEmojiConfig.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\ndata class UserEmojiConfig(\n    val reaction: String,\n    val instanceDomain: String,\n    var weight: Int\n)\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/emoji/UserEmojiConfigRepository.kt",
    "content": "package net.pantasystem.milktea.model.emoji\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface UserEmojiConfigRepository {\n    suspend fun saveAll(configs: List<UserEmojiConfig>): Result<Unit>\n    suspend fun save(config: UserEmojiConfig): Result<Unit>\n    suspend fun findByInstanceDomain(instanceDomain: String): List<UserEmojiConfig>\n    suspend fun deleteAll(settings: List<UserEmojiConfig>): Result<Unit>\n    suspend fun delete(setting: UserEmojiConfig): Result<Unit>\n    fun observeByInstanceDomain(instanceDomain: String): Flow<List<UserEmojiConfig>>\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/file/AppFile.kt",
    "content": "package net.pantasystem.milktea.model.file\n\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.note.draft.DraftNoteFile\nimport java.io.Serializable as JSerializable\n\nsealed interface AppFile : JSerializable {\n\n    companion object;\n\n\n    data class Local(\n        val name: String,\n        val path: String,\n        val type: String,\n        val thumbnailUrl: String?,\n        val isSensitive: Boolean,\n        val folderId: String?,\n        val fileSize: Long?,\n        val comment: String?,\n        val id: Long = 0,\n    ) : AppFile {\n        fun isAttributeSame(file: Local): Boolean {\n            return file.name == name\n                    && file.path == path\n                    && file.type == type\n                    && file.fileSize == fileSize\n                    && file.comment == comment\n        }\n    }\n\n    data class Remote(\n        val id: FileProperty.Id,\n    ) : AppFile\n\n}\n\nenum class AboutMediaType {\n    VIDEO, IMAGE, SOUND, OTHER\n\n}\n\nsealed interface FilePreviewSource {\n    val file: AppFile\n\n    data class Local(override val file: AppFile.Local) : FilePreviewSource {\n        override val type: String = file.type\n        override val aboutMediaType: AboutMediaType = when {\n            this.type.startsWith(\"image\") -> AboutMediaType.IMAGE\n            this.type.startsWith(\"video\") -> AboutMediaType.VIDEO\n            this.type.startsWith(\"audio\") -> AboutMediaType.SOUND\n            else -> AboutMediaType.OTHER\n        }\n        override val path: String = file.path\n        override val comment: String? = file.comment\n        override val name: String = file.name\n        override val thumbnailUrl: String? = file.thumbnailUrl\n        override val blurhash: String? = null\n    }\n\n    data class Remote(override val file: AppFile.Remote, val fileProperty: FileProperty) :\n        FilePreviewSource {\n        override val type: String = fileProperty.type\n\n        override val aboutMediaType: AboutMediaType = when {\n            this.type.startsWith(\"image\") -> AboutMediaType.IMAGE\n            this.type.startsWith(\"video\") -> AboutMediaType.VIDEO\n            this.type.startsWith(\"audio\") -> AboutMediaType.SOUND\n            this.type == \"gifv\" -> AboutMediaType.VIDEO\n            else -> AboutMediaType.OTHER\n        }\n        override val path: String = fileProperty.url\n        override val comment: String? = fileProperty.comment\n        override val name: String = fileProperty.name\n        override val thumbnailUrl: String? = fileProperty.thumbnailUrl\n        override val blurhash: String? = fileProperty.blurhash\n    }\n\n\n    val thumbnailUrl: String?\n    val name: String\n    val comment: String?\n\n    val type: String\n    val path: String\n    val aboutMediaType: AboutMediaType\n    val blurhash: String?\n\n}\n\nval FilePreviewSource.isSensitive: Boolean\n    get() = when (this) {\n        is FilePreviewSource.Local -> this.file.isSensitive\n        is FilePreviewSource.Remote -> fileProperty.isSensitive\n    }\n\n\n\n\n\nfun AppFile.Companion.from(file: DraftNoteFile): AppFile {\n    return when (file) {\n        is DraftNoteFile.Local -> AppFile.Local(\n            name = file.name,\n            path = file.filePath,\n            thumbnailUrl = file.thumbnailUrl,\n            type = file.type,\n            isSensitive = file.isSensitive ?: false,\n            fileSize = file.fileSize,\n            folderId = file.folderId,\n            comment = file.comment,\n        )\n        is DraftNoteFile.Remote -> AppFile.Remote(file.fileProperty.id)\n    }\n}\n\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/file/CopyFileToAppDirRepository.kt",
    "content": "package net.pantasystem.milktea.model.file\n\nimport android.net.Uri\n\ninterface CopyFileToAppDirRepository {\n\n    suspend fun copyFileToAppDir(uri: Uri): Result<AppFile.Local>\n\n    suspend fun exists(uri: Uri): Boolean\n\n    suspend fun delete(appFile: AppFile.Local): Boolean\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/file/CopyFileToAppDirUseCase.kt",
    "content": "package net.pantasystem.milktea.model.file\n\nimport android.net.Uri\nimport net.pantasystem.milktea.model.UseCase\nimport javax.inject.Inject\n\nclass CopyFileToAppDirUseCase @Inject constructor(\n    private val repository: CopyFileToAppDirRepository\n): UseCase {\n\n    suspend operator fun invoke(uri: Uri): Result<AppFile.Local> {\n        return repository.copyFileToAppDir(uri)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/file/FileUploadFailedException.kt",
    "content": "package net.pantasystem.milktea.model.file\n\n\nclass FileUploadFailedException(\n    val file: AppFile,\n    val throwable: Throwable?,\n    statusCode: Int?,\n    errorMessage: String?,\n) : IllegalStateException(\n    \"ファイルアップロードに失敗: file:$file, statusCode:$statusCode, message:$errorMessage\",\n    throwable\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/file/UpdateAppFileSensitiveUseCase.kt",
    "content": "package net.pantasystem.milktea.model.file\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.drive.DriveFileRepository\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UpdateAppFileSensitiveUseCase @Inject constructor(\n    val driveFileRepository: DriveFileRepository,\n    val filePropertyDataSource: FilePropertyDataSource,\n    val accountRepository: AccountRepository,\n) : UseCase {\n\n    suspend operator fun invoke(appFile: AppFile, isSensitive: Boolean): Result<AppFile> = runCancellableCatching {\n        when (appFile) {\n            is AppFile.Local -> {\n                appFile.copy(isSensitive = isSensitive)\n            }\n            is AppFile.Remote -> {\n                val account = accountRepository.get(appFile.id.accountId).getOrThrow()\n                when (account.instanceType) {\n                    Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> {\n                        val fileProperty = driveFileRepository.find(appFile.id)\n                        driveFileRepository.update(\n                            fileProperty.update(\n                                isSensitive = isSensitive,\n                            )\n                        )\n                        AppFile.Remote(fileProperty.id)\n                    }\n                    Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> {\n                        val fileProperty = filePropertyDataSource.find(appFile.id).getOrThrow()\n                        filePropertyDataSource.add(\n                            fileProperty.copy(\n                                isSensitive = isSensitive,\n                            )\n                        )\n                        AppFile.Remote(fileProperty.id)\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/file/UriToAppFileUseCase.kt",
    "content": "package net.pantasystem.milktea.model.file\n\nimport android.net.Uri\n\ninterface UriToAppFileUseCase {\n    operator fun invoke(uri: Uri): AppFile.Local\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/filter/ClientWordFilterService.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfig\nimport javax.inject.Inject\n\nclass ClientWordFilterService @Inject constructor() {\n    fun isShouldFilterNote(\n        config: WordFilterConfig?,\n        note: Note?,\n    ): Boolean {\n        note ?: return false\n        config ?: return false\n        val isMatched = config.checkMatchText(note.text)\n                || config.checkMatchText(note.cw)\n                || note.poll?.let { poll ->\n            poll.choices.any { choice ->\n                config.checkMatchText(choice.text)\n            }\n        } ?: false\n        if (isMatched) {\n            return true\n        }\n        return false\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/filter/FilterPatternCache.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport java.util.regex.Pattern\nimport javax.inject.Inject\n\nclass FilterPatternCache @Inject constructor() {\n    data class Key(\n        val pageable: Pageable,\n        val filters: List<MastodonWordFilter>,\n    )\n    private val map = mutableMapOf<Key, Pattern>()\n    fun get(pageable: Pageable, filters: List<MastodonWordFilter>): Pattern? {\n        return map[Key(pageable, filters)]\n    }\n\n    fun put(pageable: Pageable, filters: List<MastodonWordFilter>, pattern: Pattern) {\n        synchronized(this) {\n            map[Key(pageable, filters)] = pattern\n        }\n    }\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/filter/GetMatchContextFilters.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport javax.inject.Inject\n\nclass GetMatchContextFilters @Inject constructor() {\n    operator fun invoke(pageable: Pageable, filters: List<MastodonWordFilter>): List<MastodonWordFilter> {\n        val now = Clock.System.now()\n        return filters.filter {\n            it.expiresAt == null || it.expiresAt > now\n        }.filter { filter ->\n            filter.isContextHome && pageable is Pageable.Mastodon.HomeTimeline\n                    || filter.isContextNotifications && pageable is Pageable.Notification\n                    || filter.isContextPublic && pageable is Pageable.Mastodon.PublicTimeline\n                    || filter.isContextPublic && pageable is Pageable.Mastodon.LocalTimeline\n                    || filter.isContextAccount && pageable is Pageable.Mastodon.UserTimeline\n                    || filter.isContextThread && pageable is Pageable.Show\n                    || filter.isContextHome && pageable is Pageable.Mastodon.HomeTimeline\n        }\n    }\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/filter/MastodonFilterService.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport android.text.Spanned\nimport androidx.core.text.parseAsHtml\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport java.util.regex.Pattern\nimport javax.inject.Inject\n\n\nclass MastodonFilterService @Inject constructor(\n    private val patternCache: FilterPatternCache,\n    private val getMatchContextFilters: GetMatchContextFilters,\n) {\n    fun isShouldFilterNote(pageable: Pageable, filters: List<MastodonWordFilter>, note: Note): Boolean {\n        val matcher = makeFilter(pageable, filters)?.matcher(\"\")\n            ?: return false\n\n        if (note.poll != null) {\n            val pollMatches = note.poll.choices.any { matcher.reset(it.text).find() }\n            if (pollMatches) return true\n        }\n\n        val spoilerText = note.cw\n        return (\n                matcher.reset(note.text?.parseAsMastodonHtml().toString()).find() ||\n                        (spoilerText?.isNotEmpty() == true && matcher.reset(spoilerText).find())\n                )\n\n    }\n\n    private fun makeFilter(pageable: Pageable, filters: List<MastodonWordFilter>): Pattern? {\n        val inCache = patternCache.get(pageable, filters)\n        if (inCache != null) {\n            return inCache\n        }\n        if (filters.isEmpty()) return null\n        val contextMatchedFilters = getMatchContextFilters(pageable, filters)\n        if (contextMatchedFilters.isEmpty()) return null\n\n        val tokens = contextMatchedFilters\n            .map { filterToRegexToken(it) }\n\n        val pattern = Pattern.compile(tokens.joinToString(\"|\"), Pattern.CASE_INSENSITIVE)\n        patternCache.put(pageable, filters, pattern)\n        return pattern\n    }\n\n\n\n    private fun filterToRegexToken(filter: MastodonWordFilter): String? {\n        val phrase = filter.phrase\n        val quotedPhrase = Pattern.quote(phrase)\n        return if (filter.wholeWord && ALPHANUMERIC.matcher(phrase).matches()) {\n            String.format(\"(^|\\\\W)%s($|\\\\W)\", quotedPhrase)\n        } else {\n            quotedPhrase\n        }\n    }\n\n    companion object {\n        private val ALPHANUMERIC = Pattern.compile(\"^\\\\w+$\")\n    }\n}\n\nprivate fun String.parseAsMastodonHtml(): Spanned {\n    return this.replace(\"<br> \", \"<br>&nbsp;\")\n        .replace(\"<br /> \", \"<br />&nbsp;\")\n        .replace(\"<br/> \", \"<br/>&nbsp;\")\n        .replace(\"  \", \"&nbsp;&nbsp;\")\n        .parseAsHtml()\n        /* Html.fromHtml returns trailing whitespace if the html ends in a </p> tag, which\n         * most status contents do, so it should be trimmed. */\n        .trimTrailingWhitespace()\n}\n\nprivate fun Spanned.trimTrailingWhitespace(): Spanned {\n    var i = length\n    do {\n        i--\n    } while (i >= 0 && get(i).isWhitespace())\n    return subSequence(0, i + 1) as Spanned\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/filter/MastodonWordFilter.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport kotlinx.datetime.Instant\n\ndata class MastodonWordFilter(\n    val id: Id,\n    val phrase: String,\n    val context: List<FilterContext>,\n    val wholeWord: Boolean,\n    val expiresAt: Instant?,\n    val irreversible: Boolean,\n) {\n    data class Id(\n        val accountId: Long,\n        val filterId: String\n    )\n    enum class FilterContext {\n        Home,\n        Notifications,\n        Public,\n        Thread,\n        Account,\n    }\n\n    val isContextHome = context.any {\n        it == FilterContext.Home\n    }\n\n    val isContextNotifications = context.any {\n        it == FilterContext.Notifications\n    }\n\n    val isContextPublic = context.any {\n        it == FilterContext.Public\n    }\n\n    val isContextThread = context.any {\n        it == FilterContext.Thread\n    }\n\n    val isContextAccount = context.any {\n        it == FilterContext.Account\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/filter/MastodonWordFilterRepository.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface MastodonWordFilterRepository {\n\n    suspend fun sync(accountId: Long): Result<Unit>\n\n    suspend fun findAll(accountId: Long): Result<List<MastodonWordFilter>>\n\n    suspend fun observeAll(accountId: Long): Flow<List<MastodonWordFilter>>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/filter/WordFilterService.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfigRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass WordFilterService @Inject constructor(\n    private val mastodonWordFilterRepository: MastodonWordFilterRepository,\n    private val wordFilterConfigRepository: WordFilterConfigRepository,\n    private val accountRepository: AccountRepository,\n    private val mastodonWordFilterService: MastodonFilterService,\n    private val clientWordFilterService: ClientWordFilterService,\n) {\n\n    suspend fun isShouldFilterNote(pageable: Pageable, noteRelation: NoteRelation?, a: Account? = null): Boolean {\n        noteRelation ?: return false\n        val account = a?: accountRepository.get(noteRelation.note.id.accountId).getOrNull()\n            ?: return false\n        return isShouldFilterNote(pageable, noteRelation.note, account)\n                || isShouldFilterNote(pageable, noteRelation.reply, account)\n                || isShouldFilterNote(pageable, noteRelation.renote, account)\n    }\n\n    suspend fun isShouldFilterNote(pageable: Pageable, note: Note?, a: Account? = null): Boolean {\n        note ?: return false\n        val account = a?: accountRepository.get(note.id.accountId).getOrNull()\n            ?: return false\n\n        if (note.userId == User.Id(account.accountId, account.remoteId)) {\n            return false\n        }\n        val config = wordFilterConfigRepository.get().getOrNull()\n        val isMatched = clientWordFilterService.isShouldFilterNote(config, note)\n        if (isMatched) {\n            return true\n        }\n\n        if (note.type !is Note.Type.Mastodon) {\n            return false\n        }\n\n        val filter = mastodonWordFilterRepository.findAll(note.id.accountId).getOrNull()\n            ?: return false\n        return mastodonWordFilterService.isShouldFilterNote(pageable, filter, note)\n\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/gallery/CreateGalleryPost.kt",
    "content": "package net.pantasystem.milktea.model.gallery\n\nimport net.pantasystem.milktea.model.ITask\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.file.AppFile\n\ndata class CreateGalleryPost (\n    val title: String,\n    val author: Account,\n    val files: List<AppFile>,\n    val description: String?,\n    val isSensitive: Boolean,\n)\n\n\nclass CreateGalleryPostTask(\n    private val createGalleryPost: CreateGalleryPost,\n    private val galleryPostRepository: GalleryRepository\n) : ITask<GalleryPost> {\n    override suspend fun execute(): GalleryPost {\n        return galleryPostRepository.create(createGalleryPost)\n    }\n}\n\nfun CreateGalleryPost.toTask(galleryPostRepository: GalleryRepository) : CreateGalleryPostTask {\n    return CreateGalleryPostTask(this, galleryPostRepository)\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/gallery/GalleryDataSource.kt",
    "content": "package net.pantasystem.milktea.model.gallery\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.StateFlow\nimport net.pantasystem.milktea.model.AddResult\n\ninterface GalleryDataSource {\n\n    sealed class Event {\n        abstract val galleryPostId: GalleryPost.Id\n        data class Created(override val galleryPostId: GalleryPost.Id, val galleryPost: GalleryPost) : Event()\n        data class Updated(override val galleryPostId: GalleryPost.Id, val galleryPost: GalleryPost) : Event()\n        data class Deleted(override val galleryPostId: GalleryPost.Id) : Event()\n    }\n\n    fun events(): Flow<Event>\n    val state: StateFlow<Map<GalleryPost.Id, GalleryPost>>\n\n    suspend fun add(galleryPost: GalleryPost) : Result<AddResult>\n    suspend fun remove(galleryPostId: GalleryPost.Id) : Result<Boolean>\n    suspend fun find(galleryPostId: GalleryPost.Id) : Result<GalleryPost>\n    suspend fun addAll(posts: List<GalleryPost>) : Result<List<AddResult>>\n    suspend fun findAll() : Result<List<GalleryPost>>\n    suspend fun filterByAccountId(accountId: Long) : Result<List<GalleryPost>>\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/gallery/GalleryNotFoundException.kt",
    "content": "package net.pantasystem.milktea.model.gallery\n\nclass GalleryNotFoundException(id: GalleryPost.Id) : NoSuchElementException(\"存在しません:$id\")"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/gallery/GalleryPost.kt",
    "content": "package net.pantasystem.milktea.model.gallery\n\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.user.User\n\nsealed class GalleryPost {\n    data class Id(\n        val accountId: Long,\n        val galleryId: String\n    ) : EntityId\n\n    abstract val id: Id\n    abstract val createdAt: Instant\n    abstract val updatedAt: Instant\n    abstract val title: String\n    abstract val description: String?\n    abstract val userId: User.Id\n    abstract val fileIds: List<FileProperty.Id>\n    abstract val tags: List<String>\n    abstract val isSensitive: Boolean\n\n    data class Normal(\n        override val id: Id,\n        override val createdAt: Instant,\n        override val updatedAt: Instant,\n        override val title: String,\n        override val description: String?,\n        override val userId: User.Id,\n        override val fileIds: List<FileProperty.Id>,\n        override val tags: List<String>,\n        override val isSensitive: Boolean\n    ) : GalleryPost()\n\n    data class Authenticated(\n        override val id: Id,\n        override val createdAt: Instant,\n        override val updatedAt: Instant,\n        override val title: String,\n        override val description: String?,\n        override val userId: User.Id,\n        override val fileIds: List<FileProperty.Id>,\n        override val tags: List<String>,\n        override val isSensitive: Boolean,\n        val likedCount: Int,\n        val isLiked: Boolean\n    ) : GalleryPost()\n}\n\n\n\ndata class GalleryPostRelation(\n    val galleryPost: GalleryPost,\n    val files: List<FileProperty>,\n    val user: User,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/gallery/GalleryRepository.kt",
    "content": "package net.pantasystem.milktea.model.gallery\n\ninterface GalleryRepository {\n\n    suspend fun create(createGalleryPost: CreateGalleryPost) : GalleryPost\n\n    suspend fun find(id: GalleryPost.Id) : GalleryPost\n\n    suspend fun like(id: GalleryPost.Id)\n\n    suspend fun unlike(id: GalleryPost.Id)\n\n    suspend fun delete(id: GalleryPost.Id)\n\n    suspend fun update(updateGalleryPost: UpdateGalleryPost) : GalleryPost\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/gallery/UpdateGalleryPost.kt",
    "content": "package net.pantasystem.milktea.model.gallery\n\nimport net.pantasystem.milktea.model.file.AppFile\n\nclass UpdateGalleryPost (\n    val id: GalleryPost.Id,\n    val title: String,\n    val files: List<AppFile>,\n    val description: String?,\n    val isSensitive: Boolean,\n    val tags: List<String>\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/AcceptGroupInvitationUseCase.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nimport net.pantasystem.milktea.model.UseCase\nimport javax.inject.Inject\n\nclass AcceptGroupInvitationUseCase @Inject constructor(\n    private val groupRepository: GroupRepository\n) : UseCase {\n\n    suspend operator fun invoke(invitationId: InvitationId): Result<Unit> {\n        return groupRepository.accept(invitationId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/CreateGroup.kt",
    "content": "package net.pantasystem.milktea.model.group\n\ndata class CreateGroup (\n    val author: Long,\n    val name: String\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/Group.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.Entity\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.user.User\n\ndata class Group(\n    val id: Id,\n    val createdAt: Instant,\n    val name: String,\n    val ownerId: User.Id,\n    val userIds: List<User.Id>\n) : Entity {\n    data class Id(val accountId: Long, val groupId: String) : EntityId\n}\n\ndata class GroupMember(\n    val userId: User.Id,\n    val avatarUrl: String?\n)\n\ndata class GroupWithMember(\n    val group: Group,\n    val members: List<GroupMember>\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/GroupDataSource.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.AddResult\n\ninterface GroupDataSource {\n\n    suspend fun find(groupId: Group.Id): Result<Group>\n\n    suspend fun add(group: Group) : Result<AddResult>\n\n    suspend fun addAll(groups: List<Group>) : Result<List<AddResult>>\n\n    suspend fun delete(groupId: Group.Id) : Result<Boolean>\n\n    fun observeOwnedGroups(accountId: Long) : Flow<List<GroupWithMember>>\n\n    fun observeJoinedGroups(accountId: Long) : Flow<List<GroupWithMember>>\n\n    fun observeOne(groupId: Group.Id) : Flow<GroupWithMember>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/GroupNotFoundException.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nclass GroupNotFoundException(groupId: Group.Id) : NoSuchElementException(\"${groupId}は存在しません。\")"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/GroupRepository.kt",
    "content": "package net.pantasystem.milktea.model.group\n\ninterface GroupRepository {\n\n    suspend fun syncOne(groupId: Group.Id) : Group\n\n    suspend fun create(createGroup: CreateGroup) : Group\n\n    suspend fun update(updateGroup: UpdateGroup) : Group\n\n    suspend fun syncByJoined(accountId: Long) : List<Group>\n\n    suspend fun syncByOwned(accountId: Long) : List<Group>\n\n    suspend fun transfer(transfer: Transfer) : Group\n\n    suspend fun pull(pull: Pull) : Group\n\n    suspend fun invite(invite: Invite) : Result<Unit>\n\n    suspend fun accept(invitationId: InvitationId) : Result<Unit>\n\n    suspend fun reject(invitationId: InvitationId) : Result<Unit>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/InvitationId.kt",
    "content": "package net.pantasystem.milktea.model.group\n\ndata class InvitationId(\n    val accountId: Long,\n    val invitationId: String\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/Invite.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nimport net.pantasystem.milktea.model.user.User\n\ndata class Invite(\n    val groupId: Group.Id,\n    val userId: User.Id\n)\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/Pull.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nimport net.pantasystem.milktea.model.user.User\n\ndata class Pull (\n    val groupId: Group.Id,\n    val userId: User.Id,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/RejectGroupInvitationUseCase.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nimport net.pantasystem.milktea.model.UseCase\nimport javax.inject.Inject\n\nclass RejectGroupInvitationUseCase @Inject constructor(\n    private val groupRepository: GroupRepository,\n): UseCase {\n\n    suspend operator fun invoke(p1: InvitationId): Result<Unit> {\n        return groupRepository.reject(p1)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/Transfer.kt",
    "content": "package net.pantasystem.milktea.model.group\n\nimport net.pantasystem.milktea.model.user.User\n\ndata class Transfer(\n    val groupId: Group.Id,\n    val userId: User.Id\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/group/UpdateGroup.kt",
    "content": "package net.pantasystem.milktea.model.group\n\ndata class UpdateGroup (val groupId: Group.Id, val name: String)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/hashtag/HashTag.kt",
    "content": "package net.pantasystem.milktea.model.hashtag\n\ndata class HashTag(\n    val name: String,\n    val usersCount: Int,\n    val chart: List<Int>,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/hashtag/HashtagRepository.kt",
    "content": "package net.pantasystem.milktea.model.hashtag\n\ninterface HashtagRepository {\n    suspend fun search(accountId: Long, query: String, limit: Int = 10, offset: Int = 0): Result<List<String>>\n\n    suspend fun trends(accountId: Long): Result<List<HashTag>>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/image/ImageCache.kt",
    "content": "package net.pantasystem.milktea.model.image\n\nimport kotlinx.datetime.Instant\n\ndata class ImageCache(\n    val sourceUrl: String,\n    val cachePath: String,\n    val cachedAt: Instant,\n    val width: Int?,\n    val height: Int?,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/image/ImageCacheRepository.kt",
    "content": "package net.pantasystem.milktea.model.image\n\ninterface ImageCacheRepository {\n    suspend fun save(url: String): Result<ImageCache>\n    suspend fun findBySourceUrl(url: String): Result<ImageCache?>\n    suspend fun deleteExpiredCaches(): Result<Unit>\n    suspend fun clear(): Result<Unit>\n\n    suspend fun findBySourceUrls(urls: List<String>): Result<List<ImageCache>>\n\n    suspend fun findCachedFileCount(reality: Boolean = false): Result<Long>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/FeatureEnables.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\ninterface FeatureEnables {\n    suspend fun isEnable(\n        instanceDomain: String,\n        type: FeatureType,\n        default: Boolean = true,\n    ): Boolean\n\n    suspend fun enableFeatures(instanceDomain: String): Set<FeatureType>\n}\n\nenum class FeatureType {\n    Gallery, Channel, Group, Antenna, UserReactionHistory, Drive, Bookmark, Clip, Messaging, ReactionAcceptance, PostReactionUsers, PostLocalOnlyVisibility\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/HostWithVersion.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nobject HostWithVersion {\n\n    private val hostWithVersion = mutableMapOf<String, Version>()\n\n    fun put(host: String, version: Version) {\n        synchronized(this) {\n            hostWithVersion[host] = version\n        }\n    }\n\n    fun get(host: String): Version? {\n        return synchronized(this) {\n            hostWithVersion[host]\n        }\n    }\n\n    fun isOverV13(host: String?, default: Boolean = false): Boolean {\n        if (host == null) {\n            return false\n        }\n        return get(host)?.let {\n            it >= Version(\"13.0.0\")\n        } ?: default\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/IllegalVersionException.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport java.lang.IllegalStateException\n\nclass IllegalVersionException : IllegalStateException(\"要求されたバージョンに満たないAPIです。\")"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/InstanceInfo.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\ndata class InstanceInfo(\n    val id: String,\n    val host: String,\n    val name: String?,\n    val description: String?,\n    val clientMaxBodyByteSize: Long?,\n    val iconUrl: String?,\n    val themeColor: String?,\n)\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/InstanceInfoService.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport kotlinx.coroutines.ExperimentalCoroutinesApi\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.asFlow\nimport kotlinx.coroutines.flow.combine\nimport kotlinx.coroutines.flow.flatMapLatest\nimport kotlinx.coroutines.flow.flowOf\nimport kotlinx.coroutines.flow.map\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport java.net.URL\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nopen class InstanceInfoService @Inject constructor(\n    private val mastodonInstanceInfoRepository: MastodonInstanceInfoRepository,\n    private val metaRepository: MetaRepository,\n    private val nodeInfoRepository: NodeInfoRepository,\n    private val customEmojiRepository: CustomEmojiRepository,\n) {\n\n    open suspend fun find(instanceDomain: String): Result<InstanceInfoType> {\n        return nodeInfoRepository.find(URL(instanceDomain).host).mapCancellableCatching {\n            when(it.type) {\n                is NodeInfo.SoftwareType.Mastodon -> {\n                    InstanceInfoType.Mastodon(\n                        it,\n                        mastodonInstanceInfoRepository.find(instanceDomain).getOrThrow()\n                    )\n                }\n                is NodeInfo.SoftwareType.Misskey -> {\n                    InstanceInfoType.Misskey(\n                        it,\n                        metaRepository.find(instanceDomain).getOrThrow()\n                    )\n                }\n                is NodeInfo.SoftwareType.Firefish -> {\n                    InstanceInfoType.Firefish(\n                        it,\n                        metaRepository.find(instanceDomain).getOrThrow()\n                    )\n                }\n                is NodeInfo.SoftwareType.Pleroma -> {\n                    InstanceInfoType.Pleroma(\n                        it,\n                        mastodonInstanceInfoRepository.find(instanceDomain).getOrThrow()\n                    )\n                }\n                is NodeInfo.SoftwareType.Other -> throw NoSuchElementException()\n            }\n        }\n    }\n\n    open suspend fun sync(instanceDomain: String): Result<Unit> {\n        return nodeInfoRepository.find(URL(instanceDomain).host).mapCancellableCatching {\n            when(it.type) {\n                is NodeInfo.SoftwareType.Mastodon -> {\n                    mastodonInstanceInfoRepository.sync(instanceDomain).getOrThrow()\n                    customEmojiRepository.sync(it.host)\n                }\n                is NodeInfo.SoftwareType.Misskey -> {\n                    metaRepository.sync(instanceDomain)\n                    customEmojiRepository.sync(it.host).getOrThrow()\n                }\n                is NodeInfo.SoftwareType.Pleroma -> {\n                    mastodonInstanceInfoRepository.sync(instanceDomain).getOrThrow()\n                    customEmojiRepository.sync(it.host)\n                }\n                is NodeInfo.SoftwareType.Firefish -> {\n                    metaRepository.sync(instanceDomain)\n                    customEmojiRepository.sync(it.host).getOrThrow()\n                }\n                is NodeInfo.SoftwareType.Other -> throw NoSuchElementException()\n            }\n        }\n    }\n\n    @OptIn(ExperimentalCoroutinesApi::class)\n    open fun observe(instanceDomain: String): Flow<InstanceInfoType?> {\n        return suspend {\n            nodeInfoRepository.find(URL(instanceDomain).host).getOrNull()\n        }.asFlow().flatMapLatest { nodeInfo ->\n            when(nodeInfo?.type) {\n                is NodeInfo.SoftwareType.Mastodon -> {\n                    mastodonInstanceInfoRepository.observe(instanceDomain).map {\n                        it?.let {\n                            InstanceInfoType.Mastodon(nodeInfo, it)\n                        }\n                    }\n                }\n                is NodeInfo.SoftwareType.Misskey -> {\n                    metaRepository.observe(instanceDomain).map {\n                        it?.let {\n                            InstanceInfoType.Misskey(nodeInfo, it)\n                        }\n                    }\n                }\n                is NodeInfo.SoftwareType.Firefish -> {\n                    metaRepository.observe(instanceDomain).map {\n                        it?.let {\n                            InstanceInfoType.Firefish(nodeInfo, it)\n                        }\n                    }\n                }\n                is NodeInfo.SoftwareType.Pleroma -> {\n                    mastodonInstanceInfoRepository.observe(instanceDomain).map {\n                        it?.let {\n                            InstanceInfoType.Pleroma(nodeInfo, it)\n                        }\n                    }\n                }\n                is NodeInfo.SoftwareType.Other -> flowOf(null)\n                null -> flowOf(null)\n            }\n        }\n    }\n\n    open fun observeIn(instanceDomains: List<String>): Flow<List<InstanceInfoType>> {\n        return combine(instanceDomains.map { observe(it) }) {\n            it.filterNotNull()\n        }.map {\n            it.toList()\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/InstanceInfoType.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\n\nsealed interface InstanceInfoType {\n    val nodeInfo: NodeInfo\n    val softwareType: NodeInfo.SoftwareType\n    data class Misskey(override val nodeInfo: NodeInfo, val meta: Meta) : InstanceInfoType {\n        override val softwareType: NodeInfo.SoftwareType.Misskey\n            get() = nodeInfo.type as NodeInfo.SoftwareType.Misskey\n    }\n    data class Mastodon(override val nodeInfo: NodeInfo, val info: MastodonInstanceInfo) : InstanceInfoType {\n        override val softwareType: NodeInfo.SoftwareType.Mastodon\n            get() =  nodeInfo.type as NodeInfo.SoftwareType.Mastodon\n    }\n\n    data class Pleroma(override val nodeInfo: NodeInfo, val info: MastodonInstanceInfo) : InstanceInfoType {\n        override val softwareType: NodeInfo.SoftwareType.Pleroma\n            get() = nodeInfo.type as NodeInfo.SoftwareType.Pleroma\n    }\n\n    data class Firefish(override val nodeInfo: NodeInfo, val meta: Meta) : InstanceInfoType {\n        override val softwareType: NodeInfo.SoftwareType.Firefish\n            get() = nodeInfo.type as NodeInfo.SoftwareType.Firefish\n    }\n\n    val iconUrl: String? get() {\n        return when(this) {\n            is Mastodon -> \"https://${info.uri}/favicon.ico\"\n            is Pleroma -> \"https://${info.uri}/favicon.ico\"\n            is Misskey -> meta.iconUrl ?: \"${meta.uri}/favicon.ico\"\n            is Firefish -> meta.iconUrl ?: \"${meta.uri}/favicon.ico\"\n        }\n    }\n\n    val uri: String get() {\n        return when(this) {\n            is Mastodon -> \"https://${info.uri}\"\n            is Pleroma -> \"https://${info.uri}\"\n            is Misskey -> meta.uri\n            is Firefish -> meta.uri\n        }\n    }\n\n    val maxNoteTextLength: Int get() {\n        return when(this) {\n            is Mastodon -> info.configuration?.statuses?.maxCharacters ?: 500\n            is Pleroma -> info.configuration?.statuses?.maxCharacters ?: 500\n            is Misskey -> meta.maxNoteTextLength ?: 3000\n            is Firefish -> meta.maxNoteTextLength ?: 3000\n        }\n    }\n\n    val maxFileCount: Int get() {\n        return when(this) {\n            is Mastodon -> info.configuration?.statuses?.maxMediaAttachments ?: 4\n            is Pleroma -> info.configuration?.statuses?.maxMediaAttachments ?: 4\n            is Misskey -> if (meta.getVersion() >= Version(\"12.100.2\")) {\n                16\n            } else {\n                4\n            }\n            is Firefish -> 16\n        }\n    }\n\n    val maxReactionsPerAccount: Int get() {\n        // TODO: Pleromaの場合はリアクション可能な件数の判定方法が異なるのであとで修正する\n        return when(this) {\n            is Mastodon -> info.configuration?.emojiReactions?.maxReactionsPerAccount ?: 0\n            is Pleroma -> info.configuration?.emojiReactions?.maxReactionsPerAccount ?: 0\n            is Misskey -> 1\n            is Firefish -> 1\n        }\n    }\n\n    val name: String get() {\n        return when(this) {\n            is Mastodon -> info.title\n            is Misskey -> meta.name ?: \"Misskey\"\n            is Pleroma -> info.title\n            is Firefish -> meta.name ?: \"Firefish\"\n        }\n    }\n\n    val canMultipleReaction: Boolean get() {\n        return maxReactionsPerAccount > 1\n    }\n\n    val canQuote: Boolean get() {\n        return when(this) {\n            is Mastodon -> info.featureQuote\n            is Misskey -> true\n            is Pleroma -> true\n            is Firefish -> true\n        }\n    }\n\n    val isRequirePerformNyaizeFrontend: Boolean get() {\n        return this is Misskey && this.meta.getVersion() >= Version(\"2023.10.2\")\n    }\n\n    val version: Version get() {\n        return when(this) {\n            is Firefish -> meta.getVersion()\n            is Mastodon -> Version(info.version)\n            is Misskey -> meta.getVersion()\n            is Pleroma -> Version(info.version)\n        }\n    }\n\n    val isCwAllowBlank: Boolean get() {\n        return when(this) {\n            is Firefish -> true\n            is Mastodon -> true\n            is Misskey -> meta.getVersion() < Version(\"2023.11.0\")\n            is Pleroma -> true\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/MastodonInstanceInfo.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\n\ndata class MastodonInstanceInfo(\n    val uri: String,\n    val title: String,\n    val description: String,\n    val email: String,\n    val version: String,\n    val urls: Urls,\n    val configuration: Configuration?,\n    val fedibirdCapabilities: List<String>?,\n    val pleroma: Pleroma?,\n) {\n    companion object;\n\n    data class Configuration(\n        val statuses: Statuses?,\n        val polls: Polls?,\n        val emojiReactions: EmojiReactions?,\n    ) {\n\n        data class Statuses(\n            val maxCharacters: Int?,\n            val maxMediaAttachments: Int?,\n        )\n\n        data class Polls(\n            val maxOptions: Int?,\n            val maxCharactersPerOption: Int?,\n            val minExpiration: Int?,\n            val maxExpiration: Int?,\n        )\n\n        data class EmojiReactions(\n            val maxReactions: Int?,\n            val maxReactionsPerAccount: Int?\n        )\n\n    }\n\n    data class Urls(\n        val streamingApi: String?\n    )\n\n\n    // リアクションを使用可能か？\n    val isReactionAvailable: Boolean\n        get() = (fedibirdCapabilities?.contains(\"emoji_reaction\") ?: false)\n                || (pleroma?.metadata?.features?.contains(\"pleroma_emoji_reactions\") ?: false)\n\n    val maxReactionsPerAccount: Int\n        get() = configuration?.emojiReactions?.maxReactionsPerAccount\n            ?: Int.MAX_VALUE.takeIf {\n                pleroma?.metadata?.features?.contains(\"pleroma_emoji_reactions\") == true\n            } ?: 0\n\n    val featureQuote: Boolean\n        get() = fedibirdCapabilities?.contains(\"feature_quote\") == true\n\n    data class Pleroma(\n        val metadata: Metadata,\n    ) {\n        data class Metadata(\n            val features: List<String>\n        )\n    }\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/MastodonInstanceInfoRepository.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface MastodonInstanceInfoRepository {\n\n    suspend fun sync(instanceDomain: String): Result<Unit>\n\n    fun observe(instanceDomain: String): Flow<MastodonInstanceInfo?>\n\n    suspend fun find(instanceDomain: String): Result<MastodonInstanceInfo>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/Meta.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n@Serializable\ndata class Meta(\n    @SerialName(\"uri\") var uri: String,\n    @SerialName(\"bannerUrl\") var bannerUrl: String? = null,\n    @SerialName(\"cacheRemoteFiles\") var cacheRemoteFiles: Boolean? = null,\n    @SerialName(\"description\") var description: String? = null,\n    @SerialName(\"disableGlobalTimeline\") var disableGlobalTimeline: Boolean? = null,\n    @SerialName(\"disableLocalTimeline\") var disableLocalTimeline: Boolean? = null,\n    @SerialName(\"disableRegistration\") var disableRegistration: Boolean? = null,\n    @SerialName(\"driveCapacityPerLocalUserMb\") var driveCapacityPerLocalUserMb: Int? = null,\n    @SerialName(\"driveCapacityPerRemoteUserMb\") var driveCapacityPerRemoteUserMb: Int? = null,\n    @SerialName(\"enableDiscordIntegration\") var enableDiscordIntegration: Boolean? = null,\n    @SerialName(\"enableEmail\") var enableEmail: Boolean? = null,\n    @SerialName(\"enableEmojiReaction\") var enableEmojiReaction: Boolean? = null,\n    @SerialName(\"enableGithubIntegration\") var enableGithubIntegration: Boolean? = null,\n    @SerialName(\"enableRecaptcha\") var enableRecaptcha: Boolean? = null,\n    @SerialName(\"enableServiceWorker\") var enableServiceWorker: Boolean? = null,\n    @SerialName(\"enableTwitterIntegration\") var enableTwitterIntegration: Boolean? = null,\n    @SerialName(\"errorImageUrl\") var errorImageUrl: String? = null,\n    @SerialName(\"feedbackUrl\") var feedbackUrl: String? = null,\n    @SerialName(\"iconUrl\") var iconUrl: String? = null,\n    @SerialName(\"maintainerEmail\") var maintainerEmail: String? = null,\n    @SerialName(\"maintainerName\") var maintainerName: String? = null,\n    @SerialName(\"mascotImageUrl\") var mascotImageUrl: String? = null,\n    @SerialName(\"maxNoteTextLength\") var maxNoteTextLength: Int? = null,\n    @SerialName(\"name\") var name: String? = null,\n    @SerialName(\"recaptchaSiteKey\") var recaptchaSiteKey: String? = null,\n    @SerialName(\"secure\") var secure: Boolean? = null,\n    @SerialName(\"swPublickey\") var swPublicKey: String? = null,\n    @SerialName(\"ToSUrl\") var toSUrl: String? = null,\n    @SerialName(\"version\") var version: String = \"\",\n) {\n\n\n    fun getVersion(): Version {\n        return Version(version)\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/MetaDataSource.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport kotlinx.coroutines.flow.Flow\n\n\ninterface MetaDataSource {\n\n    suspend fun add(meta: Meta) : Meta\n\n    suspend fun get(instanceDomain: String) : Meta?\n\n    suspend fun delete(meta: Meta)\n\n    fun observe(instanceDomain: String) : Flow<Meta?>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/MetaRepository.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface MetaRepository {\n    suspend fun sync(instanceDomain: String): Result<Unit>\n\n    fun observe(instanceDomain: String): Flow<Meta?>\n    suspend fun find(instanceDomain: String): Result<Meta>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/SyncMetaExecutor.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\ninterface SyncMetaExecutor {\n\n    operator fun invoke(instanceBaseUrl: String) {\n\n    }\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/Version.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nclass Version : Comparable<Version>{\n\n    enum class Major{\n        V_10{\n            override fun range(version: Version): Boolean {\n                return version >= Version(\"10\") && version < Version(\"11\")\n            }\n        },\n        V_11{\n            override fun range(version: Version): Boolean {\n                return version >= Version(\"11\") && version < Version(\"12\")\n            }\n        },\n        V_12{\n            override fun range(version: Version): Boolean {\n                return version >= Version(\"12\") && version < Version(\"13\")\n            }\n        },\n        V_13 {\n            override fun range(version: Version): Boolean {\n                return version >= Version(\"13\") && version < Version(\"14\")\n            }\n        };\n\n        abstract fun range(version: Version): Boolean\n    }\n\n    private val subVersions: List<Int>\n\n    constructor(version: String){\n        subVersions = version.split(\".\").map{\n            try{\n                Integer.parseInt(it)\n            }catch(e: NumberFormatException){\n                0\n            }\n        }\n    }\n\n    constructor(meta: Meta) : this(meta.version)\n\n\n    override fun compareTo(other: Version): Int {\n        // 桁違いに酔って発生したスペースは０とする\n        val size = other.subVersions.size.coerceAtLeast(this.subVersions.size)\n        for(index in 0 until size){\n            val result = this.getSubVersion(index).compareTo(other.getSubVersion(index))\n            if(result != 0){\n                return result\n            }\n        }\n        return 0\n    }\n\n    private fun getSubVersion(index: Int): Int{\n        return try{\n            subVersions[index]\n        }catch(e: IndexOutOfBoundsException){\n            0\n        }\n    }\n\n    override fun equals(other: Any?): Boolean {\n        if (this === other) return true\n        if (javaClass != other?.javaClass) return false\n\n        other as Version\n\n        if (subVersions != other.subVersions) return false\n\n        return true\n    }\n\n    override fun hashCode(): Int {\n        return subVersions.hashCode()\n    }\n\n    fun isUntilRange(minVersion: Version, maxVersion: Version): Boolean{\n        return try{\n            this >= minVersion && this < maxVersion\n        }catch( e: Exception ){\n            false\n        }\n    }\n\n    fun isInRange(version: Major): Boolean{\n        return try{\n            version.range(this)\n        }catch( e: Exception ){\n            false\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/online/user/count/OnlineUserCountRepository.kt",
    "content": "package net.pantasystem.milktea.model.instance.online.user.count\n\ninterface OnlineUserCountRepository {\n    suspend fun find(accountId: Long): Result<OnlineUserCountResult>\n}\n\nsealed interface OnlineUserCountResult {\n    object Unknown : OnlineUserCountResult\n    data class Success(val count: Int) : OnlineUserCountResult\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/ticker/InstanceTicker.kt",
    "content": "package net.pantasystem.milktea.model.instance.ticker\n\ndata class InstanceTicker(\n    val uri: String,\n    val faviconUrl: String?,\n    val iconUrl: String?,\n    val name: String?,\n    val softwareName: String?,\n    val softwareVersion: String?,\n    val themeColor: String?,\n) {\n\n    fun isValid(): Boolean {\n        return uri.isNotEmpty() && name != null && themeColor != null\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/instance/ticker/InstanceTickerRepository.kt",
    "content": "package net.pantasystem.milktea.model.instance.ticker\n\ninterface InstanceTickerRepository {\n\n    suspend fun sync(host: String): Result<Unit>\n\n    suspend fun find(host: String): Result<InstanceTicker>\n\n    suspend fun get(host: String): Result<InstanceTicker?>\n\n    suspend fun findIn(hosts: List<String>): Result<List<InstanceTicker>>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/list/UserList.kt",
    "content": "package net.pantasystem.milktea.model.list\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.Entity\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.user.User\n\ndata class UserList(\n    val id: Id,\n    val createdAt: Instant,\n    val name: String,\n    val userIds: List<User.Id>\n) : Entity {\n\n    data class Id(\n        val accountId: Long,\n        val userListId: String\n    ) : EntityId\n}\n\ndata class UserListWithMembers(\n    val userList: UserList,\n    val members: List<UserListMember>,\n)\n\ndata class UserListMember(\n    val userId: User.Id,\n    val avatarUrl: String?,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/list/UserListRepository.kt",
    "content": "package net.pantasystem.milktea.model.list\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.user.User\n\ninterface UserListRepository {\n    suspend fun findByAccountId(accountId: Long): List<UserList>\n\n    suspend fun create(accountId: Long, name: String): UserList\n\n    suspend fun update(listId: UserList.Id, name: String)\n\n    suspend fun appendUser(listId: UserList.Id, userId: User.Id)\n\n    suspend fun removeUser(listId: UserList.Id, userId: User.Id)\n\n    suspend fun delete(listId: UserList.Id)\n\n    suspend fun findOne(userListId: UserList.Id): UserList\n\n    suspend fun syncByAccountId(accountId: Long): Result<Unit>\n\n    suspend fun syncOne(userListId: UserList.Id): Result<Unit>\n\n    fun observeByAccountId(accountId: Long): Flow<List<UserListWithMembers>>\n\n    fun observeOne(userListId: UserList.Id): Flow<UserListWithMembers?>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/list/UserListTabToggleAddToTabUseCase.kt",
    "content": "package net.pantasystem.milktea.model.list\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Page\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.antenna.AccountService\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UserListTabToggleAddToTabUseCase @Inject constructor(\n    private val userListRepository: UserListRepository,\n    private val accountRepository: AccountRepository,\n    private val accountService: AccountService,\n): UseCase {\n\n    suspend operator fun invoke(listId: UserList.Id, addTabToAccountId: Long? = null) = runCancellableCatching<Unit> {\n        val account = accountRepository.get(addTabToAccountId ?: listId.accountId)\n            .getOrThrow()\n        val page = account.pages.firstOrNull { page ->\n            page.pageParams.listId == listId.userListId\n                    && listId.accountId == (page.attachedAccountId ?: page.accountId)\n        }\n\n        val relatedAccount = accountRepository.get(listId.accountId).getOrThrow()\n\n        if (page == null) {\n            val userList = userListRepository.findOne(listId)\n            accountService.add(\n                Page(\n                    account.accountId,\n                    if (addTabToAccountId == null) userList.name else \"${userList.name}(${relatedAccount.getAcct()})\",\n                    weight = -1,\n                    attachedAccountId = if (addTabToAccountId == null) null else relatedAccount.accountId,\n                    pageable = when(account.instanceType) {\n                        Account.InstanceType.MISSKEY, Account.InstanceType.FIREFISH -> Pageable.UserListTimeline(\n                            listId.userListId\n                        )\n                        Account.InstanceType.MASTODON, Account.InstanceType.PLEROMA -> Pageable.Mastodon.ListTimeline(\n                            listId.userListId\n                        )\n                    }\n                )\n            )\n\n        } else {\n            accountService.remove(page)\n        }\n\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/markers/MarkerRepository.kt",
    "content": "package net.pantasystem.milktea.model.markers\n\nimport kotlinx.datetime.Instant\n\ninterface MarkerRepository {\n\n    suspend fun find(accountId: Long, types: List<MarkerType>): Result<Markers>\n\n    suspend fun save(accountId: Long, params: SaveMarkerParams): Result<Markers>\n\n}\n\nenum class MarkerType {\n    Home, Notifications,\n}\n\ndata class Markers(\n    val home: Marker?,\n    val notifications: Marker?\n)\n\ndata class Marker(\n    val lastReadId: String,\n    val version: Long,\n    val updatedAt: Instant\n)\n\ndata class SaveMarkerParams(\n    val home: String? = null,\n    val notifications: String? = null,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/Message.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.group.GroupRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport net.pantasystem.milktea.model.group.Group as GroupEntity\n\n\nsealed class Message {\n    data class Id(\n        val accountId: Long,\n        val messageId: String\n    ) : EntityId\n\n    abstract val id: Id\n    abstract val createdAt: Instant\n    abstract val text: String?\n    abstract val userId: User.Id\n    abstract val fileId: String?\n    abstract val file: FileProperty?\n    abstract val isRead: Boolean\n    abstract val emojis: List<CustomEmoji>\n\n    /**\n     * isReadをtrueにして新しいオブジェクトを返す\n     */\n    abstract fun read(): Message\n\n    fun messagingId(account: Account): MessagingId {\n        return when (this) {\n            is Direct -> MessagingId.Direct(this, account)\n            is Group -> MessagingId.Group(groupId)\n        }\n    }\n\n\n    data class Group(\n        override val id: Id,\n        override val createdAt: Instant,\n        override val text: String?,\n        override val userId: User.Id,\n        override val fileId: String?,\n        override val file: FileProperty?,\n        override val isRead: Boolean,\n        override val emojis: List<CustomEmoji>,\n        val groupId: GroupEntity.Id,\n        val reads: List<User.Id>\n    ) : Message() {\n        override fun read(): Message {\n            return this.copy(isRead = true)\n        }\n    }\n\n    /**\n     * @param recipientId 受信者のUser.Id\n     */\n    data class Direct(\n        override val id: Id,\n        override val createdAt: Instant,\n        override val text: String?,\n        override val userId: User.Id,\n        override val fileId: String?,\n        override val file: FileProperty?,\n        override val isRead: Boolean,\n        override val emojis: List<CustomEmoji>,\n        val recipientId: User.Id\n    ) : Message() {\n\n        companion object;\n\n        override fun read(): Message {\n            return this.copy(isRead = true)\n        }\n\n        fun partnerUserId(account: Account): User.Id {\n            return if (recipientId == User.Id(account.accountId, account.remoteId)) {\n                userId\n            } else {\n                recipientId\n            }\n        }\n    }\n\n}\n\nfun Message.Direct.Companion.make(\n    id: Message.Id,\n    userId: User.Id,\n    recipientId: User.Id,\n    createdAt: Instant = Clock.System.now(),\n    text: String? = null,\n    fileId: String? = null,\n    file: FileProperty? = null,\n    isRead: Boolean = false,\n    emojis: List<CustomEmoji> = emptyList()\n): Message.Direct {\n\n    return Message.Direct(\n        id = id,\n        userId = userId,\n        recipientId = recipientId,\n        createdAt = createdAt,\n        text = text,\n        file = file,\n        fileId = fileId,\n        isRead = isRead,\n        emojis = emojis,\n    )\n}\n\n\nsealed class CreateMessage {\n    abstract val accountId: Long\n    abstract val text: String?\n    abstract val fileId: String?\n\n    data class Direct(\n        override val accountId: Long,\n        val userId: User.Id,\n        override val text: String?,\n        override val fileId: String?,\n    ) : CreateMessage()\n\n    data class Group(\n        override val accountId: Long,\n        val groupId: GroupEntity.Id,\n        override val text: String?,\n        override val fileId: String?\n    ) : CreateMessage()\n\n    object Factory {\n\n        fun create(messagingId: MessagingId, text: String?, fileId: String?): CreateMessage {\n            return when (messagingId) {\n                is MessagingId.Direct -> {\n                    Direct(\n                        messagingId.accountId,\n                        messagingId.userId,\n                        text,\n                        fileId\n                    )\n                }\n                is MessagingId.Group -> {\n                    Group(\n                        messagingId.accountId,\n                        messagingId.groupId,\n                        text,\n                        fileId\n                    )\n                }\n            }\n        }\n    }\n}\n\nsealed class MessageRelation {\n\n    abstract val message: Message\n    abstract val user: User\n    abstract val account: Account\n\n    data class Group(\n        override val message: Message.Group,\n        override val user: User,\n        override val account: Account\n    ) : MessageRelation()\n\n    data class Direct(\n        override val message: Message.Direct,\n        override val user: User,\n        override val account: Account\n    ) : MessageRelation()\n\n    fun isMime(account: Account): Boolean {\n        return message.userId == User.Id(account.accountId, account.remoteId)\n    }\n\n    fun isMine(): Boolean {\n        return message.userId == User.Id(account.accountId, account.remoteId)\n    }\n\n}\n\nsealed class MessageHistoryRelation : MessageRelation() {\n    data class Group(\n        override val message: Message,\n        override val user: User,\n        val group: GroupEntity,\n        override val account: Account\n    ) : MessageHistoryRelation()\n\n    data class Direct(\n        override val message: Message,\n        override val user: User,\n        val recipient: User,\n        override val account: Account\n    ) : MessageHistoryRelation()\n}\n\nval MessageHistoryRelation.Direct.partner: User\n    get() {\n        return if (this.recipient.id.id == account.remoteId) {\n            this.user\n        } else {\n            this.recipient\n        }\n    }\n\nval MessageHistoryRelation.thumbnailUrl: String?\n    get() {\n        return when (this) {\n            is MessageHistoryRelation.Direct -> partner.avatarUrl\n            is MessageHistoryRelation.Group -> user.avatarUrl\n        }\n    }\n\nval MessageHistoryRelation.messagingId: MessagingId\n    get() {\n        return message.messagingId(account)\n    }\n\n\nfun MessageHistoryRelation.getTitle(isUserNameDefault: Boolean): String {\n\n    return when (this) {\n        is MessageHistoryRelation.Direct -> {\n            if (isUserNameDefault) {\n                partner.displayUserName\n            } else {\n                partner.displayName\n            }\n        }\n        is MessageHistoryRelation.Group -> {\n            group.name\n        }\n    }\n}\n\nsuspend fun MessageRelation.toHistory(\n    groupRepository: GroupRepository,\n    userRepository: UserRepository\n): MessageHistoryRelation {\n    return when (val msg = message) {\n        is Message.Direct -> {\n            val recipient = userRepository.find(msg.recipientId, false)\n            MessageHistoryRelation.Direct(this.message, this.user, recipient, account)\n        }\n        is Message.Group -> {\n            val group = groupRepository.syncOne(msg.groupId)\n            MessageHistoryRelation.Group(this.message, this.user, group, account)\n        }\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/MessageNotFoundException.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\nclass MessageNotFoundException(messageId: Message.Id) : NoSuchElementException(\"$messageId は見つかりませんでした\")"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/MessageObserver.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.account.Account\n\ninterface MessageObserver {\n    fun observeAllAccountsMessages(): Flow<Message>\n    fun observeByMessagingId(messagingId: MessagingId): Flow<Message>\n    fun observeAccountMessages(ac: Account): Flow<Message>\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/MessageRelationGetter.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\ninterface MessageRelationGetter {\n    suspend fun get(messageId: Message.Id): MessageRelation\n\n    suspend fun get(message: Message): MessageRelation\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/MessageRepository.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\ninterface MessageRepository {\n\n    suspend fun read(messageId: Message.Id): Boolean\n\n    suspend fun create(createMessage: CreateMessage): Message\n\n    suspend fun delete(messageId: Message.Id): Boolean\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/MessagingId.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\nimport java.io.Serializable\nimport net.pantasystem.milktea.model.group.Group as GroupEntity\n\nsealed class MessagingId : Serializable {\n\n    val accountId: Long\n        get() {\n            return when (this) {\n                is Group -> {\n                    groupId.accountId\n                }\n                is Direct -> {\n                    userId.accountId\n                }\n            }\n        }\n\n    data class Group(\n        val groupId: GroupEntity.Id\n    ) : MessagingId()\n\n    data class Direct(\n        val userId: User.Id\n    ) : MessagingId() {\n        constructor(\n            message: Message.Direct,\n            account: Account\n        ) : this(message.partnerUserId(account))\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/MessagingRepository.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\ninterface MessagingRepository {\n    suspend fun findMessageSummaries(accountId: Long, isGroup: Boolean = false): Result<List<MessageRelation>>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/messaging/UnReadMessages.kt",
    "content": "package net.pantasystem.milktea.model.messaging\n\nimport kotlinx.coroutines.flow.Flow\n\n/**\n * NOTE: UseCase層として分離したほうがいいのではないか？\n */\ninterface UnReadMessages {\n\n    fun findAll(): Flow<List<Message>>\n\n    fun findByMessagingId(messagingId: MessagingId): Flow<List<Message>>\n\n    fun findByAccountId(accountId: Long): Flow<List<Message>>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/nodeinfo/NodeInfo.kt",
    "content": "package net.pantasystem.milktea.model.nodeinfo\n\nimport net.pantasystem.milktea.model.instance.Version\n\n\ndata class NodeInfo(\n    val host: String,\n    val version: String,\n    val software: Software,\n) {\n\n    data class Software(\n        val name: String,\n        val version: String,\n    )\n\n    sealed interface SoftwareType {\n        val version: String\n        val name: String\n        sealed interface Misskey : SoftwareType {\n            data class Normal(\n                override val name: String,\n                override val version: String,\n            ) : Misskey\n\n            data class Calckey(\n                override val name: String,\n                override val version: String,\n            ) : Misskey\n\n            data class Meisskey(\n                override val name: String,\n                override val version: String\n            ) : Misskey\n\n            data class Foundkey(\n                override val name: String,\n                override val version: String\n            ) : Misskey\n        }\n\n        sealed interface Mastodon : SoftwareType {\n            data class Normal(\n                override val name: String,\n                override val version: String,\n            ) : Mastodon\n\n            data class Fedibird(\n                override val name: String,\n                override val version: String,\n            ) : Mastodon\n\n            data class Kmyblue(\n                override val name: String,\n                override val version: String,\n            ) : Mastodon\n        }\n\n        sealed interface Pleroma : SoftwareType {\n            data class Normal(\n                override val name: String,\n                override val version: String\n            ) : Pleroma\n\n            data class Akkoma(\n                override val name: String,\n                override val version: String\n            ) : Pleroma\n        }\n\n        data class Firefish(\n            override val version: String,\n            override val name: String\n        ) : SoftwareType\n\n        data class Other(\n            override val version: String,\n            override val name: String\n        ) : SoftwareType\n    }\n\n    val type = when(software.name) {\n        \"calckey\" -> SoftwareType.Misskey.Calckey(version = software.version, name = software.name)\n        \"misskey\", \"sharkey\", \"cherrypick\" -> SoftwareType.Misskey.Normal(version = software.version, name = software.name)\n        \"mastodon\" -> SoftwareType.Mastodon.Normal(version = software.version, name = software.name)\n        \"fedibird\" -> SoftwareType.Mastodon.Fedibird(version = software.version, name = software.name)\n        \"meisskey\" -> SoftwareType.Misskey.Meisskey(version = software.version, name = software.name)\n        \"foundkey\" -> SoftwareType.Misskey.Foundkey(version = software.version, name = software.name)\n        \"pleroma\" -> SoftwareType.Pleroma.Normal(version = software.version, name = software.name)\n        \"akkoma\" -> SoftwareType.Pleroma.Akkoma(version = software.version, name = software.name)\n        \"firefish\", \"iceshrimp\" -> SoftwareType.Firefish(version = software.version, name = software.name)\n        \"kmyblue\" -> SoftwareType.Mastodon.Kmyblue(version = software.version, name = software.name)\n        \"Iceshrimp.NET\" -> SoftwareType.Mastodon.Normal(version = software.version, name = software.name)\n        else -> SoftwareType.Other(version = software.version, name = software.name)\n    }\n}\n\nfun NodeInfo.SoftwareType.getVersion(): Version {\n    return Version(this.version)\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/nodeinfo/NodeInfoRepository.kt",
    "content": "package net.pantasystem.milktea.model.nodeinfo\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface NodeInfoRepository {\n    suspend fun find(host: String): Result<NodeInfo>\n    suspend fun sync(host: String): Result<Unit>\n    suspend fun syncAll(): Result<Unit>\n    fun get(host: String): NodeInfo?\n    fun observe(host: String): Flow<NodeInfo?>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/CreateNote.kt",
    "content": "package net.pantasystem.milktea.model.note\n\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.from\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.poll.CreatePoll\nimport net.pantasystem.milktea.model.user.User\n\n\n/**\n * @param noExtractEmojis 本文からカスタム絵文字を展開しないか否か\n * @param noExtractMentions 本文からメンションを展開しないか否か\n * @param noExtractHashtags 本文からハッシュタグを展開しないか否か\n */\ndata class CreateNote(\n    val author: Account,\n    val visibility: Visibility,\n    val text: String?,\n    val cw: String? = null,\n    val viaMobile: Boolean? = null,\n    val noExtractMentions: Boolean? = null,\n    val noExtractHashtags: Boolean? = null,\n    val noExtractEmojis: Boolean? = null,\n    var files: List<AppFile>? = null,\n    val replyId: Note.Id? = null,\n    val renoteId: Note.Id? = null,\n    val poll: CreatePoll? = null,\n    val draftNoteId: Long? = null,\n    val channelId: Channel.Id? = null,\n    val scheduleWillPostAt: Instant? = null,\n    val isSensitive: Boolean? = null,\n    val reactionAcceptance: ReactionAcceptanceType? = null,\n)\n\n\nfun DraftNote.toCreateNote(author: Account): CreateNote {\n    return CreateNote(\n        text = this.text,\n        cw = this.cw,\n        draftNoteId = this.draftNoteId,\n        visibility = Visibility(\n            type = this.visibility,\n            isLocalOnly = this.localOnly ?: false,\n            visibleUserIds = this.visibleUserIds?.map {\n                User.Id(accountId = accountId, id = it)\n            }),\n        viaMobile = this.viaMobile ?: true,\n        poll = draftPoll?.let {\n            CreatePoll(\n                choices = it.choices,\n                multiple = it.multiple,\n                expiresAt = it.expiresAt\n            )\n        },\n        replyId = this.replyId?.let {\n            Note.Id(accountId = accountId, noteId = it)\n        },\n        renoteId = this.renoteId?.let {\n            Note.Id(accountId = accountId, noteId = it)\n        },\n        files = draftFiles?.map {\n            AppFile.from(it)\n        } ?: emptyList(),\n        scheduleWillPostAt = reservationPostingAt?.let {\n            Instant.fromEpochMilliseconds(it.time)\n        },\n        channelId = channelId,\n        author = author,\n        isSensitive = isSensitive,\n        reactionAcceptance = reactionAcceptanceType,\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/CreateNoteUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport net.pantasystem.milktea.model.note.draft.DraftNoteService\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport net.pantasystem.milktea.model.setting.RememberVisibility\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass CreateNoteUseCase @Inject constructor(\n    private val noteRepository: NoteRepository,\n    private val draftNoteRepository: DraftNoteRepository,\n    private val settingRepository: LocalConfigRepository,\n    private val draftNoteService: DraftNoteService,\n) : UseCase {\n\n    suspend operator fun invoke(createNote: CreateNote): Result<Note> {\n        return runCancellableCatching {\n            val createNoteResult = noteRepository.create(createNote)\n            if (createNoteResult.isFailure) {\n                draftNoteService.save(createNote)\n            }\n            val result = createNoteResult.getOrThrow()\n            if (createNoteResult.isSuccess && createNote.draftNoteId != null) {\n                draftNoteRepository.delete(createNote.draftNoteId)\n            }\n            setNoteVisibility(createNote)\n\n            return@runCancellableCatching result\n        }\n    }\n\n    suspend internal fun setNoteVisibility(createNote: CreateNote) {\n        if (!(createNote.channelId == null && createNote.renoteId == null && createNote.replyId == null)) {\n            return\n        }\n        val nowConfig =\n            (settingRepository.getRememberVisibility(createNote.author.accountId).getOrThrow())\n\n        when (nowConfig) {\n            is RememberVisibility.None -> return\n            is RememberVisibility.Remember -> settingRepository.save(\n                nowConfig.copy(visibility = createNote.visibility)\n            )\n        }\n\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/DeleteAndEditUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.note.draft.DraftNote\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport net.pantasystem.milktea.model.note.draft.toDraftNote\nimport javax.inject.Inject\n\nclass DeleteAndEditUseCase @Inject constructor(\n    val noteRepository: NoteRepository,\n    val noteRelationGetter: NoteRelationGetter,\n    val draftNoteRepository: DraftNoteRepository,\n) : UseCase {\n\n    suspend operator fun invoke(id: Note.Id): Result<DraftNote> = runCancellableCatching {\n        val relation = noteRelationGetter.get(id).getOrThrow()\n        val result = noteRepository.delete(id).getOrThrow()\n        val draftNote = requireNotNull(relation).copy(note = result).toDraftNote()\n        draftNoteRepository.save(draftNote).getOrThrow()\n    }\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/DeleteNoteUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.model.UseCase\nimport javax.inject.Inject\n\n\nclass DeleteNoteUseCase @Inject constructor(\n    private val noteRepository: NoteRepository,\n): UseCase {\n\n    suspend operator fun invoke(noteId: Note.Id): Result<Note> {\n        return noteRepository.delete(noteId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/FindPinnedNoteUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass FindPinnedNoteUseCase @Inject constructor(\n    private val userRepository: UserRepository,\n    private val noteRepository: NoteRepository,\n): UseCase {\n\n    suspend operator fun invoke(userId: User.Id): Result<List<Note>> = runCancellableCatching{\n        val detailedUser = userRepository.find(userId, true) as User.Detail\n         noteRepository.findIn(detailedUser.info.pinnedNoteIds ?: emptyList())\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/GetAllMentionUsersUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\n@Singleton\nclass GetAllMentionUsersUseCase @Inject constructor(\n    val noteRepository: NoteRepository,\n    val userRepository: UserRepository,\n    val getAccount: GetAccount,\n) : UseCase {\n\n    /**\n     * 返信元を辿りながら、全てのユーザーを取得する\n     * @param noteId 指定されたNoteのIdから親投稿のユーザーを取得していきながらメンション対象のユーザを取得します。\n     */\n    suspend operator fun invoke(\n        noteId: Note.Id,\n        users: List<User> = emptyList(),\n        searchedIds: List<Note.Id> = emptyList()\n    ): Result<List<User>> {\n        return withContext(Dispatchers.IO) {\n            // NOTE:\n            if (searchedIds.contains(noteId)) {\n                return@withContext Result.success(users)\n            }\n            runCancellableCatching {\n                val me = getAccount.get(noteId.accountId)\n                val myId = User.Id(me.accountId, me.remoteId)\n                val note = noteRepository.find(noteId).getOrThrow()\n                val user = userRepository.find(note.userId)\n                if (note.replyId == null) {\n                    (users + user).distinctBy { it.id }.filterNot {\n                        it.id == myId\n                    }\n                } else {\n                    invoke(note.replyId, users + user, searchedIds + noteId)\n                        .getOrElse {\n                            users.distinctBy { it.id }.filterNot {\n                                it.id == myId\n                            }\n                        }\n                }\n            }\n        }\n\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/GetShareNoteUrlUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass GetShareNoteUrlUseCase @Inject constructor(\n    private val noteService: NoteService,\n    private val accountRepository: AccountRepository,\n) : UseCase {\n    suspend operator fun invoke(noteId: Note.Id): Result<String> {\n        return noteService.findHasContentNote(noteId).mapCancellableCatching { note ->\n            note.getOriginUrl(\n                accountRepository.get(noteId.accountId).getOrThrow()\n            )\n        }\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/Note.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.Entity\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\nimport net.pantasystem.milktea.model.user.User\nimport kotlin.math.min\nimport java.io.Serializable as JSerializable\n\ndata class Note(\n    val id: Id,\n    val createdAt: Instant,\n    val text: String?,\n    val cw: String?,\n    val userId: User.Id,\n\n    val replyId: Id?,\n\n    val renoteId: Id?,\n\n    val viaMobile: Boolean?,\n    val visibility: Visibility,\n    val localOnly: Boolean?,\n\n    val visibleUserIds: List<User.Id>?,\n\n    val url: String?,\n    val uri: String?,\n    val renoteCount: Int,\n    val reactionCounts: List<ReactionCount>,\n    val emojis: List<CustomEmoji>?,\n    val repliesCount: Int,\n    val fileIds: List<FileProperty.Id>?,\n    val poll: Poll?,\n    val myReaction: String?,\n\n    val channelId: Channel.Id?,\n    val type: Type,\n    val maxReactionsPerAccount: Int,\n    val emojiNameMap: Map<String, CustomEmoji>?,\n) : Entity {\n    class Id(\n        val accountId: Long,\n        val noteId: String,\n    ) : EntityId {\n\n        private var _hashCode: Int? = null\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (javaClass != other?.javaClass) return false\n\n            other as Id\n\n            if (accountId != other.accountId) return false\n            if (noteId != other.noteId) return false\n\n            return true\n        }\n\n        override fun hashCode(): Int {\n            if (_hashCode != null) return _hashCode!!\n            var result = accountId.hashCode()\n            result = 31 * result + noteId.hashCode()\n            _hashCode = result\n            return result\n        }\n\n        override fun toString(): String {\n            return \"Id(accountId=$accountId, noteId='$noteId')\"\n        }\n\n    }\n\n\n    sealed interface Type {\n        data class Misskey(\n            val channel: SimpleChannelInfo? = null,\n            val isAcceptingOnlyLikeReaction: Boolean = false,\n            val isNotAcceptingSensitiveReaction: Boolean = false,\n            val isRequireNyaize: Boolean = false,\n        ) : Type {\n            data class SimpleChannelInfo(val id: Channel.Id, val name: String)\n\n        }\n\n        data class Mastodon(\n            val reblogged: Boolean?,\n            val favorited: Boolean?,\n            val bookmarked: Boolean?,\n            val muted: Boolean?,\n            val favoriteCount: Int?,\n            val tags: List<Tag>,\n            val mentions: List<Mention>,\n            val isFedibirdQuote: Boolean,\n            val pollId: String?,\n            val isSensitive: Boolean?,\n            val pureText: String?,\n            val isReactionAvailable: Boolean,\n        ) : Type {\n            data class Tag(\n                val name: String,\n                val url: String,\n            )\n\n            data class Mention(\n                val id: String,\n                val username: String,\n                val url: String,\n                val acct: String,\n            )\n        }\n    }\n\n    companion object {\n        const val SHORT_REACTION_COUNT_MAX_SIZE = 16\n        const val SHORT_RENOTE_REACTION_COUNT_MAX_SIZE = 8\n    }\n\n    val isMastodon: Boolean = type is Type.Mastodon\n    val isMisskey: Boolean = type is Type.Misskey\n\n    val isSupportEmojiReaction: Boolean =\n        type is Type.Misskey || (type is Type.Mastodon && type.isReactionAvailable)\n\n    val isAcceptingOnlyLikeReaction: Boolean =\n        type is Type.Misskey && type.isAcceptingOnlyLikeReaction\n\n\n    val isReacted: Boolean = reactionCounts.any {\n        it.me\n    }\n\n    val canReaction: Boolean = reactionCounts.count {\n        it.me\n    } < maxReactionsPerAccount\n\n    val reactionsCount = reactionCounts.sumOf {\n        it.count\n    }\n\n    fun getShortReactionCounts(isRenote: Boolean): List<ReactionCount> {\n        return if (isRenote) {\n            if (reactionCounts.size <= SHORT_RENOTE_REACTION_COUNT_MAX_SIZE) {\n                reactionCounts\n            } else {\n                reactionCounts.subList(\n                    0,\n                    min(reactionCounts.size, SHORT_RENOTE_REACTION_COUNT_MAX_SIZE)\n                )\n            }\n        } else {\n            if (reactionCounts.size <= SHORT_REACTION_COUNT_MAX_SIZE) {\n                reactionCounts\n            } else {\n                reactionCounts.subList(0, min(reactionCounts.size, SHORT_REACTION_COUNT_MAX_SIZE))\n            }\n        }\n    }\n\n    /**\n     * 引用リノートであるか\n     */\n    fun isQuote(): Boolean {\n        if (type is Type.Mastodon && type.isFedibirdQuote) {\n            return true\n        }\n        // NOTE: mastodonには引用が存在しない\n        if (isMastodon) {\n            return false\n        }\n\n        return isRenote() && hasContent()\n    }\n\n    /**\n     * リノートであるか\n     */\n    fun isRenote(): Boolean {\n        return renoteId != null\n    }\n\n\n    fun isRenoteOnly(): Boolean {\n        return isRenote() && !hasContent()\n    }\n\n    /**\n     * ファイル、投票、テキストなどのコンテンツを持っているか\n     */\n    fun hasContent(): Boolean {\n        if (type is Type.Mastodon && type.isFedibirdQuote) {\n            return true\n        }\n\n        if (isMastodon && isRenote()) {\n            return false\n        }\n        return text != null || !fileIds.isNullOrEmpty() || poll != null\n    }\n\n    fun isReactedReaction(reaction: String): Boolean {\n        return reactionCounts.any {\n            it.reaction == reaction && it.me\n        }\n    }\n\n    fun getMyReactionCount(): Int {\n        return reactionCounts.count {\n            it.me\n        }\n    }\n\n    /**\n     * この投稿がRenote可能であるかをチェックしている。\n     * 既に取得できた投稿なので少なくともHome, Followers, Specifiedの公開範囲に\n     * 入っていることになるので厳密なチェックは行わない。\n     */\n    fun canRenote(userId: User.Id): Boolean {\n        return when (type) {\n            is Type.Mastodon -> visibility is Visibility.Public\n                    || visibility is Visibility.Home\n            is Type.Misskey -> id.accountId == userId.accountId\n                    && (visibility is Visibility.Public\n                    || visibility is Visibility.Home\n                    || ((visibility is Visibility.Specified || visibility is Visibility.Followers) && this.userId == userId)\n                    )\n        }\n\n    }\n\n    fun getOriginUrl(account: Account): String {\n        // リモートの投稿の場合はuriかurlにリモートの投稿のソースとなるURLが入っているはず\n        if (url != null || uri != null) {\n            return url ?: uri!!\n        }\n        return when (type) {\n            is Type.Mastodon -> \"${account.normalizedInstanceUri}/web/statuses/${id.noteId}\"\n            is Type.Misskey -> \"${account.normalizedInstanceUri}/notes/${id.noteId}\"\n        }\n    }\n}\n\ndata class NoteRelation(\n    val note: Note,\n    val user: User,\n    val renote: NoteRelation?,\n    val reply: NoteRelation?,\n    val files: List<FileProperty>?,\n) : JSerializable {\n\n    val contentNote: NoteRelation = if (note.isRenote() && !note.hasContent()) {\n        renote ?: this\n    } else {\n        this\n    }\n}\n\nfun Note.Companion.make(\n    id: Note.Id,\n    userId: User.Id,\n    createdAt: Instant = Clock.System.now(),\n    text: String? = null,\n    cw: String? = null,\n    replyId: Note.Id? = null,\n    renoteId: Note.Id? = null,\n    viaMobile: Boolean? = null,\n    visibility: Visibility = Visibility.Public(false),\n    localOnly: Boolean? = false,\n    visibleUserIds: List<User.Id>? = null,\n    url: String? = null,\n    uri: String? = null,\n    renoteCount: Int = 0,\n    reactionCounts: List<ReactionCount> = emptyList(),\n    emojis: List<CustomEmoji>? = null,\n    repliesCount: Int = 0,\n    fileIds: List<FileProperty.Id>? = null,\n    poll: Poll? = null,\n    myReaction: String? = null,\n    channelId: Channel.Id? = null,\n    type: Note.Type = Note.Type.Misskey(),\n    maxReactionsPerAccount: Int = 1\n): Note {\n    return Note(\n        id = id,\n        userId = userId,\n        createdAt = createdAt,\n        text = text,\n        cw = cw,\n        replyId = replyId,\n        renoteId = renoteId,\n        viaMobile = viaMobile,\n        visibility = visibility,\n        localOnly = localOnly,\n        visibleUserIds = visibleUserIds,\n        url = url,\n        uri = uri,\n        renoteCount = renoteCount,\n        reactionCounts = reactionCounts,\n        emojis = emojis,\n        repliesCount = repliesCount,\n        fileIds = fileIds,\n        poll = poll,\n        myReaction = myReaction,\n        channelId = channelId,\n        type = type,\n        maxReactionsPerAccount = maxReactionsPerAccount,\n        emojiNameMap = emojis?.associateBy { it.name },\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteCaptureAPIAdapter.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.coroutines.flow.Flow\n\n/**\n * Noteの更新イベントをWebSocket経由でキャプチャーして\n * その更新イベントをキャッシュに反映するための抽象\n */\ninterface NoteCaptureAPIAdapter {\n    fun capture(id: Note.Id): Flow<NoteDataSource.Event>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteDataSource.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.AddResult\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.User\n\n\n/**\n * キャッシュやデータベースの実装の差をなくすためのRepository\n * 要するに抽象化したいだけで意味はない\n * ※またAPIを抽象化するためのものではない\n */\ninterface NoteDataSource {\n\n    interface Factory {\n        fun create(account: Account): NoteDataSource\n    }\n\n    fun interface Listener {\n        fun on(e: Event)\n    }\n\n\n    sealed class Event {\n        abstract val noteId: Note.Id\n\n        data class Deleted(override val noteId: Note.Id) : Event()\n        data class Updated(override val noteId: Note.Id, val note: Note) : Event()\n        data class Created(override val noteId: Note.Id, val note: Note) : Event()\n    }\n\n    fun addEventListener(listener: Listener)\n\n    suspend fun getIn(noteIds: List<Note.Id>): Result<List<Note>>\n\n    @Throws(NoteNotFoundException::class)\n    suspend fun get(noteId: Note.Id): Result<Note>\n\n    suspend fun getWithState(noteId: Note.Id): Result<NoteResult>\n\n    suspend fun findByReplyId(id: Note.Id): Result<List<Note>>\n\n    suspend fun exists(noteId: Note.Id): Boolean\n\n    /**\n     * @param noteId 削除対象のNoteのId\n     * キャッシュ上のノートを削除する。\n     * これを実行すると削除フラグが立ち、\n     * 次からgetなどの関数にアクセスすると、NoteDeletedExceptionの例外が投げられる\n     */\n    suspend fun delete(noteId: Note.Id): Result<Boolean>\n\n    suspend fun add(note: Note): Result<AddResult>\n\n    suspend fun addAll(notes: List<Note>): Result<List<AddResult>>\n    suspend fun clear(): Result<Unit>\n\n    suspend fun findNoteThreadContext(noteId: Note.Id): Result<NoteThreadContext>\n\n    /**\n     * 投稿者のuserIdに基づいて削除をします\n     * @param userId 対称のUser#id\n     * @return 削除されたNote数\n     */\n    suspend fun deleteByUserId(userId: User.Id): Result<Int>\n\n    fun observeIn(noteIds: List<Note.Id>): Flow<List<Note>>\n\n    fun observeOne(noteId: Note.Id): Flow<Note?>\n\n    fun observeNoteThreadContext(noteId: Note.Id): Flow<NoteThreadContext?>\n\n    suspend fun findLocalCount(): Result<Long>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteDeletedException.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nclass NoteDeletedException(noteId: Note.Id) : NoteNotFoundException(noteId)\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteEditingState.kt",
    "content": "package net.pantasystem.milktea.model.note\n\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.note.poll.CreatePoll\nimport java.util.Calendar\nimport java.util.Date\nimport java.util.UUID\n\n\n\nsealed interface PollExpiresAt : java.io.Serializable {\n    object Infinity : PollExpiresAt\n    data class DateAndTime(val expiresAt: Date) : PollExpiresAt {\n        constructor(expiresAt: Instant) : this(Date(expiresAt.toEpochMilliseconds()))\n        val year = expiresAt.let {\n            val cal = Calendar.getInstance()\n            cal.time = it\n            cal.get(Calendar.YEAR)\n        }\n        val month = expiresAt.let {\n            val cal = Calendar.getInstance()\n            cal.time = it\n            cal.get(Calendar.MONTH) + 1\n        }\n        val dayOfMonth = expiresAt.let {\n            val cal = Calendar.getInstance()\n            cal.time = it\n            cal.get(Calendar.DAY_OF_MONTH)\n        }\n\n        val hour = expiresAt.let {\n            val cal = Calendar.getInstance()\n            cal.time = it\n            cal.get(Calendar.HOUR_OF_DAY)\n        }\n\n        val minutes = expiresAt.let {\n            val cal = Calendar.getInstance()\n             cal.time = it\n            cal.get(Calendar.MINUTE)\n        }\n    }\n\n    fun asDate(): Date? {\n        return this.expiresAt()?.toEpochMilliseconds()?.let {\n            Date(it)\n        }\n    }\n}\n\nfun PollExpiresAt.expiresAt(): Instant? {\n    return when (this) {\n        is PollExpiresAt.Infinity -> null\n        is PollExpiresAt.DateAndTime -> Instant.fromEpochMilliseconds(this.expiresAt.time)\n    }\n}\n\ndata class PollEditingState(\n    val choices: List<PollChoiceState>,\n    val multiple: Boolean,\n    val expiresAt: PollExpiresAt = PollExpiresAt.Infinity\n) : java.io.Serializable {\n\n    companion object {\n        val EMPTY_POLL_EDITING_STATE = PollEditingState(\n            listOf(\n                PollChoiceState(\"\", UUID.randomUUID()),\n                PollChoiceState(\"\", UUID.randomUUID()),\n                PollChoiceState(\"\", UUID.randomUUID())\n            ), false\n        )\n    }\n\n    fun checkValidate(): Boolean {\n        return choices.all {\n            it.text.isNotBlank()\n        } && this.choices.size >= 2\n    }\n\n    fun toggleMultiple(): PollEditingState {\n        return this.copy(\n            multiple = !this.multiple\n        )\n    }\n}\n\ndata class PollChoiceState(\n    val text: String,\n    val id: UUID = UUID.randomUUID()\n) : java.io.Serializable\n\nfun PollEditingState.toCreatePoll(): CreatePoll {\n    return CreatePoll(\n        choices = this.choices.map {\n            it.text\n        },\n        multiple = multiple,\n        expiresAt = expiresAt.expiresAt()?.toEpochMilliseconds()\n    )\n}\n\n\n\n\nfun List<AppFile>.toggleFileSensitiveStatus(appFile: AppFile.Local): List<AppFile> {\n    return this.map {\n        if (it === appFile || it is AppFile.Local && it.isAttributeSame(appFile)) {\n            appFile.copy(isSensitive = !appFile.isSensitive)\n        } else {\n            it\n        }\n    }\n}\n\n\nfun List<AppFile>.updateFileName(appFile: AppFile.Local, name: String): List<AppFile> {\n    return this.map {\n        if (it === appFile || it is AppFile.Local && it.isAttributeSame(appFile)) {\n            appFile.copy(name = name)\n        } else {\n            it\n        }\n    }\n}\n\nfun List<AppFile>.updateFileComment(appFile: AppFile.Local, comment: String): List<AppFile> {\n    return this.map {\n        if (it === appFile || it is AppFile.Local && it.isAttributeSame(appFile)) {\n            appFile.copy(comment = comment)\n        } else {\n            it\n        }\n    }\n}\nfun String?.addMentionUserNames(userNames: List<String>, pos: Int): Pair<String?, Int> {\n    val mentionBuilder = StringBuilder()\n    userNames.forEachIndexed { index, userName ->\n        if (index < userNames.size - 1) {\n            // NOTE: 次の文字がつながらないようにする\n            mentionBuilder.appendLine(\"$userName \")\n        } else {\n            // NOTE: 次の文字がつながらないようにする\n            mentionBuilder.append(\"$userName \")\n        }\n    }\n    val builder = StringBuilder(this ?: \"\")\n    builder.insert(pos, mentionBuilder.toString())\n    val nextPos = pos + mentionBuilder.length\n    return builder.toString() to nextPos\n}\n\nfun List<AppFile>.removeFile(appFile: AppFile): List<AppFile> {\n    return toMutableList().apply {\n        remove(appFile)\n    }\n}\n\n\nfun PollEditingState?.removePollChoice(id: UUID): PollEditingState? {\n    return this?.copy(\n        choices = this.choices.filterNot { choice ->\n            choice.id == id\n        }\n    )\n}\n\nfun PollEditingState?.updatePollChoice(id: UUID, text: String): PollEditingState? {\n    return this?.copy(\n        choices = choices.map { choice ->\n            if (choice.id == id) {\n                choice.copy(\n                    text = text\n                )\n            } else {\n                choice\n            }\n        }\n    )\n}\n\nfun PollEditingState?.addPollChoice(): PollEditingState? {\n    return this?.copy(\n        choices = choices.toMutableList().also { list ->\n            list.add(\n                PollChoiceState(\"\")\n            )\n        }\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteNotFoundException.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nopen class NoteNotFoundException(noteId: Note.Id, msg: String = \"ノートを見つけることができませんでした: $noteId\") : Exception(msg)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteRelationGetter.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\n@Singleton\nclass NoteRelationGetter @Inject constructor(\n    private val noteRepository: NoteRepository,\n    private val noteDataSource: NoteDataSource,\n    private val userDataSource: UserDataSource,\n    private val filePropertyDataSource: FilePropertyDataSource,\n) {\n\n    suspend fun get(\n        noteId: Note.Id,\n        deep: Boolean = true,\n        usersMap: Map<User.Id, User> = emptyMap(),\n        notesMap: Map<Note.Id, Note> = emptyMap(),\n        filesMap: Map<FileProperty.Id, FileProperty> = emptyMap(),\n        skipIfNotExistsInCache: Boolean = false,\n    ): Result<NoteRelation?> {\n        return runCancellableCatching {\n            notesMap.getOrElse(noteId) {\n                if (skipIfNotExistsInCache) {\n                    noteDataSource.get(noteId).getOrThrow()\n                } else {\n                    noteRepository.find(noteId).getOrThrow()\n                }\n\n            }\n        }.flatMapCancellableCatching {\n            get(\n                it,\n                deep,\n                usersMap = usersMap,\n                notesMap = notesMap,\n                filesMap = filesMap,\n            )\n        }\n    }\n\n    suspend fun getIn(noteIds: List<Note.Id>): List<NoteRelation> {\n        val notes = noteRepository.findIn(noteIds)\n        val acIdAndUserIdMap = notes.map {\n            it.userId\n        }.groupBy {\n            it.accountId\n        }\n        val users = acIdAndUserIdMap.map { list ->\n            userDataSource.getIn(list.key, list.value.map { it.id }, isSimple = true)\n                .getOrElse { emptyList() }\n        }.flatten().associateBy {\n            it.id\n        }\n        val noteMap = notes.associateBy { it.id }\n        val files = filePropertyDataSource.findIn(\n            notes.mapNotNull { it.fileIds }.flatten()\n        ).getOrElse {\n            emptyList()\n        }.let { files ->\n            files.associateBy { it.id }\n        }\n        return notes.mapNotNull {\n            get(\n                it,\n                true,\n                usersMap = users,\n                notesMap = noteMap,\n                filesMap = files,\n            ).getOrNull()\n        }\n    }\n\n    suspend fun get(\n        accountId: Long,\n        noteId: String,\n    ): Result<NoteRelation?> {\n        return get(Note.Id(accountId, noteId))\n    }\n\n\n    suspend fun get(\n        note: Note,\n        deep: Boolean = true,\n        usersMap: Map<User.Id, User> = emptyMap(),\n        notesMap: Map<Note.Id, Note> = emptyMap(),\n        filesMap: Map<FileProperty.Id, FileProperty> = emptyMap(),\n    ): Result<NoteRelation> {\n        return runCancellableCatching {\n            val user = usersMap.getOrElse(note.userId) {\n                userDataSource.get(note.userId, isSimple = true).getOrThrow()\n            }\n\n            val renote = if (deep) {\n                note.renoteId?.let {\n                    get(it, note.isRenote(), skipIfNotExistsInCache = true)\n                }\n            } else null\n            val reply = if (deep) {\n                note.replyId?.let {\n                    get(\n                        it,\n                        false,\n                        notesMap = notesMap,\n                        usersMap = usersMap,\n                        skipIfNotExistsInCache = true,\n                        filesMap = filesMap,\n                    )\n                }\n            } else null\n\n            val filesInDb = note.fileIds?.filter {\n                filesMap[it] == null\n            }?.let {\n                filePropertyDataSource.findIn(it).getOrElse {\n                    emptyList()\n                }\n            }?.associateBy { it.id }\n\n            return@runCancellableCatching NoteRelation(\n                note = note,\n                user = user,\n                renote = renote?.getOrNull(),\n                reply = reply?.getOrNull(),\n                files = note.fileIds?.mapNotNull {\n                    filesMap[it] ?: filesInDb?.get(it)\n                } ?: emptyList(),\n            )\n        }\n\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteRepository.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.repost.CreateRenote\n\ninterface NoteRepository {\n\n    suspend fun delete(noteId: Note.Id): Result<Note>\n\n    suspend fun create(createNote: CreateNote): Result<Note>\n\n    suspend fun renote(createRenote: CreateRenote): Result<Note>\n\n    suspend fun unrenote(noteId: Note.Id): Result<Unit>\n\n    suspend fun find(noteId: Note.Id): Result<Note>\n\n    suspend fun findIn(noteIds: List<Note.Id>): List<Note>\n\n    suspend fun vote(noteId: Note.Id, choice: Poll.Choice): Result<Unit>\n\n//    suspend fun syncConversation(noteId: Note.Id): Result<Unit>\n//\n//    suspend fun syncChildren(noteId: Note.Id): Result<Unit>\n\n    suspend fun syncThreadContext(noteId: Note.Id): Result<Unit>\n\n    suspend fun sync(noteId: Note.Id): Result<Unit>\n\n    suspend fun createThreadMute(noteId: Note.Id): Result<Unit>\n\n    suspend fun deleteThreadMute(noteId: Note.Id): Result<Unit>\n\n    suspend fun findNoteState(noteId: Note.Id): Result<NoteState>\n\n    fun observeIn(noteIds: List<Note.Id>): Flow<List<Note>>\n\n    fun observeOne(noteId: Note.Id): Flow<Note?>\n\n    fun observeThreadContext(noteId: Note.Id): Flow<NoteThreadContext>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteResult.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nsealed interface NoteResult {\n    data class Success(val note: Note) : NoteResult\n    data object NotFound : NoteResult\n    data object Deleted : NoteResult\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteService.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport javax.inject.Inject\n\nclass NoteService @Inject constructor(\n    private val noteRepository: NoteRepository,\n) : UseCase {\n\n    suspend fun findHasContentNote(noteId: Note.Id): Result<Note> {\n        return noteRepository.find(noteId).mapCancellableCatching { note ->\n            if (note.hasContent()) {\n                note\n            } else {\n                findHasContentNote(requireNotNull(note.renoteId)).getOrThrow()\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteState.kt",
    "content": "package net.pantasystem.milktea.model.note\n\n/**\n * お気に入りやスレッドのミュートの状態を表す。\n * v13でノートのウォッチ機能が削除されたため、isWatchingのフィールドも無効(None)になる。\n */\ndata class NoteState(\n    val isFavorited: Boolean,\n    val isWatching: Watching,\n    val isMutedThread: Boolean?\n) {\n\n    /**\n     * isWatchingの状態を3値で表現する必要が出てきたため、sealed interfaceで表現している。\n     */\n    sealed interface Watching {\n        /**\n         * APIから削除された状態で、JSONのフィールド上に存在しない。\n         */\n        object None : Watching\n\n        /**\n         * API上にまだ存在している状態で、JSONのフィールド上に存在する。\n         * またその結果が isWatching に格納される。\n         */\n        data class Some(val isWatching: Boolean) : Watching\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteStreaming.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.page.Pageable\n\ninterface NoteStreaming {\n    fun connect(getAccount: suspend ()-> Account, pageable: Pageable): Flow<Note>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/NoteThreadContext.kt",
    "content": "package net.pantasystem.milktea.model.note\n\n/**\n * @param ancestors 親投稿\n * @param descendants 子投稿\n */\ndata class NoteThreadContext(\n    val ancestors: List<Note>,\n    val descendants: List<Note>,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/ReactionAcceptanceType.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nenum class ReactionAcceptanceType {\n    LikeOnly4Remote,\n    NonSensitiveOnly,\n    NonSensitiveOnly4LocalOnly4Remote,\n    LikeOnly,\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/ReplyStreaming.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.account.Account\n\ninterface ReplyStreaming {\n    fun connect(getAccount: suspend ()-> Account): Flow<Note>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/TimelineScrollPositionRepository.kt",
    "content": "package net.pantasystem.milktea.model.note\n\ninterface TimelineScrollPositionRepository {\n\n    suspend fun save(pageId: Long, noteId: Note.Id)\n\n    suspend fun get(pageId: Long): Note.Id?\n\n    suspend fun remove(pageId: Long)\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/Translation.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport kotlinx.serialization.Serializable\nimport java.io.Serializable as JSerializable\n\n@Serializable\ndata class Translation (val sourceLang: String, val text: String) : JSerializable"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/Visibility.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.user.User\nimport java.io.Serializable\nimport java.util.*\n\nsealed class Visibility : Serializable{\n    data class Public(\n        override val isLocalOnly: Boolean\n    ) : CanLocalOnly, Visibility() {\n        override fun changeLocalOnly(isLocalOnly: Boolean): CanLocalOnly {\n            return this.copy(isLocalOnly = isLocalOnly)\n        }\n    }\n\n    data class Home(\n        override val isLocalOnly: Boolean\n    ) : Visibility(), CanLocalOnly {\n        override fun changeLocalOnly(isLocalOnly: Boolean): CanLocalOnly {\n            return this.copy(isLocalOnly = isLocalOnly)\n        }\n    }\n\n    data class Followers(\n        override val isLocalOnly: Boolean\n    ) : Visibility(), CanLocalOnly {\n        override fun changeLocalOnly(isLocalOnly: Boolean): CanLocalOnly {\n            return this.copy(isLocalOnly = isLocalOnly)\n        }\n    }\n\n    data class Specified(\n        val visibleUserIds: List<User.Id>\n    ) : Visibility()\n    /*\n    NOTE: LocalOnlyはPub,Ho,Fのいずれかを選択し、そのうちLocalのユーザーに限定に公開されるというものなので、LocalOnlyというVisibilityは存在しない\n    object LocalOnly : Visibility(), CanLocalOnly {\n        override val isLocalOnly: Boolean = true\n    }*/\n\n    object Personal : Visibility()\n\n    data class Limited(val circleId: String?) : Visibility()\n\n    object Mutual : Visibility()\n}\n\ninterface CanLocalOnly {\n    val isLocalOnly: Boolean\n\n    fun changeLocalOnly(isLocalOnly: Boolean): CanLocalOnly\n}\n\n\nfun Visibility.type(): String {\n    return when(this) {\n        is Visibility.Public -> {\n            \"public\"\n        }\n        is Visibility.Home -> {\n            \"home\"\n        }\n        is Visibility.Followers -> {\n            \"followers\"\n        }\n        is Visibility.Specified -> {\n            \"specified\"\n        }\n        is Visibility.Limited -> \"limited\"\n        Visibility.Mutual -> \"mutual\"\n        Visibility.Personal -> \"personal\"\n    }\n}\n\nfun Visibility.type4Mastodon(): String {\n    return when(this) {\n        is Visibility.Followers -> \"private\"\n        is Visibility.Home -> \"unlisted\"\n        is Visibility.Public -> \"public\"\n        is Visibility.Specified -> \"direct\"\n        is Visibility.Limited -> \"limited\"\n        Visibility.Mutual -> \"mutual\"\n        Visibility.Personal -> \"personal\"\n    }\n}\n\n@Throws(IllegalArgumentException::class)\nfun Visibility(type: String, isLocalOnly: Boolean, visibleUserIds: List<User.Id>? = null): Visibility {\n    return when(type.lowercase(Locale.ROOT)){\n        \"public\" -> Visibility.Public(isLocalOnly)\n        \"home\" -> Visibility.Home(isLocalOnly)\n        \"followers\" -> Visibility.Followers(isLocalOnly)\n        \"specified\" -> Visibility.Specified(visibleUserIds ?: emptyList())\n        else -> Visibility(type)\n    }\n}\n\nfun Visibility(type: String, circleId: String? = null, visibilityEx: String? = null,): Visibility {\n    return when(type.lowercase()) {\n        \"private\" -> {\n            when(visibilityEx) {\n                \"limited\" -> Visibility.Limited(circleId)\n                else -> Visibility.Followers(false)\n            }\n        }\n        \"limited\" -> Visibility.Limited(circleId)\n        \"unlisted\" -> Visibility.Home(false)\n        \"public\" -> Visibility.Public(false)\n        \"direct\" -> when(visibilityEx) {\n            \"personal\" -> Visibility.Personal\n            else -> Visibility.Specified(emptyList())\n        }\n        \"followers\" -> Visibility.Followers(false)\n        \"home\" -> Visibility.Home(false)\n        else -> throw IllegalArgumentException(\"limited, direct, unlisted, private public, home, followers, specified以外許可されていません。与えられたデータ:$type\")\n    }\n}\n\nfun Visibility(type: String, circleId: String?, localOnly: Boolean?): Visibility {\n    return when(type.lowercase(Locale.ROOT)){\n        \"public\" -> Visibility.Public(localOnly ?: false)\n        \"home\" -> Visibility.Home(localOnly ?: false)\n        \"followers\" -> Visibility.Followers(localOnly ?: false)\n        \"specified\" -> Visibility.Specified(emptyList())\n        \"limited\" -> Visibility.Limited(circleId)\n        \"mutual\" -> Visibility.Mutual\n        \"personal\" -> Visibility.Personal\n        else -> throw IllegalArgumentException(\"limited, direct, unlisted, private public, home, followers, specified以外許可されていません。与えられたデータ:$type\")\n    }\n}\n\nfun Visibility.isLocalOnly(): Boolean {\n    return (this as? CanLocalOnly)?.isLocalOnly?: false\n}\n\nfun CreateNote.visibleUserIds(): List<String>? {\n    return (this.visibility as? Visibility.Specified)?.visibleUserIds?.map {\n        it.id\n    }\n}\n\nfun Visibility.getName(softwareType: NodeInfo.SoftwareType? = null) : String{\n    return when(this) {\n        is Visibility.Public -> \"public\"\n        is Visibility.Home -> when(softwareType) {\n            is NodeInfo.SoftwareType.Mastodon -> \"unlisted\"\n            else -> \"home\"\n        }\n        is Visibility.Specified -> when(softwareType) {\n            is NodeInfo.SoftwareType.Mastodon -> \"direct\"\n            else -> \"specified\"\n        }\n        is Visibility.Followers -> when(softwareType) {\n            is NodeInfo.SoftwareType.Mastodon -> \"private\"\n            else -> \"followers\"\n        }\n        is Visibility.Limited -> \"limited\"\n        is Visibility.Mutual -> \"mutual\"\n        is Visibility.Personal -> \"personal\"\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/bookmark/BookmarkRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.bookmark\n\nimport net.pantasystem.milktea.model.note.Note\n\ninterface BookmarkRepository {\n\n    suspend fun create(noteId: Note.Id): Result<Unit>\n\n    suspend fun delete(noteId: Note.Id): Result<Unit>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/bookmark/CreateBookmarkUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.bookmark\n\nimport net.pantasystem.milktea.model.note.Note\nimport javax.inject.Inject\n\nclass CreateBookmarkUseCase @Inject constructor(\n    private val bookmarkRepository: BookmarkRepository\n) {\n\n    suspend operator fun invoke(noteId: Note.Id): Result<Unit> {\n        return bookmarkRepository.create(noteId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/bookmark/DeleteBookmarkUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.bookmark\n\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.note.Note\nimport javax.inject.Inject\n\nclass DeleteBookmarkUseCase @Inject constructor(\n    private val bookmarkRepository: BookmarkRepository\n) : UseCase {\n\n    suspend operator fun invoke(noteId: Note.Id): Result<Unit> {\n        return bookmarkRepository.delete(noteId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/draft/DraftNote.kt",
    "content": "package net.pantasystem.milktea.model.note.draft\n\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.file.AppFile\nimport net.pantasystem.milktea.model.file.FilePreviewSource\nimport net.pantasystem.milktea.model.file.from\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.note.ReactionAcceptanceType\nimport net.pantasystem.milktea.model.note.getName\nimport net.pantasystem.milktea.model.note.isLocalOnly\nimport java.io.Serializable\nimport java.util.Date\n\n\ndata class DraftNote(\n    val accountId: Long,\n    val visibility: String = \"public\",\n    var visibleUserIds: List<String>? = null,\n    val text: String?,\n    val cw: String? = null,\n    var draftFiles: List<DraftNoteFile>? = null,\n    val viaMobile: Boolean? = null,\n    val localOnly: Boolean? = null,\n    val noExtractMentions: Boolean? = null,\n    val noExtractHashtags: Boolean? = null,\n    val noExtractEmojis: Boolean? = null,\n    val replyId: String? = null,\n    val renoteId: String? = null,\n    val draftPoll: DraftPoll? = null,\n    val reservationPostingAt: Date? = null,\n    val channelId: Channel.Id? = null,\n    val isSensitive: Boolean? = null,\n    val reactionAcceptanceType: ReactionAcceptanceType? = null,\n    var draftNoteId: Long = 0L\n) : Serializable {\n    val filePreviewSources: List<FilePreviewSource> by lazy {\n        draftFiles?.map {\n            when (val appFile = AppFile.from(it)) {\n                is AppFile.Local -> FilePreviewSource.Local(appFile)\n                is AppFile.Remote -> FilePreviewSource.Remote(\n                    appFile,\n                    (it as DraftNoteFile.Remote).fileProperty\n                )\n            }\n        } ?: emptyList()\n    }\n    val appFiles: List<AppFile>\n        get() = draftFiles?.map { draftNoteFile ->\n            AppFile.from(draftNoteFile)\n        } ?: emptyList()\n}\n\nsealed interface DraftNoteFile {\n\n    data class Remote(val fileProperty: FileProperty) : DraftNoteFile\n    data class Local(\n        val name: String,\n        val filePath: String,\n        val isSensitive: Boolean?,\n        val type: String,\n        val thumbnailUrl: String?,\n        val folderId: String?,\n        val fileSize: Long?,\n        val localFileId: Long,\n        val comment: String?\n    ) : DraftNoteFile {\n        companion object\n    }\n}\n\nfun DraftNoteFile.Local.Companion.from(appFile: AppFile.Local, id: Long = 0L): DraftNoteFile.Local {\n    return DraftNoteFile.Local(\n        filePath = appFile.path,\n        folderId = appFile.folderId,\n        isSensitive = appFile.isSensitive,\n        type = appFile.type,\n        name = appFile.name,\n        thumbnailUrl = appFile.thumbnailUrl,\n        fileSize = appFile.fileSize,\n        localFileId = id,\n        comment = appFile.comment,\n    )\n}\n\nfun NoteRelation.toDraftNote(): DraftNote {\n    return DraftNote(\n        accountId = this.note.id.accountId,\n        visibility = this.note.visibility.getName(),\n        visibleUserIds = this.note.visibleUserIds?.map {\n            it.id\n        },\n        text = (this.note.type as? Note.Type.Mastodon)?.pureText ?: this.note.text,\n        cw = this.note.cw,\n        draftFiles = this.files?.map {\n            DraftNoteFile.Remote(it)\n        },\n        viaMobile = this.note.viaMobile,\n        localOnly = this.note.visibility.isLocalOnly(),\n        renoteId = this.note.renoteId.let {\n            it?.noteId\n        },\n        replyId = this.note.replyId.let {\n            it?.noteId\n        },\n        draftPoll = this.note.poll?.toDraftPoll(),\n        channelId = this.note.channelId,\n        isSensitive = (this.note.type as? Note.Type.Mastodon)?.isSensitive\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/draft/DraftNoteRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.draft\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface DraftNoteRepository {\n\n    suspend fun save(draftNote: DraftNote): Result<DraftNote>\n    suspend fun delete(draftNoteId: Long): Result<Unit>\n    suspend fun findOne(draftNoteId: Long): Result<DraftNote>\n    fun observeByAccountId(accountId: Long): Flow<List<DraftNote>>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/draft/DraftNoteService.kt",
    "content": "package net.pantasystem.milktea.model.note.draft\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.note.CreateNote\n\n\ninterface DraftNoteService {\n    fun getDraftNoteSavedEventBy(accountId: Long): Flow<DraftNoteSavedEvent>\n    suspend fun save(createNote: CreateNote): Result<DraftNote>\n    suspend fun save(draftNoteFile: DraftNoteFile): Result<DraftNoteFile>\n}\n\nsealed interface DraftNoteSavedEvent {\n    data class Failed(val createNote: CreateNote, val throwable: Throwable) : DraftNoteSavedEvent\n    data class Success(val draftNote: DraftNote) : DraftNoteSavedEvent\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/draft/DraftPoll.kt",
    "content": "package net.pantasystem.milktea.model.note.draft\n\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport java.io.Serializable\n\ndata class DraftPoll(\n    var choices: List<String>,\n    val multiple: Boolean,\n    val expiresAt: Long? = null\n): Serializable\n\n\nfun Poll.toDraftPoll() : DraftPoll {\n    return DraftPoll(\n        choices = this.choices.map {\n            it.text\n        },\n        multiple = this.multiple,\n        expiresAt = this.expiresAt?.toEpochMilliseconds()\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/favorite/CreateFavoriteUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.favorite\n\nimport net.pantasystem.milktea.model.note.Note\nimport javax.inject.Inject\n\nclass CreateFavoriteUseCase @Inject constructor(\n    private val favoriteRepository: FavoriteRepository\n) {\n    suspend operator fun invoke(noteId: Note.Id): Result<Unit> {\n        return favoriteRepository.create(noteId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/favorite/DeleteFavoriteUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.favorite\n\nimport net.pantasystem.milktea.model.note.Note\nimport javax.inject.Inject\n\nclass DeleteFavoriteUseCase @Inject constructor(\n    private val favoriteRepository: FavoriteRepository\n) {\n    suspend operator fun invoke(noteId: Note.Id): Result<Unit> {\n        return favoriteRepository.delete(noteId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/favorite/FavoriteRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.favorite\n\nimport net.pantasystem.milktea.model.note.Note\n\ninterface FavoriteRepository {\n\n    suspend fun create(noteId: Note.Id): Result<Unit>\n    suspend fun delete(noteId: Note.Id): Result<Unit>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/favorite/ToggleFavoriteUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.favorite\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass ToggleFavoriteUseCase @Inject constructor(\n    private val favoriteRepository: FavoriteRepository,\n    private val noteRepository: NoteRepository,\n) : UseCase {\n\n    suspend operator fun invoke(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        val isFavorite = when(val type = noteRepository.find(noteId).getOrThrow().type) {\n            is Note.Type.Mastodon -> {\n                type.favorited == true\n            }\n            is Note.Type.Misskey -> {\n                val state = noteRepository.findNoteState(noteId).getOrThrow()\n                state.isFavorited\n            }\n        }\n        if (isFavorite) {\n            favoriteRepository.delete(noteId)\n        } else {\n            favoriteRepository.create(noteId)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/muteword/FilterConditionType.kt",
    "content": "package net.pantasystem.milktea.model.note.muteword\n\nsealed interface FilterConditionType {\n    data class Normal(val words: List<String>) : FilterConditionType\n    data class Regex(val pattern: String) : FilterConditionType {\n        val regex: kotlin.text.Regex by lazy {\n            kotlin.text.Regex(pattern.substring(0, pattern.length - 1))\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/muteword/WordFilterConfig.kt",
    "content": "package net.pantasystem.milktea.model.note.muteword\n\ndata class WordFilterConfig(\n    val conditions: List<FilterConditionType>\n) {\n    companion object\n\n    fun checkMatchText(text: String?): Boolean {\n        if (text == null) {\n            return false\n        }\n        return conditions.any { type ->\n            when(type) {\n                is FilterConditionType.Normal -> {\n                    type.words.all { word ->\n                        text.contains(word)\n                    }\n                }\n                is FilterConditionType.Regex -> {\n                    try {\n                        type.regex.matches(text)\n                    } catch (e: Exception) {\n                        false\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/muteword/WordFilterConfigRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.muteword\n\nimport kotlinx.coroutines.flow.Flow\n\n\ninterface WordFilterConfigRepository {\n    suspend fun save(config: WordFilterConfig): Result<Unit>\n\n    suspend fun get(): Result<WordFilterConfig>\n\n    fun observe(): Flow<WordFilterConfig>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/muteword/WordFilterConfigTextParser.kt",
    "content": "package net.pantasystem.milktea.model.note.muteword\n\nobject WordFilterConfigTextParser {\n\n    fun fromText(text: String): Result<WordFilterConfig> {\n        val conditions = text.split(\"\\n\").filterNot {\n            it.isBlank()\n        }.map { line ->\n            if (line.startsWith(\"\\\\\") && line.endsWith(\"\\\\\")) {\n                FilterConditionType.Regex(line)\n            } else {\n                val words = line.split(\" \").filterNot {\n                    it.isBlank()\n                }\n                FilterConditionType.Normal(words)\n            }\n        }\n        return Result.success(WordFilterConfig(conditions))\n    }\n\n    fun fromConfig(config: WordFilterConfig): Result<String> {\n        val text = config.conditions.filter {\n            when(it) {\n                is FilterConditionType.Normal -> it.words.isNotEmpty()\n                is FilterConditionType.Regex -> it.pattern.isNotBlank()\n            }\n        }.map { filterConditionType ->\n            when(filterConditionType) {\n                is FilterConditionType.Normal -> {\n                    if (filterConditionType.words.size > 1) {\n                        filterConditionType.words.reduce { acc, s ->\n                            \"$acc $s\"\n                        }\n                    } else {\n                        filterConditionType.words.first()\n                    }\n                }\n                is FilterConditionType.Regex -> {\n                    filterConditionType.pattern\n                }\n            }\n        }.reduce { acc, s ->\n            \"$acc\\n$s\"\n        }\n        return Result.success(text)\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/poll/CreatePoll.kt",
    "content": "package net.pantasystem.milktea.model.note.poll\n\nimport kotlinx.serialization.Serializable\nimport java.io.Serializable as JavaSerializable\n\n@Serializable\ndata class CreatePoll(\n    var choices: List<String>,\n    val multiple: Boolean,\n    val expiresAt: Long? = null\n): JavaSerializable"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/poll/Poll.kt",
    "content": "package net.pantasystem.milktea.model.note.poll\n\nimport kotlinx.datetime.Clock\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.serializers.InstantIso8601Serializer\nimport java.io.Serializable\n\n@kotlinx.serialization.Serializable\ndata class Poll(\n    val choices: List<Choice>,\n    @kotlinx.serialization.Serializable(with = InstantIso8601Serializer::class) val expiresAt: Instant?,\n    val multiple: Boolean\n) : Serializable {\n\n    @kotlinx.serialization.Serializable\n    data class Choice(val index: Int, val text: String, val votes: Int, val isVoted: Boolean) :\n        Serializable\n\n    val canVote: Boolean\n        get() {\n            return (expiresAt == null\n                    || expiresAt >= Clock.System.now())\n                    && (multiple || !choices.any { it.isVoted })\n                    && !choices.all { it.isVoted }\n        }\n\n    val totalVoteCount: Int\n        get() {\n            return choices.sumOf {\n                it.votes\n            }\n        }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/poll/VoteUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.poll\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport javax.inject.Inject\n\nclass VoteUseCase @Inject constructor(\n    private val noteRepository: NoteRepository,\n): UseCase {\n\n    suspend operator fun invoke(noteId: Note.Id, choice: Poll.Choice): Result<Note> = runCancellableCatching{\n        val note = noteRepository.find(noteId).getOrThrow()\n        if (note.poll == null) throw IllegalArgumentException(\"Note is not poll\")\n        if (!note.poll.canVote) throw IllegalArgumentException(\"Poll is closed\")\n        noteRepository.vote(noteId, choice).getOrThrow()\n        noteRepository.find(noteId).getOrThrow()\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/CreateReaction.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport net.pantasystem.milktea.model.note.Note\n\n\ndata class CreateReaction(\n    val noteId: Note.Id,\n    val reaction: String\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/DeleteReaction.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport net.pantasystem.milktea.model.note.Note\n\ndata class DeleteReaction(\n    val noteId: Note.Id,\n    val reaction: String,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/DeleteReactionsUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport javax.inject.Inject\n\nclass DeleteReactionsUseCase @Inject constructor(\n    private val noteRepository: NoteRepository,\n    private val reactionRepository: ReactionRepository,\n) {\n\n    suspend operator fun invoke(noteId: Note.Id): Result<Unit> = runCancellableCatching {\n        val note = noteRepository.find(noteId).getOrThrow()\n        note.reactionCounts.filter {\n            it.me\n        }.map {\n            reactionRepository.delete(DeleteReaction(noteId, it.reaction)).getOrThrow()\n        }\n        noteRepository.sync(noteId).getOrThrow()\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/LegacyReaction.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nobject LegacyReaction {\n\n    val reactionMap = mapOf(\n        \"angry\" to \"\\uD83D\\uDCA2\",  // 💢\n        \"confused\" to \"\\uD83D\\uDE25\", // 😥\n        \"congrats\" to \"\\uD83C\\uDF89\", // 🎉\n        \"hmm\" to \"\\uD83E\\uDD14\",    //  🤔\n        \"laugh\" to \"\\uD83D\\uDE06\",  // 😆\n        \"like\" to \"\\uD83D\\uDC4D\", // 👍\n        \"love\" to \"❤\", //❤\n        \"pudding\" to \"\\uD83C\\uDF6E\", // 🍮\n        \"rip\" to \"\\uD83D\\uDE07\", // 😇\n        \"surprise\" to \"\\uD83D\\uDE2E\", // 😮\n        \"star\" to \"⭐\" // ⭐\n    )\n\n    val defaultReaction = listOf(\"angry\", \"confused\", \"congrats\", \"hmm\", \"laugh\", \"like\", \"love\", \"pudding\", \"rip\", \"surprise\", \"star\")\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/Reaction.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\ndata class Reaction(val reaction: String) {\n    fun isLocal(): Boolean {\n        return !reaction.contains(\"@\") || reaction.replace(\":\", \"\").split(\"@\").getOrNull(1) == \".\"\n    }\n\n    fun getName(): String? {\n        return reaction.replace(\":\", \"\").split(\"@\").getOrNull(0)\n    }\n\n    fun getHost(): String? {\n        val host = reaction.replace(\":\", \"\").split(\"@\").getOrNull(1)\n        if (host == \".\") {\n            return null\n        }\n        return host\n    }\n\n    fun getNameAndHost(): String {\n        val text = getName() ?: reaction\n        val host = getHost()\n        return if (host == null || host == \".\") {\n            text\n        } else {\n            \"$text@$host\"\n        }\n    }\n\n    /**\n     * フォーマットがカスタム絵文字のものであるか判定する\n     */\n    fun isCustomEmojiFormat(): Boolean {\n        // 初めのコロンと末端のコロンで２文字、カスタム絵文字の名称で１文字\n        return reaction.codePointCount(0, reaction.length) >= 3\n                && reaction.startsWith(\":\")\n                && reaction.endsWith(\":\")\n    }\n\n    fun isLegacyFormat(): Boolean {\n        return LegacyReaction.reactionMap.containsKey(reaction)\n    }\n\n    fun getLegacyEmoji(): String? {\n        if (isLegacyFormat()) {\n            return LegacyReaction.reactionMap[reaction]\n        }\n        return null\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/ReactionCount.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport java.io.Serializable\n\ndata class ReactionCount(\n    val reaction: String,\n    val count: Int,\n    val me: Boolean,\n) : Serializable"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/ReactionHistoryRequest.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport net.pantasystem.milktea.model.note.Note\n\n\ndata class ReactionHistoryRequest(\n    val noteId: Note.Id,\n    val type: String?,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/ReactionRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\ninterface ReactionRepository {\n\n    suspend fun create(createReaction: CreateReaction): Result<Boolean>\n    suspend fun delete(deleteReaction: DeleteReaction): Result<Boolean>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/ReactionSelection.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nfun interface ReactionSelection {\n\n    fun selectReaction(reaction: String)\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/ReactionUserRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\ninterface ReactionUserRepository {\n    /**\n     * 内部的に保持しているリアクションしたユーザの履歴の状態をリモートと同期する\n     * @param reaction 同期する対象のリアクションでカスタム絵文字の場合は:emoji_type@.:あるいは:emoji_type@host:の形式で与えられる\n     * @param noteId 同期する対象のNoteのId\n     */\n    suspend fun syncBy(noteId: Note.Id, reaction: String? = null): Result<Unit>\n\n    /**\n     * 内部的に保持しているリアクションしたユーザの履歴の状態をobserveする\n     * @param reaction 同期する対象のリアクションでカスタム絵文字の場合は:emoji_type@.:あるいは:emoji_type@host:の形式で与えられる\n     * @param noteId 同期する対象のNoteのId\n     */\n    fun observeBy(noteId: Note.Id, reaction: String? = null): Flow<List<User>>\n\n    /**\n     * 内部的に保持しているリアクションしたユーザの履歴の現在の状態を参照する\n     * @param reaction 同期する対象のリアクションでカスタム絵文字の場合は:emoji_type@.:あるいは:emoji_type@host:の形式で与えられる\n     * @param noteId 同期する対象のNoteのId\n     */\n    suspend fun findBy(noteId: Note.Id, reaction: String? = null): Result<List<User>>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/ToggleReactionUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport kotlinx.coroutines.delay\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistory\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryRepository\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\ninterface CheckEmoji {\n    suspend fun checkEmoji(char: CharSequence): Boolean\n}\n\n\n@Singleton\nclass ToggleReactionUseCase @Inject constructor(\n    private val noteRepository: NoteRepository,\n    private val reactionRepository: ReactionRepository,\n    private val reactionHistoryRepository: ReactionHistoryRepository,\n    private val getAccount: GetAccount,\n    private val instanceInfoService: InstanceInfoService,\n    private val customEmojiRepository: CustomEmojiRepository,\n    private val checkEmoji: CheckEmoji,\n    private val userRepository: UserRepository,\n) : UseCase {\n\n    suspend operator fun invoke(noteId: Note.Id, reaction: String): Result<Unit> {\n        return runCancellableCatching {\n            val account = getAccount.get(noteId.accountId)\n            val instanceType = instanceInfoService.find(account.normalizedInstanceUri).getOrThrow()\n            val sendReaction = getSendReaction(instanceType, account, reaction)\n                ?: return@runCancellableCatching\n            val note = noteRepository.find(noteId).getOrThrow()\n\n            // 同一のリアクションを選択した場合は解除して終了する\n            if (note.isReactedReaction(reaction)) {\n                reactionRepository.delete(\n                    DeleteReaction(\n                        noteId,\n                        reaction\n                    )\n                ).getOrThrow()\n                return@runCancellableCatching\n            }\n\n            if (!instanceType.canMultipleReaction) {\n                // 他にリアクション済みのリアクションがあればそれを解除する\n                note.reactionCounts.firstOrNull {\n                    it.me\n                }?.let {\n                    reactionRepository.delete(\n                        DeleteReaction(\n                            noteId,\n                            it.reaction\n                        )\n                    ).getOrThrow()\n                }\n            } else {\n                // リアクション可能な件数をオーバーしてしまっていた場合はキャンセルする\n                if (note.getMyReactionCount() >= instanceType.maxReactionsPerAccount) {\n                    return@runCancellableCatching\n                }\n            }\n\n            if (reactionRepository.create(CreateReaction(noteId, sendReaction)).getOrThrow()) {\n                reactionHistoryRepository.create(\n                    ReactionHistory(\n                        reaction = sendReaction,\n                        instanceDomain = account.normalizedInstanceUri,\n                        accountId = account.accountId,\n                        targetPostId = noteId.noteId,\n                        targetUserId = note.userId.id,\n                    )\n                )\n            }\n\n            // NOTE: Suggestionを表示するためにユーザのデータが必要になるので、キャッシュを更新しておく\n            userRepository.sync(note.userId).getOrThrow()\n        }.flatMapCancellableCatching {\n            delay(100)\n            noteRepository.sync(noteId)\n        }\n    }\n\n\n    internal suspend fun getSendReaction(\n        instanceType: InstanceInfoType,\n        account: Account,\n        reaction: String,\n    ): String? {\n        val reactionObj = Reaction(reaction)\n        return if (checkEmoji.checkEmoji(reaction)) {\n            reaction\n        } else if (LegacyReaction.reactionMap.containsKey(reaction)) {\n            requireNotNull(LegacyReaction.reactionMap[reaction])\n        } else {\n            when (instanceType) {\n                is InstanceInfoType.Mastodon -> {\n                    val maxCount = instanceType.maxReactionsPerAccount\n                    if (maxCount < 1) {\n                        return null\n                    }\n\n                    reactionObj.getNameAndHost()\n                }\n                is InstanceInfoType.Firefish -> {\n                    val maxCount = instanceType.maxReactionsPerAccount\n                    if (maxCount < 1) {\n                        return null\n                    }\n\n                    reactionObj.getNameAndHost()\n                }\n                is InstanceInfoType.Pleroma -> {\n                    val maxCount = instanceType.maxReactionsPerAccount\n                    if (maxCount < 1) {\n                        return null\n                    }\n\n                    // TODO: ユニコード絵文字の場合コロンは不要かもしれない\n                    \":${reactionObj.getNameAndHost()}:\"\n                }\n                is InstanceInfoType.Misskey -> {\n                    val name = reactionObj.getName()\n                        ?: return null\n                    val hitEmojis =\n                        customEmojiRepository.findByName(account.getHost(), name).getOrThrow()\n                    val hitEmoji = hitEmojis.firstOrNull()\n                    if (hitEmoji == null) {\n                        \"👍\"\n                    } else {\n                        reaction\n                    }\n                }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/history/ReactionHistory.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction.history\n\ndata class ReactionHistory(\n    val reaction: String,\n    val instanceDomain: String,\n    val accountId: Long?,\n    val targetUserId: String?,\n    val targetPostId: String?,\n    var id: Long? = null\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/history/ReactionHistoryCount.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction.history\n\ndata class ReactionHistoryCount(\n    val reaction: String,\n    val count: Int\n)\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reaction/history/ReactionHistoryRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction.history\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface ReactionHistoryRepository {\n    suspend fun create(reactionHistory: ReactionHistory): Result<Unit>\n    fun observeSumReactions(instanceDomain: String, limit: Int = 80): Flow<List<ReactionHistoryCount>>\n    fun observeRecentlyUsedBy(instanceDomain: String, limit: Int = 20): Flow<List<ReactionHistory>>\n    suspend fun sumReactions(instanceDomain: String, limit: Int = 80): List<ReactionHistoryCount>\n    suspend fun findAll(): List<ReactionHistory>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/repost/CheckCanRepostService.kt",
    "content": "package net.pantasystem.milktea.model.note.repost\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass CheckCanRepostService @Inject constructor(\n    val accountRepository: AccountRepository,\n    val noteRepository: NoteRepository,\n) {\n\n    suspend fun canRepost(noteId: Note.Id): Result<Boolean> = runCancellableCatching {\n        val note = noteRepository.find(noteId).getOrThrow()\n        val account = accountRepository.get(noteId.accountId).getOrThrow()\n        val userId = User.Id(account.accountId, account.remoteId)\n        if (note.isRenoteOnly()) {\n            return@runCancellableCatching false\n        }\n\n        if ((note.type as? Note.Type.Mastodon)?.reblogged == true) {\n            return@runCancellableCatching false\n        }\n\n        if (userId == note.userId) {\n            return@runCancellableCatching true\n        }\n\n        note.canRenote(userId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/repost/CreateRenote.kt",
    "content": "package net.pantasystem.milktea.model.note.repost\n\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.Visibility\n\n\ndata class CreateRenote(\n    val author: Account,\n    val renoteId: Note.Id,\n    val channelId: Channel.Id?,\n    val visibility: Visibility,\n) {\n    companion object {\n        fun ofTimeline(author: Account, target: Note) : CreateRenote {\n            return CreateRenote(\n                author = author,\n                renoteId = target.id,\n                channelId = null,\n                visibility = target.visibility,\n            )\n        }\n\n        fun ofChannel(author: Account, target: Note): CreateRenote {\n            return CreateRenote(\n                author = author,\n                renoteId = target.id,\n                channelId = target.channelId,\n                visibility = target.visibility,\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/repost/CreateRenoteMultipleAccountUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.repost\n\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.ap.ApResolverService\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * 複数のアカウントからリノートを行うユースケースです。\n * Milkteaでは原則としてUseCaseのメソッドは一つとしているが、このユースケースは下記理由によって、\n * 二つ以上メソッドが公開されていることを例外的に許容しています。\n * - リノート対象のノートがチャンネル内に投稿されたノートの場合、チャンネル内にリノートするかどうかでメソッドを分ける必要があった\n * - 微妙にユースケース自体は異なるが、UseCaseを分離するとService層を作り必要が出てきたりしてと複雑度が増してしまうため、一つのUseCaseにまとめています。\n */\n@Singleton\nclass CreateRenoteMultipleAccountUseCase @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val noteRepository: NoteRepository,\n    private val checkCanRepostService: CheckCanRepostService,\n    private val apResolverService: ApResolverService,\n) : UseCase {\n\n    /**\n     * [targetNoteId]を持つノートをHTL/LTL/STL/GTLへリノートする。\n     * チャンネル内に投稿されたノートの場合、チャンネル内にはリノートされず各種TLへリノートされる。\n     * チャンネル内にリノートしたい場合は[renoteToChannel]を使用する。\n     *\n     * @param targetNoteId リノート対象の[Note.Id]\n     * @param publisherAccountIds このアカウントからリノートを行う\n     */\n    suspend fun renote(\n        targetNoteId: Note.Id,\n        publisherAccountIds: List<Long>,\n    ): Result<List<Result<Note>>> = runCancellableCatching {\n        coroutineScope {\n            val note = recursiveSearchHasContentNote(targetNoteId).getOrThrow()\n            publisherAccountIds.map {\n                resolveAndRenote(note, it) { a, n ->\n                    CreateRenote.ofTimeline(a, n)\n                }\n            }\n        }\n    }\n\n    /**\n     * [targetNoteId]を持つノートが投稿されたチャンネルと同じチャンネルにリノートする。\n     * [targetNoteId]がチャンネル外に投稿されたノートの場合、特定のチャンネル内にリノートということにはならず[renote]と同等の挙動となる。\n     * チャンネル外にリノートしたい場合は[renote]を使用する。\n     *\n     * @param targetNoteId リノート対象の[Note.Id]\n     * @param publisherAccountIds このアカウントからリノートを行う\n     */\n    suspend fun renoteToChannel(\n        targetNoteId: Note.Id,\n        publisherAccountIds: List<Long>,\n    ): Result<List<Result<Note>>> = runCancellableCatching {\n        coroutineScope {\n            val note = recursiveSearchHasContentNote(targetNoteId).getOrThrow()\n            publisherAccountIds.map {\n                resolveAndRenote(note, it) { a, n ->\n                    CreateRenote.ofChannel(a, n)\n                }\n            }\n        }\n    }\n\n    private suspend fun resolveAndRenote(\n        targetNote: Note,\n        publisherAccountId: Long,\n        paramFactory: (Account, Note) -> CreateRenote\n    ): Result<Note> = runCancellableCatching {\n        val publisherAccount = accountRepository.get(publisherAccountId).getOrThrow()\n        val relatedTargetNoteAccount = accountRepository.get(targetNote.id.accountId).getOrThrow()\n\n        val resolvedNote = if (publisherAccount.getHost() != relatedTargetNoteAccount.getHost()) {\n            // リノート発信アカウントと対象ノートのホストが異なる場合、\n            // AP経由でリノート発信アカウントのあるホストに対象ノートを取り寄せ、ホストに複製されたノートをリノートする\n            apResolverService\n                .resolve(targetNote.id, publisherAccountId)\n                .getOrThrow()\n        } else {\n            noteRepository\n                .find(Note.Id(publisherAccount.accountId, targetNote.id.noteId))\n                .getOrThrow()\n        }\n\n        if (!checkCanRepostService.canRepost(resolvedNote.id).getOrElse { false }) {\n            throw IllegalArgumentException()\n        }\n\n        val resolvedAccount = accountRepository.get(resolvedNote.id.accountId).getOrThrow()\n\n        noteRepository\n            .renote(paramFactory.invoke(resolvedAccount, resolvedNote))\n            .getOrThrow()\n    }\n\n    private suspend fun recursiveSearchHasContentNote(noteId: Note.Id): Result<Note> =\n        runCancellableCatching {\n            val note = noteRepository.find(noteId).getOrThrow()\n            if (note.hasContent()) {\n                note\n            } else {\n                recursiveSearchHasContentNote(note.renoteId!!).getOrThrow()\n            }\n        }\n}\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/repost/QuoteRenoteData.kt",
    "content": "package net.pantasystem.milktea.model.note.repost\n\nimport net.pantasystem.milktea.model.channel.Channel\nimport net.pantasystem.milktea.model.note.Note\n\ndata class QuoteRenoteData(\n    val noteId: Note.Id,\n    val channelId: Channel.Id?,\n) {\n    companion object {\n        fun ofTimeline(noteId: Note.Id): QuoteRenoteData {\n            return QuoteRenoteData(\n                noteId = noteId,\n                channelId = null,\n            )\n        }\n\n        fun ofChannel(noteId: Note.Id, channelId: Channel.Id): QuoteRenoteData {\n            return QuoteRenoteData(\n                noteId = noteId,\n                channelId = channelId,\n            )\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/repost/Renotes.kt",
    "content": "package net.pantasystem.milktea.model.note.repost\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\nsealed interface RenoteType {\n    data class Renote(\n        val noteId: Note.Id,\n        val isQuote: Boolean\n    ) : RenoteType\n\n    data class Reblog(\n        val userId: User.Id\n    ) : RenoteType\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/repost/RenotesPagingService.kt",
    "content": "package net.pantasystem.milktea.model.note.repost\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.note.Note\n\ninterface RenotesPagingService {\n\n    interface Factory {\n        fun create(noteId: Note.Id): RenotesPagingService\n    }\n\n    val state: Flow<PageableState<List<RenoteType>>>\n    suspend fun next()\n    suspend fun refresh()\n    suspend fun clear()\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/reservation/NoteReservationPostExecutor.kt",
    "content": "package net.pantasystem.milktea.model.note.reservation\n\nimport net.pantasystem.milktea.model.note.draft.DraftNote\n\ninterface NoteReservationPostExecutor {\n    fun register(draftNote: DraftNote)\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/timeline/SyncTimelineFromLatestToCurrentUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.timeline\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.delay\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport javax.inject.Inject\n\n/**\n * 一番先頭の投稿から、キャッシュ上にある最新の投稿に追いつくまで取得し続ける\n */\nclass SyncTimelineFromLatestToCurrentUseCase @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val timelineRepository: TimelineRepository,\n) {\n\n    suspend operator fun invoke(): Result<Unit> = runCancellableCatching {\n        val accounts = accountRepository.findAll().getOrThrow()\n        coroutineScope {\n            accounts.flatMap { it.pages }.map {\n                async {\n                    val type = TimelineType(\n                        accountId = it.accountId,\n                        pageable = it.pageable(),\n                        pageId = it.pageId,\n                    )\n                    if (type.canCache() && it.isSavePagePosition) {\n                        val currentId = timelineRepository.findFirstLaterId(type).getOrThrow()\n                        sync(\n                            type,\n                            nextId = null,\n                            currentId,\n                        ).getOrThrow()\n                    }\n                }\n            }.awaitAll()\n        }\n    }\n\n    //\n    suspend fun sync(type: TimelineType, nextId: String?, currentId: String?, loopCount: Int = 0): Result<Unit> = runCancellableCatching {\n        if (!type.canCache()) {\n            return@runCancellableCatching\n        }\n        val response = timelineRepository.findPreviousTimeline(type, untilId = nextId).getOrThrow()\n        if (response.timelineItems.isEmpty()) {\n            return@runCancellableCatching\n        }\n\n        val lastItemId = response.timelineItems.last().noteId\n        // 最後にある要素がcurrentIdより小さくなれば終了\n        // ページ数が100ページを越えれば終了\n        // 100という数字に特に意味はないが10 * 100で1000投稿になり流石にそれ以上の投稿をユーザが読むとは思えないため\n        if ((currentId != null && lastItemId < currentId) || loopCount > 100) {\n            return@runCancellableCatching\n        }\n\n        delay(100)\n        sync(type, response.untilId, currentId = currentId, loopCount + 1)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/timeline/SyncTimelineUseCase.kt",
    "content": "package net.pantasystem.milktea.model.note.timeline\n\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport javax.inject.Inject\n\nclass SyncTimelineUseCase @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val timelineRepository: TimelineRepository,\n) : UseCase {\n\n    suspend operator fun invoke(): Result<Unit> = runCancellableCatching {\n        val accounts = accountRepository.findAll().getOrThrow()\n        coroutineScope {\n            accounts.flatMap { it.pages }.map {\n                async {\n                    val type = TimelineType(\n                        accountId = it.accountId,\n                        pageable = it.pageable(),\n                        pageId = null,\n                    )\n                    if (type.canCache() && it.isSavePagePosition) {\n                        sync(\n                            type,\n                            nextId = timelineRepository.findFirstLaterId(type).getOrNull()\n                        )\n                    }\n                }\n            }.awaitAll()\n        }\n    }\n\n    // ページがなくなるまで最新の投稿を取得し続ける\n    suspend fun sync(type: TimelineType, nextId: String?): Result<Unit> = runCancellableCatching {\n        if (type.canCache()) {\n            return@runCancellableCatching\n        }\n        val response = timelineRepository.findLaterTimeline(type, sinceId = nextId).getOrThrow()\n        if (response.timelineItems.isEmpty()) {\n            return@runCancellableCatching\n        }\n\n        sync(type, response.untilId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/timeline/TimelineItem.kt",
    "content": "package net.pantasystem.milktea.model.note.timeline\n\nimport net.pantasystem.milktea.model.note.Note\n\ndata class TimelineItem(\n    val noteId: Note.Id\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/timeline/TimelineRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.timeline\n\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.note.Note\n\n\n/**\n * 投稿に関するタイムラインを取得するためのリポジトリ\n * このリポジトリはキャッシュを持つことができる\n * キャッシュを持つことができるかどうかは[TimelineType.canCache]で判断する\n * キャッシュを持つことができる場合は[findLaterTimeline]で取得したデータをキャッシュに保存する\n * ページネーションの状態を無視して呼び出してしまうと、キャッシュの順序が狂ってしまうので注意\n */\ninterface TimelineRepository {\n    suspend fun findPreviousTimeline(\n        type: TimelineType,\n        untilId: String? = null,\n        untilDate: Long? = null,\n        limit: Int = 10,\n    ): Result<TimelineResponse>\n\n    /**\n     * @Param sinceDate はサーバーによっては使えない場合がある\n     */\n    suspend fun findLaterTimeline(\n        type: TimelineType,\n        sinceId: String? = null,\n        sinceDate: Long? = null,\n        limit: Int = 10,\n    ): Result<TimelineResponse>\n\n    // 先頭に要素を追加するためのメソッド\n    suspend fun add(\n        type: TimelineType,\n        noteId: Note.Id,\n    ): Result<Unit>\n\n    suspend fun clear(\n        type: TimelineType,\n    ): Result<Unit>\n\n    suspend fun findFirstLaterId(\n        type: TimelineType,\n    ): Result<String?>\n\n    suspend fun findLastPreviousId(\n        type: TimelineType,\n    ): Result<String?>\n}\n\ndata class TimelineResponse(\n    val timelineItems: List<Note.Id>,\n    val sinceId: String?,\n    val untilId: String?,\n)\n\ndata class TimelineType(\n    val accountId: Long,\n    val pageable: Pageable,\n    val pageId: Long?,\n) {\n\n    fun isAllowPageable(): Boolean {\n        return when (pageable) {\n            is Pageable.Antenna -> true\n            Pageable.CalckeyRecommendedTimeline -> true\n            is Pageable.ChannelTimeline -> true\n            is Pageable.ClipNotes -> true\n            Pageable.Favorite -> true\n            is Pageable.Featured -> true\n            is Pageable.Gallery -> false\n            is Pageable.GlobalTimeline -> true\n            is Pageable.HomeTimeline -> true\n            is Pageable.HybridTimeline -> true\n            is Pageable.LocalTimeline -> true\n            Pageable.Mastodon.BookmarkTimeline -> true\n            is Pageable.Mastodon.HashTagTimeline -> true\n            is Pageable.Mastodon.HomeTimeline -> true\n            is Pageable.Mastodon.ListTimeline -> true\n            is Pageable.Mastodon.LocalTimeline -> true\n            Pageable.Mastodon.Mention -> false\n            is Pageable.Mastodon.PublicTimeline -> true\n            is Pageable.Mastodon.SearchTimeline -> false\n            Pageable.Mastodon.TrendTimeline -> false\n            is Pageable.Mastodon.UserTimeline -> true\n            is Pageable.Mention -> true\n            is Pageable.Notification -> false\n            is Pageable.Search -> true\n            is Pageable.SearchByTag -> true\n            is Pageable.Show -> false\n            is Pageable.UserListTimeline -> true\n            is Pageable.UserTimeline -> true\n        }\n    }\n\n    fun canCache(): Boolean {\n        if (!isAllowPageable()) {\n            return false\n        }\n        if (pageId == null) {\n            return false\n        }\n        return when (pageable) {\n            is Pageable.Antenna -> true\n            Pageable.CalckeyRecommendedTimeline -> true\n            is Pageable.ChannelTimeline -> true\n            is Pageable.ClipNotes -> false\n            Pageable.Favorite -> false\n            is Pageable.Featured -> false\n            is Pageable.Gallery -> false\n            is Pageable.GlobalTimeline -> true\n            is Pageable.HomeTimeline -> true\n            is Pageable.HybridTimeline -> true\n            is Pageable.LocalTimeline -> true\n            Pageable.Mastodon.BookmarkTimeline -> false\n            is Pageable.Mastodon.HashTagTimeline -> false\n            is Pageable.Mastodon.HomeTimeline -> true\n            is Pageable.Mastodon.ListTimeline -> true\n            is Pageable.Mastodon.LocalTimeline -> true\n            Pageable.Mastodon.Mention -> false\n            is Pageable.Mastodon.PublicTimeline -> true\n            is Pageable.Mastodon.SearchTimeline -> false\n            Pageable.Mastodon.TrendTimeline -> false\n            is Pageable.Mastodon.UserTimeline -> false\n            is Pageable.Mention -> false\n            is Pageable.Notification -> false\n            is Pageable.Search -> false\n            is Pageable.SearchByTag -> false\n            is Pageable.Show -> false\n            is Pageable.UserListTimeline -> false\n            is Pageable.UserTimeline -> false\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/note/timeline/favorite/FavoriteTimelineRepository.kt",
    "content": "package net.pantasystem.milktea.model.note.timeline.favorite\n\nimport net.pantasystem.milktea.model.note.Note\n\ninterface FavoriteTimelineRepository {\n    suspend fun findPreviousTimeline(\n        accountId: Long,\n        untilId: String? = null,\n        untilDate: Long? = null,\n        limit: Int = 10,\n    ): Result<FavoriteTimelineResponse>\n\n    /**\n     * @Param sinceDate はサーバーによっては使えない場合がある\n     */\n    suspend fun findLaterTimeline(\n        accountId: Long,\n        sinceId: String? = null,\n        sinceDate: Long? = null,\n        limit: Int = 10,\n    ): Result<FavoriteTimelineResponse>\n\n}\n\ndata class FavoriteTimelineResponse(\n    val timelineItems: List<Note.Id>,\n    val sinceId: String?,\n    val untilId: String?,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/Notification.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.group.Group\nimport net.pantasystem.milktea.model.group.InvitationId\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\n\nsealed class Notification {\n    abstract val id: Id\n    abstract val createdAt: Instant\n    abstract val isRead: Boolean\n\n    abstract fun read(): Notification\n\n    data class Id(\n        val accountId: Long,\n        val notificationId: String\n    ) : EntityId\n}\n\n\ninterface HasNote {\n    val noteId: Note.Id\n}\n\ninterface HasUser {\n    val userId: User.Id\n}\n\ndata class FollowNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val isRead: Boolean\n) : Notification(), HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class FollowRequestAcceptedNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val isRead: Boolean\n\n) : Notification(), HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class ReceiveFollowRequestNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val isRead: Boolean\n\n) : Notification(), HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class MentionNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val noteId: Note.Id,\n    override val isRead: Boolean\n\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class PostNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val noteId: Note.Id,\n    override val isRead: Boolean\n\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class FavoriteNotification(\n    override val id: Id,\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val noteId: Note.Id,\n    override val isRead: Boolean\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class ReplyNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val noteId: Note.Id,\n    override val isRead: Boolean\n\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class RenoteNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val noteId: Note.Id,\n    override val isRead: Boolean\n\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class QuoteNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val noteId: Note.Id,\n    override val isRead: Boolean\n\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class ReactionNotification(\n    override val id: Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    override val noteId: Note.Id,\n    val reaction: String,\n    override val isRead: Boolean\n\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class PollVoteNotification(\n    override val id: Id,\n    override val noteId: Note.Id,\n\n    override val createdAt: Instant,\n    override val userId: User.Id,\n    val choice: Int,\n    override val isRead: Boolean\n\n) : Notification(), HasNote, HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class PollEndedNotification(\n    override val id: Id,\n    override val createdAt: Instant,\n    override val isRead: Boolean,\n    override val noteId: Note.Id,\n\n    ) : Notification(), HasNote {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}\n\ndata class UnknownNotification(\n    override val id: Id,\n    override val createdAt: Instant,\n    override val isRead: Boolean,\n    val userId: User.Id?,\n    val rawType: String\n\n) : Notification() {\n    override fun read(): Notification {\n        return this.copy(isRead = true)\n    }\n}\n\ndata class GroupInvitedNotification(\n    override val id: Id,\n    override val isRead: Boolean,\n    override val createdAt: Instant,\n    val group: Group,\n    override val userId: User.Id,\n    val invitationId: InvitationId,\n) : Notification(), HasUser {\n    override fun read(): Notification {\n        return copy(isRead = true)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationDataSource.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.AddResult\n\n\ninterface NotificationDataSource {\n\n    sealed class Event {\n        abstract val notificationId: Notification.Id\n        data class Created(override val notificationId: Notification.Id, val notification: Notification) : Event()\n        data class Updated(override val notificationId: Notification.Id, val notification: Notification) : Event()\n        data class Deleted(override val notificationId: Notification.Id) : Event()\n    }\n\n    fun interface Listener {\n        fun on(event: Event)\n    }\n\n    fun addEventListener(listener: Listener)\n    fun removeEventListener(listener: Listener)\n\n    suspend fun get(notificationId: Notification.Id): Result<Notification>\n    suspend fun add(notification: Notification): Result<AddResult>\n    suspend fun remove(notificationId: Notification.Id) : Result<Boolean>\n    suspend fun addAll(notifications: Collection<Notification>): Result<List<AddResult>>\n\n    fun observeOne(notificationId: Notification.Id): Flow<Notification?>\n    fun observeIn(notificationIds: List<Notification.Id>): Flow<List<Notification>>\n\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationNotFoundException.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nclass NotificationNotFoundException(notificationId: Notification.Id) : NoSuchElementException(\"Notificationは存在しません: $notificationId\")"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationPagingStore.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.model.account.Account\n\ninterface NotificationPagingStore {\n\n    interface Factory {\n        fun create(getAccount: suspend () -> Account): NotificationPagingStore\n    }\n\n    val notifications: Flow<PageableState<List<NotificationRelation>>>\n\n    suspend fun loadPrevious(): Result<Int>\n\n    suspend fun loadFuture(): Result<Int>\n\n    suspend fun clear()\n\n    suspend fun onReceiveNewNotification(notificationRelation: NotificationRelation) {\n\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationRelation.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.user.User\n\ndata class NotificationRelation (\n    val notification: Notification,\n    val user: User?,\n    val note: NoteRelation?\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationRelationGetter.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport net.pantasystem.milktea.model.note.NoteRelationGetter\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n\n@Singleton\nclass NotificationRelationGetter @Inject constructor(\n    private val userDataSource: UserDataSource,\n    private val notificationDataSource: NotificationDataSource,\n    private val noteRelationGetter: NoteRelationGetter,\n) {\n\n    suspend fun get(notificationId: Notification.Id): NotificationRelation {\n        val notification = notificationDataSource.get(notificationId)\n        val user = (notification.getOrThrow() as? HasUser)?.userId?.let {\n            userDataSource.get(it)\n        }\n        val noteRelation = (notification.getOrThrow() as? HasNote)?.let {\n            noteRelationGetter.get(it.noteId)\n        }\n        return NotificationRelation(\n            notification.getOrThrow(), user?.getOrNull(), noteRelation?.getOrNull()\n        )\n    }\n\n    suspend fun get(accountId: Long, notificationId: String): NotificationRelation {\n        return get(Notification.Id(accountId, notificationId))\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationRepository.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface NotificationRepository {\n\n    suspend fun read(notificationId: Notification.Id)\n\n    fun countUnreadNotification(accountId: Long): Flow<Int>\n\n    suspend fun markAsRead(accountId: Long): Result<Unit>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationStreaming.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.account.Account\n\ninterface NotificationStreaming {\n    fun connect(getAccount: () -> Account): Flow<NotificationRelation>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/NotificationTimelineRepository.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\ninterface NotificationTimelineRepository {\n\n    suspend fun findPreviousTimeline(\n        accountId: Long,\n        untilId: String? = null,\n        limit: Int = 10,\n        excludeTypes: List<String>? = null,\n        includeTypes: List<String>? = null\n    ): Result<List<Notification>>\n\n    suspend fun findLaterTimeline(\n        accountId: Long,\n        sinceId: String? = null,\n        limit: Int = 10,\n        excludeTypes: List<String>? = null,\n        includeTypes: List<String>? = null,\n    ): Result<List<Notification>>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/notification/PushNotification.kt",
    "content": "package net.pantasystem.milktea.model.notification\n\nimport android.os.Bundle\nimport net.pantasystem.milktea.common.runCancellableCatching\n\n\ndata class PushNotification(\n    val notificationId: String,\n    val type: String,\n    val body: String,\n    val title: String,\n    val accountId: Long,\n    val noteId: String?,\n    val userId: String?,\n) {\n    fun isNearUserNotification(): Boolean {\n        return userId != null\n                && (type == \"follow\"\n                || type == \"receiveFollowRequest\"\n                || type == \"followRequestAccepted\")\n    }\n\n    fun isNearNoteNotification(): Boolean {\n        return noteId != null\n                && (type == \"mention\"\n                || type == \"reply\"\n                || type == \"renote\"\n                || type == \"quote\"\n                || type == \"reaction\")\n    }\n}\n\nfun Map<String, String?>.toPushNotification(): PushNotification {\n    val title = this[\"title\"]\n    val body = this[\"body\"]\n    val notificationId = this[\"notificationId\"]\n    val type = this[\"type\"]\n    val accountId = this[\"accountId\"]\n    val userId = this[\"userId\"]\n    val noteId = this[\"noteId\"]\n    if(title == null || body == null || notificationId == null || type == null || accountId == null) {\n        throw IllegalArgumentException(\n            \"title, body, notificationId, type, accountIdいずれかの必要な項目が足りません data:${this}\"\n        )\n    }\n    return PushNotification(\n        notificationId = notificationId,\n        type = type,\n        body = body,\n        title = title,\n        accountId = accountId.toLong(),\n        noteId = noteId,\n        userId = userId\n    )\n}\n\nfun Bundle.toPushNotification(): Result<PushNotification> = runCancellableCatching {\n    listOf(\n        \"title\" to getString(\"title\"),\n        \"body\" to getString(\"body\"),\n        \"notificationId\" to getString(\"notificationId\"),\n        \"type\" to getString(\"type\"),\n        \"accountId\" to getString(\"accountId\"),\n        \"userId\" to  getString(\"userId\"),\n        \"noteId\" to getString(\"noteId\"),\n    ).toMap().toPushNotification()\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/search/SearchHistory.kt",
    "content": "package net.pantasystem.milktea.model.search\n\ndata class SearchHistory(\n    val accountId: Long,\n    val keyword: String,\n    val id: Long = 0L\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/search/SearchHistoryRepository.kt",
    "content": "package net.pantasystem.milktea.model.search\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface SearchHistoryRepository {\n\n    suspend fun add(history: SearchHistory): Result<SearchHistory>\n\n    suspend fun delete(id: Long): Result<Unit>\n\n    fun observeBy(accountId: Long, limit: Int = 10): Flow<List<SearchHistory>>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/ColorSettingStore.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\nimport android.content.SharedPreferences\n\nclass ColorSettingStore(private val sharedPreferences: SharedPreferences) {\n    companion object{\n        const val SURFACE_COLOR_OPAQUE_KEY = \"jp.panta.misskeyandroidclient.model.settings.SURFACE_COLOR_OPAQUE_KEY\"\n    }\n\n    private var mSurfaceColorOpaque: Int? = null\n\n    var surfaceColorOpaque: Int\n        get() {\n            return mSurfaceColorOpaque?: sharedPreferences.getInt(SURFACE_COLOR_OPAQUE_KEY, 0xff)\n        }\n        set(value) {\n            if(value in 0..255){\n                val e = sharedPreferences.edit()\n                e.putInt(SURFACE_COLOR_OPAQUE_KEY, value)\n                e.apply()\n            }\n\n        }\n\n\n    init{\n        sharedPreferences.registerOnSharedPreferenceChangeListener { sharedPreferences, key ->\n            when(key){\n                SURFACE_COLOR_OPAQUE_KEY ->{\n                    mSurfaceColorOpaque = sharedPreferences.getInt(SURFACE_COLOR_OPAQUE_KEY, 0xff)\n                }\n            }\n        }\n    }\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/Config.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\nimport net.pantasystem.milktea.model.note.Visibility\n\n\n\n\nsealed interface RememberVisibility {\n    object None : RememberVisibility\n    data class Remember(val visibility: Visibility, val accountId: Long) : RememberVisibility\n    sealed interface Keys {\n        object IsRememberNoteVisibility : Keys\n        data class NoteVisibility(val accountId: Long) : Keys\n        data class IsLocalOnly(val accountId: Long) : Keys\n    }\n}\n\n/**\n * @param isEnable クラシュリティクスによる情報収集が有効\n * @param isConfirmed 情報収集の確認済み(可否は関係ない)\n */\ndata class IsCrashlyticsCollectionEnabled(\n    val isEnable: Boolean,\n    val isConfirmed: Boolean\n)\n\ndata class IsAnalyticsCollectionEnabled(\n    val isEnabled: Boolean,\n    val isConfirmed: Boolean,\n)\n\ndata class IsSafeSearchEnabled(\n    val isEnabled: Boolean,\n    val isConfirmed: Boolean,\n)\n\n/**\n * @param isSimpleEditorEnabled シンプルエディターを使用するのか\n * @param reactionPickerType リアクションピッカーの種別　\n * @param backgroundImagePath 背景画像のパス\n * @param isClassicUI BottomNavを使用しないタイプのUI\n * @param isUserNameDefault User@usernameを主体とする表示\n * @param isPostButtonAtTheBottom ノート編集画面の投稿ボタンを下に持ってくる\n * @param noteExpandedHeightSize ノートを強制的に折り畳むサイズ\n * @param theme テーマカラー\n * @param isCrashlyticsCollectionEnabled クラシュリティクスの許可状態\n * @param isAnalyticsCollectionEnabled アナリティクスの許可状態\n * @param isConfirmedPostNotification プッシュ通知の顕現許可の状態\n * @param isEnableInstanceTicker Instance Tickerの有無\n * @param isDriveUsingGridView 一覧表示時にグリッド表示を行うのか\n * @param isEnableNotificationSound アプリ内通知の通知音の有無\n * @param isStopNoteCaptureWhenBackground バックグラウンド移行時にノートのキャプチャーを停止する\n * @param isStopStreamingApiWhenBackground バックグルアンド移行時にストリーミングを中止する\n * @param isEnableStreamingAPIAndNoteCapture 自動更新のON/OFF\n * @Param isEnableNoteDivider ノートの区切り線の有無 trueで有り falseで無し\n * @param isVisibleInstanceUrlInToolbar toolbar内にインスタンス情報を表示するか？\n * @param noteHeaderFontSize ノートのヘッダー部分のテキストサイズ\n * @param noteContentFontSize ノートのコンテンツ部分のテキストサイズ\n * @param noteReactionCounterFontSize ノートのリアクションカウンターのカスタム絵文字、絵文字と件数表示のフォントサイズ\n * @param emojiPickerEmojiDisplaySize 絵文字ピッカーの絵文字の表示サイズ\n * @param mediaDisplayMode メディアの表示モード\n */\ndata class Config(\n    val isSimpleEditorEnabled: Boolean,\n    val reactionPickerType: ReactionPickerType,\n    val backgroundImagePath: String?,\n    val isClassicUI: Boolean,\n    val isUserNameDefault: Boolean,\n    val isPostButtonAtTheBottom: Boolean,\n    val noteExpandedHeightSize: Int,\n    val theme: Theme,\n    val isIncludeMyRenotes: Boolean,\n    val isIncludeRenotedMyNotes: Boolean,\n    val isIncludeLocalRenotes: Boolean,\n    val surfaceColorOpacity: Int,\n    val isEnableTimelineScrollAnimation: Boolean,\n    val isCrashlyticsCollectionEnabled: IsCrashlyticsCollectionEnabled,\n    val isAnalyticsCollectionEnabled: IsAnalyticsCollectionEnabled,\n    val isConfirmedPostNotification: Boolean,\n    val isEnableInstanceTicker: Boolean,\n    val isDriveUsingGridView: Boolean,\n    val isEnableNotificationSound: Boolean,\n    val isStopStreamingApiWhenBackground: Boolean,\n    val isStopNoteCaptureWhenBackground: Boolean,\n    val isEnableStreamingAPIAndNoteCapture: Boolean,\n    val isEnableNoteDivider: Boolean,\n    val isVisibleInstanceUrlInToolbar: Boolean,\n    val noteHeaderFontSize: Float,\n    val noteContentFontSize: Float,\n    val isDisplayTimestampsAsAbsoluteDates: Boolean,\n    val noteReactionCounterFontSize: Float,\n    val noteCustomEmojiScaleSizeInText: Float,\n    val emojiPickerEmojiDisplaySize: Int,\n    val avatarIconShapeType: AvatarIconShapeType,\n    val mediaDisplayMode: MediaDisplayMode,\n    val isEnableSafeSearch: IsSafeSearchEnabled,\n    val isShowWarningDisplayingSensitiveMedia: Boolean,\n    val isEnableHapticFeedbackOnNewPost: Boolean,\n) {\n    companion object\n\n    fun setCrashlyticsCollectionEnabled(enabled: Boolean): Config {\n        return copy(\n            isCrashlyticsCollectionEnabled = isCrashlyticsCollectionEnabled.copy(\n                isEnable = enabled,\n                isConfirmed = true\n            )\n        )\n    }\n\n    fun setAnalyticsCollectionEnabled(enabled: Boolean): Config {\n        return copy(\n            isAnalyticsCollectionEnabled = isAnalyticsCollectionEnabled.copy(\n                isEnabled = enabled,\n                isConfirmed = true\n            )\n        )\n    }\n\n\n}\n\nobject DefaultConfig {\n    val config = Config(\n        isSimpleEditorEnabled = false,\n        reactionPickerType = ReactionPickerType.LIST,\n        backgroundImagePath = null,\n        isClassicUI = false,\n        isUserNameDefault = false,\n        isPostButtonAtTheBottom = true,\n        noteExpandedHeightSize = 300,\n        theme = Theme.White,\n        isIncludeLocalRenotes = true,\n        isIncludeMyRenotes = true,\n        isIncludeRenotedMyNotes = true,\n        surfaceColorOpacity = 0xff,\n        isEnableTimelineScrollAnimation = false,\n        isCrashlyticsCollectionEnabled = IsCrashlyticsCollectionEnabled(\n            isConfirmed = false,\n            isEnable = false,\n        ),\n        isAnalyticsCollectionEnabled = IsAnalyticsCollectionEnabled(\n            isConfirmed = false,\n            isEnabled = false,\n        ),\n        isConfirmedPostNotification = false,\n        isEnableInstanceTicker = true,\n        isDriveUsingGridView = false,\n        isEnableNotificationSound = true,\n        isStopNoteCaptureWhenBackground = true,\n        isStopStreamingApiWhenBackground = true,\n        isEnableStreamingAPIAndNoteCapture = true,\n        isEnableNoteDivider = true,\n        isVisibleInstanceUrlInToolbar = true,\n        noteContentFontSize = 15f,\n        noteHeaderFontSize = 15f,\n        isDisplayTimestampsAsAbsoluteDates = false,\n        noteReactionCounterFontSize = 15f,\n        noteCustomEmojiScaleSizeInText = 1.2f,\n        emojiPickerEmojiDisplaySize = 28,\n        avatarIconShapeType = AvatarIconShapeType.Circle,\n        mediaDisplayMode = MediaDisplayMode.AUTO,\n        isEnableSafeSearch =IsSafeSearchEnabled(\n            isEnabled = true,\n            isConfirmed = false,\n        ),\n        isShowWarningDisplayingSensitiveMedia = true,\n        isEnableHapticFeedbackOnNewPost = true,\n    )\n\n    fun getRememberVisibilityConfig(accountId: Long): RememberVisibility.Remember {\n        return RememberVisibility.Remember(\n            accountId = accountId,\n            visibility = Visibility.Public(false)\n        )\n    }\n}\n\nenum class ReactionPickerType {\n    LIST,\n    SIMPLE\n}\n\nenum class AvatarIconShapeType(val value: Int) {\n    Circle(0),\n    Square(1),\n}\n\nenum class MediaDisplayMode(val value: Int) {\n    AUTO(0),\n    ALWAYS_HIDE(1),\n    ALWAYS_HIDE_WHEN_MOBILE_NETWORK(2),\n    ALWAYS_SHOW(3),\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/Keys.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\nval Keys.Companion.allKeys by lazy {\n    setOf(\n        Keys.IsSimpleEditorEnabled,\n        Keys.ReactionPickerType,\n        Keys.BackgroundImage,\n        Keys.ClassicUI,\n        Keys.IsUserNameDefault,\n        Keys.IsPostButtonToBottom,\n        Keys.NoteLimitHeight,\n        Keys.IsIncludeLocalRenotes,\n        Keys.IsIncludeRenotedMyNotes,\n        Keys.IsIncludeMyRenotes,\n        Keys.SurfaceColorOpacity,\n        Keys.ThemeType,\n        Keys.IsEnableTimelineScrollAnimation,\n        Keys.IsCrashlyticsCollectionEnabled,\n        Keys.IsConfirmedCrashlyticsCollection,\n        Keys.IsConfirmedAnalyticsCollection,\n        Keys.IsAnalyticsCollectionEnabled,\n        Keys.IsConfirmedPostNotification,\n        Keys.IsEnableInstanceTicker,\n        Keys.IsDriveUsingGridView,\n        Keys.IsEnableNotificationSound,\n        Keys.IsStopStreamingApiWhenBackground,\n        Keys.IsStopNoteCaptureWhenBackground,\n        Keys.IsEnableStreamingAPIAndNoteCapture,\n        Keys.IsEnableNoteDivider,\n        Keys.IsVisibleInstanceUrlInToolbar,\n        Keys.NoteHeaderFontSize,\n        Keys.NoteContentFontSize,\n        Keys.IsDisplayTimestampsAsAbsoluteDates,\n        Keys.NoteReactionCounterFontSize,\n        Keys.NoteCustomEmojiScaleSizeInText,\n        Keys.EmojiPickerEmojiDisplaySize,\n        Keys.AvatarIconShapeType,\n        Keys.MediaDisplayMode,\n        Keys.IsSafeSearchEnabled,\n        Keys.IsConfirmedSafeSearchEnabled,\n        Keys.IsShowWarningDisplayingSensitiveMedia,\n        Keys.IsEnableHapticFeedbackOnNewPost,\n    )\n}\n\nsealed interface Keys {\n\n\n    data object IsSimpleEditorEnabled : Keys\n\n    data object ReactionPickerType : Keys\n\n    data object BackgroundImage : Keys\n    data object ClassicUI : Keys\n\n    data object IsUserNameDefault : Keys\n\n    data object IsPostButtonToBottom : Keys\n\n    data object NoteLimitHeight : Keys\n\n\n    data object ThemeType : Keys\n\n    data object IsIncludeMyRenotes : Keys\n    data object IsIncludeRenotedMyNotes : Keys\n    data object IsIncludeLocalRenotes : Keys\n    data object SurfaceColorOpacity : Keys\n    data object IsEnableTimelineScrollAnimation : Keys\n    data object IsCrashlyticsCollectionEnabled : Keys\n    data object IsConfirmedCrashlyticsCollection : Keys\n\n    data object IsAnalyticsCollectionEnabled : Keys\n    data object IsConfirmedAnalyticsCollection : Keys\n\n    data object IsConfirmedPostNotification : Keys\n\n    data object IsEnableInstanceTicker : Keys\n\n    data object IsDriveUsingGridView : Keys\n\n    data object IsEnableNotificationSound : Keys\n\n    data object IsStopStreamingApiWhenBackground : Keys\n\n    data object IsStopNoteCaptureWhenBackground : Keys\n\n    data object IsEnableStreamingAPIAndNoteCapture : Keys\n\n    data object IsEnableNoteDivider: Keys\n\n    data object IsVisibleInstanceUrlInToolbar : Keys\n\n    data object NoteHeaderFontSize: Keys\n\n    data object NoteContentFontSize: Keys\n\n    data object IsDisplayTimestampsAsAbsoluteDates: Keys\n\n    data object NoteReactionCounterFontSize : Keys\n\n    data object NoteCustomEmojiScaleSizeInText : Keys\n\n    data object EmojiPickerEmojiDisplaySize : Keys\n\n    data object AvatarIconShapeType : Keys\n\n    data object MediaDisplayMode : Keys\n\n    data object IsSafeSearchEnabled : Keys\n\n    data object IsConfirmedSafeSearchEnabled : Keys\n\n    data object IsShowWarningDisplayingSensitiveMedia : Keys\n\n    data object IsEnableHapticFeedbackOnNewPost : Keys\n\n    companion object\n}\n\nfun Keys.str(): String {\n    return when (this) {\n        is Keys.BackgroundImage -> \"BackgroundImage\"\n        is Keys.ClassicUI -> \"HIDE_BOTTOM_NAVIGATION\"\n        is Keys.IsPostButtonToBottom -> \"IS_POST_BUTTON_TO_BOTTOM\"\n        is Keys.IsSimpleEditorEnabled -> \"IS_SIMPLE_EDITOR_ENABLED\"\n        is Keys.IsUserNameDefault -> \"IS_USER_NAME_DEFAULT\"\n        is Keys.NoteLimitHeight -> \"HEIGHT\"\n        is Keys.ReactionPickerType -> \"ReactionPickerType\"\n        is Keys.ThemeType -> \"THEME\"\n        is Keys.IsIncludeMyRenotes -> \"INCLUDE_MY_RENOTES\"\n        is Keys.IsIncludeLocalRenotes -> \"INCLUDE_LOCAL_RENOTES\"\n        is Keys.IsIncludeRenotedMyNotes -> \"INCLUDE_RENOTED_MY_NOTES\"\n        is Keys.SurfaceColorOpacity -> \"jp.panta.misskeyandroidclient.model.settings.SURFACE_COLOR_OPAQUE_KEY\"\n        is Keys.IsEnableTimelineScrollAnimation -> \"IS_ENABLE_TIMELINE_SCROLL_ANIMATION\"\n        is Keys.IsCrashlyticsCollectionEnabled -> \"IsCrashlyticsCollectionEnabled\"\n        is Keys.IsConfirmedCrashlyticsCollection -> \"IsConfirmedCrashlyticsCollection\"\n        is Keys.IsConfirmedAnalyticsCollection -> \"IsConfirmedAnalyticsCollection\"\n        is Keys.IsAnalyticsCollectionEnabled -> \"IsAnalyticsCollectionEnabled\"\n        is Keys.IsConfirmedPostNotification -> \"IsConfirmedPostNotification\"\n        is Keys.IsEnableInstanceTicker -> \"IsEnableInstanceTicker\"\n        is Keys.IsDriveUsingGridView -> \"IsDriveUsingGridView\"\n        is Keys.IsEnableNotificationSound -> \"IsEnableNotificationSound\"\n        is Keys.IsStopNoteCaptureWhenBackground -> \"IsStopNoteCaptureWhenBackground\"\n        is Keys.IsStopStreamingApiWhenBackground -> \"IsStopStreamingApiWhenBackground\"\n        is Keys.IsEnableStreamingAPIAndNoteCapture -> \"IsEnableStreamingAPIAndNoteCapture\"\n        is Keys.IsEnableNoteDivider -> \"IsEnableNoteDivider\"\n        is Keys.IsVisibleInstanceUrlInToolbar -> \"IsVisibleInstanceUrlInToolbar\"\n        is Keys.NoteContentFontSize -> \"NoteContentFontSize\"\n        is Keys.NoteHeaderFontSize -> \"NoteHeaderFontSize\"\n        is Keys.IsDisplayTimestampsAsAbsoluteDates -> \"IsDisplayTimestampsAsAbsoluteDates\"\n        is Keys.NoteReactionCounterFontSize -> \"NoteReactionCounterFontSize\"\n        is Keys.NoteCustomEmojiScaleSizeInText -> \"NoteCustomEmojiScaleSizeInText\"\n        is Keys.EmojiPickerEmojiDisplaySize -> \"EmojiPickerEmojiDisplaySize\"\n        is Keys.AvatarIconShapeType -> \"AvatarIconShapeType\"\n        is Keys.MediaDisplayMode -> \"MediaDisplayMode\"\n        is Keys.IsSafeSearchEnabled -> \"ExcludeIfExistsSensitiveMedia\"\n        is Keys.IsConfirmedSafeSearchEnabled -> \"IsConfirmedSafeSearchEnabled\"\n        is Keys.IsShowWarningDisplayingSensitiveMedia -> \"IsShowWarningDisplayingSensitiveMedia\"\n        is Keys.IsEnableHapticFeedbackOnNewPost -> \"IsEnableHapticFeedbackOnNewPost\"\n    }\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/LocalConfigRepository.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\nimport kotlinx.coroutines.flow.Flow\n\ninterface LocalConfigRepository {\n\n    suspend fun save(config: Config): Result<Unit>\n    suspend fun save(remember: RememberVisibility): Result<Unit>\n\n    fun get(): Result<Config>\n    fun getRememberVisibility(accountId: Long): Result<RememberVisibility>\n\n    fun observe(): Flow<Config>\n    fun observeRememberVisibility(accountId: Long): Flow<RememberVisibility>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/NoteExpandedHeightSize.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\ninterface NoteExpandedHeightSize {\n    fun getNoteExpandedHeightSize(): Int\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/PrefType.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\nsealed interface PrefType {\n    data class StrPref(\n        val value: String?\n    ) : PrefType\n\n    data class BoolPref(\n        val value: Boolean\n    ) : PrefType\n\n    data class IntPref(\n        val value: Int\n    ) : PrefType\n\n    data class FloatPref(\n        val value: Float\n    ) : PrefType\n\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/Theme.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\nsealed interface Theme {\n    object White : Theme\n    object Black : Theme\n    object Dark : Theme\n    object Bread : Theme\n\n    object ElephantDark : Theme\n    companion object\n}\n\n\nfun Theme.isNightTheme(): Boolean {\n    return this is Theme.Black || this is Theme.Dark || this is Theme.ElephantDark\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/setting/WebClientBaseCache.kt",
    "content": "package net.pantasystem.milktea.model.setting\n\n@kotlinx.serialization.Serializable\ndata class WebClientBaseCache(\n    val reactions: List<String>\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/sw/register/DeviceTokenRepository.kt",
    "content": "package net.pantasystem.milktea.model.sw.register\n\ninterface DeviceTokenRepository {\n\n    suspend fun getOrCreate(): Result<String>\n\n    suspend fun get(): Result<String?>\n\n    fun save(deviceToken: String): Result<Unit>\n\n    fun clear(): Result<Unit>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/sw/register/SubscriptionRegistration.kt",
    "content": "package net.pantasystem.milktea.model.sw.register\n\ninterface SubscriptionRegistration {\n    suspend fun registerAll() : Int\n    suspend fun register(accountId: Long): Result<Unit>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/sw/register/SubscriptionState.kt",
    "content": "package net.pantasystem.milktea.model.sw.register\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n\n@Serializable\ndata class SubscriptionState(\n    @SerialName(\"state\") val state: String,\n    @SerialName(\"key\") val key: String? = null,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/sw/register/SubscriptionUnRegistration.kt",
    "content": "package net.pantasystem.milktea.model.sw.register\n\ninterface SubscriptionUnRegistration {\n    suspend fun unregister(accountId: Long)\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/task_executor.kt",
    "content": "package net.pantasystem.milktea.model\n\n\nimport kotlinx.coroutines.CoroutineScope\nimport kotlinx.coroutines.channels.BufferOverflow\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableSharedFlow\nimport kotlinx.coroutines.flow.SharingStarted\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.flow.onEach\nimport kotlinx.coroutines.flow.shareIn\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.gallery.GalleryPost\n\n/**\n * アプリケーションのスコープの範囲内で完了するタスク\n */\n@Deprecated(\"複雑でわかりづらいのでWorkerかStoreに移行したい\")\nfun interface ITask<T> {\n    suspend fun execute(): T\n}\n\n@Deprecated(\"複雑でわかりづらいのでWorkerかStoreに移行したい\")\nsealed class TaskState<T> {\n    data class Success<T>(val res: T) : TaskState<T>()\n    data class Error<T>(val e: Throwable, val task: ITask<T>) : TaskState<T>()\n    class Executing<T> : TaskState<T>()\n}\n\n/**\n * 別のCoroutineScopeでタスクを実行する\n */\n@Deprecated(\"複雑でわかりづらいのでWorkerかStoreに移行したい\")\ninterface TaskExecutor<T> {\n    val tasks: Flow<TaskState<T>>\n    fun dispatch(task: ITask<T>, isLazy: Boolean = false): Flow<TaskState<T>>\n}\n\n@Deprecated(\"複雑でわかりづらいのでWorkerかStoreに移行したい\")\nclass TaskExecutorImpl<T>(\n    val coroutineScope: CoroutineScope,\n    val logger: Logger\n) : TaskExecutor<T> {\n\n    private val _tasks = MutableSharedFlow<TaskState<T>>(\n        onBufferOverflow = BufferOverflow.DROP_OLDEST,\n        extraBufferCapacity = 100\n    )\n    override val tasks: Flow<TaskState<T>> = _tasks\n\n    override fun dispatch(task: ITask<T>, isLazy: Boolean): Flow<TaskState<T>> {\n        return flow<TaskState<T>> {\n            runCancellableCatching {\n                emit(TaskState.Executing())\n                task.execute()\n            }.onSuccess {\n                emit(TaskState.Success(it))\n            }.onFailure {\n                logger.debug(\"タスクの実行中にエラーが発生しました\", e = it)\n                emit(TaskState.Error(it, task))\n            }\n        }.onEach {\n            _tasks.tryEmit(it)\n        }.shareIn(coroutineScope, if (isLazy) SharingStarted.Lazily else SharingStarted.Eagerly)\n\n    }\n}\n\n@Deprecated(\"複雑でわかりづらいのでWorkerかStoreに移行したい\")\nclass CreateGalleryTaskExecutor(\n    private val taskExecutorImpl: TaskExecutor<GalleryPost>\n) : TaskExecutor<GalleryPost> by taskExecutorImpl"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/url/UrlPreview.kt",
    "content": "package net.pantasystem.milktea.model.url\n\nimport kotlinx.serialization.SerialName\nimport kotlinx.serialization.Serializable\n\n\n@Serializable\ndata class UrlPreview(\n    val url: String,\n    val title: String,\n    val icon: String?,\n    val description: String?,\n    val thumbnail: String?,\n    @SerialName(\"sitename\") val siteName: String?\n    //val sensitive: Boolean\n    //val player,\n)\n\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/url/UrlPreviewLoadTask.kt",
    "content": "package net.pantasystem.milktea.model.url\n\nimport android.util.Log\nimport kotlinx.coroutines.*\n\nclass UrlPreviewLoadTask(\n    private val urlPreviewStore: UrlPreviewStore?,\n    private val urlList: List<String>?,\n    private val coroutineScope: CoroutineScope\n) {\n\n    private var job: Job? = null\n\n    @FunctionalInterface\n    interface Callback{\n        fun accept(list: List<UrlPreview>)\n    }\n\n    fun load(callback: Callback){\n        job = loadUrlPreviews(callback)\n    }\n\n    fun cancel(){\n        job?.cancel()\n    }\n\n    private fun loadUrlPreviews(callback: Callback)= coroutineScope.launch(Dispatchers.IO){\n        try{\n            urlPreviewStore?: return@launch\n            urlList?: return@launch\n            val list = urlList.mapIndexed { i, url ->\n                coroutineScope.async(Dispatchers.IO) {\n                    try{\n                        i to urlPreviewStore.get(url)\n                    }catch(e: Exception){\n                        Log.e(\"UrlPreviewLoadTask\", \"error\", e)\n                        null\n                    }\n                }\n            }.awaitAll().filterNotNull().sortedBy {\n                it.first\n            }.mapNotNull {\n                it.second\n            }.filterNot {\n                it.url.isBlank()\n            }\n            //Log.d(\"UrlPreviewLoadTask\", list.toString())\n            callback.accept(list)\n\n        }catch(e: Throwable){\n            Log.d(\"UrlPreviewLoadTask\", \"url load error\", e)\n        }\n\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/url/UrlPreviewStore.kt",
    "content": "package net.pantasystem.milktea.model.url\n\nimport net.pantasystem.milktea.model.account.Account\n\ninterface UrlPreviewStore{\n\n    fun get(url: String): UrlPreview?\n}\n\ninterface UrlPreviewStoreProvider {\n    fun getUrlPreviewStore(account: Account): UrlPreviewStore\n\n    fun getUrlPreviewStore(\n        account: Account,\n        isReplace: Boolean\n    ): UrlPreviewStore\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/Acct.kt",
    "content": "package net.pantasystem.milktea.model.user\n\ndata class Acct(val userName: String, val host: String?)\n\n\nfun Acct(acct: String): Acct {\n    val userNameAndHost = acct.split(\"@\").filter { it.isNotBlank() }\n    val userName = userNameAndHost[0]\n    val host = userNameAndHost.getOrNull(1)\n    return Acct(userName, host)\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/FollowRequestRepository.kt",
    "content": "package net.pantasystem.milktea.model.user\n\ninterface FollowRequestRepository {\n\n    suspend fun accept(userId: User.Id) : Boolean\n\n    suspend fun reject(userId: User.Id) : Boolean\n\n    suspend fun find(\n        accountId: Long,\n        sinceId: String? = null,\n        untilId: String? = null,\n    ): FollowRequestsResult\n}\n\ndata class FollowRequestsResult(\n    val users: List<User>,\n    val sinceId: String? = null,\n    val untilId: String? = null,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/ToggleFollowUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user\n\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.follow.FollowRepository\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass ToggleFollowUseCase @Inject constructor(\n    private val followRepository: FollowRepository,\n    private val userRepository: UserRepository,\n) : UseCase {\n\n    suspend operator fun invoke(userId: User.Id): Result<Unit> {\n        return runCancellableCatching {\n            val state = userRepository.find(userId, true) as User.Detail\n            if (state.related?.isFollowing == true || state.related?.hasPendingFollowRequestFromYou == true) {\n                followRepository.delete(userId)\n            } else {\n                followRepository.create(userId)\n            }\n        }.flatMapCancellableCatching {\n            userRepository.sync(userId)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/ToggleUserTimelineAddTabUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport net.pantasystem.milktea.model.account.page.PageableTemplate\nimport net.pantasystem.milktea.model.antenna.AccountService\nimport net.pantasystem.milktea.model.setting.LocalConfigRepository\nimport javax.inject.Inject\n\nclass ToggleUserTimelineAddTabUseCase @Inject constructor(\n    private val accountRepository: AccountRepository,\n    private val userRepository: UserRepository,\n    private val localConfigRepository: LocalConfigRepository,\n    private val accountService: AccountService,\n) : UseCase {\n\n    suspend operator fun invoke(userId: User.Id): Result<Unit> = runCancellableCatching {\n        val account = accountRepository.get(userId.accountId).getOrThrow()\n        val page = account.pages.firstOrNull {\n            val pageable = it.pageable()\n            pageable is Pageable.UserTimeline && pageable.userId == userId.id\n        }\n        if (page == null) {\n            accountService.add(\n                PageableTemplate(account).user(\n                    userRepository.find(userId),\n                    localConfigRepository.get().getOrThrow().isUserNameDefault\n                )\n            )\n        } else {\n            accountService.remove(page)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/User.kt",
    "content": "package net.pantasystem.milktea.model.user\n\nimport android.graphics.Color\nimport kotlinx.datetime.Instant\nimport kotlinx.datetime.LocalDate\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.Entity\nimport net.pantasystem.milktea.model.EntityId\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParsedResult\nimport net.pantasystem.milktea.model.emoji.CustomEmojiParser\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.nickname.UserNickname\n\n/**\n * Userはfollowやunfollowなどは担当しない\n * Userはfollowやunfollowに関連しないため\n */\nsealed interface User : Entity {\n\n    val id: Id\n    val userName: String\n    val name: String?\n    val avatarUrl: String?\n    val emojis: List<CustomEmoji>\n    val isCat: Boolean?\n    val isBot: Boolean?\n    val host: String\n    val nickname: UserNickname?\n    val isSameHost: Boolean\n    val instance: InstanceInfo?\n    val avatarBlurhash: String?\n    val parsedResult: CustomEmojiParsedResult\n    val badgeRoles: List<BadgeRole>\n\n\n    class Id(\n        val accountId: Long,\n        val id: String,\n    ) : EntityId {\n\n        private var _hashCode: Int? = null\n\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (javaClass != other?.javaClass) return false\n\n            other as Id\n\n            if (accountId != other.accountId) return false\n            if (id != other.id) return false\n\n            return true\n        }\n\n        override fun hashCode(): Int {\n            if (_hashCode != null) return _hashCode!!\n            var result = accountId.hashCode()\n            result = 31 * result + id.hashCode()\n            _hashCode = result\n            return result\n        }\n\n        override fun toString(): String {\n            return \"Id(accountId=$accountId, id='$id')\"\n        }\n\n    }\n\n    data class Simple(\n        override val id: Id,\n        override val userName: String,\n        override val name: String?,\n        override val avatarUrl: String?,\n        override val emojis: List<CustomEmoji>,\n        override val isCat: Boolean?,\n        override val isBot: Boolean?,\n        override val host: String,\n        override val nickname: UserNickname?,\n        override val isSameHost: Boolean,\n        override val instance: InstanceInfo?,\n        override val avatarBlurhash: String?,\n        override val badgeRoles: List<BadgeRole>\n    ) : User {\n        companion object;\n        override val parsedResult: CustomEmojiParsedResult = try {\n            CustomEmojiParser.parse(sourceHost = host, emojis, displayName)\n        } catch (e: Throwable) {\n            CustomEmojiParsedResult(displayName, emptyList())\n        }\n\n        override val iconBadgeRoles: List<BadgeRole> = badgeRoles.filter { it.iconUri != null }.sortedByDescending {\n            it.displayOrder\n        }\n\n    }\n\n    data class Detail(\n        override val id: Id,\n        override val userName: String,\n        override val name: String?,\n        override val avatarUrl: String?,\n        override val emojis: List<CustomEmoji>,\n        override val isCat: Boolean?,\n        override val isBot: Boolean?,\n        override val host: String,\n        override val nickname: UserNickname?,\n        override val avatarBlurhash: String?,\n        override val isSameHost: Boolean,\n        override val instance: InstanceInfo?,\n        override val badgeRoles: List<BadgeRole>,\n        val info: Info,\n        val related: Related?,\n    ) : User {\n        companion object\n\n        val isRemoteUser: Boolean = !isSameHost\n\n        val followState: FollowState\n            get() {\n                if (related?.isFollowing == true) {\n                    return FollowState.FOLLOWING\n                }\n\n                if (info.isLocked) {\n                    return if (related?.hasPendingFollowRequestFromYou == true) {\n                        FollowState.PENDING_FOLLOW_REQUEST\n                    } else {\n                        FollowState.UNFOLLOWING_LOCKED\n                    }\n                }\n\n                return FollowState.UNFOLLOWING\n            }\n\n        fun getRemoteProfileUrl(account: Account): String {\n            return info.url ?: getProfileUrl(account)\n        }\n\n        override val parsedResult: CustomEmojiParsedResult = try {\n            CustomEmojiParser.parse(sourceHost = host, emojis, displayName)\n        } catch (e: Throwable) {\n            CustomEmojiParsedResult(displayName, emptyList())\n        }\n\n        override val iconBadgeRoles: List<BadgeRole> = badgeRoles.filter { it.iconUri != null }.sortedByDescending {\n            it.displayOrder\n        }\n    }\n\n    data class Info(\n        val description: String?,\n        val followersCount: Int?,\n        val followingCount: Int?,\n        val hostLower: String?,\n        val notesCount: Int?,\n        val pinnedNoteIds: List<Note.Id>?,\n        val bannerUrl: String?,\n        val url: String?,\n        val isLocked: Boolean,\n        val birthday: LocalDate?,\n        val fields: List<Field>,\n        val createdAt: Instant?,\n        val updatedAt: Instant?,\n        val isPublicReactions: Boolean,\n        val ffVisibility: FollowerFollowerVisibility?,\n    )\n\n    data class Related(\n        val isFollowing: Boolean,\n        val isFollower: Boolean,\n        val isBlocking: Boolean,\n        val isMuting: Boolean,\n        val hasPendingFollowRequestFromYou: Boolean,\n        val hasPendingFollowRequestToYou: Boolean,\n        val isNotify: Boolean?,\n    )\n\n    data class InstanceInfo(\n        val faviconUrl: String?,\n        val iconUrl: String?,\n        val name: String?,\n        val softwareName: String?,\n        val softwareVersion: String?,\n        val themeColor: String?,\n    ) {\n\n        val themeColorNumber: Result<Int?> by lazy {\n            runCancellableCatching {\n                themeColor?.let {\n                    Color.parseColor(it)\n                }\n            }\n\n        }\n    }\n\n    data class Field(\n        val name: String,\n        val value: String,\n    )\n\n    data class BadgeRole(\n        val name: String,\n        val iconUri: String?,\n        val displayOrder: Int,\n    )\n\n    enum class FollowerFollowerVisibility {\n        Public, Followers, Private,\n    }\n\n    val displayUserName: String\n        get() = \"@\" + this.userName + if (isSameHost) {\n            \"\"\n        } else {\n            \"@\" + this.host\n        }\n\n    val iconBadgeRoles: List<BadgeRole>\n        get() = badgeRoles.filter { it.iconUri != null }\n\n    val displayName: String\n        get() = nickname?.name ?: name ?: userName\n\n\n    val shortDisplayName: String\n        get() = \"@\" + this.userName\n\n    fun getProfileUrl(account: Account): String {\n        return \"https://${account.getHost()}/${displayUserName}\"\n    }\n\n    fun castAndPartiallyFill(): Detail {\n        when(this) {\n            is Detail -> return this\n            is Simple -> return Detail(\n                id = id,\n                userName = userName,\n                name = name,\n                avatarUrl = avatarUrl,\n                emojis = emojis,\n                isCat = isCat,\n                isBot = isBot,\n                host = host,\n                nickname = nickname,\n                avatarBlurhash = avatarBlurhash,\n                isSameHost = isSameHost,\n                instance = instance,\n                info = Info(\n                    description = null,\n                    followersCount = null,\n                    followingCount = null,\n                    hostLower = null,\n                    notesCount = null,\n                    pinnedNoteIds = null,\n                    bannerUrl = null,\n                    url = null,\n                    isLocked = false,\n                    birthday = null,\n                    fields = emptyList(),\n                    createdAt = null,\n                    updatedAt = null,\n                    isPublicReactions = false,\n                    ffVisibility = null,\n                ),\n                related = null,\n                badgeRoles = badgeRoles,\n            )\n        }\n    }\n}\n\nenum class FollowState {\n    PENDING_FOLLOW_REQUEST, FOLLOWING, UNFOLLOWING, UNFOLLOWING_LOCKED\n}\n\nfun User.Simple.Companion.make(\n    id: User.Id,\n    userName: String,\n    name: String? = null,\n    avatarUrl: String? = null,\n    emojis: List<CustomEmoji> = emptyList(),\n    isCat: Boolean? = null,\n    isBot: Boolean? = null,\n    host: String? = null,\n    nickname: UserNickname? = null,\n    isSameHost: Boolean? = null,\n    instance: User.InstanceInfo? = null,\n    avatarBlurhash: String? = null,\n    badgeRoles: List<User.BadgeRole> = emptyList(),\n): User.Simple {\n    return User.Simple(\n        id,\n        userName = userName,\n        name = name,\n        avatarUrl = avatarUrl,\n        emojis = emojis,\n        isCat = isCat,\n        isBot = isBot,\n        host = host ?: \"\",\n        nickname = nickname,\n        isSameHost = isSameHost ?: false,\n        instance = instance,\n        avatarBlurhash = avatarBlurhash,\n        badgeRoles = badgeRoles,\n    )\n}\n\n\nfun User.Detail.Companion.make(\n    id: User.Id,\n    userName: String,\n    name: String? = null,\n    avatarUrl: String? = null,\n    emojis: List<CustomEmoji> = emptyList(),\n    isCat: Boolean? = null,\n    isBot: Boolean? = null,\n    host: String? = null,\n    nickname: UserNickname? = null,\n    description: String? = null,\n    followersCount: Int? = null,\n    followingCount: Int? = null,\n    hostLower: String? = null,\n    notesCount: Int? = null,\n    pinnedNoteIds: List<Note.Id>? = null,\n    bannerUrl: String? = null,\n    url: String? = null,\n    isFollowing: Boolean = false,\n    isFollower: Boolean = false,\n    isBlocking: Boolean = false,\n    isMuting: Boolean = false,\n    hasPendingFollowRequestFromYou: Boolean = false,\n    hasPendingFollowRequestToYou: Boolean = false,\n    isLocked: Boolean = false,\n    isSameHost: Boolean = false,\n    instance: User.InstanceInfo? = null,\n    birthday: LocalDate? = null,\n    fields: List<User.Field>? = null,\n    createdAt: Instant? = null,\n    updatedAt: Instant? = null,\n    isPublicReactions: Boolean = false,\n    avatarBlurhash: String? = null,\n    isNotify: Boolean = false,\n    badgeRoles: List<User.BadgeRole> = emptyList(),\n    ffVisibility: User.FollowerFollowerVisibility? = null,\n): User.Detail {\n    return User.Detail(\n        id,\n        userName,\n        name,\n        avatarUrl,\n        emojis,\n        isCat,\n        isBot,\n        host ?: \"\",\n        nickname,\n        avatarBlurhash,\n        instance = instance,\n        isSameHost = isSameHost,\n        info = User.Info(\n            description = description,\n            followersCount = followersCount,\n            followingCount = followingCount,\n            hostLower = hostLower,\n            notesCount = notesCount,\n            pinnedNoteIds = pinnedNoteIds,\n            bannerUrl = bannerUrl,\n            url = url,\n            isLocked = isLocked,\n            birthday = birthday,\n            fields = fields ?: emptyList(),\n            createdAt = createdAt,\n            updatedAt = updatedAt,\n            isPublicReactions = isPublicReactions,\n            ffVisibility = ffVisibility,\n        ),\n        related = User.Related(\n            isFollowing = isFollowing,\n            isFollower = isFollower,\n            isBlocking = isBlocking,\n            isMuting = isMuting,\n            hasPendingFollowRequestFromYou = hasPendingFollowRequestFromYou,\n            hasPendingFollowRequestToYou = hasPendingFollowRequestToYou,\n            isNotify = isNotify,\n        ),\n        badgeRoles = badgeRoles,\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/UserDataSource.kt",
    "content": "package net.pantasystem.milktea.model.user\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.AddResult\n\n\ninterface UserDataSource {\n\n\n    /**\n     * @param isSimple できるだけシンプルな構造のデータを取得する様にする。\n     */\n    suspend fun get(userId: User.Id, isSimple: Boolean = false): Result<User>\n\n    /**\n     * @param keepInOrder 指定したserverIdsの順番と同じように揃える場合はtrueを指定します。\n     * @param isSimple できるだけシンプルな構造のデータを取得する様にする。\n     */\n    suspend fun getIn(\n        accountId: Long,\n        serverIds: List<String>,\n        keepInOrder: Boolean = false,\n        isSimple: Boolean = false,\n    ): Result<List<User>>\n\n    suspend fun get(accountId: Long, userName: String, host: String?): Result<User>\n\n    suspend fun add(user: User): Result<AddResult>\n\n    suspend fun addAll(users: List<User>): Result<Map<User.Id, AddResult>>\n\n    suspend fun remove(user: User): Result<Boolean>\n\n\n    fun observeIn(accountId: Long, serverIds: List<String>): Flow<List<User>>\n    fun observe(userId: User.Id): Flow<User>\n    fun observe(accountId: Long, acct: String): Flow<User>\n\n    fun observe(userName: String, host: String? = null, accountId: Long): Flow<User?>\n\n    suspend fun searchByNameOrUserName(\n        accountId: Long,\n        keyword: String,\n        limit: Int = 100,\n        nextId: String? = null,\n        host: String? = null\n    ): Result<List<User>>\n\n    suspend fun count(): Result<Long>\n\n    suspend fun clear(limit: Int? = null): Result<Unit>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/UserNotFoundException.kt",
    "content": "package net.pantasystem.milktea.model.user\n\nclass UserNotFoundException(userId: User.Id?, userName: String? = null, host: String? = null) : NoSuchElementException(\"ユーザーが見つかりませんでした: id:$userId, userName:$userName, host:$host\")"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/UserRepository.kt",
    "content": "package net.pantasystem.milktea.model.user\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.user.query.FindUsersQuery\n\ninterface UserRepository {\n\n    suspend fun find(userId: User.Id, detail: Boolean = true): User\n\n    suspend fun findByUserName(accountId: Long, userName: String, host: String?, detail: Boolean = true): User\n\n    suspend fun syncByUserName(accountId: Long, userName: String, host: String?): Result<Unit>\n\n    suspend fun searchByNameOrUserName(accountId: Long, keyword: String, limit: Int = 100, nextId: String? = null, host: String? = null): List<User>\n\n    suspend fun findUsers(accountId: Long, query: FindUsersQuery): List<User>\n\n    suspend fun sync(userId: User.Id): Result<Unit>\n\n    suspend fun syncIn(userIds: List<User.Id>): Result<List<User.Id>>\n\n    fun observeIn(accountId: Long, serverIds: List<String>): Flow<List<User>>\n    fun observe(userId: User.Id): Flow<User>\n    fun observe(accountId: Long, acct: String): Flow<User>\n\n    fun observe(userName: String, host: String? = null, accountId: Long): Flow<User?>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/block/BlockRepository.kt",
    "content": "package net.pantasystem.milktea.model.user.block\n\nimport net.pantasystem.milktea.model.user.User\n\ninterface BlockRepository {\n\n    suspend fun create(userId: User.Id): Result<Unit>\n\n    suspend fun delete(userId: User.Id): Result<Unit>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/block/BlockUserUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.block\n\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass BlockUserUseCase @Inject constructor(\n    private val blockRepository: BlockRepository,\n    private val userRepository: UserRepository,\n): UseCase {\n\n    suspend operator fun invoke(userId: User.Id): Result<Unit> {\n        return blockRepository.create(userId).flatMapCancellableCatching {\n            userRepository.sync(userId)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/block/UnBlockUserUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.block\n\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass UnBlockUserUseCase @Inject constructor(\n    private val blockRepository: BlockRepository,\n    private val userRepository: UserRepository,\n) : UseCase {\n\n    suspend operator fun invoke(userId: User.Id): Result<Unit> {\n        return blockRepository.delete(userId).flatMapCancellableCatching {\n            userRepository.sync(userId)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/follow/FollowRepository.kt",
    "content": "package net.pantasystem.milktea.model.user.follow\n\nimport net.pantasystem.milktea.model.user.User\n\ninterface FollowRepository {\n    suspend fun create(userId: User.Id): Result<Unit>\n\n    suspend fun delete(userId: User.Id): Result<Unit>\n\n    suspend fun update(userId: User.Id, params: FollowUpdateParams): Result<Unit>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/follow/FollowUpdateParams.kt",
    "content": "package net.pantasystem.milktea.model.user.follow\n\n\n/**\n * @param isNotify misskey, mastodonにて通知を受け取るかどうか\n// * @param isReblog mastodonにてホームタイムラインでそのユーザのリブログを表示するかどうか\n// * @param withReplies misskeyにてそのユーザのリプライを表示するかどうか\n */\ndata class FollowUpdateParams(\n    val isNotify: Boolean? = null,\n//    val isReblog: Boolean? = null,\n//    val withReplies: Boolean? = null,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/follow/ToggleNotifyUserPostsUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.follow\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass ToggleNotifyUserPostsUseCase @Inject constructor(\n    val followRepository: FollowRepository,\n    val userRepository: UserRepository,\n) {\n\n    suspend operator fun invoke(userId: User.Id): Result<Unit> = runCancellableCatching {\n        val user = userRepository.find(userId, detail = true) as User.Detail\n        followRepository.update(\n            userId, FollowUpdateParams(\n                isNotify = user.related?.isNotify?.not()\n            )\n        ).getOrThrow()\n        userRepository.sync(userId).getOrThrow()\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/follow/requests/AcceptFollowRequestUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.follow.requests\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.FollowRequestRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\nclass AcceptFollowRequestUseCase @Inject constructor(\n    private val followRequestRepository: FollowRequestRepository,\n): UseCase {\n\n    suspend operator fun invoke(userId: User.Id) = runCancellableCatching {\n        followRequestRepository.accept(userId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/follow/requests/FollowRequestPagingStore.kt",
    "content": "package net.pantasystem.milktea.model.user.follow.requests\n\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.MutableStateFlow\nimport kotlinx.coroutines.sync.Mutex\nimport kotlinx.coroutines.sync.withLock\nimport net.pantasystem.milktea.common.PageableState\nimport net.pantasystem.milktea.common.paginator.*\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.user.FollowRequestRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\n\nclass FollowRequestPagingStore(\n    val getAccount: suspend () -> Account,\n    followRequestRepository: FollowRequestRepository,\n){\n\n    class Factory @Inject constructor(\n        private val followRequestRepository: FollowRequestRepository\n    ) {\n        fun create(getAccount: suspend () -> Account): FollowRequestPagingStore {\n            return FollowRequestPagingStore(getAccount, followRequestRepository)\n        }\n    }\n\n    private val impl = FollowRequestPagingStoreImpl(getAccount, followRequestRepository)\n    private val previousController = PreviousPagingController.create(\n        impl,\n    )\n\n    val state = impl.state\n\n    suspend fun loadPrevious(): Result<Unit> = runCancellableCatching {\n        previousController.loadPrevious().getOrThrow()\n    }\n    suspend fun clear() {\n        impl.mutex.withLock {\n            impl.setState(PageableState.Loading.Init())\n            impl.untilId = null\n            impl.sinceId = null\n        }\n    }\n}\n\nclass FollowRequestPagingStoreImpl(\n    val getAccount: suspend () -> Account,\n    private val followRequestRepository: FollowRequestRepository,\n): StateLocker, PaginationState<User.Id>, PreviousLoader<User>, EntityConverter<User, User.Id>, IdGetter<String> {\n\n\n    override val mutex: Mutex = Mutex()\n\n    private val _state = MutableStateFlow<PageableState<List<User.Id>>>(PageableState.Loading.Init())\n\n    var sinceId: String? = null\n    var untilId: String? = null\n\n    override val state: Flow<PageableState<List<User.Id>>>\n        get() = _state\n\n    override suspend fun convertAll(list: List<User>): List<User.Id> {\n        return list.map {\n            it.id\n        }\n    }\n\n    override fun getState(): PageableState<List<User.Id>> {\n        return _state.value\n    }\n\n    override suspend fun loadPrevious(): Result<List<User>> = runCancellableCatching {\n        val result = followRequestRepository.find(\n            getAccount().accountId,\n            untilId = getUntilId()\n        )\n        untilId = result.untilId\n        result.users\n    }\n\n    override fun setState(state: PageableState<List<User.Id>>) {\n        _state.value = state\n    }\n\n    override suspend fun getSinceId(): String? {\n        return sinceId\n    }\n\n    override suspend fun getUntilId(): String? {\n        return untilId\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/follow/requests/RejectFollowRequestUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.follow.requests\n\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.FollowRequestRepository\nimport net.pantasystem.milktea.model.user.User\nimport javax.inject.Inject\n\nclass RejectFollowRequestUseCase @Inject constructor(\n    private val followRequestRepository: FollowRequestRepository,\n): UseCase {\n    suspend operator fun invoke(userId: User.Id) = runCancellableCatching {\n        followRequestRepository.reject(userId)\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/mute/CreateMute.kt",
    "content": "package net.pantasystem.milktea.model.user.mute\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.user.User\n\n/**\n * @param userId ミュートする対象のUserのId\n * @param expiresAt ミュートの期限\n * @param notifications Mastodonのためのパラメータで、ミュートしたユーザからの通知の有無を指定できる\n */\ndata class CreateMute(\n    val userId: User.Id,\n    val expiresAt: Instant? = null,\n    val notifications: Boolean? = null\n)\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/mute/MuteRepository.kt",
    "content": "package net.pantasystem.milktea.model.user.mute\n\nimport net.pantasystem.milktea.model.user.User\n\ninterface MuteRepository {\n\n    suspend fun create(createMute: CreateMute): Result<Unit>\n\n    suspend fun delete(userId: User.Id): Result<Unit>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/mute/MuteUserUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.mute\n\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass MuteUserUseCase @Inject constructor(\n    private val muteRepository: MuteRepository,\n    private val userRepository: UserRepository\n): UseCase {\n\n    suspend operator fun invoke(createMute: CreateMute): Result<Unit> {\n        return muteRepository.create(createMute).flatMapCancellableCatching {\n            userRepository.sync(createMute.userId)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/mute/UnMuteUserUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.mute\n\nimport net.pantasystem.milktea.common.flatMapCancellableCatching\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport javax.inject.Inject\n\nclass UnMuteUserUseCase @Inject constructor(\n    private val userRepository: UserRepository,\n    private val muteRepository: MuteRepository,\n) : UseCase {\n\n    suspend operator fun invoke(userId: User.Id): Result<Unit> {\n        return muteRepository.delete(userId).flatMapCancellableCatching {\n            userRepository.sync(userId)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/nickname/DeleteNicknameUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.nickname\n\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass DeleteNicknameUseCase @Inject constructor(\n    val userNicknameRepository: UserNicknameRepository,\n    val userDataSource: UserDataSource,\n) : UseCase {\n\n    suspend operator fun invoke(user: User) {\n        userNicknameRepository.delete(\n            UserNickname.Id(\n                userName = user.userName,\n                host = user.host\n            )\n        )\n        userDataSource.add(when(user) {\n            is User.Detail -> user.copy(nickname = null)\n            is User.Simple -> user.copy(nickname = null)\n        })\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/nickname/UpdateNickname.kt",
    "content": "package net.pantasystem.milktea.model.user.nickname\n\n\nimport net.pantasystem.milktea.model.UseCase\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserDataSource\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass UpdateNicknameUseCase @Inject constructor(\n    val userDataSource: UserDataSource,\n    val userNicknameRepository: UserNicknameRepository,\n) : UseCase {\n\n    suspend operator fun invoke(user: User, nickname: String): User {\n        val id = UserNickname.Id(\n            userName = user.userName,\n            host = user.host\n        )\n        userNicknameRepository.save(\n            UserNickname(\n                id = id,\n                name = nickname\n            )\n        )\n        val existsUserName = userNicknameRepository.findOne(id)\n        val updatedUser = when(user) {\n            is User.Detail -> {\n                user.copy(nickname = existsUserName)\n            }\n            is User.Simple -> {\n                user.copy(nickname = existsUserName)\n            }\n        }\n        userDataSource.add(\n            updatedUser\n        )\n        return updatedUser\n    }\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/nickname/UserNickname.kt",
    "content": "package net.pantasystem.milktea.model.user.nickname\n\ndata class UserNickname(\n    val id: Id,\n    val name: String,\n\n    ) {\n    data class Id(\n        val userName: String,\n        val host: String\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/nickname/UserNicknameNotFoundException.kt",
    "content": "package net.pantasystem.milktea.model.user.nickname\n\nclass UserNicknameNotFoundException : NoSuchElementException()"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/nickname/UserNicknameRepository.kt",
    "content": "package net.pantasystem.milktea.model.user.nickname\n\n\ninterface UserNicknameRepository {\n\n    suspend fun save(nickname: UserNickname)\n\n    suspend fun findOne(id: UserNickname.Id): UserNickname\n\n    suspend fun delete(id: UserNickname.Id)\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/query/FindUsersQuery.kt",
    "content": "package net.pantasystem.milktea.model.user.query\n\nsealed interface FindUsersQuery\n\nsealed interface FindUsersQuery4Mastodon : FindUsersQuery {\n    data class SuggestUsers(val limit: Int? = null) : FindUsersQuery4Mastodon\n}\n\nobject FindUsersFromFrequentlyReactionUsers : FindUsersQuery\n\ndata class FindUsersQuery4Misskey(\n    val origin: Origin?,\n    val sort: OrderBy?,\n    val state: State?,\n) : FindUsersQuery {\n    companion object;\n\n    sealed interface Order {\n\n        object Follower : Order\n        object CreatedAt : Order\n        object UpdatedAt : Order\n    }\n\n    sealed interface OrderBy {\n        sealed interface By {\n            object Desc : By\n            object Asc : By\n\n        }\n\n        val type: By\n\n        data class Follower(override val type: By) : OrderBy\n        data class CreatedAt(override val type: By) : OrderBy\n        data class UpdatedAt(override val type: By) : OrderBy\n        companion object\n\n        fun str(): String {\n            val order = when (this) {\n                is CreatedAt -> \"createdAt\"\n                is Follower -> \"follower\"\n                is UpdatedAt -> \"updatedAt\"\n            }\n            val sort = when (type) {\n                By.Asc -> \"+\"\n                By.Desc -> \"-\"\n            }\n            return \"$sort$order\"\n        }\n\n\n    }\n\n    sealed class State(val state: String) {\n        object All : State(\"all\")\n        object Admin : State(\"admin\")\n        object Moderator : State(\"moderator\")\n        object AdminOrModerator : State(\"adminOrModerator\")\n        object Alive : State(\"alive\")\n        companion object\n\n    }\n\n    sealed class Origin(val origin: String) {\n        object Local : Origin(\"local\")\n        object Combined : Origin(\"combined\")\n        object Remote : Origin(\"remote\")\n        companion object\n\n    }\n\n}\n\nfun FindUsersQuery4Misskey.OrderBy.Companion.from(str: String): FindUsersQuery4Misskey.OrderBy? {\n    return when (str) {\n        FindUsersQuery4Misskey.Order.Follower.asc.str() -> FindUsersQuery4Misskey.Order.Follower.asc\n        FindUsersQuery4Misskey.Order.Follower.desc.str() -> FindUsersQuery4Misskey.Order.Follower.desc\n        FindUsersQuery4Misskey.Order.CreatedAt.asc.str() -> FindUsersQuery4Misskey.Order.CreatedAt.asc\n        FindUsersQuery4Misskey.Order.CreatedAt.desc.str() -> FindUsersQuery4Misskey.Order.CreatedAt.desc\n        FindUsersQuery4Misskey.Order.UpdatedAt.asc.str() -> FindUsersQuery4Misskey.Order.UpdatedAt.asc\n        FindUsersQuery4Misskey.Order.UpdatedAt.desc.str() -> FindUsersQuery4Misskey.Order.UpdatedAt.desc\n        else -> null\n    }\n}\n\nfun FindUsersQuery4Misskey.State.Companion.from(str: String): FindUsersQuery4Misskey.State? {\n\n    return when (str) {\n        FindUsersQuery4Misskey.State.All.state -> FindUsersQuery4Misskey.State.All\n        FindUsersQuery4Misskey.State.Admin.state -> FindUsersQuery4Misskey.State.Admin\n        FindUsersQuery4Misskey.State.Moderator.state -> FindUsersQuery4Misskey.State.Moderator\n        FindUsersQuery4Misskey.State.AdminOrModerator.state -> FindUsersQuery4Misskey.State.AdminOrModerator\n        FindUsersQuery4Misskey.State.Alive.state -> FindUsersQuery4Misskey.State.Alive\n        else -> null\n    }\n}\n\nfun FindUsersQuery4Misskey.Origin.Companion.from(str: String): FindUsersQuery4Misskey.Origin? {\n    return when (str) {\n        FindUsersQuery4Misskey.Origin.Local.origin -> FindUsersQuery4Misskey.Origin.Local\n        FindUsersQuery4Misskey.Origin.Combined.origin -> FindUsersQuery4Misskey.Origin.Combined\n        FindUsersQuery4Misskey.Origin.Remote.origin -> FindUsersQuery4Misskey.Origin.Remote\n        else -> null\n    }\n}\n\nval FindUsersQuery4Misskey.Order.desc: FindUsersQuery4Misskey.OrderBy\n    get() {\n        return when (this) {\n            FindUsersQuery4Misskey.Order.CreatedAt -> FindUsersQuery4Misskey.OrderBy.CreatedAt(\n                FindUsersQuery4Misskey.OrderBy.By.Desc\n            )\n            FindUsersQuery4Misskey.Order.Follower -> FindUsersQuery4Misskey.OrderBy.Follower(\n                FindUsersQuery4Misskey.OrderBy.By.Desc\n            )\n            FindUsersQuery4Misskey.Order.UpdatedAt -> FindUsersQuery4Misskey.OrderBy.UpdatedAt(\n                FindUsersQuery4Misskey.OrderBy.By.Desc\n            )\n        }\n    }\n\nval FindUsersQuery4Misskey.Order.asc: FindUsersQuery4Misskey.OrderBy\n    get() {\n        return when (this) {\n            FindUsersQuery4Misskey.Order.CreatedAt -> FindUsersQuery4Misskey.OrderBy.CreatedAt(\n                FindUsersQuery4Misskey.OrderBy.By.Asc\n            )\n            FindUsersQuery4Misskey.Order.Follower -> FindUsersQuery4Misskey.OrderBy.Follower(\n                FindUsersQuery4Misskey.OrderBy.By.Asc\n            )\n            FindUsersQuery4Misskey.Order.UpdatedAt -> FindUsersQuery4Misskey.OrderBy.UpdatedAt(\n                FindUsersQuery4Misskey.OrderBy.By.Asc\n            )\n        }\n    }\n\nfun FindUsersQuery4Misskey.Companion.trendingUser(): FindUsersQuery4Misskey {\n    return FindUsersQuery4Misskey(\n        origin = FindUsersQuery4Misskey.Origin.Local,\n        sort = FindUsersQuery4Misskey.Order.Follower.asc,\n        state = FindUsersQuery4Misskey.State.Alive\n    )\n}\n\nfun FindUsersQuery4Misskey.Companion.usersWithRecentActivity(): FindUsersQuery4Misskey {\n    return FindUsersQuery4Misskey(\n        origin = FindUsersQuery4Misskey.Origin.Local,\n        sort = FindUsersQuery4Misskey.Order.UpdatedAt.asc,\n        state = null,\n    )\n}\n\nfun FindUsersQuery4Misskey.Companion.newlyJoinedUsers(): FindUsersQuery4Misskey {\n    return FindUsersQuery4Misskey(\n        origin = FindUsersQuery4Misskey.Origin.Local,\n        sort = FindUsersQuery4Misskey.Order.CreatedAt.asc,\n        state = FindUsersQuery4Misskey.State.Alive\n    )\n}\n\nfun FindUsersQuery4Misskey.Companion.remoteTrendingUser(): FindUsersQuery4Misskey {\n    return FindUsersQuery4Misskey(\n        origin = FindUsersQuery4Misskey.Origin.Remote,\n        sort = FindUsersQuery4Misskey.Order.Follower.asc,\n        state = FindUsersQuery4Misskey.State.Alive\n    )\n}\n\nfun FindUsersQuery4Misskey.Companion.remoteUsersWithRecentActivity(): FindUsersQuery4Misskey {\n    return FindUsersQuery4Misskey(\n        origin = FindUsersQuery4Misskey.Origin.Combined,\n        sort = FindUsersQuery4Misskey.Order.UpdatedAt.asc,\n        state = FindUsersQuery4Misskey.State.Alive\n    )\n}\n\nfun FindUsersQuery4Misskey.Companion.newlyDiscoveredUsers(): FindUsersQuery4Misskey {\n    return FindUsersQuery4Misskey.from(FindUsersQuery4Misskey.Origin.Combined)\n        .whereState(FindUsersQuery4Misskey.State.All)\n        .orderBy(FindUsersQuery4Misskey.Order.CreatedAt.asc)\n}\n\n\ninfix fun FindUsersQuery4Misskey.orderBy(order: FindUsersQuery4Misskey.OrderBy): FindUsersQuery4Misskey {\n    return this.copy(sort = order)\n}\n\nfun FindUsersQuery4Misskey.Companion.from(origin: FindUsersQuery4Misskey.Origin): FindUsersQuery4Misskey {\n    return FindUsersQuery4Misskey(origin = origin, null, null)\n}\n\ninfix fun FindUsersQuery4Misskey.whereState(state: FindUsersQuery4Misskey.State): FindUsersQuery4Misskey {\n    return this.copy(state = state)\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/reaction/UserReaction.kt",
    "content": "package net.pantasystem.milktea.model.user.reaction\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.user.User\n\ndata class UserReaction(\n    val id: Id,\n    val type: String,\n    val noteId: Note.Id,\n    val userId: User.Id,\n    val createdAt: Instant,\n) {\n    data class Id(\n        val accountId: Long,\n        val serverId: String,\n    )\n}\n\ndata class UserReactionRelation(\n    val reaction: UserReaction,\n    val note: NoteRelation,\n    val user: User,\n)"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/renote/mute/RenoteMute.kt",
    "content": "package net.pantasystem.milktea.model.user.renote.mute\n\nimport kotlinx.datetime.Instant\nimport net.pantasystem.milktea.model.user.User\n\ndata class RenoteMute(\n    val userId: User.Id,\n    val createdAt: Instant,\n    val postedAt: Instant?,\n)\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/renote/mute/RenoteMuteRepository.kt",
    "content": "package net.pantasystem.milktea.model.user.renote.mute\n\nimport kotlinx.coroutines.flow.Flow\nimport net.pantasystem.milktea.model.user.User\n\ninterface RenoteMuteRepository {\n\n    /**\n     * アカウント単位で内部の状態とリモートの状態の同期を行う\n     * APIがリノートのミュートに対応していない場合はスキップされる\n     */\n    suspend fun syncBy(accountId: Long): Result<Unit>\n\n    /**\n     * ユーザ単位で内部の状態とリモートの状態の同期を行う\n     * APIがリノートのミュートに対応していない場合はスキップされる\n     */\n    suspend fun syncBy(userId: User.Id): Result<Unit>\n\n    suspend fun findBy(accountId: Long): Result<List<RenoteMute>>\n\n    suspend fun findOne(userId: User.Id): Result<RenoteMute>\n\n    suspend fun delete(userId: User.Id): Result<Unit>\n\n    suspend fun create(userId: User.Id): Result<RenoteMute>\n\n    suspend fun exists(userId: User.Id): Result<Boolean>\n\n    fun observeBy(accountId: Long): Flow<List<RenoteMute>>\n\n    fun observeOne(userId: User.Id): Flow<RenoteMute?>\n\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/report/Report.kt",
    "content": "package net.pantasystem.milktea.model.user.report\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRelation\nimport net.pantasystem.milktea.model.user.User\n\ndata class Report(\n    val userId: User.Id,\n    val noteIds: List<Note.Id>,\n    val comment: String\n)\n\nfun NoteRelation.toReport(baseUrl: String) : Report {\n    return Report(\n        userId = this.user.id,\n        noteIds = listOf(note.id),\n        comment = when(this.note.type) {\n            is Note.Type.Mastodon -> {\n                \"\"\n            }\n            is Note.Type.Misskey -> {\n                \"$baseUrl/notes/${this.note.id.noteId}\\n------\"\n            }\n        }\n    )\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/report/ReportRepository.kt",
    "content": "package net.pantasystem.milktea.model.user.report\n\ninterface ReportRepository {\n    suspend fun create(report: Report): Result<Unit>\n}"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/report/ReportState.kt",
    "content": "package net.pantasystem.milktea.model.user.report\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.user.User\n\nsealed interface ReportState {\n    data class Specify(\n        val userId: User.Id,\n        val noteIds: List<Note.Id>,\n        val comment: String\n    ) : ReportState {\n        val canSend: Boolean\n            get() = this.comment.isNotBlank()\n    }\n    data object None : ReportState\n\n\n    sealed interface Sending : ReportState {\n        val userId: User.Id\n        val comment: String\n        data class Doing(\n            override val userId: User.Id,\n            override val comment: String\n        ) : Sending\n\n        data class Failed(\n            override val userId: User.Id,\n            override val comment: String\n        ) : Sending\n\n        data class Success(\n            override val userId: User.Id,\n            override val comment: String\n        ) : Sending\n    }\n}\n"
  },
  {
    "path": "modules/model/src/main/java/net/pantasystem/milktea/model/user/report/SendReportUseCase.kt",
    "content": "package net.pantasystem.milktea.model.user.report\n\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.flow\nimport kotlinx.coroutines.withContext\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass SendReportUseCase @Inject constructor(\n    private val reportRepository: ReportRepository,\n){\n    operator fun invoke(state: ReportState): Flow<ReportState> {\n        return flow {\n            when (state) {\n                is ReportState.None -> {\n                    return@flow\n                }\n                is ReportState.Sending -> {\n                    return@flow\n                }\n                is ReportState.Specify -> {\n                    emit(ReportState.Sending.Doing(state.userId, state.comment))\n\n                    withContext(Dispatchers.Main) {\n                    }\n                    val r = Report(\n                        state.userId,\n                        state.noteIds,\n                        state.comment\n                    )\n                    reportRepository.create(\n                        r\n                    ).onSuccess {\n                        emit(ReportState.Sending.Success(state.userId, state.comment))\n                    }.onFailure {\n                        emit(ReportState.Sending.Failed(state.userId, state.comment))\n                    }\n                }\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/account/AccountTest.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass AccountTest {\n\n    @Test\n    fun getNormalizedInstanceDomain() {\n        val account = Account(\n            remoteId = \"abc\",\n            instanceDomain = \"https://misskey.pantasystem.com\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"test\",\n            userName = \"Panta\"\n        )\n        Assertions.assertEquals(\"https://misskey.pantasystem.com\", account.normalizedInstanceUri)\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/account/SyncAccountInfoUseCaseTest.kt",
    "content": "package net.pantasystem.milktea.model.account\n\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.make\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verifyBlocking\n\nclass SyncAccountInfoUseCaseTest {\n\n    @Test\n    fun softwareTypeChanged() = runTest {\n        val account = Account(\n            accountId = 1,\n            remoteId = \"1\",\n            instanceDomain = \"https://misskey.io\",\n            instanceType = Account.InstanceType.FIREFISH,\n            userName = \"panta\",\n            pages = emptyList(),\n            token = \"test\",\n        )\n        val accountRepository: AccountRepository = mock() {\n            onBlocking {\n                add(any(), any())\n            } doReturn Result.success(\n                account\n            )\n        }\n        val nodeInfoRepository: NodeInfoRepository = mock() {\n            onBlocking {\n                find(any())\n            } doReturn Result.success(\n                NodeInfo(\n                    host = \"misskey.io\",\n                    software = NodeInfo.Software(\n                        name = \"firefish\",\n                        version = \"12.34.56\"\n                    ),\n                    version = \"12.34.56\"\n                )\n            )\n        }\n        val useCase = SyncAccountInfoUseCase(\n            accountRepository = accountRepository,\n            nodeInfoRepository = nodeInfoRepository,\n            userRepository = mock() {\n                onBlocking {\n                    find(any(), any())\n                } doReturn User.Detail.make(\n                    id = User.Id(1L, \"1\"),\n                    userName = \"panta\",\n                )\n            }\n        )\n        useCase(\n            account.copy(\n                instanceType = Account.InstanceType.MISSKEY,\n            )\n        ).getOrThrow()\n\n        verifyBlocking(accountRepository) {\n            add(\n                Account(\n                    accountId = 1,\n                    remoteId = \"1\",\n                    instanceDomain = \"https://misskey.io\",\n                    instanceType = Account.InstanceType.FIREFISH,\n                    userName = \"panta\",\n                    pages = emptyList(),\n                    token = \"test\",\n                ),\n                false\n            )\n        }\n    }\n\n    @Test\n    fun userNameChanged() = runTest {\n        val account = Account(\n            accountId = 1,\n            remoteId = \"1\",\n            instanceDomain = \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            userName = \"panta\",\n            pages = emptyList(),\n            token = \"test\",\n        )\n        val accountRepository: AccountRepository = mock() {\n            onBlocking {\n                add(any(), any())\n            } doReturn Result.success(\n                account,\n            )\n        }\n        val nodeInfoRepository: NodeInfoRepository = mock() {\n            onBlocking {\n                find(any())\n            } doReturn Result.success(\n                NodeInfo(\n                    host = \"misskey.io\",\n                    software = NodeInfo.Software(\n                        name = \"misskey\",\n                        version = \"12.34.56\"\n                    ),\n                    version = \"12.34.56\"\n                )\n            )\n        }\n        val useCase = SyncAccountInfoUseCase(\n            accountRepository = accountRepository,\n            nodeInfoRepository = nodeInfoRepository,\n            userRepository = mock() {\n                onBlocking {\n                    find(any(), any())\n                } doReturn User.Detail.make(\n                    id = User.Id(1L, \"1\"),\n                    userName = \"panta\",\n                )\n            }\n        )\n        useCase(\n            account.copy(\n                userName = \"panta2\",\n            )\n        ).getOrThrow()\n\n        verifyBlocking(accountRepository) {\n            add(\n                account,\n                false\n            )\n        }\n    }\n\n    @Test\n    fun userNameEmptyAndChanged() = runTest {\n        val account = Account(\n            accountId = 1,\n            remoteId = \"1\",\n            instanceDomain = \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            userName = \"\",\n            pages = emptyList(),\n            token = \"test\",\n        )\n        val accountRepository: AccountRepository = mock() {\n            onBlocking {\n                add(any(), any())\n            } doReturn Result.success(\n                account,\n            )\n        }\n        val nodeInfoRepository: NodeInfoRepository = mock() {\n            onBlocking {\n                find(any())\n            } doReturn Result.success(\n                NodeInfo(\n                    host = \"misskey.io\",\n                    software = NodeInfo.Software(\n                        name = \"misskey\",\n                        version = \"12.34.56\"\n                    ),\n                    version = \"12.34.56\"\n                )\n            )\n        }\n        val useCase = SyncAccountInfoUseCase(\n            accountRepository = accountRepository,\n            nodeInfoRepository = nodeInfoRepository,\n            userRepository = mock() {\n                onBlocking {\n                    find(any(), any())\n                } doReturn User.Detail.make(\n                    id = User.Id(1L, \"1\"),\n                    userName = \"panta\",\n                )\n            }\n        )\n        useCase(\n            account.copy(\n                userName = \"\",\n            )\n        ).getOrThrow()\n\n        verifyBlocking(accountRepository) {\n            add(\n                account.copy(\n                    userName = \"panta\"\n                ),\n                false\n            )\n        }\n    }\n\n    @Test\n    fun userNameAndInstanceTypeChanged() = runTest {\n        val account = Account(\n            accountId = 1,\n            remoteId = \"1\",\n            instanceDomain = \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            userName = \"panta\",\n            pages = emptyList(),\n            token = \"test\",\n        )\n        val accountRepository: AccountRepository = mock() {\n            onBlocking {\n                add(any(), any())\n            } doReturn Result.success(\n                account,\n            )\n        }\n        val nodeInfoRepository: NodeInfoRepository = mock() {\n            onBlocking {\n                find(any())\n            } doReturn Result.success(\n                NodeInfo(\n                    host = \"misskey.io\",\n                    software = NodeInfo.Software(\n                        name = \"firefish\",\n                        version = \"12.34.56\"\n                    ),\n                    version = \"12.34.56\"\n                )\n            )\n        }\n        val useCase = SyncAccountInfoUseCase(\n            accountRepository = accountRepository,\n            nodeInfoRepository = nodeInfoRepository,\n            userRepository = mock() {\n                onBlocking {\n                    find(any(), any())\n                } doReturn User.Detail.make(\n                    id = User.Id(1L, \"1\"),\n                    userName = \"panta\",\n                )\n            }\n        )\n        useCase(\n            account.copy(\n                instanceType = Account.InstanceType.FIREFISH,\n                userName = \"panta2\",\n            )\n        ).getOrThrow()\n\n        verifyBlocking(accountRepository) {\n            add(\n                account.copy(\n                    instanceType = Account.InstanceType.FIREFISH,\n                    userName = \"panta\",\n                ),\n                false\n            )\n        }\n    }\n\n    @Test\n    fun unchanged() = runTest {\n        val account = Account(\n            accountId = 1,\n            remoteId = \"1\",\n            instanceDomain = \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            userName = \"panta\",\n            pages = emptyList(),\n            token = \"test\",\n        )\n        val accountRepository: AccountRepository = mock()\n        val nodeInfoRepository: NodeInfoRepository = mock() {\n            onBlocking {\n                find(any())\n            } doReturn Result.success(\n                NodeInfo(\n                    host = \"misskey.io\",\n                    software = NodeInfo.Software(\n                        name = \"misskey\",\n                        version = \"12.34.56\"\n                    ),\n                    version = \"12.34.56\"\n                )\n            )\n        }\n        val useCase = SyncAccountInfoUseCase(\n            accountRepository = accountRepository,\n            nodeInfoRepository = nodeInfoRepository,\n            userRepository = mock() {\n                onBlocking {\n                    find(any(), any())\n                } doReturn User.Detail.make(\n                    id = User.Id(1L, \"1\"),\n                    userName = \"panta\",\n                )\n            }\n        )\n        useCase(\n            account\n        ).getOrThrow()\n\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/account/page/PageTypeTest.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\ninternal class PageTypeTest {\n\n    // enumのnameとlabelが一致することを確認する\n    @Test\n    fun enumNameEqualsLabel() {\n        PageType.values().forEach {\n            Assertions.assertEquals(it.name, it.label)\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/account/page/PageableTest.kt",
    "content": "package net.pantasystem.milktea.model.account.page\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass PageableTest {\n\n    @Test\n    fun setOnlyMedia_GiveGlobalTimeline() {\n        val pageable = Pageable.GlobalTimeline()\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).withFiles)\n        Assertions.assertNull(pageable.setOnlyMedia(false).withFiles)\n        Assertions.assertEquals(false, pageable.copy(withFiles = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveLocalTimeline() {\n        val pageable = Pageable.LocalTimeline()\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).withFiles)\n        Assertions.assertNull(pageable.setOnlyMedia(false).withFiles)\n        Assertions.assertEquals(false, pageable.copy(withFiles = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveHybridTimeline() {\n        val pageable = Pageable.HybridTimeline()\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).withFiles)\n        Assertions.assertNull(pageable.setOnlyMedia(false).withFiles)\n        Assertions.assertEquals(false, pageable.copy(withFiles = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveHomeTimeline() {\n        val pageable = Pageable.HomeTimeline()\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).withFiles)\n        Assertions.assertNull(pageable.setOnlyMedia(false).withFiles)\n        Assertions.assertEquals(false, pageable.copy(withFiles = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveUserListTimeline() {\n        val pageable = Pageable.UserListTimeline(listId = \"\")\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).withFiles)\n        Assertions.assertNull(pageable.setOnlyMedia(false).withFiles)\n        Assertions.assertEquals(false, pageable.copy(withFiles = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveSearchByTag() {\n        val pageable = Pageable.SearchByTag(\"\")\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).withFiles)\n        Assertions.assertNull(pageable.setOnlyMedia(false).withFiles)\n        Assertions.assertEquals(false, pageable.copy(withFiles = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveUserTimeline() {\n        val pageable = Pageable.UserTimeline(\"\")\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).withFiles)\n        Assertions.assertNull(pageable.setOnlyMedia(false).withFiles)\n        Assertions.assertEquals(false, pageable.copy(withFiles = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveMastodonPublicTimeline() {\n        val pageable = Pageable.Mastodon.PublicTimeline()\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.setOnlyMedia(false).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.copy(isOnlyMedia = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveMastodonLocalTimeline() {\n        val pageable = Pageable.Mastodon.LocalTimeline()\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.setOnlyMedia(false).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.copy(isOnlyMedia = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveMastodonHashTagTimeline() {\n        val pageable = Pageable.Mastodon.HashTagTimeline(\"\")\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.setOnlyMedia(false).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.copy(isOnlyMedia = null).getOnlyMedia())\n    }\n\n    @Test\n    fun setOnlyMedia_GiveMastodonUserTimeline() {\n        val pageable = Pageable.Mastodon.UserTimeline(\"\")\n        Assertions.assertEquals(true, pageable.setOnlyMedia(true).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.setOnlyMedia(false).isOnlyMedia)\n        Assertions.assertEquals(false, pageable.copy(isOnlyMedia = null).getOnlyMedia())\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/filter/ClientWordFilterServiceTest.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.make\nimport net.pantasystem.milktea.model.note.muteword.FilterConditionType\nimport net.pantasystem.milktea.model.note.muteword.WordFilterConfig\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass ClientWordFilterServiceTest {\n\n    @Test\n    fun isShouldFilterNote_GiveMatchedText() {\n        val service = ClientWordFilterService()\n        val config = WordFilterConfig(\n            conditions = listOf(\n                FilterConditionType.Normal(\n                    words = listOf(\"test\")\n                )\n            )\n        )\n        val note = Note.make(\n            Note.Id(0L, \"\"),\n            User.Id(0L, \"\"),\n            text = \"testtest\"\n        )\n        Assertions.assertTrue(service.isShouldFilterNote(config, note))\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveMatchedTextInCw() {\n        val service = ClientWordFilterService()\n        val config = WordFilterConfig(\n            conditions = listOf(\n                FilterConditionType.Normal(\n                    words = listOf(\"test\")\n                )\n            )\n        )\n        val note = Note.make(\n            Note.Id(0L, \"\"),\n            User.Id(0L, \"\"),\n            text = \"hoge\",\n            cw = \"testtest\"\n        )\n        Assertions.assertTrue(service.isShouldFilterNote(config, note))\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveMatchedTextInPollChoice() {\n        val service = ClientWordFilterService()\n        val config = WordFilterConfig(\n            conditions = listOf(\n                FilterConditionType.Normal(\n                    words = listOf(\"test\")\n                )\n            )\n        )\n        val note = Note.make(\n            Note.Id(0L, \"\"),\n            User.Id(0L, \"\"),\n            text = \"fuga\",\n            poll = Poll(\n                choices = listOf(\n                    \"test\",\n                    \"fuga\",\n                    \"piyo\"\n                ).mapIndexed { index, s ->\n                    Poll.Choice(\n                        index,\n                        s,\n                        10,\n                        false\n                    )\n                },\n                null,\n                false\n            )\n        )\n        Assertions.assertTrue(service.isShouldFilterNote(config, note))\n    }\n\n    @Test\n    fun isShouldFilterNote_GiveNotMatched() {\n        val service = ClientWordFilterService()\n        val config = WordFilterConfig(\n            conditions = listOf(\n                FilterConditionType.Normal(\n                    words = listOf(\"test\")\n                )\n            )\n        )\n        val note = Note.make(\n            Note.Id(0L, \"\"),\n            User.Id(0L, \"\"),\n            text = \"f302fjfjoaf\",\n            poll = Poll(\n                choices = listOf(\n                    \"8f90fj0afa\",\n                    \"390fjvan\",\n                    \"2390fno\"\n                ).mapIndexed { index, s ->\n                    Poll.Choice(\n                        index,\n                        s,\n                        10,\n                        false\n                    )\n                },\n                null,\n                false\n            )\n        )\n        Assertions.assertFalse(service.isShouldFilterNote(config, note))\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/filter/GetMatchContextFiltersTest.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport kotlinx.datetime.Clock\nimport net.pantasystem.milktea.model.account.page.Pageable\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.minutes\n\ninternal class GetMatchContextFiltersTest {\n\n    @Test\n    fun giveExpiredFilters() {\n        val expiredTimes = Clock.System.now() - 3.minutes\n\n        val expected = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(MastodonWordFilter.FilterContext.Home),\n                wholeWord = false,\n                expiresAt = expiredTimes + 1.days,\n                irreversible = false\n            ),\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(MastodonWordFilter.FilterContext.Home),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            )\n        )\n        val filters = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(MastodonWordFilter.FilterContext.Home),\n                wholeWord = false,\n                expiresAt = expiredTimes,\n                irreversible = false\n            ),\n        ) + expected\n        val result = GetMatchContextFilters().invoke(\n            Pageable.Mastodon.HomeTimeline(),\n            filters\n        )\n        assertEquals(expected, result)\n    }\n\n    @Test\n    fun giveHasHomeContextAndHomePageable() {\n\n        val expected = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(MastodonWordFilter.FilterContext.Home),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            ),\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(\n                    MastodonWordFilter.FilterContext.Home,\n                    MastodonWordFilter.FilterContext.Public\n                ),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            )\n        )\n        val filters = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(\n                    MastodonWordFilter.FilterContext.Account,\n                    MastodonWordFilter.FilterContext.Thread,\n                    MastodonWordFilter.FilterContext.Notifications,\n                    MastodonWordFilter.FilterContext.Public\n                ),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            ),\n        ) + expected\n        val result = GetMatchContextFilters().invoke(\n            Pageable.Mastodon.HomeTimeline(),\n            filters\n        )\n        assertEquals(expected, result)\n    }\n\n    @Test\n    fun giveHasPublicContextAndPublicPageable() {\n\n        val expected = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(MastodonWordFilter.FilterContext.Public),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            ),\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(\n                    MastodonWordFilter.FilterContext.Public,\n                    MastodonWordFilter.FilterContext.Thread\n                ),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            )\n        )\n        val filters = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(\n                    MastodonWordFilter.FilterContext.Account,\n                    MastodonWordFilter.FilterContext.Thread,\n                    MastodonWordFilter.FilterContext.Notifications,\n                    MastodonWordFilter.FilterContext.Home\n                ),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            ),\n        ) + expected\n        val result = GetMatchContextFilters().invoke(\n            Pageable.Mastodon.PublicTimeline(),\n            filters\n        )\n        assertEquals(expected, result)\n    }\n\n    @Test\n    fun giveHasPublicContextAndLocalOnlyPageable() {\n\n        val expected = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(MastodonWordFilter.FilterContext.Public),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            ),\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(\n                    MastodonWordFilter.FilterContext.Public,\n                    MastodonWordFilter.FilterContext.Thread\n                ),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            )\n        )\n        val filters = listOf(\n            MastodonWordFilter(\n                id = MastodonWordFilter.Id(\n                    accountId = 0,\n                    filterId = \"\"\n                ),\n                phrase = \"\",\n                context = listOf(\n                    MastodonWordFilter.FilterContext.Account,\n                    MastodonWordFilter.FilterContext.Thread,\n                    MastodonWordFilter.FilterContext.Notifications,\n                    MastodonWordFilter.FilterContext.Home\n                ),\n                wholeWord = false,\n                expiresAt = null,\n                irreversible = false\n            ),\n        ) + expected\n        val result = GetMatchContextFilters().invoke(\n            Pageable.Mastodon.LocalTimeline(),\n            filters\n        )\n        assertEquals(expected, result)\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/filter/MastodonWordFilterTest.kt",
    "content": "package net.pantasystem.milktea.model.filter\n\nimport org.junit.jupiter.api.Assertions.*\nimport org.junit.jupiter.api.Test\n\ninternal class MastodonWordFilterTest {\n    private val blankFilter = MastodonWordFilter(\n        id = MastodonWordFilter.Id(\n            accountId = 0,\n            filterId = \"\"\n        ),\n        phrase = \"\",\n        context = listOf(),\n        wholeWord = false,\n        expiresAt = null,\n        irreversible = false\n    )\n\n    @Test\n    fun isContextHome_GiveNoHomeContextReturnsFalse() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Public\n            )\n        )\n        assertFalse(filter.isContextHome)\n    }\n\n    @Test\n    fun isContextHome_GiveHomeContextReturnsTrue() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Home\n            )\n        )\n        assertTrue(filter.isContextHome)\n    }\n\n    @Test\n    fun isContextPublic_GivePublicContextReturnsTrue() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Public,\n                MastodonWordFilter.FilterContext.Home\n            )\n        )\n        assertTrue(filter.isContextPublic)\n    }\n\n    @Test\n    fun isContextPublic_GiveNoPublicContextReturnsFalse() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Home,\n                MastodonWordFilter.FilterContext.Notifications\n            )\n        )\n        assertFalse(filter.isContextPublic)\n    }\n\n    @Test\n    fun isContextNotifications_GiveNotificationsContextReturnsTrue() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Notifications\n            )\n        )\n        assertTrue(filter.isContextNotifications)\n    }\n\n    @Test\n    fun isContextNotifications_GiveNoNotificationsContextReturnsFalse() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Home\n            )\n        )\n        assertFalse(filter.isContextNotifications)\n    }\n\n    @Test\n    fun isContextAccount_GiveNoAccountContextReturnsFalse() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Home\n            )\n        )\n        assertFalse(filter.isContextAccount)\n    }\n\n    @Test\n    fun isContextAccount_GiveAccountContextReturnsTrue() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Account\n            )\n        )\n        assertTrue(filter.isContextAccount)\n    }\n\n    @Test\n    fun isContextThread_GiveThreadContextReturnsTrue() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Thread\n            )\n        )\n        assertTrue(filter.isContextThread)\n    }\n\n    @Test\n    fun isContextThread_GiveNoThreadContextReturnsFalse() {\n        val filter = blankFilter.copy(\n            context = listOf(\n                MastodonWordFilter.FilterContext.Account\n            )\n        )\n        assertFalse(filter.isContextThread)\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/instance/MetaTest.kt",
    "content": "package net.pantasystem.milktea.model.instance\n\nimport kotlinx.serialization.decodeFromString\nimport kotlinx.serialization.json.Json\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport java.io.BufferedInputStream\nimport java.io.BufferedReader\nimport java.io.File\nimport java.io.InputStreamReader\n\nclass MetaTest {\n\n    @Test\n    fun getVersion() {\n\n        val meta = Meta(\n            uri = \"https://misskey.io\",\n            version = \"12.7.54\"\n        )\n        val version = meta.getVersion()\n        assertEquals(Version(\"12.7.54\"), version)\n    }\n\n\n    @Test\n    fun decodeJsonGiveV12Meta() {\n        val file = File(javaClass.classLoader!!.getResource(\"v12_meta_case1.json\").file)\n        val reader = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream())))\n        val textJson = reader.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        val decoder = Json {\n            ignoreUnknownKeys = true\n        }\n        val meta= decoder.decodeFromString<Meta>(textJson)\n        assertEquals(\"Misskey.io\", meta.name)\n        assertEquals(\"12.110.1\", meta.version)\n    }\n\n    @Test\n    fun decodeJsonGiveV10Meta() {\n        val file = File(javaClass.classLoader!!.getResource(\"v10_meta_case1.json\").file)\n        val reader = BufferedReader(InputStreamReader(BufferedInputStream(file.inputStream())))\n        val textJson = reader.readLines().reduce { acc, s -> acc + s }.trimIndent()\n        val decoder = Json {\n            ignoreUnknownKeys = true\n        }\n        val meta = decoder.decodeFromString<Meta>(textJson)\n        assertEquals(\"めいすきー\", meta.name)\n        assertEquals(\"10.102.584-m544\", meta.version)\n\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/nodeinfo/NodeInfoTest.kt",
    "content": "package net.pantasystem.milktea.model.nodeinfo\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\ninternal class NodeInfoTest {\n\n    @Test\n    fun type_GiveMisskey() {\n        val nodeInfo = NodeInfo(\n            version = \"2.0\",\n            host = \"example.com\",\n            software = NodeInfo.Software(\n                name = \"misskey\",\n                version = \"13.0.0\"\n            )\n        )\n        assertEquals(\n            NodeInfo.SoftwareType.Misskey.Normal(\"misskey\", \"13.0.0\"),\n            nodeInfo.type\n        )\n    }\n\n    @Test\n    fun type_GiveCalckey() {\n        val nodeInfo = NodeInfo(\n            version = \"2.0\",\n            host = \"example.com\",\n            software = NodeInfo.Software(\n                name = \"calckey\",\n                version = \"13.0.0\"\n            )\n        )\n        assertEquals(\n            NodeInfo.SoftwareType.Misskey.Calckey(\"calckey\", \"13.0.0\"),\n            nodeInfo.type\n        )\n    }\n\n    @Test\n    fun type_GiveFoundkey() {\n        val nodeInfo = NodeInfo(\n            version = \"2.0\",\n            host = \"example.com\",\n            software = NodeInfo.Software(\n                name = \"foundkey\",\n                version = \"13.0.0\"\n            )\n        )\n        assertEquals(\n            NodeInfo.SoftwareType.Misskey.Foundkey(\"foundkey\", \"13.0.0\"),\n            nodeInfo.type\n        )\n    }\n\n    @Test\n    fun type_GiveMeisskey() {\n        val nodeInfo = NodeInfo(\n            version = \"2.0\",\n            host = \"example.com\",\n            software = NodeInfo.Software(\n                name = \"meisskey\",\n                version = \"13.0.0\"\n            )\n        )\n        assertEquals(\n            NodeInfo.SoftwareType.Misskey.Meisskey(\"meisskey\", \"13.0.0\"),\n            nodeInfo.type\n        )\n    }\n\n    @Test\n    fun type_GiveMastodon() {\n        val nodeInfo = NodeInfo(\n            version = \"2.0\",\n            host = \"example.com\",\n            software = NodeInfo.Software(\n                name = \"mastodon\",\n                version = \"3.0\"\n            )\n        )\n        assertEquals(\n            NodeInfo.SoftwareType.Mastodon.Normal(\"mastodon\", \"3.0\"),\n            nodeInfo.type\n        )\n    }\n\n    @Test\n    fun type_GiveFedibird() {\n        val nodeInfo = NodeInfo(\n            version = \"2.0\",\n            host = \"example.com\",\n            software = NodeInfo.Software(\n                name = \"fedibird\",\n                version = \"3.0\"\n            )\n        )\n        assertEquals(\n            NodeInfo.SoftwareType.Mastodon.Fedibird(\"fedibird\", \"3.0\"),\n            nodeInfo.type\n        )\n    }\n\n    @Test\n    fun type_GiveKmyblue() {\n        val nodeInfo = NodeInfo(\n            version = \"2.0\",\n            host = \"example.com\",\n            software = NodeInfo.Software(\n                name = \"kmyblue\",\n                version = \"3.0\"\n            )\n        )\n        assertEquals(\n            NodeInfo.SoftwareType.Mastodon.Kmyblue(\"kmyblue\", \"3.0\"),\n            nodeInfo.type\n        )\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/note/NoteTest.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.drive.FileProperty\nimport net.pantasystem.milktea.model.note.poll.Poll\nimport net.pantasystem.milktea.model.note.reaction.ReactionCount\nimport net.pantasystem.milktea.model.user.User\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\n\n\nclass NoteTest {\n\n    @Test\n    fun isQuote() {\n        val note = generateEmptyNote()\n        val quoteNote = note.copy(\n            renoteId = Note.Id(0L, \"noteId\"),\n            text = \"text\"\n        )\n\n        assertTrue(quoteNote.isQuote())\n    }\n\n\n    @Test\n    fun hasContent_OnlyText() {\n        assertTrue(generateEmptyNote().copy(text = \"text\").hasContent())\n    }\n\n    @Test\n    fun hasContent_OnlyFiles() {\n        assertTrue(generateEmptyNote().copy(fileIds = listOf(FileProperty.Id(0L, \"\"))).hasContent())\n    }\n\n    @Test\n    fun hasContent_OnlyPoll() {\n        val note = generateEmptyNote().copy(\n            poll = Poll(choices = emptyList(), multiple = false, expiresAt = null)\n        )\n        assertTrue(note.hasContent())\n    }\n\n    @Test\n    fun hasContent_ReturnsFalse() {\n        // NOTE: cwだけの場合はcw扱いにならない\n        val note = generateEmptyNote().copy(cw = \"a\")\n        assertFalse(note.hasContent())\n    }\n\n    @Test\n    fun canRenote_WhenVisibilityPublic() {\n        val note = generateEmptyNote().copy(\n            visibility = Visibility.Public(true)\n        )\n        assertTrue(note.canRenote(User.Id(accountId = note.id.accountId, \"acId\")))\n    }\n\n    @Test\n    fun canRenote_WhenVisibilityHome() {\n        val note = generateEmptyNote().copy(\n            visibility = Visibility.Home(true)\n        )\n        assertTrue(note.canRenote(User.Id(accountId = note.id.accountId, \"acId\")))\n    }\n\n    @Test\n    fun canRenote_WhenVisibilityFollowersReturnFalse() {\n        val note = generateEmptyNote().copy(\n            visibility = Visibility.Followers(false),\n        )\n        assertFalse(note.canRenote(User.Id(accountId = note.id.accountId, \"acId\")))\n    }\n\n    @Test\n    fun canRenote_WhenVisibilitySpecifiedReturnFalse() {\n        val note = generateEmptyNote().copy(\n            visibility = Visibility.Specified(emptyList()),\n        )\n        assertFalse(note.canRenote(User.Id(accountId = note.id.accountId, \"acId\")))\n    }\n\n    @Test\n    fun canRenote_WhenVisibilityFollowersAndMyPostReturnTrue() {\n        val note = generateEmptyNote().copy(\n            visibility = Visibility.Followers(false),\n        )\n        assertTrue(note.canRenote(note.userId))\n    }\n\n    @Test\n    fun canRenote_WhenVisibilitySpecifiedAndMyNote() {\n        val userId = generateEmptyNote().userId\n        val note = generateEmptyNote().copy(\n            visibility = Visibility.Specified(emptyList()),\n            userId = userId,\n        )\n        assertTrue(note.canRenote(userId))\n    }\n\n    @Test\n    fun canRenote_GetByOtherAccountId() {\n        val note = generateEmptyNote().copy(\n            visibility = Visibility.Public(false),\n        )\n        assertFalse(note.canRenote(User.Id(accountId = note.id.accountId + 1L, \"acId\")))\n    }\n\n    @Test\n    fun isQuote_GiveFedibirdPost() {\n        val note = generateEmptyNote().copy(\n            text = \"<p>hogehoge</p>\",\n            type = Note.Type.Mastodon(\n                reblogged = null,\n                favorited = null,\n                bookmarked = null,\n                muted = null,\n                favoriteCount = null,\n                tags = listOf(),\n                mentions = listOf(),\n                isFedibirdQuote = true,\n                pollId = null,\n                isSensitive = null,\n                pureText = null,\n                isReactionAvailable = true,\n            )\n        )\n        assertTrue(note.isQuote())\n    }\n\n    @Test\n    fun isQuote_GiveMastodonBoostReturnsFalse() {\n        val note = generateEmptyNote().copy(\n            text = \"<p>hogehoge</p>\",\n            type = Note.Type.Mastodon(\n                reblogged = null,\n                favorited = null,\n                bookmarked = null,\n                muted = null,\n                favoriteCount = null,\n                tags = listOf(),\n                mentions = listOf(),\n                isFedibirdQuote = false,\n                pollId = null,\n                isSensitive = null,\n                pureText = null,\n                isReactionAvailable = true,\n            )\n        )\n        assertFalse(note.isQuote())\n    }\n\n    @Test\n    fun isRenote_GiveMastodonBoost() {\n        val note = generateEmptyNote().copy(\n            text = \"<p>hogehoge</p>\",\n            type = Note.Type.Mastodon(\n                reblogged = null,\n                favorited = null,\n                bookmarked = null,\n                muted = null,\n                favoriteCount = null,\n                tags = listOf(),\n                mentions = listOf(),\n                isFedibirdQuote = false,\n                pollId = null,\n                isSensitive = null,\n                pureText = null,\n                isReactionAvailable = true,\n            ),\n            renoteId = Note.Id(0L, \"id\")\n        )\n        assertTrue(note.isRenote())\n    }\n\n    @Test\n    fun hasContent_GiveMastodonBoostReturnsFalse() {\n        val note = generateEmptyNote().copy(\n            text = \"<p>hogehoge</p>\",\n            renoteId = Note.Id(0L, \"id\"),\n            type = Note.Type.Mastodon(\n                reblogged = null,\n                favorited = null,\n                bookmarked = null,\n                muted = null,\n                favoriteCount = null,\n                tags = listOf(),\n                mentions = listOf(),\n                isFedibirdQuote = false,\n                pollId = null,\n                isSensitive = null,\n                pureText = null,\n                isReactionAvailable = true,\n            )\n        )\n        assertFalse(note.hasContent())\n    }\n\n    @Test\n    fun shortReactionCounts_GiveOverMaxCountCounts() {\n        val counts = (0..(Note.SHORT_REACTION_COUNT_MAX_SIZE)).map {\n            ReactionCount(\"r$it\", 1, false)\n        }\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = counts,\n        )\n        assertEquals(Note.SHORT_REACTION_COUNT_MAX_SIZE + 1, counts.size)\n        assertEquals(Note.SHORT_REACTION_COUNT_MAX_SIZE, note.getShortReactionCounts(false).size)\n        assertEquals(counts.subList(0, Note.SHORT_REACTION_COUNT_MAX_SIZE), note.getShortReactionCounts(false))\n    }\n\n    @Test\n    fun shortReactionCounts_GiveUnderMaxCountCounts() {\n        val counts = (0 until (Note.SHORT_REACTION_COUNT_MAX_SIZE - 1)).map {\n            ReactionCount(\"r$it\", 1, true)\n        }\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = counts,\n        )\n        assertEquals(Note.SHORT_REACTION_COUNT_MAX_SIZE - 1, counts.size)\n        assertEquals(Note.SHORT_REACTION_COUNT_MAX_SIZE - 1, note.getShortReactionCounts(false).size)\n        assertEquals(counts, note.getShortReactionCounts(false))\n    }\n\n    @Test\n    fun shortReactionCounts_GiveMaxCountCounts() {\n        val counts = (0 until Note.SHORT_REACTION_COUNT_MAX_SIZE).map {\n            ReactionCount(\"r$it\", 1, false)\n        }\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = counts,\n        )\n        assertEquals(Note.SHORT_REACTION_COUNT_MAX_SIZE, counts.size)\n        assertEquals(Note.SHORT_REACTION_COUNT_MAX_SIZE, note.getShortReactionCounts(false).size, )\n        assertEquals(counts, note.getShortReactionCounts(false))\n    }\n\n    @Test\n    fun shortReactionCounts_GiveZeroElementsCounts() {\n\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = emptyList(),\n        )\n        assertEquals(emptyList<ReactionCount>(), note.getShortReactionCounts(false))\n    }\n\n    @Test\n    fun shortReactionCounts_GiveRenoteAndMaxCounts() {\n        val counts = (0 until Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE).map {\n            ReactionCount(\"r$it\", 1, false)\n        }\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = counts,\n            renoteId = Note.Id(0L, \"\")\n        )\n        assertEquals(Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE, counts.size)\n        assertEquals(Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE, note.getShortReactionCounts(true).size)\n        assertEquals(counts, note.getShortReactionCounts(true))\n    }\n\n    @Test\n    fun shortReactionCounts_GiveRenoteAndZeroElementsCounts() {\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = emptyList(),\n            renoteId = Note.Id(0L, \"\")\n        )\n        assertEquals(emptyList<ReactionCount>(), note.getShortReactionCounts(true))\n    }\n\n    @Test\n    fun shortReactionCounts_GiveRenoteAndUnderMaxCountCounts() {\n        val counts = (0 until (Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE - 1)).map {\n            ReactionCount(\"r$it\", 1, false)\n        }\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = counts,\n            renoteId = Note.Id(0L, \"\")\n        )\n        assertEquals(Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE - 1, counts.size)\n        assertEquals(Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE - 1, note.getShortReactionCounts(true).size)\n        assertEquals(counts, note.getShortReactionCounts(true))\n    }\n\n    @Test\n    fun shortReactionCounts_GiveRenoteAndOverMaxCountCounts() {\n        val counts = (0..(Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE)).map {\n            ReactionCount(\"r$it\", 1, false)\n        }\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = counts,\n            renoteId = Note.Id(0L, \"\")\n        )\n        assertEquals(Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE + 1, counts.size)\n        assertEquals(Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE, note.getShortReactionCounts(true).size)\n        assertEquals(counts.subList(0, Note.SHORT_RENOTE_REACTION_COUNT_MAX_SIZE), note.getShortReactionCounts(true))\n    }\n\n    @Test\n    fun isReactedReaction_GiveReactedReaction() {\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = listOf(\n                ReactionCount(\n                    \":kawaii:\",\n                    1,\n                    true,\n                ),\n                ReactionCount(\n                    \":iizo:\",\n                    1,\n                    false,\n                )\n            ),\n            renoteId = Note.Id(0L, \"\")\n        )\n\n        assertFalse(note.isReactedReaction(\":iizo:\"))\n        assertTrue(note.isReactedReaction(\":kawaii:\"))\n    }\n\n    @Test\n    fun getMyReactionCount_GiveAnyReactedReactions() {\n        val note = Note.make(\n            id = Note.Id(0L, \"\"),\n            text = null,\n            userId = User.Id(0L, \"\"),\n            reactionCounts = listOf(\n                ReactionCount(\n                    \":kawaii:\",\n                    1,\n                    true,\n                ),\n                ReactionCount(\n                    \":iizo:\",\n                    1,\n                    true,\n                ),\n                ReactionCount(\n                    \":dame:\",\n                    1,\n                    false,\n                ),\n                ReactionCount(\n                    \":souiuhimoaru:\",\n                    1,\n                    false,\n                ),\n                ReactionCount(\n                    \":angry:\",\n                    1,\n                    false,\n                )\n            ),\n            renoteId = Note.Id(0L, \"\")\n        )\n        assertEquals(2, note.getMyReactionCount())\n    }\n\n\n    @Test\n    fun getOriginUrl_UrlAsNullAndHostTypeMisskey() {\n        val note = Note.make(\n            Note.Id(0L, \"a0b\"),\n            User.Id(0L, \"\"),\n            uri = null,\n            url = null,\n            type = Note.Type.Misskey()\n        )\n\n        val url = note.getOriginUrl(\n            Account(\n                remoteId = \"remoteId\",\n                instanceDomain = \"https://example.com\",\n                userName = \"Florine Ryan\",\n                instanceType = Account.InstanceType.MISSKEY,\n                token = \"gubergren\"\n            )\n        )\n        assertEquals(\"https://example.com/notes/a0b\", url)\n    }\n\n    @Test\n    fun getOriginUrl_UrlAsNullAndHostTypeMastodon() {\n        val note = Note.make(\n            Note.Id(0L, \"a0b\"),\n            User.Id(0L, \"\"),\n            uri = null,\n            url = null,\n            type = Note.Type.Mastodon(\n                reblogged = null,\n                favorited = null,\n                bookmarked = null,\n                muted = null,\n                favoriteCount = null,\n                tags = listOf(),\n                mentions = listOf(),\n                isFedibirdQuote = false,\n                pollId = null,\n                isSensitive = null,\n                pureText = null,\n                isReactionAvailable = false\n            ),\n        )\n\n        val url = note.getOriginUrl(\n            Account(\n                remoteId = \"remoteId\",\n                instanceDomain = \"https://example.com\",\n                userName = \"Florine Ryan\",\n                instanceType = Account.InstanceType.MASTODON,\n                token = \"gubergren\"\n            )\n        )\n        assertEquals(\"https://example.com/web/statuses/a0b\", url)\n    }\n\n    @Test\n    fun getOriginUrl_UrlNotNull() {\n        val note = Note.make(\n            Note.Id(0L, \"a0b\"),\n            User.Id(0L, \"\"),\n            uri = null,\n            url = \"https://example.com/web/statuses/a0b\",\n            type = Note.Type.Mastodon(\n                reblogged = null,\n                favorited = null,\n                bookmarked = null,\n                muted = null,\n                favoriteCount = null,\n                tags = listOf(),\n                mentions = listOf(),\n                isFedibirdQuote = false,\n                pollId = null,\n                isSensitive = null,\n                pureText = null,\n                isReactionAvailable = false\n            ),\n        )\n        val url = note.getOriginUrl(\n            Account(\n                remoteId = \"remoteId\",\n                instanceDomain = \"https://a.example.com\",\n                userName = \"Florine Ryan\",\n                instanceType = Account.InstanceType.MASTODON,\n                token = \"gubergren\"\n            )\n        )\n        assertEquals(\"https://example.com/web/statuses/a0b\", url)\n    }\n\n    @Test\n    fun getOriginUrl_UrlNotNullAndHostTypeMisskey() {\n        val note = Note.make(\n            Note.Id(0L, \"a0b\"),\n            User.Id(0L, \"\"),\n            uri = null,\n            url = \"https://example.com/notes/a0b\",\n            type = Note.Type.Misskey()\n        )\n\n        val url = note.getOriginUrl(\n            Account(\n                remoteId = \"remoteId\",\n                instanceDomain = \"https://a.example.com\",\n                userName = \"Florine Ryan\",\n                instanceType = Account.InstanceType.MISSKEY,\n                token = \"gubergren\"\n            )\n        )\n        assertEquals(\"https://example.com/notes/a0b\", url)\n    }\n\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/note/NoteTestUtil.kt",
    "content": "package net.pantasystem.milktea.model.note\n\nimport net.pantasystem.milktea.model.user.User\n\nfun generateEmptyNote(): Note {\n    return Note.make(\n        id = Note.Id(0L, \"id1\"),\n        userId = User.Id(0L, \"id2\"),\n    )\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/note/muteword/WordFilterConfigTest.kt",
    "content": "package net.pantasystem.milktea.model.note.muteword\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass WordFilterConfigTest {\n\n    @Test\n    fun checkMatchText_GiveNullText_ReturnFalse() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\"))))\n        Assertions.assertFalse(config.checkMatchText(null))\n    }\n\n    @Test\n    fun checkMatchText_GiveEmptyText_ReturnFalse() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\"))))\n        Assertions.assertFalse(config.checkMatchText(\"\"))\n    }\n\n    @Test\n    fun checkMatchText_GiveMatchText_ReturnTrue() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\"))))\n        Assertions.assertTrue(config.checkMatchText(\"test\"))\n    }\n\n    @Test\n    fun checkMatchText_GiveNotMatchText_ReturnFalse() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\"))))\n        Assertions.assertFalse(config.checkMatchText(\"hoge\"))\n    }\n\n    @Test\n    fun checkMatchText_GiveMatchTextWithRegex_ReturnTrue() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Regex(\"\"\"\\d+\\\"\"\")))\n        Assertions.assertTrue(config.checkMatchText(\"123\"))\n    }\n\n    @Test\n    fun checkMatchText_GiveNotMatchTextWithRegex_ReturnFalse() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Regex(\"\"\"\\d{3}\\\"\"\")))\n        Assertions.assertFalse(config.checkMatchText(\"aa\"))\n    }\n\n    @Test\n    fun checkMatchText_GiveMatchTextWithNormalAndRegex_ReturnTrue() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\")), FilterConditionType.Regex(\"\"\"\\d{3}\\\"\"\")))\n        Assertions.assertTrue(config.checkMatchText(\"test\"))\n        Assertions.assertTrue(config.checkMatchText(\"123\"))\n    }\n\n    @Test\n    fun checkMatchText_GiveNotMatchTextWithNormalAndRegex_ReturnFalse() {\n        val config = WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\")), FilterConditionType.Regex(\"\"\"\\d{3}\\\"\"\")))\n        Assertions.assertFalse(config.checkMatchText(\"hoge\"))\n        Assertions.assertFalse(config.checkMatchText(\"12\"))\n    }\n\n    @Test\n    fun checkMatchText_GiveMatchTextWithNormalAndRegexAndNormal_ReturnTrue() {\n        val config = WordFilterConfig(\n            listOf(\n                FilterConditionType.Normal(listOf(\"test\")),\n                FilterConditionType.Regex(\"\"\"\\d{3}\\\"\"\"),\n                FilterConditionType.Normal(listOf(\"hoge\"))\n            )\n        )\n        Assertions.assertTrue(config.checkMatchText(\"test\"))\n        Assertions.assertTrue(config.checkMatchText(\"123\"))\n        Assertions.assertTrue(config.checkMatchText(\"hoge test 123\"))\n\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/note/muteword/WordFilterConfigTextParserTest.kt",
    "content": "package net.pantasystem.milktea.model.note.muteword\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass WordFilterConfigTextParserTest {\n\n    @Test\n    fun fromText_Give1LineWord() {\n        val text = \"test\\n\"\n        val result = WordFilterConfigTextParser.fromText(text).getOrThrow()\n        Assertions.assertEquals(\n            WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\")))),\n            result\n        )\n\n    }\n\n    @Test\n    fun fromText_Give1LineWordNotExistsReturnCode() {\n        val text = \"test\"\n        val result = WordFilterConfigTextParser.fromText(text).getOrThrow()\n        Assertions.assertEquals(\n            WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"test\")))),\n            result\n        )\n    }\n\n\n    @Test\n    fun fromText_GiveAnyOrText() {\n        val text = \"hoge piyo fuga\"\n        val result = WordFilterConfigTextParser.fromText(text).getOrThrow()\n        Assertions.assertEquals(\n            WordFilterConfig(listOf(FilterConditionType.Normal(listOf(\"hoge\", \"piyo\", \"fuga\")))),\n            result\n        )\n    }\n\n    @Test\n    fun fromText_GiveAnyAndConditionsText() {\n        val text = \"hoge\\npiyo \\nfuga\"\n        val result = WordFilterConfigTextParser.fromText(text).getOrThrow()\n        Assertions.assertEquals(\n            WordFilterConfig(\n                listOf(\n                    FilterConditionType.Normal(listOf(\"hoge\")),\n                    FilterConditionType.Normal(listOf(\"piyo\")),\n                    FilterConditionType.Normal(listOf(\"fuga\"))\n                )\n            ), result\n        )\n    }\n\n    @Test\n    fun fromText_GiveAnyAndConditionAndOrConditionText() {\n        val text = \"hoge fizz panta\\npiyo buzz\\n fuga moga\"\n        val result = WordFilterConfigTextParser.fromText(text).getOrThrow()\n        Assertions.assertEquals(\n            WordFilterConfig(\n                listOf(\n                    FilterConditionType.Normal(listOf(\"hoge\", \"fizz\", \"panta\")),\n                    FilterConditionType.Normal(listOf(\"piyo\", \"buzz\")),\n                    FilterConditionType.Normal(listOf(\"fuga\", \"moga\"))\n                )\n            ), result\n        )\n    }\n\n    @Test\n    fun fromText_GiveRegex() {\n        val text = \"hoge fizz panta\\npiyo buzz\\n fuga moga\\n\\\\hogepiyo\\\\\"\n        val result = WordFilterConfigTextParser.fromText(text).getOrThrow()\n        Assertions.assertEquals(\n            WordFilterConfig(\n                listOf(\n                    FilterConditionType.Normal(listOf(\"hoge\", \"fizz\", \"panta\")),\n                    FilterConditionType.Normal(listOf(\"piyo\", \"buzz\")),\n                    FilterConditionType.Normal(listOf(\"fuga\", \"moga\")),\n                    FilterConditionType.Regex(\"\\\\hogepiyo\\\\\")\n                )\n            ), result\n        )\n    }\n\n    @Test\n    fun fromConfig_GiveAnyAndConditionAndOrCondition() {\n        val config = WordFilterConfig(\n            listOf(\n                FilterConditionType.Normal(listOf(\"hoge\", \"fizz\", \"panta\")),\n                FilterConditionType.Normal(listOf(\"piyo\", \"buzz\")),\n                FilterConditionType.Normal(listOf(\"fuga\", \"moga\"))\n            )\n        )\n        Assertions.assertEquals(\n            \"hoge fizz panta\\npiyo buzz\\nfuga moga\",\n            WordFilterConfigTextParser.fromConfig(config).getOrThrow()\n        )\n    }\n\n    @Test\n    fun fromConfig_GiveRegex() {\n        val config = WordFilterConfig(\n            listOf(\n                FilterConditionType.Normal(listOf(\"hoge\", \"fizz\", \"panta\")),\n                FilterConditionType.Normal(listOf(\"piyo\", \"buzz\")),\n                FilterConditionType.Normal(listOf(\"fuga\", \"moga\")),\n                FilterConditionType.Regex(\"\\\\hogepiyo\\\\\")\n            )\n        )\n        Assertions.assertEquals(\n            \"hoge fizz panta\\npiyo buzz\\nfuga moga\\n\\\\hogepiyo\\\\\",\n            WordFilterConfigTextParser.fromConfig(config).getOrThrow()\n        )\n\n    }\n\n\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/note/reaction/ReactionTest.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\nclass ReactionTest {\n\n    @Test\n    fun isLocal() {\n        val localReaction = Reaction(\":kawaii@.:\")\n        Assertions.assertTrue(localReaction.isLocal())\n    }\n\n    @Test\n    fun isNotLocal() {\n        val localReaction = Reaction(\":kawaii@misskey.io:\")\n        Assertions.assertFalse(localReaction.isLocal())\n    }\n\n    @Test\n    fun getName() {\n        val reaction = Reaction(\":a:\")\n        Assertions.assertEquals(\"a\", reaction.getName())\n    }\n\n    @Test\n    fun getNameThenRemoteCustomEmojiReaction() {\n        val reaction = Reaction(\":a@misskey.io:\")\n        Assertions.assertEquals(\"a\", reaction.getName())\n    }\n\n    @Test\n    fun getNameThenLocalCustomEmojiReaction() {\n        val reaction = Reaction(\":a@.:\")\n        Assertions.assertEquals(\"a\", reaction.getName())\n    }\n\n    @Test\n    fun isCustomEmojiFormatThenCustomEmoji() {\n        val reaction = Reaction(\":a:\")\n        Assertions.assertTrue(reaction.isCustomEmojiFormat())\n    }\n\n    @Test\n    fun isCustomEmojiFormatThenRemoteCustomEmoji() {\n        val reaction = Reaction(\":a@misskey.io:\")\n        Assertions.assertTrue(reaction.isCustomEmojiFormat())\n    }\n\n    @Test\n    fun isCustomEmojiFormatThenLocalCustomEmoji() {\n        val reaction = Reaction(\":a@.:\")\n        Assertions.assertTrue(reaction.isCustomEmojiFormat())\n    }\n\n    @Test\n    fun isCustomEmojiFormatThenEmoji() {\n        val reaction = Reaction(\"😄\")\n        Assertions.assertFalse(reaction.isCustomEmojiFormat())\n    }\n\n    @Test\n    fun getName_GiveColonNameColon() {\n        val reaction = Reaction(\":name:\")\n        Assertions.assertEquals(\"name\", reaction.getName())\n    }\n\n    @Test\n    fun getHost_GiveColonNameColon() {\n        val reaction = Reaction(\":name:\")\n        Assertions.assertNull(reaction.getHost())\n    }\n\n    @Test\n    fun getHost_GiveColonNameAtMarkHostColon() {\n        val reaction = Reaction(\":name@host:\")\n        Assertions.assertEquals(\"host\",reaction.getHost())\n    }\n\n    @Test\n    fun getNameAndHost_GiveColonNameColon() {\n        val reaction = Reaction(\":name:\")\n        Assertions.assertEquals(\"name\", reaction.getNameAndHost())\n    }\n\n    @Test\n    fun getNameAndHost_GiveColonNameAtMarkHostColon() {\n        val reaction = Reaction(\":name@host:\")\n        Assertions.assertEquals(\"name@host\", reaction.getNameAndHost())\n    }\n\n    @Test\n    fun getHost_GiveNameAtMarkDot() {\n        val reaction = Reaction(\"name@.\")\n        Assertions.assertNull(reaction.getHost())\n    }\n\n    @Test\n    fun getNameAndHost_GiveNameAtMarkDot() {\n        val reaction = Reaction(\"name@.\")\n        Assertions.assertEquals(\"name\", reaction.getNameAndHost())\n    }\n\n    @Test\n    fun isCustomEmojiFormat_GiveLegacyEmoji() {\n        LegacyReaction.defaultReaction.forEach {\n            Assertions.assertFalse(Reaction(it).isCustomEmojiFormat())\n            Assertions.assertTrue(Reaction(it).isLegacyFormat())\n            Assertions.assertEquals(LegacyReaction.reactionMap[it], Reaction(it).getLegacyEmoji())\n        }\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/note/reaction/ToggleReactionUseCaseTest.kt",
    "content": "package net.pantasystem.milktea.model.note.reaction\n\nimport kotlinx.coroutines.runBlocking\nimport kotlinx.coroutines.test.runTest\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.GetAccount\nimport net.pantasystem.milktea.model.emoji.CustomEmoji\nimport net.pantasystem.milktea.model.instance.InstanceInfoType\nimport net.pantasystem.milktea.model.instance.MastodonInstanceInfo\nimport net.pantasystem.milktea.model.instance.Meta\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfo\nimport net.pantasystem.milktea.model.note.Note\nimport net.pantasystem.milktea.model.note.NoteRepository\nimport net.pantasystem.milktea.model.note.generateEmptyNote\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistory\nimport net.pantasystem.milktea.model.note.reaction.history.ReactionHistoryRepository\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\nimport org.mockito.kotlin.any\nimport org.mockito.kotlin.doReturn\nimport org.mockito.kotlin.mock\nimport org.mockito.kotlin.verifyBlocking\n\nclass ToggleReactionUseCaseTest {\n\n    @Test\n    fun giveCustomEmojiReactionWhenHasMyReaction() {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\"),\n            reactionCounts = listOf(\n                ReactionCount(\n                    \":kawaii:\",\n                    1,\n                    me = true,\n                )\n            ),\n            myReaction = \":kawaii:\"\n        )\n\n        val noteRepository = mock<NoteRepository> {\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                delete(DeleteReaction(targetNote.id, \":kawaii:\")).getOrThrow()\n            } doReturn true\n        }\n\n        val meta = Meta(\n            uri = \"misskey.io\",\n\n            )\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList(),\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n        val checkEmoji = mock<CheckEmoji> {\n            onBlocking {\n                checkEmoji(any())\n            } doReturn true\n        }\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = checkEmoji,\n            reactionRepository = reactionRepository,\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(\n                    listOf(\n                        CustomEmoji(\n                            name = \"kawaii\"\n                        )\n                    )\n                )\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        nodeInfo = NodeInfo(\n                            \"\",\n                            \"\",\n                            NodeInfo.Software(\"\", \"\")\n                        ), meta\n                    )\n                )\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n        runBlocking {\n            useCase(targetNote.id, \":kawaii:\").getOrThrow()\n        }\n\n        verifyBlocking(reactionRepository) {\n            delete(DeleteReaction(targetNote.id, \":kawaii:\"))\n        }\n    }\n\n    @Test\n    fun giveCustomEmojiReactionWhenHasOtherMyReaction() = runBlocking {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\"),\n            reactionCounts = listOf(\n                ReactionCount(\":kawaii:\", 1, true)\n            ),\n        )\n        val createReactionDTO = CreateReaction(targetNote.id, \":wakaranai:\")\n\n        val noteRepository = mock<NoteRepository> {\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                delete(DeleteReaction(targetNote.id, \":kawaii:\")).getOrThrow()\n            } doReturn true\n            onBlocking {\n                create(createReactionDTO).getOrThrow()\n            } doReturn true\n        }\n\n        val meta = Meta(\n            uri = \"https://misskey.io\",\n\n            )\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList(),\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n        val checkEmoji = mock<CheckEmoji> {\n            onBlocking {\n                checkEmoji(any())\n            } doReturn true\n        }\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = checkEmoji,\n            reactionRepository = reactionRepository,\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(listOf(CustomEmoji(name = \"wakaranai\")))\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\n                            \"\",\n                            \"\",\n                            NodeInfo.Software(\"\", \"\")\n                        ), meta\n                    )\n                )\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n        runBlocking {\n            useCase(targetNote.id, \":wakaranai:\").getOrThrow()\n        }\n\n        verifyBlocking(reactionRepository) {\n            delete(DeleteReaction(targetNote.id, \":kawaii:\"))\n            create(createReactionDTO)\n        }\n\n        verifyBlocking(reactionHistoryDao) {\n            create(\n                ReactionHistory(\n                    reaction = \":wakaranai:\",\n                    instanceDomain = \"https://misskey.io\",\n                    accountId = account.accountId,\n                    targetPostId = targetNote.id.noteId,\n                    targetUserId = targetNote.userId.id,\n                )\n            )\n        }\n    }\n\n\n    @Test\n    fun giveCustomEmojiReaction() {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\")\n        )\n        val createReactionDTO = CreateReaction(targetNote.id, \":kawaii:\")\n\n        val noteRepository = mock<NoteRepository> {\n\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                create(createReactionDTO).getOrThrow()\n            } doReturn true\n        }\n\n        val meta = Meta(\n            uri = \"https://misskey.io\",\n        )\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList(),\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n        val checkEmoji = mock<CheckEmoji> {\n            onBlocking {\n                checkEmoji(any())\n            } doReturn true\n        }\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = checkEmoji,\n            reactionRepository = reactionRepository,\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(listOf(CustomEmoji(\"kawaii\")))\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\n                            \"\",\n                            \"\",\n                            NodeInfo.Software(\"\", \"\")\n                        ), meta\n                    )\n                )\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n\n        runBlocking {\n            useCase(targetNote.id, \":kawaii:\").getOrThrow()\n        }\n        verifyBlocking(reactionRepository) {\n            create(createReactionDTO)\n        }\n\n        verifyBlocking(reactionHistoryDao) {\n            create(\n                ReactionHistory(\n                    reaction = \":kawaii:\",\n                    instanceDomain = \"https://misskey.io\",\n                    targetUserId = targetNote.userId.id,\n                    targetPostId = targetNote.id.noteId,\n                    accountId = account.accountId\n                )\n            )\n        }\n    }\n\n    @Test\n    fun giveUnknownCharacter() {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\")\n        )\n        val createReactionDTO = CreateReaction(targetNote.id, \"👍\")\n\n        val noteRepository = mock<NoteRepository> {\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                create(createReactionDTO).getOrThrow()\n            } doReturn true\n        }\n\n        val meta = Meta(uri = \"https://misskey.io\")\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList(),\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = mock {\n                onBlocking {\n                    checkEmoji(any())\n                } doReturn false\n            },\n            reactionRepository = reactionRepository,\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\n                            \"\",\n                            \"\",\n                            NodeInfo.Software(\"\", \"\")\n                        ), meta\n                    )\n                )\n            },\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(emptyList())\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n\n        runBlocking {\n            useCase(targetNote.id, \"unknown\").getOrThrow()\n        }\n        verifyBlocking(reactionRepository) {\n            create(createReactionDTO)\n        }\n\n        verifyBlocking(reactionHistoryDao) {\n            create(\n                ReactionHistory(\n                    reaction = \"👍\",\n                    instanceDomain = \"https://misskey.io\",\n                    accountId = account.accountId,\n                    targetPostId = targetNote.id.noteId,\n                    targetUserId = targetNote.userId.id,\n                )\n            )\n        }\n    }\n\n    @Test\n    fun giveMultiByteEmoji() {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\")\n        )\n        val createReactionDTO = CreateReaction(targetNote.id, \"🥺\")\n\n        val noteRepository = mock<NoteRepository> {\n\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                create(createReactionDTO).getOrThrow()\n            } doReturn true\n        }\n\n        val meta = Meta(uri = \"https://misskey.io\")\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList()\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = mock {\n                onBlocking {\n                    checkEmoji(any())\n                } doReturn true\n            },\n            reactionRepository = reactionRepository,\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\n                            \"\",\n                            \"\",\n                            NodeInfo.Software(\"\", \"\")\n                        ), meta\n                    )\n                )\n            },\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(emptyList())\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n\n        runBlocking {\n            useCase(targetNote.id, \"🥺\").getOrThrow()\n        }\n        verifyBlocking(reactionRepository) {\n            create(createReactionDTO)\n        }\n\n        verifyBlocking(reactionHistoryDao) {\n            create(\n                ReactionHistory(\n                    reaction = \"🥺\",\n                    instanceDomain = \"https://misskey.io\",\n                    accountId = account.accountId,\n                    targetUserId = targetNote.userId.id,\n                    targetPostId = targetNote.id.noteId,\n                )\n            )\n        }\n    }\n\n    @Test\n    fun giveLegacyReaction() {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\")\n        )\n        val createReactionDTO = CreateReaction(targetNote.id, \"\\uD83D\\uDE06\")\n\n        val noteRepository = mock<NoteRepository> {\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                create(createReactionDTO).getOrThrow()\n            } doReturn true\n        }\n\n        val meta = Meta(uri = \"https://misskey.io\")\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://misskey.io\",\n            instanceType = Account.InstanceType.MISSKEY,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList()\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = mock {\n                onBlocking {\n                    checkEmoji(any())\n                } doReturn false\n            },\n            reactionRepository = reactionRepository,\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(listOf())\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Misskey(\n                        NodeInfo(\n                            \"\",\n                            \"\",\n                            NodeInfo.Software(\"\", \"\")\n                        ), meta\n                    )\n                )\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n\n        runBlocking {\n            useCase(targetNote.id, \"laugh\").getOrThrow()\n        }\n        verifyBlocking(reactionRepository) {\n            create(createReactionDTO)\n        }\n\n        verifyBlocking(reactionHistoryDao) {\n            create(\n                ReactionHistory(\n                    reaction = \"\\uD83D\\uDE06\",\n                    instanceDomain = \"https://misskey.io\",\n                    accountId = account.accountId,\n                    targetPostId = targetNote.id.noteId,\n                    targetUserId = targetNote.userId.id,\n                )\n            )\n        }\n    }\n\n    @Test\n    fun giveRemoteEmojiWhenFedibird() {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\")\n        )\n        val createReactionDTO = CreateReaction(targetNote.id, \"kawaii@misskey.io\")\n\n        val noteRepository = mock<NoteRepository> {\n\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                create(createReactionDTO).getOrThrow()\n            } doReturn true\n        }\n\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://fedibird.com\",\n            instanceType = Account.InstanceType.MASTODON,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList(),\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n        val checkEmoji = mock<CheckEmoji> {\n            onBlocking {\n                checkEmoji(any())\n            } doReturn true\n        }\n\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = checkEmoji,\n            reactionRepository = reactionRepository,\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(emptyList())\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Mastodon(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"\", \"\")),\n                        MastodonInstanceInfo(\n                            uri = \"\",\n                            title = \"\",\n                            description = \"\",\n                            email = \"\",\n                            version = \"\",\n                            urls = MastodonInstanceInfo.Urls(streamingApi = null),\n                            configuration = MastodonInstanceInfo.Configuration(\n                                emojiReactions = MastodonInstanceInfo.Configuration.EmojiReactions(\n                                    maxReactions = 1000,\n                                    maxReactionsPerAccount = 1\n                                ),\n                                polls = null,\n                                statuses = null,\n                            ),\n                            fedibirdCapabilities = listOf(\"emoji_reaction\"),\n                            pleroma = null,\n                        )\n                    )\n                )\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n\n        runBlocking {\n            useCase(targetNote.id, \"kawaii@misskey.io\").getOrThrow()\n        }\n        verifyBlocking(reactionRepository) {\n            create(createReactionDTO)\n        }\n\n        verifyBlocking(reactionHistoryDao) {\n            create(\n                ReactionHistory(\n                    reaction = \"kawaii@misskey.io\",\n                    instanceDomain = \"https://fedibird.com\",\n                    accountId = account.accountId,\n                    targetUserId = targetNote.userId.id,\n                    targetPostId = targetNote.id.noteId,\n                )\n            )\n        }\n    }\n\n    @Test\n    fun giveRemoteEmojiWhenMastodonAndCanMultipleReaction() {\n        val targetNote = generateEmptyNote().copy(\n            text = \"test\",\n            id = Note.Id(accountId = 0L, \"testId\"),\n            reactionCounts = listOf(\n                ReactionCount(\n                    \":iizo:\",\n                    2,\n                    true,\n                ),\n                ReactionCount(\n                    \":dame:\",\n                    1,\n                    false,\n                )\n            )\n        )\n        val createReactionDTO = CreateReaction(targetNote.id, \"kawaii@misskey.io\")\n\n        val noteRepository = mock<NoteRepository> {\n\n            onBlocking {\n                find(targetNote.id).getOrThrow()\n            } doReturn targetNote\n        }\n\n        val reactionRepository = mock<ReactionRepository> {\n            onBlocking {\n                create(createReactionDTO).getOrThrow()\n            } doReturn true\n        }\n\n        val reactionHistoryDao = mock<ReactionHistoryRepository>()\n        val account = Account(\n            \"testId\",\n            \"https://fedibird.com\",\n            instanceType = Account.InstanceType.MASTODON,\n            token = \"test\",\n            userName = \"test\",\n            accountId = 0L,\n            pages = emptyList(),\n        )\n        val getAccount = mock<GetAccount> {\n            onBlocking {\n                get(any())\n            } doReturn account\n        }\n\n        val checkEmoji = mock<CheckEmoji> {\n            onBlocking {\n                checkEmoji(any())\n            } doReturn true\n        }\n\n\n        val useCase = ToggleReactionUseCase(\n            getAccount = getAccount,\n            noteRepository = noteRepository,\n            reactionHistoryRepository = reactionHistoryDao,\n            checkEmoji = checkEmoji,\n            reactionRepository = reactionRepository,\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(emptyList())\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    InstanceInfoType.Mastodon(\n                        NodeInfo(\"\", \"\", NodeInfo.Software(\"\", \"\")),\n                        MastodonInstanceInfo(\n                            uri = \"\",\n                            title = \"\",\n                            description = \"\",\n                            email = \"\",\n                            version = \"\",\n                            urls = MastodonInstanceInfo.Urls(streamingApi = null),\n                            configuration = MastodonInstanceInfo.Configuration(\n                                emojiReactions = MastodonInstanceInfo.Configuration.EmojiReactions(\n                                    maxReactions = 1000,\n                                    maxReactionsPerAccount = 2\n                                ),\n                                polls = null,\n                                statuses = null,\n                            ),\n                            fedibirdCapabilities = listOf(\"emoji_reaction\"),\n                            pleroma = null,\n                        )\n                    )\n                )\n            },\n            userRepository = mock() {\n                onBlocking {\n                    sync(any())\n                } doReturn Result.success(Unit)\n            }\n        )\n\n        runBlocking {\n            useCase(targetNote.id, \"kawaii@misskey.io\").getOrThrow()\n        }\n        verifyBlocking(reactionRepository) {\n            create(createReactionDTO)\n        }\n\n        verifyBlocking(reactionHistoryDao) {\n            create(\n                ReactionHistory(\n                    reaction = \"kawaii@misskey.io\",\n                    instanceDomain = \"https://fedibird.com\",\n                    targetPostId = targetNote.id.noteId,\n                    targetUserId = targetNote.userId.id,\n                    accountId = account.accountId,\n                )\n            )\n        }\n    }\n\n    @Test\n    fun getSendReaction_whenMastodonAndCanMultipleReaction() = runTest {\n\n        val instanceType = InstanceInfoType.Mastodon(\n            NodeInfo(\"\", \"\", NodeInfo.Software(\"mastodon\", \"\")),\n            MastodonInstanceInfo(\n                uri = \"\",\n                title = \"\",\n                description = \"\",\n                email = \"\",\n                version = \"\",\n                urls = MastodonInstanceInfo.Urls(streamingApi = null),\n                configuration = MastodonInstanceInfo.Configuration(\n                    emojiReactions = MastodonInstanceInfo.Configuration.EmojiReactions(\n                        maxReactions = 1000,\n                        maxReactionsPerAccount = 2\n                    ),\n                    polls = null,\n                    statuses = null,\n                ),\n                fedibirdCapabilities = listOf(\"emoji_reaction\"),\n                pleroma = null,\n            )\n        )\n        val useCase = ToggleReactionUseCase(\n            getAccount = mock(),\n            noteRepository = mock(),\n            reactionHistoryRepository = mock(),\n            checkEmoji = object : CheckEmoji {\n                override suspend fun checkEmoji(char: CharSequence): Boolean {\n                    return false\n                }\n            },\n            reactionRepository = mock(),\n            customEmojiRepository = mock(),\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    instanceType\n                )\n            },\n            userRepository = mock()\n        )\n        val sendReaction = useCase.getSendReaction(\n            instanceType,\n            Account(\n                \"testId\",\n                \"https://fedibird.com\",\n                instanceType = Account.InstanceType.MASTODON,\n                token = \"test\",\n                userName = \"test\",\n                accountId = 0L,\n                pages = emptyList(),\n            ),\n            \":kawaii:\"\n        )\n        Assertions.assertEquals(\"kawaii\", sendReaction)\n    }\n\n    @Test\n    fun getSendReaction_whenMastodonAndCanNotMultipleReaction() = runTest {\n\n        val instanceType = InstanceInfoType.Mastodon(\n            NodeInfo(\"\", \"\", NodeInfo.Software(\"mastodon\", \"\")),\n            MastodonInstanceInfo(\n                uri = \"\",\n                title = \"\",\n                description = \"\",\n                email = \"\",\n                version = \"\",\n                urls = MastodonInstanceInfo.Urls(streamingApi = null),\n                configuration = MastodonInstanceInfo.Configuration(\n                    emojiReactions = MastodonInstanceInfo.Configuration.EmojiReactions(\n                        maxReactions = 1000,\n                        maxReactionsPerAccount = 0\n                    ),\n                    polls = null,\n                    statuses = null,\n                ),\n                fedibirdCapabilities = listOf(\"emoji_reaction\"),\n                pleroma = null,\n            )\n        )\n        val useCase = ToggleReactionUseCase(\n            getAccount = mock(),\n            noteRepository = mock(),\n            reactionHistoryRepository = mock(),\n            checkEmoji = object : CheckEmoji {\n                override suspend fun checkEmoji(char: CharSequence): Boolean {\n                    return false\n                }\n            },\n            reactionRepository = mock(),\n            customEmojiRepository = mock(),\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    instanceType\n                )\n            },\n            userRepository = mock()\n        )\n        val sendReaction = useCase.getSendReaction(\n            instanceType,\n            Account(\n                \"testId\",\n                \"https://fedibird.com\",\n                instanceType = Account.InstanceType.MASTODON,\n                token = \"test\",\n                userName = \"test\",\n                accountId = 0L,\n                pages = emptyList(),\n            ),\n            \":kawaii:\"\n        )\n        Assertions.assertNull(sendReaction)\n    }\n\n\n    // ソフトウェア種別がmisskeyでCustomEmojiRepositoryに絵文字が存在しない場合\n    @Test\n    fun getSendReaction_whenMisskeyAndCustomEmojiRepositoryIsEmpty() = runTest {\n        val instanceType = InstanceInfoType.Misskey(\n            NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n            Meta(uri = \"\")\n        )\n        val useCase = ToggleReactionUseCase(\n            getAccount = mock(),\n            noteRepository = mock(),\n            reactionHistoryRepository = mock(),\n            checkEmoji = object : CheckEmoji {\n                override suspend fun checkEmoji(char: CharSequence): Boolean {\n                    return false\n                }\n            },\n            reactionRepository = mock(),\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(emptyList())\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    instanceType\n                )\n            },\n            userRepository = mock()\n        )\n        val sendReaction = useCase.getSendReaction(\n            instanceType,\n            Account(\n                \"testId\",\n                \"https://misskey.io\",\n                instanceType = Account.InstanceType.MISSKEY,\n                token = \"test\",\n                userName = \"test\",\n                accountId = 0L,\n                pages = emptyList(),\n            ),\n            \":kawaii:\"\n        )\n        Assertions.assertEquals(\"👍\", sendReaction)\n    }\n\n    // ソフトウェア種別がmisskeyでCustomEmojiRepositoryに絵文字が存在する場合\n    @Test\n    fun getSendReaction_whenMisskeyAndCustomEmojiRepositoryIsNotEmpty() = runTest {\n        val instanceType = InstanceInfoType.Misskey(\n            NodeInfo(\"\", \"\", NodeInfo.Software(\"misskey\", \"\")),\n            Meta(uri = \"\")\n        )\n        val useCase = ToggleReactionUseCase(\n            getAccount = mock(),\n            noteRepository = mock(),\n            reactionHistoryRepository = mock(),\n            checkEmoji = object : CheckEmoji {\n                override suspend fun checkEmoji(char: CharSequence): Boolean {\n                    return false\n                }\n            },\n            reactionRepository = mock(),\n            customEmojiRepository = mock() {\n                onBlocking {\n                    findByName(any(), any())\n                } doReturn Result.success(listOf(CustomEmoji(\"kawaii\")))\n            },\n            instanceInfoService = mock() {\n                onBlocking {\n                    find(any())\n                } doReturn Result.success(\n                    instanceType\n                )\n            },\n            userRepository = mock()\n        )\n        val sendReaction = useCase.getSendReaction(\n            instanceType,\n            Account(\n                \"testId\",\n                \"https://misskey.io\",\n                instanceType = Account.InstanceType.MISSKEY,\n                token = \"test\",\n                userName = \"test\",\n                accountId = 0L,\n                pages = emptyList(),\n            ),\n            \":kawaii:\"\n        )\n        Assertions.assertEquals(\":kawaii:\", sendReaction)\n    }\n}"
  },
  {
    "path": "modules/model/src/test/java/net/pantasystem/milktea/model/user/AcctTest.kt",
    "content": "package net.pantasystem.milktea.model.user\n\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.Test\n\n\nclass AcctTest {\n\n    @Test\n    fun userName_giveUserNameOnly() {\n        val textAcct = \"@Panta\"\n        val acct = Acct(textAcct)\n        Assertions.assertEquals(\"Panta\", acct.userName)\n    }\n\n    @Test\n    fun host_giveUserNameOnlyReturnsNull() {\n        val textAcct = \"@Panta\"\n        val acct = Acct(textAcct)\n        Assertions.assertNull(acct.host)\n    }\n\n    @Test\n    fun userName_giveUserNameAndHost() {\n        val textAcct = \"@Panta@misskey.io\"\n        val acct = Acct(textAcct)\n        Assertions.assertEquals(\"Panta\", acct.userName)\n    }\n\n    @Test\n    fun host_giveUserNameAndHost() {\n        val textAcct = \"@Panta@misskey.io\"\n        val acct = Acct(textAcct)\n        Assertions.assertEquals(\"misskey.io\", acct.host)\n    }\n}"
  },
  {
    "path": "modules/model/src/test/resources/v10_meta_case1.json",
    "content": "{\n  \"maintainer\": {\n    \"name\": \"\",\n    \"url\": \"mailto:m@m544.net\",\n    \"repository_url\": \"https://github.com/mei23/misskey/tree/mei-m544\",\n    \"email\": \"\"\n  },\n  \"version\": \"10.102.584-m544\",\n  \"name\": \"めいすきー\",\n  \"uri\": \"https://misskey.m544.net\",\n  \"description\": \"お淑やかなめいめいさん推しのためのめいめい邸ガレージなのだわ。招待コードが欲しい人間は管理人に聞いてなのだわ。ローカルタイムラインのない <a href=\\\"https://meisskey.one\\\"  target=\\\"_blank\\\" rel=\\\"noopener\\\">meisskey.one</a> もあるのだわ。\",\n  \"langs\": [],\n  \"machine\": \"meisskey\",\n  \"os\": \"linux\",\n  \"arch\": \"x64\",\n  \"node\": \"v16.16.0\",\n  \"cpu\": {\n    \"model\": \"Intel Xeon Processor (Cascadelake)\",\n    \"cores\": 4\n  },\n  \"announcements\": [\n    {\n      \"title\": \"めいすきーについて\",\n      \"text\": \"<a target=_blank href=https://mei23.github.io/misskey_m544_net>めいすきーについて</a> / \\n<a target=_blank href=https://misskey.m544.net/notes/717cefadcfe84dd16460ba5f>アイコンの設定方法</a> / \\n<a target=_blank href=https://misskey.m544.net/docs/ja-JP/search-box>検索について</a> / \\n<a target=_blank href=https://misskey.m544.net/docs/ja-JP/visibilities>公開範囲について</a> /\\n<a target=_blank href=https://misskey.m544.net/mfm-cheat-sheet>文字装飾</a>\"\n    }\n  ],\n  \"disableRegistration\": true,\n  \"disableLocalTimeline\": false,\n  \"enableEmojiReaction\": true,\n  \"driveCapacityPerLocalUserMb\": 100000,\n  \"driveCapacityPerRemoteUserMb\": 128,\n  \"cacheRemoteFiles\": false,\n  \"enableRecaptcha\": true,\n  \"recaptchaSiteKey\": \"6LcEZVIUAAAAAFWCFAR9WK8zDY-GewLl7oOsexTp\",\n  \"swPublickey\": \"BG0ZvVjw1LKSVupQoVgQK3RF7Q2txYxdwsJGXI-fh9iTbhUM2uj3uvP2ok8ooIEx5MEYFOu14lLMh38sZkfW_nw\",\n  \"mascotImageUrl\": \"\",\n  \"bannerUrl\": \"https://misskey-drive.m544.net/files/f648b567-9b8a-49d2-b561-17ae1df2837f.jpg\",\n  \"iconUrl\": \"https://misskey-drive.m544.net/files/969b8097-464a-467d-bd88-530058aa9c84.ico\",\n  \"maxNoteTextLength\": 3001,\n  \"emojis\": [\n    {\n      \"aliases\": [],\n      \"name\": \"agooglehearts\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/wiq9ala0rzshugnungggaljt.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blank\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive.m544.net/files/7a699fd6-ea02-45cc-b849-b6ac466b8e04.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsignya\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/j7pkhm6xznuvdb5chi5mwxit.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"boomerang\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive.m544.net/files/0f35cacc-cdb5-468c-b2b6-afc0c5c98848.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"chikuwa\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/kfuqtxbhf28tp94vu7zqsndm.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"erait\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/s7y8a8ra9ynecaj85ljjl6oh.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"gomamayo\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/m3ho7hr9gngy3ftfxd1gq274.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"hinokinobou\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive2.m544.net/m544/xiruqlo5qa8cvbtzje6jb88e.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ifilter_misetehoshii\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/rbyl6501d6lnno857ofxrd8i.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"koishi_smug\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive2.m544.net/m544/icgnkmlfv0t8gpnd818uwmpq.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [\n        \"お淑やかなドール\"\n      ],\n      \"name\": \"mei23\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive.m544.net/files/f1baef28-ca68-41d2-9275-1f02642a7168.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"na\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive.m544.net/files/c382d93c-5bfc-4643-ad13-e28c3a7b43a5.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"pyonpyon\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive.m544.net/files/c63559a9-ab39-42a2-a801-39fd99a4efd6.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"rec\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/4ph3nfmzzui6dl61mn4lompr.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"suggoku_suki\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/17ghqqlx9jrdczm9xyelf1pr.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"wakaru\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/dxfc6tkt0wecri33pxdrlnc3.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"wifi_spot\",\n      \"category\": null,\n      \"url\": \"https://misskey-drive2.m544.net/m544/mssiw2ovdg9oyxn8ipoppooz.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"yabaiwayo\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5bhgfd08wfzvujh7axfc3lsv.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ie_button\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/c4hckxuj4lgnpfj6i3s72xwf.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"kamattehoshii\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/9t1vb0rpp7r9rvwbexle8og7.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"katorisenkou\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/spfwwwxbafaz7erpkgb5lcrz.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"kosyudenwa\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/dyxzb6mysxfr82gbjt8tjn52.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"mine\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive.m544.net/files/d55e8525-f956-4391-ad05-a076551469a4.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"mizuno_haitta_pet_bottle\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/v76qwhydy92x57d6xmrkp4ig.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"nazo\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ct2dg3dywzakfi0royu1fvhd.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"pluto\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lmwdlxfquvksq1qd4hpt8x15.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"saisenbako\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/uq2r0wz1vshra2zvz1cbcvph.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"tarai\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/zby5fy9zdm2hyve435xhy8mc.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"venus\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/k2suz4eqc1b9x4irqobm50li.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"w017\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/weno70pfe0hoqxrh0yvwadx6.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"wakaranaiwakaranaiwakaru\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/mgwcexyghuz6m8fthbx4pd5b.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"wakaranaiwakaru\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5g6j5zv3vohhy70ve4k3syk9.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"wasabi\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/uzox6wpe0sixu4rgd21ot4rg.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"wontfix\",\n      \"category\": \"\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/zxiqx4xmj67i8qrtynfnvi1f.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobdundundun\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/fcjxe6qcxayh3g8unrias8fa.gif\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobkeyboard\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/gckikrufrr4jjfr4ubpf2b1l.gif\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobwobwork\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/0fjmc4wv985b21il238z3vfa.gif\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blob0w0\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xf9i8prc8fwusnoibrz5d5qj.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blob3c\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/oit4svrdhmogafzrxjmtusv5.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobamused\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/huvj47gk56hvvyy2uy2ulppz.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobangel\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/uwgx1ewofh29aq6til78ch5n.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobartist\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/oc9ct6zmw28286bwodeodl5n.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobaww\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/088is6c814uyf3uyzvytil5j.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobblush\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/7uyp5b44bsv50pgsa48panl7.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobboo\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/okxaoaaa4tza8ti8ppw3mwv0.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobbounce\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/y9nltb1e2ysz7l6md80jp96x.apng\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobbowing\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/eqjllgd1u7wl02i0u8uyo2iq.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcamera\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/v3g5r2wty4t0pr9ltot0vslw.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcheer\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/65vf92d08ped9bvt2hl6joxz.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcheerbounce\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ihs1vlxzo8lromd5gdzi0wug.apng\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcheerful\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/emcytp44uhq0y96kpmwn8gfn.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcheerful2\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/6fgzm1dviyh0rynqtjexjskr.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcmereyou\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/gva2g3eoxh0ff4vdadxqok59.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcocoa\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive.m544.net/files/tk4ts1lt55umwih4hvhquolo.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcouncil\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/1yr57s63y824c0lf3ctsuz0i.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcouple\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/l6t80ymzcg3ms8yir1zuo9o3.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobdancer\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/voxfe34jjn377g6vzr4vj7b4.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobdoctor\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/kq3pji3vn5nir7uv6l3c1nw7.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobexpressionless\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/p4c3vd7pb8cboiw157jlicq6.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobeyesdown\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lo07oz6o9e91gcx9pn4zrjez.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobeyesup\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/40l7rkbtgsxup6x1yeo4ovcw.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobfacemask\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive.m544.net/files/2budcn95tn0hxza4a00hnnuu.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobfacepalm\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/fzkia0altfc7smph0vrg9hhs.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobfearful\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/yxz4ksytlspe3vvu0sbnaepw.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobfingerguns\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lmj3tq1zp30y2d1fo37392sq.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobgamer\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/wtf49ge55gu9p2qxvmkcrvqh.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobgift\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/rros9nriv1qi5afwrotyfhx0.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobgo\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lq5xxfuqdmdiqyji3ff3c71c.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobgoodmorning\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/pwq5s42u9b6652j53n3vmnws.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobheadphones\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive.m544.net/files/o1tels16jhg524wgisx71w5r.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobhearteyes\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ongxton93q0fkke9kx3247p5.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobhero\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/r1pp4kp5cshfqmo1fb40i433.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobhighfive\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/0merr3m21naxztfhriybi1gq.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobhug\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/pik1lq0c1bntl42awuyds38z.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobhug2\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/os7b4qszqpc2y3m4550zdbee.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobimfine\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/8euba9ypskqd38ocm1glbjrk.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobinlove\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/7n80wwn7ulzizj3rd02ieg7z.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobkiss\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/0tl36281joiqcw0dolonqzn4.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobkissblush\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/cs9swn65bphbr9k07p6oylsf.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobkissheart\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/92e6uf858tqw69jthhx6jw4f.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bloblamp\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/rardggsetflma9ys173z9we9.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bloblul\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xcgclx70898czdxpl2lpedcy.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobmaracas\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/utal084sif6uwpgfdpe4qpfq.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobmeltsob\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ntpntp2rrb1t79i5fv2uclqe.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobmeltsoblove\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/294ef4d4ml60ws1v3oe9ljx2.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobmindblown\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/f4ns5mcgcz8nq5y450kytyf5.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobmorning\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/sk2vzy882g3y7m6sz9bj5q4e.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobnervous\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/kzkepj2b5wiqvbvvk3rpdkxe.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobneutral\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/86cremomao3gb5lknj5fx2ym.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobnight\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/jym9kac0qtp1rz2xzrrx88ru.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobno\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/cn2yq3af817muj7vzdihnts5.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobnom\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/2d9wctubos9cbx78ghrhbzdj.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobnomchristmas\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ifay2csaixep94v3nepo2p9a.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobnomcookie\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/vximrec5mtipwtxupr4w41eg.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobnomglobal1\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/vplcdse1dgeysju5mpl077bd.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobnomouth\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/sfqhs0btlfym3yhdmhdbpihy.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobok\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/4yxgm0bcc7upu5x7hkfehrex.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobooh\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/t7f49yvp5ov5ljwzostalefp.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobopenmouth\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/03meazo0ojfetztle5vq5v7m.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpain\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/hfh0o1lleu4z7wzdje7o4qrl.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpan\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/0pyjii3fv6enw0p2j8z3lxhc.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpanic\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/bhcirk5oj1i4afpbgc2km231.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpartlysunny\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/88py5b8v905nf2vo80klpvq9.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobparty\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/a7cggxkjvpk7pp2tm0fwr5ia.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpats\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ya2crwcosxrmugamtcfhfd4o.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpeek\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/46scwd9x8det6enminro87fl.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpensive\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lgip1naz8a24zorjhx7xrgdu.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpleading\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/02z5k12qxp40km7kep9atvvl.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpoll\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ek29nw3pu4x8hu40jhf5j4mh.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpopcorn\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/fip04ohh3zuh5ai3cicah0gb.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpopsicle\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/iwohmk6qxjtgyr3rfjwp4u3w.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpout\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lv6z7h0xrblzd9kppr80jfb6.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobpray\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ku7o8gimwervrwdzhqecpjvm.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobreach\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/b2h9yuanjljapedx3ciyf25i.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobrollingeyes\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/pnl56o1ep09wtjto9kqukzd8.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsad\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/d9o5nxqn8jsq07i4h3rjlds8.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsadpats\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/upq3rsrydmieqn64bgwmqo6l.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsadrain\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/uw01r2i5kswb4zqgv0wo4zb6.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsanta\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/x3ncvdsfysm437t41v2a1frl.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobscarf\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/e7q2mqe83zbdwarrbepsqbfs.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobscream\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/sdxagoqcki6clz3b4llpnt4w.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobshh\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/w6pg3xq8tjtyfzht95abowet.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsick\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ors5dskmn4w61hs6tyhby082.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsip\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/asorj3d88tkl4e7z4bjihbln.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsleeping\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qgkuu7agyb0ix2cvjipu4q7b.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsmile\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/dgcjivfrky1dyvb2kx1020c0.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsmilehappyeyes\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ihydh1rbqbq8shxsf5fxqj6v.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsmilesweat\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lh788fwz0rmv9e2x7dzud2yi.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsmiletear\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive.m544.net/files/nwroqweapobkn6qi2651ee7h.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsmiley\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xg3yw8jv0f96kf8vhc9auq2x.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsmirk\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/3vikwl4kl9zzoq3o6foiqdpc.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsneezing\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/d2fbagwzfg6386yiodex0gbr.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsnuggle\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/uedbbvrjxoxddzxgbx2ylowj.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobsob\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/p9m33ltnwyo9752q1wdpgttn.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobspam\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/r4majpyuoc48mpcbk5ppaeks.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobstarstruck\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/t1qg8vl70g4uyl36rszjhrug.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobstop\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/de51pnlkg2tbsylyrh9u1mpd.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobstudent\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5zzzpqq4lxgzkpvrwf7ryd1j.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobthanks\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/sq8y3sn96zmc720dc4bzhhok.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobthinking\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/wyx54knfop04g8741qhyxhm3.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobthumbsdown\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/r40p6o0ggrvkbydiayc9vegn.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobthumbsup\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/u1enlwk5qjfatymc15e0nfhz.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobthump\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/8kftcxp7iap250rv3xe2k0x5.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobtoofast\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/6qocjkf9q27gvw32yukrk7ar.apng\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobtorch\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/88al4mab67zat67jic07nx01.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobweary\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/o9oyipa4pufj6c317nr80shg.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobwink\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/66dnorm4owl7qhbcai942bq8.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobwitch\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/s7jw5e6wl90gw1mucykwytb4.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobwizard\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5delu7funm1h0mjwc2ef66ex.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobwoozy\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/isnuf7aqp7ys61vnwoxeg328.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobyawn\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/0yw7s66wiitnwqdpyeqpb9za.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobyes\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/wldqy7ujw9zhdzqkc3c8aflk.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobyum\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/lccjv26cqn9z9im529y152if.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"pumpkin_owo\",\n      \"category\": \"blob\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/7gabzxbbinseat9jf4nxn5e5.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobcatattentionreverse\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/us2y9gmih3tolt4m6t14ttao.apng\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobcatcoffee\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/r91cgvn4h7d2od376yid4ofw.apng\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobcatreachflip\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/hmn50j42fcdiw0yhabfjt0b0.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobcatsnowjoy\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/o2z0z6wfgbb2eznlivhlpnh6.gif\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ablobcatsweatsip\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/3s1pw6pepmd2kisk5645wqvb.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcat\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/pf48xsa2ill6dyfebcncw9s2.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcat3c\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/aupdvfdjgxyr218yzgcqixbb.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcat_banban2\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/394z7066fnjrzbzhfall5o82.apng\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcataco\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/6x7om0lna99qo47o663r6gy9.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatangry\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/rb85xd39iej0ao795gh6b6jg.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatanime\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/6fhx2n2j9iuddpej6gq81sy1.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatartist\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/1exl5vplgc9ksrts1orf6327.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcataww\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/60yropaxcyzfnltageqranmk.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatbath\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/eppxrs9gltjarq9gldpzxi5m.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatblush\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/pmktbw8cujcv4umq1m2tsjsh.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatbounce\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/dxm4x5cn4me6ay5kx6mzu2dr.gif\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatbreadpeek\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/7oety7ehdsty2nib0br0zm7x.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatcandycanenom\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/hcszu2f61u75x1uu711csw5i.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatcoffee\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/rutjfiq1ep4d84c4zsqf879v.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatcomfy\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/is97jb5h4vesn7ugaaa8d6m8.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatcooljazz\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5dt125bi5lo01jvqqshpg3dj.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatcouple\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/w70hi457lgbsx4m4a5skngfz.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatcry\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/zcj6iwsig8iw4c9r29cegarn.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatdead\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/k7f9w8x4du12nrpdy8lbah1t.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatdefecit\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/zu549hz2pn1ukjsdyhed8ex8.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatdroolreach\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/7uvpft4cgpo701o22lx8o6cv.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcateyes\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/bmw9p0lm9u7v6p29qg41p5a1.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcateyesblush\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qxrc4mkocf666yfakdz2zaxo.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatfingerguns\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/l19oa1v1lmb6o9qd9fqh7bao.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatfishnom\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/h8f0crekkbv8htmuk5i2yaya.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatgamer\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/33po5wq73ed3i5wzs7q0vsym.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatghostdead\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/090d6lv0i1j5b3d73hzqugjz.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatghostreach\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qeugy9pc9q90am9ug971oky5.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatgiggle\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/goar7j3ba6ebuwname9opzko.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatgooglyshrug\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/1slpzhoj014x7g8pif4l2gxa.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcathappy\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/r1dfgv6k6tjqf6cf1p913lqv.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatheart\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ohdls6n8mmuvcj08dgc62c01.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcathearteyes\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ybxc8hmz0rkc7f98tx4zinft.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcathighfive\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/hcq511sfixle7021bop7duq7.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatindelight\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/4974i8rmml3hmexj98na9uxe.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatknifemeh\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/mprugzkk452nn1eg7vzwrqto.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatlaugh\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/8lrqwg8geeutrccwuw2vk0q7.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatlove\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/wfawy1gbh80gsdf6vn7rihqc.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatmelt\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/g6rfzpu3kku09oy78wgdmiuh.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatmeltthumbsup\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/d2xmyud6ucsr1ymzwmh0li8r.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatmorning\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ppcd4fv9ozhi61qaaamddqiv.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatnom\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/isg3ur3dsu2869zr0e1iemg7.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatnotlikethis\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/t2jmxpwjymwv2qeipo4bmtkh.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatnuu\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/dzkm152l6oup00966l8lsick.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatowoevil\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/8412dnp5rz78q5b7wjjaeg7r.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatpan\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/zp7mq0nsi3wbingpfiqbfxwc.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatpat\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/kl1rieo0lugs8kuqvmfvk3eq.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatpeek\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/jfm3ayx71ypu8fr1vk011e0g.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatpizza\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/aj37bl3lvxr1kw04o0whenjm.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatpleading\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/h4v7i82ovpdcof9ccise6kjj.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatpopcorn\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ga55hmzc2bajeuueozreg40q.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatpumpkin\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/dexvo50tqyyp63r9vt1xlkwk.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatreach\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/fnoyudvg01zh1sr1l3ax9hw3.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatread\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/gpg7n7kzlfede2u651odrjcm.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsad\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/a7cbntsup0skxrrctx4lxjyu.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsadpats\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/pqf8mhgzdrb9qm6m0qtg4tj0.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsadreach\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/7zx7nfvn11tuse17lgk55o06.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatscared\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/wt8g4noqxva1kawlyix4mt15.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatshy\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/f4v5vdmhmjh1nuh6j4krbply.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsick\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ris1681zwu3chd281j6gad5h.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsip\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/d86mkip9mk8o8r6mdkawsp0f.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsleep\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/zs4d0254igenw163l6f96dei.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsleep3\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/8rsy525nn8rhhsagvp4qyvb1.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsmug\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/rxn8o96zceyoj203unyj4y68.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsneezing\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/t1qc74q12fqrdkgxs0kiunzn.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsnuggle\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/o9cc2lk1ju0ulyzalwfbnnw1.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsurprised\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/99qlgqsnigg8xj5sazi6buti.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsweat\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5ayhkwjk51dl6vmy1k7cphs7.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatsweats\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/zfdn0gy7po1lpkpfeg54crtn.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatthink\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/r4ksn3pwmt0gtoftalljqedv.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatthinkowo\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/k53mdu4pdr6uqoodp1ihse6q.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatthirst\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/o25x8v6iq71w43lyq3tia701.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatthumbsdown\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/a9l4vk2mbfjq4nd37qjbizxb.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatthx\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/71h8b0d33mcsiviyqdtyiv82.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatwave\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/1a4ox3hc0h781adhng2292ml.png\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatwitch\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/d7khloywy5o70i2ytlkmfsfz.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"blobcatyandere\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/sncy6emojii6ye4nc4owybz0.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"meow3cSmirk\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/y6fa8vjzrur34i20exqjcjvq.png\",\n      \"direction\": \"left\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"meowhuggies\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/re4hrijv5rfs2ezjfxvuybjq.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"meowpraise\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/bqt7hpyp35jphwfvnb1wei0z.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"meowshh\",\n      \"category\": \"blobcat\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/85lqabaw2rr09acqcgk77739.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"abunsmile\",\n      \"category\": \"bun\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/b9bjrgd0opbdt1iuoao76yrv.apng\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bun\",\n      \"category\": \"bun\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/3ma0llhcn6dgexb98vkddmgx.apng\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bunlove\",\n      \"category\": \"bun\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/j3ghovg1n95cdfpurxsdtve0.apng\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bunsmile\",\n      \"category\": \"bun\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/2cm8do0njjpijqj1dlvwqpru.apng\",\n      \"direction\": \"right\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_cats_eye\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/156t0hw9snv6mpkhkpp0m6do.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_cats_eye_blue\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/jhvbwm2gat1o1cbznxsa8hjj.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_closing_eyes\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xbjar2kp7splrpnrwn3pbpqi.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_cry\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qsi69qggrugmj5hosnpm2ygp.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_fish\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/buri6nn3rq1xt8hh3fdcdsot.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_frowning\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/o43io30zv5emvz5swozqejuj.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_ghost\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/r4ctdvxazmfvj3i5aauvew7o.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_ghost2\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ep0pw6eky881wcijiuast34j.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_ghost3\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/2hze9dd3x7k4ksoa1rihcgc0.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_ghost4\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/j9uryajh4idq1408wa27ytzo.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_ghost5\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/mfef9qe28dacy1t8jwkeyfa5.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_glasses\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/k4iqngdvadzwjydp6gs75ej8.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_glasses2\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/1dssad3uzhgimscm30cn6c1r.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_glasses3\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/fb24c7uw17ales8pl4b9g8af.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_glasses4\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/a2zzgukqzqmehy8vg3aw6p7e.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_gray\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qx0wmd612kenrx8a1tx5p3gd.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_neutral\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/96y211nex7vzfm7ubdfwb8gq.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_nyaan\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xpaw7ix0ox2jgnyarc7fvx4n.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_oinari\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ktt89w8tvxtwqjcdea74zs2h.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_relax\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ilfajs3h6xo0g19kn7f7z16g.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_roling_eyes\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ufbminosxjwpexde2w5kl56h.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_roling_eyes2\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xjpj69akpt2wzuzp9r4t05oa.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_sad\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/khqf70kuy8d101re3lzkueei.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_siam\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/arljq5mlxsmyn7e236piam7z.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_sidelong\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5attjdmpln29omzmmqv3czpm.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_smiley\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/eayu6tsxp8qzy2ajacyz2nvo.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_smirk\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/bv6i8ds2alvi62bzt7n1spv3.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_star_eyes\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/13ieasfl1tp9aynxzibz8kpw.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_sunglasses\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/7imx6nyo2d8rgvh6359eza3n.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_surprised\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xp8w8lfh5f3fopxfnz2x6cfy.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_sweat\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/z7wh9f6im7gypy5m6bn4kxyg.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_thinking\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/mrrxl1bbyppi4wzysmmn74xz.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_thinking2\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/me1lwctp6jth9rhvw52tw07k.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_tired\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/17q1h3lozu35gel45xpchk1z.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_tired2\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/mwmhbwffww1vsggep57dc5ut.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"neko_xd\",\n      \"category\": \"neko\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/6a4c3rj7702zygsmsn591r8d.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_a\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qzeq0tol6tuzi6mlhfn7zri2.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_a2\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/arknkzkdbvbflic1y406773n.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_biku\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qxthrklkq0ri2s1nx12lmuvu.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_biku2\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/d6ka9i443welhoose9c65j4e.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_haahaa\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/1q5wquhbylp9elk8h18ci2d4.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_heko\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xggwzsujfexlp80wctnd1yrg.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_kyun\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/vb6phj5zalkrxk3zyll9qarb.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_ltu\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/gtkr8jjwb47k8fcsvyt4idsq.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_n\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/asygwpssuiyb1tfo37qb29t8.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_n2\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/w9abr7840wg3vocya6a6lub1.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_n3\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ei336daq9xvu0dzx8oxt789b.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_o\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/nvbg24e5ppgyw82zpo32ynms.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_suri\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/94exbo3h07gxv4xnb7g96n0i.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"eti_ziwa\",\n      \"category\": \"えっち\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/tqc1yxmqpzpw3oez9kitdpb5.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be007\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/p91c9abtjgehqontfqhe3nax.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be016\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/axk724vp3l16lorvogonijce.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be023\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/3o4eueafixmavdj9qzld7r4w.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be030\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/k5j3bjv2jzo5qlstf6axqlk5.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be031\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/np54sfgpvnuplgqhw4v3tf05.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be032\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/jxxmomchbuuz6pz6itchl291.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be033\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5uv6ew78hdzdcpukuav7308p.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be034\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/8lv99ksn1nke6142uxveeney.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be035\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/xzkr61skrmhe5qwrd2nih5u4.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be036\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/8td9l4o0t7t3j6z5il39lpwe.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be037\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/z7lkniag1y3w8x94zbrpilsu.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be038\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/y8pzha8takruycmxsplil3or.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be039\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/02v77npqu6815ehcgk76qci8.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be040\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/4bqkm3nc1h773q6b5ynvnya6.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be041\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/524aqxn2gfjdwolwid9ukwx0.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"be042\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/gvy27g7fqsdj987u6sd5kafa.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"kaenbeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeam\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/m91tx29yaesjh0d2x2en5mch.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"rose01\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/1g3bvh3t67gvbft7kxif6j3w.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"rose02\",\n      \"category\": \"エフェクト\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/x8o68m3q6g9rg6jdn02zbgf8.apng\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"nicoru\",\n      \"category\": \"サービス\",\n      \"url\": \"https://misskey-drive.m544.net/files/be3c7ae6-0137-4751-9054-5e6ff5c771d7.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"nicoru270\",\n      \"category\": \"サービス\",\n      \"url\": \"https://misskey-drive.m544.net/files/7d1836b4-cd1d-4754-913d-bc76f79546d7.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"tohyotalk\",\n      \"category\": \"サービス\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/cm76sc4vabnxeqs14mb83c0z.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"twitter\",\n      \"category\": \"サービス\",\n      \"url\": \"https://misskey-drive.m544.net/files/63fd1429-6ea9-408e-94d3-a7196a5c0930.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"youtube\",\n      \"category\": \"サービス\",\n      \"url\": \"https://misskey-drive.m544.net/files/b8b8903b-ad74-4029-b44d-2fa114438598.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cero_a\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/db0b2289-0a3e-4c99-a5f8-ee6f1cdf676f.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cero_b\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/5e6d5b0c-053f-41ad-9553-80ad9e5cfd20.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cero_c\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/644b4085-7435-43e1-bd1d-387f208efba4.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cero_d\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/90011317-71f7-43c9-9b93-d938b9b34ce4.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cero_z\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/de3808f0-f01b-477a-aad7-e0f99d8e7b57.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cerox_kyoiku\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/534a1afc-da2d-443c-8db9-d5fe6aa035e2.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cerox_tekigo\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/9201b9be-b617-4bdf-b039-f7182145e94d.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cerox_yotei\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/85a99a24-4ec4-4a07-bedb-ec40bd61346b.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy1_love\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/8fbaeb41-e3fb-4e0c-82ca-b8147033d4e9.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy2_sexual\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/160282f3-f0f4-4c7c-9169-7935945e6690.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy3_violence\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/5b06ca00-7b8b-45ff-bce8-44f900501935.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy4_horror\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/27f21b45-55bd-4e04-bfd2-c613aab864b9.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy5_drinking\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/e8086428-a5f2-4560-88a2-726efa48d3cb.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy6_gambling\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/d374aafc-c635-440b-9e7c-a0c044757b9c.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy7_crime\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/6cfc8548-96d7-4464-b137-4a50f01741e1.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy8_drugs\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/f5412977-3ce9-4b39-8c75-44dbc774b718.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroy9_language\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/e1af9fc7-90d9-44cf-9b4f-56457e9fd258.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroz_0\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/92dabe0c-84a4-4377-97aa-7044f3bece5d.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroz_12\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/4065c001-e852-413b-8d40-2c89fc457f11.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroz_15\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/1fc5b7b2-d807-4d34-be75-625a8fbab452.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"ceroz_18\",\n      \"category\": \"レーティング\",\n      \"url\": \"https://misskey-drive.m544.net/files/19988447-a973-4f6e-8a9a-4947f56ef430.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_battle\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/1cc7c135-0523-4a13-9198-53bfdbcdc322.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_bread\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/e8f69949-ba0d-49a9-ba90-277456c136ed.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_bubuu\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/ffef3d33-91f6-44a8-bfc2-42fe36bedeeb.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_calc\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/30639419-74b7-4a3a-b9cf-b804b580aa6c.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_encount\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/0f0e0d75-8ccc-4956-832c-b4d119bb5c62.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_get\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/03693f1b-57cc-4cc8-925e-730115dc1f9b.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_kirakira\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/b849c116-6e27-42f7-a768-c988a68dbcef.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_niku\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/38df460c-5c8e-4660-b192-09a32fb5e0f0.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_pinpon\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/63520602-449a-4229-ae41-0332bcc351ae.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_player\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/aaa97899-3a56-4dae-a065-682efa7116a1.png\"\n    },\n    {\n      \"aliases\": [\n        \"stat_sake\"\n      ],\n      \"name\": \"stat_sake\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/fd066c3a-4ef2-4aec-bbfd-3e6d5558cd0d.png\"\n    },\n    {\n      \"aliases\": [\n        \"stat_sing\"\n      ],\n      \"name\": \"stat_sing\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/d70b1cbd-91e4-4569-b964-3cf914630d2c.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_star\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/e94ab98b-697d-48fe-9afb-c943f24301cc.png\"\n    },\n    {\n      \"aliases\": [\n        \"stat_sweets\"\n      ],\n      \"name\": \"stat_sweets\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/f4cadacd-c618-483a-b690-17d3e4a5ce05.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_target\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/aea5e854-3279-4c79-a8f1-757e4ac16560.png\"\n    },\n    {\n      \"aliases\": [\n        \"stat_tea\"\n      ],\n      \"name\": \"stat_tea\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/465fb749-9dd6-48ce-8574-3279850eb294.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_tere\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/3ccf3de2-6e92-4c52-a4d6-b04885e77369.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_unko\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/05582799-b722-406a-a52e-4ade9b2fcb84.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stat_zzz\",\n      \"category\": \"吹き出し\",\n      \"url\": \"https://misskey-drive.m544.net/files/1f959ec7-94cb-4350-8825-66d2f28b919c.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"chiba\",\n      \"category\": \"地域\",\n      \"url\": \"https://misskey-drive.m544.net/files/8bgq4pl5isrkvgf5cf2msvhu.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"hokkaidou\",\n      \"category\": \"地域\",\n      \"url\": \"https://misskey-drive.m544.net/files/3fe0487e-f5a8-46f5-9df9-2dfd53252473.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"kanneiyahataseitetsusyo\",\n      \"category\": \"地域\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/88yrd8q0qwa7fjkebhhi3n4e.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"okinawa\",\n      \"category\": \"地域\",\n      \"url\": \"https://misskey-drive.m544.net/files/3e62cd97-c510-461b-a67a-65f03ddecf50.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"air_conditioner\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/e0cdc792-c9f0-49ad-b8ea-e7818f3b28e2.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"circulator\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/c3592f2c-4871-4541-9be7-b050ebf9c2ba.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"fan_desk\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/64ebd7e2-6a59-4691-9be6-4da49dd3b8dc.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"fan_no_blades\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/8524d782-b027-4a63-b3d5-2c9068176820.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"fan_wall\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/3d37af72-7997-4d52-b7bc-15d7d8ef91ad.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"halogen_heater\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/45f681d3-acc4-4de1-a838-339120842f2c.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"kankisen\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/408f4fc0-6067-4a98-8d22-cd5aff00cad0.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"reizouko_b\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/fe74f98e-5eb9-46d3-a6d0-b314749027c9.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"shitsugaiki\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/0e855e63-e2eb-4be3-80e1-6b5abc3f4891.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"stove\",\n      \"category\": \"家電\",\n      \"url\": \"https://misskey-drive.m544.net/files/64ffda37-599a-425d-a599-7d4357229c06.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"dpr\",\n      \"category\": \"旗\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/yqu436flkydml62j60e7hqqs.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"lpr\",\n      \"category\": \"旗\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qxx8rzx8pc5bf9yrq3s7mdo5.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"moldavian_ssr\",\n      \"category\": \"旗\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/0w10v4t0mw01ti6wmtyj3zav.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"su\",\n      \"category\": \"旗\",\n      \"url\": \"https://misskey-drive.m544.net/files/t4e9yaxiz3j9z3w5kr179uty.svg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"long1\",\n      \"category\": \"旧\",\n      \"url\": \"https://misskey-drive.m544.net/files/52033582-e9dd-4599-a0f3-7c403012885f.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"cymbal\",\n      \"category\": \"楽器\",\n      \"url\": \"https://misskey-drive.m544.net/files/c1e4434a-dc94-4815-a85d-50857679b8aa.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"gakki_case\",\n      \"category\": \"楽器\",\n      \"url\": \"https://misskey-drive.m544.net/files/88c80017-7a18-4274-ac58-a48e1d4106d4.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"vuvuzela\",\n      \"category\": \"楽器\",\n      \"url\": \"https://misskey-drive.m544.net/files/ad25ebf7-16c6-4f03-82b8-c93c9b79d180.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"aneton\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/5ql6aw6hky0ldavn1zttmn86.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bron\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/y52u2f3ny3r16ovpy561c0v2.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bron_box\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/qt9d7wj3y56am7osrmv61nng.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"bron_caution\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/afoi8e18lrr5c47nweb5ocei.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"contac\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/a5w6q6g3r8eaiei9i2sqd9hj.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"dan\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ea5nugllfcgjznswgaq4c1gr.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"g_pub\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/q77tlv23popdsgq8ciynvh6j.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"medi\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/usd473zn58htbzya4kx9sfap.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"restamin\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/tz7oz9agupkqkrp5jjgr0q1h.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"smoca\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/soopf8iq17p6yf7z9c6jquul.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"tonin\",\n      \"category\": \"濫用等のおそれのある医薬品\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/j4jd3ke3wmr6myxnhvx8se2v.jpg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"beer_blacklabel\",\n      \"category\": \"食べ物\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/iawye47qvud25c3meil92rc6.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"beer_nodogoshinama\",\n      \"category\": \"食べ物\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/i152iohvm4292er4w4eg2bul.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"soup\",\n      \"category\": \"食べ物\",\n      \"url\": \"https://misskey-drive.m544.net/files/1a0abb06-167d-4d3e-89de-1d6caf7241d4.png\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"yuzu\",\n      \"category\": \"食べ物\",\n      \"url\": \"https://misskey-drive.m544.net/files/4481099d-ad82-457a-a76c-efe774840071.svg\"\n    },\n    {\n      \"aliases\": [],\n      \"name\": \"kaenbeamp\",\n      \"category\": \"🀉\",\n      \"url\": \"https://misskey-drive2.m544.net/m544/ndbk807t6fo8lwl7u46y5r5j.webp\"\n    }\n  ],\n  \"enableEmail\": true,\n  \"enableTwitterIntegration\": false,\n  \"enableGithubIntegration\": true,\n  \"enableDiscordIntegration\": true,\n  \"enableServiceWorker\": true,\n  \"proxyAccountName\": \"ghost\",\n  \"features\": {\n    \"registration\": false,\n    \"localTimeLine\": true,\n    \"globalTimeLine\": true,\n    \"elasticsearch\": false,\n    \"recaptcha\": true,\n    \"objectStorage\": true,\n    \"twitter\": false,\n    \"github\": true,\n    \"discord\": true,\n    \"serviceWorker\": true\n  }\n}"
  },
  {
    "path": "modules/model/src/test/resources/v12_meta_case1.json",
    "content": "{\n  \"maintainerName\": \"Misskey HQ\",\n  \"maintainerEmail\": \"https://go.misskey.io/support\",\n  \"version\": \"12.110.1\",\n  \"name\": \"Misskey.io\",\n  \"uri\": \"https://misskey.io\",\n  \"description\": \"Misskey.io は、地球で生まれた分散マイクロブログSNSです。Fediverse（様々なSNSで構成される宇宙）の中に存在するため、他のSNSと相互に繋がっています。\\n<br>\\n暫し都会の喧騒から離れて、新しいインターネットにダイブしてみませんか。<br>\\n<br>\\n<a href=\\\"https://go.misskey.io/support\\\" target=\\\"_blank\\\">お問い合わせはこちら<br>https://go.misskey.io/support</a><br>\\n<br>\\n<br>\\nPowered  by Misskey\",\n  \"langs\": [\n    \"ja\",\n    \"en\",\n    \"zh\",\n    \"ko\",\n    \"fr\",\n    \"de\"\n  ],\n  \"tosUrl\": \"http://go.misskey.io/tos\",\n  \"repositoryUrl\": \"https://github.com/syuilo/misskey\",\n  \"feedbackUrl\": \"https://github.com/syuilo/misskey/issues/new\",\n  \"disableRegistration\": false,\n  \"disableLocalTimeline\": false,\n  \"disableGlobalTimeline\": false,\n  \"driveCapacityPerLocalUserMb\": 51200,\n  \"driveCapacityPerRemoteUserMb\": 10000,\n  \"emailRequiredForSignup\": true,\n  \"enableHcaptcha\": false,\n  \"hcaptchaSiteKey\": \"95d75440-7e37-4419-a693-8f52c377f1c5\",\n  \"enableRecaptcha\": true,\n  \"recaptchaSiteKey\": \"6LfW8qQUAAAAAI_1WMThmcj6zO39laasAoEJHfFF\",\n  \"swPublickey\": \"BHqCPVsCM8pMUo26Fenl6fuLPfuqQTNeo2Rpvt6KFxFEKznKAXZBHI2nk1aAanlJ1Me_PSr-MVkW3ho4RaYmZpk\",\n  \"themeColor\": \"#86b300\",\n  \"mascotImageUrl\": \"/assets/ai.png\",\n  \"bannerUrl\": \"https://s3.arkjp.net/misskey/65b25d3c-2ae4-474f-b1c0-050c8c8962e1.jpg\",\n  \"errorImageUrl\": \"https://s3.arkjp.net/misskey/94aab3c5-0b26-42a7-9fa9-83a69d7253cd.png\",\n  \"iconUrl\": \"https://s3.arkjp.net/misskey/webpublic-0c66b1ca-b8c0-4eaa-9827-47674f4a1580.png\",\n  \"backgroundImageUrl\": \"https://s3.arkjp.net/misskey/8ac31f1f-aaa1-4685-bdda-91c1f7108d12.jpeg\",\n  \"logoImageUrl\": \"https://s3.arkjp.net/misskey/31240fa8-98fa-4750-bfd4-767753d1c48d.png\",\n  \"maxNoteTextLength\": 3000,\n  \"emojis\": [\n    {\n      \"id\": \"8vzym6uouj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_acid_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/85d25c23-7388-45cc-87c7-c4aa6ce93c5f.apng\"\n    },\n    {\n      \"id\": \"8vzym78kv0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_embarrassed_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-908ec93c-6ca8-4c02-bf35-23db72776598.png\"\n    },\n    {\n      \"id\": \"8vzym6dyud\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_late_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1796f176-3f30-4140-a52b-3f5e9ae1a28e.png\"\n    },\n    {\n      \"id\": \"8vzym728un\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ainers_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ea176d9b-a92a-4ec2-b11c-defdac551156.apng\"\n    },\n    {\n      \"id\": \"8vzym7rtv8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_panic_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0ef81dc5-7289-489e-9570-8042fd821a1e.apng\"\n    },\n    {\n      \"id\": \"8vzym6nluh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_petrified_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-116a8356-ec82-47f6-a147-64bae8abc86d.png\"\n    },\n    {\n      \"id\": \"8vzym7j5v4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_pointing_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-943369f4-1b88-4117-a7ba-1512fe69bc1a.png\"\n    },\n    {\n      \"id\": \"8vzym7oav6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_psychedelic_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8135377b-84e1-48b7-8c65-80bebf6d55c8.png\"\n    },\n    {\n      \"id\": \"8vzym83nvc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_serious_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6daa8f45-533a-46a4-b0ae-cf789f284d73.png\"\n    },\n    {\n      \"id\": \"8vzym6ihuf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_sign_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2bf76563-c330-4c7a-bfd5-dcb5346a37cc.png\"\n    },\n    {\n      \"id\": \"8vzym6zbul\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_smile_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-06e1874f-ab67-42cc-a90d-4206e09ed518.png\"\n    },\n    {\n      \"id\": \"8vzym7xbva\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_space_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-93718144-0e49-4296-8880-7192a812708d.png\"\n    },\n    {\n      \"id\": \"8vzym861ve\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_tired_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e176eb40-037f-408b-9770-294bae294a39.apng\"\n    },\n    {\n      \"id\": \"8vzym7dpv2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nouhin_kannryou_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ca66fd29-a26b-4f13-95d2-27bb6bbaa4b9.png\"\n    },\n    {\n      \"id\": \"8vzym8axvg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nouhin_shippai_misskeyio\",\n      \"category\": \"00 Misskey.io Original\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1a1273e3-d769-4f6f-be14-cdad0ec521f7.png\"\n    },\n    {\n      \"id\": \"8vzyh5jfvd\",\n      \"aliases\": [],\n      \"name\": \"rec\",\n      \"category\": \"Behavior\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-56785103-2e1a-41b6-8274-c3df636ff9e6.png\"\n    },\n    {\n      \"id\": \"8vzyj5f6od\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobaww\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/36e38fca-8bb1-4e21-999f-796c4695b76e.apng\"\n    },\n    {\n      \"id\": \"8vzyhts35v\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobblewobble\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/4c8a2a34-451a-4dcb-9da7-f1205f3b7279.apng\"\n    },\n    {\n      \"id\": \"8vzyl5snfo\",\n      \"aliases\": [],\n      \"name\": \"ablobcatblink\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d8ccc64a-949a-47ed-ab2e-e27fc3d48028\"\n    },\n    {\n      \"id\": \"8vzyl5v1fq\",\n      \"aliases\": [],\n      \"name\": \"ablobcatblinkhyper\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c1d1be32-f3c3-4c60-9509-cb690b7935a8\"\n    },\n    {\n      \"id\": \"8vzyitvujo\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobcatcoffee\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/aab07d96-45fa-48e6-9e63-5c50a39d3286.apng\"\n    },\n    {\n      \"id\": \"8vzyitorjk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobcatcryingcute\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/b90b23ac-432d-4bd2-9e58-8ee6980f5595.apng\"\n    },\n    {\n      \"id\": \"8vzyjas7ra\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobcatfloofpat\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f0300925-8286-4a3e-9184-92af0a837ebd.gif\"\n    },\n    {\n      \"id\": \"8vzyk4pm4z\",\n      \"aliases\": [],\n      \"name\": \"ablobcatheadbangfastultra\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/bc67e27b-8137-4a9a-8bba-8ea8abd9ecd8\"\n    },\n    {\n      \"id\": \"8vzyil63g2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobcathyper\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e3b8e689-84e1-4e4e-b3e0-53a052818f32.apng\"\n    },\n    {\n      \"id\": \"8vzyk4qo51\",\n      \"aliases\": [],\n      \"name\": \"ablobcatphotobomb\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/4bc07f25-9115-4f66-b032-6f1078d70000\"\n    },\n    {\n      \"id\": \"8vzyl39aeg\",\n      \"aliases\": [],\n      \"name\": \"ablobcatreachflip\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/aad979c2-5fd6-4e14-af78-8c05e71bc6ac.apng\"\n    },\n    {\n      \"id\": \"8vzylmadn1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobcatsweatsip\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/04f5b293-976b-4088-8df4-5dc47e14c7b1.apng\"\n    },\n    {\n      \"id\": \"8vzyjawtre\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobcatwave\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/6c29c4ff-e123-4233-9729-a838ecdbfe55.apng\"\n    },\n    {\n      \"id\": \"8vzyl1xqdu\",\n      \"aliases\": [],\n      \"name\": \"ablobcatwhackyfast\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/808cfb67-7551-40fd-af38-176bdf886486\"\n    },\n    {\n      \"id\": \"8vzyhtun5x\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobdj\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c904eeb5-5fcb-4c6a-8d99-f9b0a67ddbee.apng\"\n    },\n    {\n      \"id\": \"8vzyjz4i2l\",\n      \"aliases\": [],\n      \"name\": \"ablobdjslow\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/8ccbea5d-e859-47b3-ad33-f3a48e5f9dcd\"\n    },\n    {\n      \"id\": \"8vzyhoj43b\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobdundundun\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c62c5cef-b9c0-4d8f-b0ce-2e2a358abe9a.gif\"\n    },\n    {\n      \"id\": \"8vzyiu4ujs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobgoodnightreverse\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d10569e6-047b-45b4-a038-bef6df5e6254.gif\"\n    },\n    {\n      \"id\": \"8vzyhtq35t\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobhype\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/83888d2a-bbb1-4ea7-967d-afb5209fa6dc.apng\"\n    },\n    {\n      \"id\": \"8vzyjz7x2n\",\n      \"aliases\": [],\n      \"name\": \"ablobkeyboard\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3fdb0686-33dc-4a14-9c89-c43dd5427216.apng\"\n    },\n    {\n      \"id\": \"8vzyhu7665\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobpeekjohnny\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/becbf002-ab3d-4b51-8fff-f245a3e3cb58.apng\"\n    },\n    {\n      \"id\": \"8vzyjam8r4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobsmile\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/23bd5305-d5df-421a-88c5-eb5a9a770ccf.apng\"\n    },\n    {\n      \"id\": \"8vzyj80pph\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobsmilehappy\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/4681779c-3d6c-4802-808d-c22fa7ba24d6.gif\"\n    },\n    {\n      \"id\": \"8vzyjcfps8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablob_spinfast\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0be2e111-f2e8-4f2b-83cb-0a6cc150b2c9.apng\"\n    },\n    {\n      \"id\": \"8vzyjappr8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobthinkingzerogravity\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/8c451df9-ad0e-4b6a-9580-f856be9b6173.gif\"\n    },\n    {\n      \"id\": \"8vzyibafde\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobwobroll\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/48c79a3e-fd23-48d2-a167-cc3c75e5471d.gif\"\n    },\n    {\n      \"id\": \"8vzykxkqbj\",\n      \"aliases\": [],\n      \"name\": \"ameowblink\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/4d1f45a2-edea-46cd-b0c6-e0f79a8c9c89.apng\"\n    },\n    {\n      \"id\": \"8vzykxndbl\",\n      \"aliases\": [],\n      \"name\": \"ameowblinkreverse\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/13da4bac-1558-4f81-b3bc-94e5121d1529.apng\"\n    },\n    {\n      \"id\": \"8vzyhtwi5z\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ameowbongo\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0d907ba1-e820-427d-80b0-205603537432.apng\"\n    },\n    {\n      \"id\": \"8vzykxybbr\",\n      \"aliases\": [],\n      \"name\": \"ameownod\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f495b083-8fcc-4a08-b337-83810a0e73a9\"\n    },\n    {\n      \"id\": \"8vzyl2fne2\",\n      \"aliases\": [],\n      \"name\": \"blabcatbea\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-68faa52d-3d66-4ad7-85b4-44810f32bb20.png\"\n    },\n    {\n      \"id\": \"8vzyj9ntqd\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blabcatpeek\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b93113ba-6a9a-43e8-96e4-0b9a17bd504c.png\"\n    },\n    {\n      \"id\": \"8vzyk0zg3h\",\n      \"aliases\": [],\n      \"name\": \"blabcatverified\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-70c5be62-36ff-40a5-9dd8-9f9cadb874b0.png\"\n    },\n    {\n      \"id\": \"8vzyjzis2t\",\n      \"aliases\": [],\n      \"name\": \"blabcatverifiedfake\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-65162cbc-9dc7-4482-b9d2-71b2be891f66.png\"\n    },\n    {\n      \"id\": \"8vzyk6cw5q\",\n      \"aliases\": [],\n      \"name\": \"blebcat\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1e3b98da-b6ef-425b-8583-fb1ef9d7a143.png\"\n    },\n    {\n      \"id\": \"8vzyk3w94n\",\n      \"aliases\": [],\n      \"name\": \"blob_bongo_cat_keyboard\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/cc1719b9-9561-4f26-9e0a-903318941ae7\"\n    },\n    {\n      \"id\": \"8vzyl337ec\",\n      \"aliases\": [],\n      \"name\": \"blobbroken\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-077b0b23-84e8-419e-8ce3-b5aaa923024b.png\"\n    },\n    {\n      \"id\": \"8vzykcjk8c\",\n      \"aliases\": [\n        \"blob\",\n        \"かめら\",\n        \"camera\",\n        \"カメラ\"\n      ],\n      \"name\": \"blobcamera\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-20cedef7-b1d2-4fb2-80b2-6bbf64c64fef.png\"\n    },\n    {\n      \"id\": \"8vzyl2ske8\",\n      \"aliases\": [],\n      \"name\": \"blobcataco\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-16c2f06e-72c9-471e-bec2-44bec6879662.png\"\n    },\n    {\n      \"id\": \"8vzyj8ixpp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatartist\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-98409120-09f7-47d4-b6eb-52496a5bbfde.png\"\n    },\n    {\n      \"id\": \"8vzyjwdk1n\",\n      \"aliases\": [],\n      \"name\": \"blobcataww\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a0c058a5-5e63-4fe1-b113-cd2ab1deeb84.png\"\n    },\n    {\n      \"id\": \"8vzyktn79w\",\n      \"aliases\": [],\n      \"name\": \"blobcatawwpat\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/51d8114b-209b-456a-8d2c-a92ebec3acdf\"\n    },\n    {\n      \"id\": \"8vzyjblhrs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatbigsob\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3b17a1dd-cc19-43e6-8e7b-0bb233701f27.png\"\n    },\n    {\n      \"id\": \"8vzyjb22ri\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatblinkrev\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/bc6cae47-1a23-4fe2-9273-5593ed420ad5.apng\"\n    },\n    {\n      \"id\": \"8vzyj1c1mt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatboopblush\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b1e20e2d-4ec3-46fb-bb90-513ec5c51e58.png\"\n    },\n    {\n      \"id\": \"8vzyj8sxpt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatcofesip\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4e585222-4ce7-4bd9-8f8e-eae3a2183516.png\"\n    },\n    {\n      \"id\": \"8vzyl3nlem\",\n      \"aliases\": [],\n      \"name\": \"blobcatdroolreach\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-075124a1-5f71-4768-ba9f-8f5e1f5e485a.png\"\n    },\n    {\n      \"id\": \"8vzyixi1la\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatevil\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-71695c34-1e8e-4664-b8fc-45ec6a43f5ad.png\"\n    },\n    {\n      \"id\": \"8vzyjjbtv1\",\n      \"aliases\": [],\n      \"name\": \"blobcatflip\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e4e4210c-49c0-4f46-9e00-48309a14c47a.png\"\n    },\n    {\n      \"id\": \"8vzyl3s9eo\",\n      \"aliases\": [],\n      \"name\": \"blobcatfluffpout\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f8ee810c-5bf7-4331-94a4-e3f5b8acec1e.png\"\n    },\n    {\n      \"id\": \"8vzyk3d94f\",\n      \"aliases\": [],\n      \"name\": \"blobcatgooglytrash\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f80c5875-805f-4445-8893-bf8a7e283314.png\"\n    },\n    {\n      \"id\": \"8vzyj9zeql\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatheartbongo\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2e8314a9-a58c-401a-a9e6-6e44d9aa37ed.gif\"\n    },\n    {\n      \"id\": \"8vzyksx39u\",\n      \"aliases\": [],\n      \"name\": \"blobcatmeataww\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-69ab7a74-c4f0-4bd7-b606-87c8e54064ea.png\"\n    },\n    {\n      \"id\": \"8vzyj1ppmz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatmeltlove\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1b1a84f2-a012-4a98-b40b-894c432b1084.png\"\n    },\n    {\n      \"id\": \"8vzyj90wpz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatmeltnomblobcatmelt\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0d407d6f-9929-4b32-a643-5c8fd30e7a13.png\"\n    },\n    {\n      \"id\": \"8vzyjdvksw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatmlem\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-668ebcdb-8246-4919-9907-8dc82a87aba1.png\"\n    },\n    {\n      \"id\": \"8vzyipypi0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcat_MUDAMUDAMUDA\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/50909dff-f785-4908-9fff-c182b431f601.apng\"\n    },\n    {\n      \"id\": \"8vzyj17mmr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatnomblobdoggo\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-671d5884-c6b5-41cb-aab3-4753af616437.png\"\n    },\n    {\n      \"id\": \"8vzyl370ee\",\n      \"aliases\": [],\n      \"name\": \"blobcatnomwatermelon\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bad64baa-e8f0-4cf7-8ea2-6bfb0a5c9fc6.png\"\n    },\n    {\n      \"id\": \"8vzyixaul4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatnoplease\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fef98648-0713-47a7-aca7-18019b7da9c3.png\"\n    },\n    {\n      \"id\": \"8vzyjbbxro\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatNotAmused\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4d56eaf4-0e77-48c3-a182-097c8a7c2b12.png\"\n    },\n    {\n      \"id\": \"8vzyjd1ssi\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcat_ok_sign\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dbe5c59e-360c-42d9-acfe-679cfce229a8.png\"\n    },\n    {\n      \"id\": \"8vzyj13jmp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatpensive\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-846c4968-171e-480f-9206-5febbe4b8ab2.png\"\n    },\n    {\n      \"id\": \"8vzyiwwrky\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatPhotobomb\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e0739b89-0539-47a0-9202-25e71af08383.png\"\n    },\n    {\n      \"id\": \"8vzyl3wteq\",\n      \"aliases\": [],\n      \"name\": \"blobcatpolicepeek\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d36b048d-6b15-4e42-9dd6-faa563ce023d.png\"\n    },\n    {\n      \"id\": \"8vzyhui36b\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatrainbow\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f9372cbe-1676-45a7-9be9-b70ebcdd3c42.apng\"\n    },\n    {\n      \"id\": \"8vzyikj4fq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatreachmelt\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-88e19f8c-a48d-49ed-88f8-69bf02a22d8d.png\"\n    },\n    {\n      \"id\": \"8vzyj8oepr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatshrug\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f0cdcb24-ab20-4cd8-b9cd-ec635f4582bd.png\"\n    },\n    {\n      \"id\": \"8vzyjcx9sg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatsign\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-88911474-20f5-480e-87cb-0bfd5593a285.png\"\n    },\n    {\n      \"id\": \"8vzylk34lz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatstretchbottom\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0a933cf2-8d57-4077-9059-290e0b079e3b.gif\"\n    },\n    {\n      \"id\": \"8vzylk4cm1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatstretchmiddle\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0f566b60-2b8f-4f41-99ac-c08db0a30007.gif\"\n    },\n    {\n      \"id\": \"8vzylk5rm3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatstretchtop\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/7dcece78-e124-4c13-98ea-9955efe47025.gif\"\n    },\n    {\n      \"id\": \"8vzyj9x4qj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatsweatflips\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/bfb5521d-71bd-4e2c-ac48-b045da99eedf.apng\"\n    },\n    {\n      \"id\": \"8vzyix5xl2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatthinking\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2f87fceb-c0eb-40c2-b71a-21b11a84a6ba.png\"\n    },\n    {\n      \"id\": \"8vzyj1uan1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobcatuwu\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-60a031b7-0e35-4b92-91a5-61c6846703dd.png\"\n    },\n    {\n      \"id\": \"8vzyjznc2v\",\n      \"aliases\": [],\n      \"name\": \"blobcatverified\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6a15de8d-24a7-4b09-b4eb-7e35992f4a9b.png\"\n    },\n    {\n      \"id\": \"8vzyl2oae6\",\n      \"aliases\": [],\n      \"name\": \"blob_closed_book\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-83992dfe-43b8-4f5e-ae1a-0c575347560c.png\"\n    },\n    {\n      \"id\": \"8vzyjagtr0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_congaroll_bounce\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/b557c6ee-1c43-4141-af5b-324e97600b92.gif\"\n    },\n    {\n      \"id\": \"8vzyjb7nrm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_devil\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/9eeadd6f-fff3-4bb5-acca-e8bc25fd9fff.gif\"\n    },\n    {\n      \"id\": \"8vzyja9fqt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_disappointment\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/87257842-5a74-461c-9b4c-1bd7e9509f60.gif\"\n    },\n    {\n      \"id\": \"8vzyja1pqn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_flushed\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/38caeccc-1337-434a-a942-33204ca6bc49.gif\"\n    },\n    {\n      \"id\": \"8vzyje6vt2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobfoxfacepalm\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1f6e2192-0ab2-433f-8883-690c8c5631d5.png\"\n    },\n    {\n      \"id\": \"8vzyjdr9su\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobfoxsignbaka\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-30f8e093-43ee-4869-ba22-2927813d812f.png\"\n    },\n    {\n      \"id\": \"8vzyjderso\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobfoxsignnou\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-407620fe-693f-4956-bdfa-7b9b4ed7315c.png\"\n    },\n    {\n      \"id\": \"8vzyjdiisq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobfoxsignnoublush\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dd0bd530-c085-436c-8378-51c8c455bbc2.png\"\n    },\n    {\n      \"id\": \"8vzyjd5zsk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobfoxsignthx\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1457e8c6-f9f7-47e1-b9a0-2893d1d343c6.png\"\n    },\n    {\n      \"id\": \"8vzyjda6sm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobfoxsignyes\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-da2f50b8-664c-4c6d-b3bf-22da235a5aeb.png\"\n    },\n    {\n      \"id\": \"8vzyllpwmt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobgamer\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3395c641-5070-4960-839b-97f8c8085694.png\"\n    },\n    {\n      \"id\": \"8vzyj9rvqf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobglassesdown\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-beedbaab-47e3-48fa-b385-f448bc27b859.png\"\n    },\n    {\n      \"id\": \"8vzyjct5se\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobgo\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f3b38fd8-4b7b-48a4-bf01-0c2a3914e98f.png\"\n    },\n    {\n      \"id\": \"8vzyj9u4qh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_goggling\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ffd2a685-a399-4b84-86a6-8d68bee8b3cd.gif\"\n    },\n    {\n      \"id\": \"8vzyi7apbk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobhai\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/b607fc20-fda7-445b-b13f-37f65c3088b0.gif\"\n    },\n    {\n      \"id\": \"8vzyjaubrc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_hello\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/05571d2b-4c16-4b6b-9e52-615430704b4b.gif\"\n    },\n    {\n      \"id\": \"8vzyitsvjm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobhighfive\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-20d1a2d6-f45f-4a1c-aad9-5c1eb6b6afd7.png\"\n    },\n    {\n      \"id\": \"8vzyj5ujol\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_hyper_nod\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2e4a2357-6194-4f0b-90a4-757ff50cc51c.gif\"\n    },\n    {\n      \"id\": \"8vzyh3yqup\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobhyperthink\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c717c2ee-9183-4959-a766-57bb492c4323.png\"\n    },\n    {\n      \"id\": \"8vzyjb53rk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_keybord\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/88178055-4cb5-4683-b460-fbe8ed7b905a.gif\"\n    },\n    {\n      \"id\": \"8vzyl0lwd5\",\n      \"aliases\": [\n        \"nervous\",\n        \"えーっと\",\n        \"えーと\",\n        \"指つん\",\n        \"ゆびつん\",\n        \"yubitun\",\n        \"指つんつん\",\n        \"言い訳\",\n        \"いいわけ\",\n        \"iiwake\"\n      ],\n      \"name\": \"blobnervous2\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b23a73ab-8994-41ed-8661-78eb473fbf00.png\"\n    },\n    {\n      \"id\": \"8vzyj1ytn3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobno\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c84c62a5-ec50-4ca4-88f2-d9ab3c0d0663.png\"\n    },\n    {\n      \"id\": \"8vzyjajsr2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_nope\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d9de6dbb-967d-4939-945a-dbec0bbee303.gif\"\n    },\n    {\n      \"id\": \"8vzyi78ubi\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobooohai\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/af7558f4-a196-4ffd-a7f2-fdbd733d8387.gif\"\n    },\n    {\n      \"id\": \"8vzyjaofr6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_present\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/7cacc888-f077-43ee-8787-9cf796556164.gif\"\n    },\n    {\n      \"id\": \"8vzyjazhrg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_rolling_bound\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/99e086a0-50b0-4bda-85f5-de5e0dbc2100.gif\"\n    },\n    {\n      \"id\": \"8vzyj8eipn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobshh\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3f0d9e30-5927-48ab-8727-9fb742830ed6.png\"\n    },\n    {\n      \"id\": \"8vzyjdmzss\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobsignya\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7f7f6e4e-cbe6-4795-9b71-6c59155476b5.png\"\n    },\n    {\n      \"id\": \"8vzyjclcsa\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobsleepless\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-da931403-9a41-48eb-8a6d-345617bde5da.png\"\n    },\n    {\n      \"id\": \"8vzyja4hqp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_sleepy\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/70fb234e-1b65-4de9-90ae-e781ba083783.gif\"\n    },\n    {\n      \"id\": \"8vzyjabjqv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_squish\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/7e48480b-1815-4140-9d9b-dbe9147266aa.gif\"\n    },\n    {\n      \"id\": \"8vzyj9hcqb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_super_nod\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/47c71dea-cdde-4c40-8f24-cc046dcb7ce2.gif\"\n    },\n    {\n      \"id\": \"8vzyjae3qx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_surprise_blush\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/a42a2db2-3b13-4795-a59e-7938597dac4b.gif\"\n    },\n    {\n      \"id\": \"8vzyht0m5h\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobsweats\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9da15c6e-9ddd-4d32-982e-4a70322ab8d7.png\"\n    },\n    {\n      \"id\": \"8vzyiko7fs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blob_think_smart\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c5334d1d-cf2a-4270-a4e0-7648ef625cd4.png\"\n    },\n    {\n      \"id\": \"8vzym3syt7\",\n      \"aliases\": [\n        \"omotenidero\",\n        \"表出ろ\"\n      ],\n      \"name\": \"blobthumbsup\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-998eb28d-90d0-4be5-b6cb-e3079e3a1b41.png\"\n    },\n    {\n      \"id\": \"8vzyh3nmul\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"blobtoofast\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c825febc-d80b-4fa2-affb-c09879010671.apng\"\n    },\n    {\n      \"id\": \"8vzyjjthv7\",\n      \"aliases\": [],\n      \"name\": \"blob_yum\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2b66a86f-d679-4e8e-9b2a-122ddd4cf6d7.png\"\n    },\n    {\n      \"id\": \"8vzyhnt42n\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"burublobhyperthink\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/72c60fe6-b146-43f8-b29c-a533c7b69c9a.gif\"\n    },\n    {\n      \"id\": \"8vzyl08rcx\",\n      \"aliases\": [\n        \"yes\",\n        \"はい\",\n        \"看板\",\n        \"かんばん\",\n        \"kanban\"\n      ],\n      \"name\": \"comfyyes\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3a66cc49-54ec-4b5a-8829-cb546ca7d9a7.png\"\n    },\n    {\n      \"id\": \"8vzykxvhbp\",\n      \"aliases\": [],\n      \"name\": \"meow0_0\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9fcbafa4-598d-436d-8981-a39b8e196030.png\"\n    },\n    {\n      \"id\": \"8vzykzr4cn\",\n      \"aliases\": [\n        \"blob\",\n        \"笑顔\",\n        \"えがお\",\n        \"egao\",\n        \"smile\",\n        \"happy\",\n        \"ハッピー\",\n        \"はっぴー\"\n      ],\n      \"name\": \"meowAwauu\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6ca4f756-8b1d-46ba-ab8f-58a19aa18d04.png\"\n    },\n    {\n      \"id\": \"8vzyky2hbt\",\n      \"aliases\": [],\n      \"name\": \"meowblue\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-071f97f4-fac3-4cfe-bf24-bbb9732ab1e2.png\"\n    },\n    {\n      \"id\": \"8vzykyfpbz\",\n      \"aliases\": [\n        \"cry\",\n        \"猫\",\n        \"ねこ\",\n        \"neko\",\n        \"泣く\",\n        \"なく\",\n        \"naku\",\n        \"涙\",\n        \"なみだ\",\n        \"namida\"\n      ],\n      \"name\": \"meowcry\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-75d6feb6-25ef-4aca-b2d5-dd9f15db2f3d.png\"\n    },\n    {\n      \"id\": \"8vzykxribn\",\n      \"aliases\": [],\n      \"name\": \"meowfacepalm\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f4a4493b-c5c8-459e-a716-13ed93406d1a.png\"\n    },\n    {\n      \"id\": \"8vzyjcpdsc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"meowFingerGuns\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-78a32e8e-ec53-42b0-a6df-076106ddf43f.png\"\n    },\n    {\n      \"id\": \"8vzykwwob7\",\n      \"aliases\": [],\n      \"name\": \"meowflower\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dff2c9b7-0d95-4510-bf27-d2f36f8598e9.png\"\n    },\n    {\n      \"id\": \"8vzykx9lbd\",\n      \"aliases\": [],\n      \"name\": \"meowhuggies\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3f43b9ea-f1ef-4756-8dbc-9556cfb61382.png\"\n    },\n    {\n      \"id\": \"8vzyix11l0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"meowmelt\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-59d3d073-014e-435e-9bb1-f1cb311d2381.png\"\n    },\n    {\n      \"id\": \"8vzykxe7bf\",\n      \"aliases\": [\n        \"cry\",\n        \"猫\",\n        \"ねこ\",\n        \"neko\",\n        \"泣く\",\n        \"なく\",\n        \"naku\",\n        \"涙\",\n        \"なみだ\",\n        \"namida\"\n      ],\n      \"name\": \"meowmeltcry\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-953cf0c4-c55a-454e-a008-f202809c4b78.png\"\n    },\n    {\n      \"id\": \"8vzykylzc1\",\n      \"aliases\": [\n        \"blob\",\n        \"pat\",\n        \"ナデナデ\",\n        \"なでなで\",\n        \"なでる\",\n        \"撫でる\",\n        \"naderu\",\n        \"nadenade\"\n      ],\n      \"name\": \"meowpats\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-19e8177b-7f4e-4ee1-8a4b-70d2df0eef2d.png\"\n    },\n    {\n      \"id\": \"8vzykx57bb\",\n      \"aliases\": [],\n      \"name\": \"meowPuffyHeadphones\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4eee0832-76de-45e4-ae8e-a1e32f1660bc.png\"\n    },\n    {\n      \"id\": \"8vzyk8ck6o\",\n      \"aliases\": [],\n      \"name\": \"meowScream\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3e7c0b0a-837c-4433-a037-f64d86f839e4.png\"\n    },\n    {\n      \"id\": \"8vzyky6wbv\",\n      \"aliases\": [],\n      \"name\": \"meowshh\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-339ec4d4-fced-47c8-9419-352dd767cd1c.png\"\n    },\n    {\n      \"id\": \"8vzykyawbx\",\n      \"aliases\": [],\n      \"name\": \"meowShrug\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bedf13be-ae7f-41fd-a9f2-fbd328ee5c39.png\"\n    },\n    {\n      \"id\": \"8vzykx0yb9\",\n      \"aliases\": [],\n      \"name\": \"meowSleeping\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-928efdc5-60d6-4de5-80b8-d674832d30f6.png\"\n    },\n    {\n      \"id\": \"8vzykxjabh\",\n      \"aliases\": [],\n      \"name\": \"meowSurprised\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1bade966-4d7d-4bc8-b956-88c6529ad285.png\"\n    },\n    {\n      \"id\": \"8vzyl2k5e4\",\n      \"aliases\": [],\n      \"name\": \"meowtilt\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1927a8b0-0644-45c2-ad13-dc9b13021e3e.png\"\n    },\n    {\n      \"id\": \"8vzyj859pj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nombread\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5ad6247a-60a1-48bf-9138-5c431896725b.png\"\n    },\n    {\n      \"id\": \"8vzyj5lioh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ohoho_blobs\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7fec4b63-8f11-430f-893f-ec180665222e.png\"\n    },\n    {\n      \"id\": \"8vzylfowk5\",\n      \"aliases\": [],\n      \"name\": \"resonyance\",\n      \"category\": \"Blob\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3ea32a15-62fd-4fde-aee4-ff8eff5f0826.webp\"\n    },\n    {\n      \"id\": \"8vzyjlwowf\",\n      \"aliases\": [\n        \"cry\",\n        \"兎\",\n        \"ウサギ\",\n        \"うさぎ\",\n        \"usagi\",\n        \"バニー\",\n        \"ばにー\",\n        \"bani-\",\n        \"bunny\",\n        \"泣く\",\n        \"なく\",\n        \"naku\",\n        \"涙\",\n        \"なみだ\",\n        \"namida\"\n      ],\n      \"name\": \"abunhdcry\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/aa171790-f6ad-47a4-be64-ece7ada4a60b.apng\"\n    },\n    {\n      \"id\": \"8vzyjlfdw1\",\n      \"aliases\": [],\n      \"name\": \"abunhdhappyhop\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/92311884-ea8f-4088-ba99-4dd130444c72.apng\"\n    },\n    {\n      \"id\": \"8vzyjmepwr\",\n      \"aliases\": [],\n      \"name\": \"bun\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/597366d1-4158-434d-b743-8fbc69fc9db5.apng\"\n    },\n    {\n      \"id\": \"8vzyjldbvz\",\n      \"aliases\": [],\n      \"name\": \"bun_back\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/30c51bfa-da15-40eb-bfbe-ee7eb7a8c285.apng\"\n    },\n    {\n      \"id\": \"8vzyjmmpwx\",\n      \"aliases\": [],\n      \"name\": \"bunblanketkawaii\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0d85319c-441f-4ba9-927a-0015650e128e.png\"\n    },\n    {\n      \"id\": \"8vzyjlrvwb\",\n      \"aliases\": [],\n      \"name\": \"buncowboy\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d4f35837-c5c1-4692-9b9c-4f509d607b76.apng\"\n    },\n    {\n      \"id\": \"8vzyjl6jvv\",\n      \"aliases\": [\n        \"cry\",\n        \"兎\",\n        \"ウサギ\",\n        \"うさぎ\",\n        \"usagi\",\n        \"バニー\",\n        \"ばにー\",\n        \"bani-\",\n        \"bunny\",\n        \"泣く\",\n        \"なく\",\n        \"naku\",\n        \"涙\",\n        \"なみだ\",\n        \"namida\"\n      ],\n      \"name\": \"buncowboycry\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/255eeaea-9f3c-4628-b461-f11fe3e73210.apng\"\n    },\n    {\n      \"id\": \"8vzyjmj5wv\",\n      \"aliases\": [\n        \"cry\",\n        \"兎\",\n        \"ウサギ\",\n        \"うさぎ\",\n        \"usagi\",\n        \"バニー\",\n        \"ばにー\",\n        \"bani-\",\n        \"bunny\",\n        \"泣く\",\n        \"なく\",\n        \"naku\",\n        \"涙\",\n        \"なみだ\",\n        \"namida\"\n      ],\n      \"name\": \"buncry\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/fca0049a-5ba1-46af-b99b-b99d8a09eb85.apng\"\n    },\n    {\n      \"id\": \"8vzyjkh7vh\",\n      \"aliases\": [],\n      \"name\": \"bun_down\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e67aa5dd-6714-42a7-866f-1912451df5c8.apng\"\n    },\n    {\n      \"id\": \"8vzyjkldvj\",\n      \"aliases\": [],\n      \"name\": \"buneyes\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ebff7485-ed44-4c34-8a53-a1803b9faa03.png\"\n    },\n    {\n      \"id\": \"8vzyjlhdw3\",\n      \"aliases\": [],\n      \"name\": \"bun_fliprev\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c190519f-fb56-427f-a453-213d3c9656d8.apng\"\n    },\n    {\n      \"id\": \"8vzyjlkkw7\",\n      \"aliases\": [],\n      \"name\": \"bunglitch\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/516e399f-1712-4d81-b008-6638d981d0e0\"\n    },\n    {\n      \"id\": \"8vzyjkcjvd\",\n      \"aliases\": [],\n      \"name\": \"bunhd\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-82856f9b-066b-495e-b15d-8a84645f38f5.png\"\n    },\n    {\n      \"id\": \"8vzyjm2lwj\",\n      \"aliases\": [],\n      \"name\": \"bunhd_aww\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-36eacbae-b469-4383-a30a-ffd3ec75a845.png\"\n    },\n    {\n      \"id\": \"8vzyjkspvn\",\n      \"aliases\": [],\n      \"name\": \"bunhdcouple\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b483da34-25ab-4bd3-b216-34e7ab8602b5.png\"\n    },\n    {\n      \"id\": \"8vzyjlbavx\",\n      \"aliases\": [\n        \"cry\",\n        \"兎\",\n        \"ウサギ\",\n        \"うさぎ\",\n        \"usagi\",\n        \"バニー\",\n        \"ばにー\",\n        \"bani-\",\n        \"bunny\",\n        \"泣く\",\n        \"なく\",\n        \"naku\",\n        \"涙\",\n        \"なみだ\",\n        \"namida\"\n      ],\n      \"name\": \"bunhdcry\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5a5c962e-1855-42c5-8fbc-62a00c81b284.png\"\n    },\n    {\n      \"id\": \"8vzyjm8dwn\",\n      \"aliases\": [],\n      \"name\": \"bunhd_googly\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-67ac3355-d420-4efa-90c8-67558de3f44d.png\"\n    },\n    {\n      \"id\": \"8vzyjlygwh\",\n      \"aliases\": [],\n      \"name\": \"bunhd_happy\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/1a6317cf-cdef-4992-97b0-12ad9b44f8e4.apng\"\n    },\n    {\n      \"id\": \"8vzyjmgmwt\",\n      \"aliases\": [],\n      \"name\": \"bunhd_happyhop\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/79ff76cd-a64c-45bf-8d51-b6ddcdfa9efe.apng\"\n    },\n    {\n      \"id\": \"8vzyjlufwd\",\n      \"aliases\": [],\n      \"name\": \"bunhd_hop\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/faa7b6af-390a-450b-9846-96e12d888e89.apng\"\n    },\n    {\n      \"id\": \"8vzyjlplw9\",\n      \"aliases\": [],\n      \"name\": \"bunhdknife\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7c4f6e2b-876d-4fb5-a9e5-b9cc64911ce9.png\"\n    },\n    {\n      \"id\": \"8vzyjms4x1\",\n      \"aliases\": [],\n      \"name\": \"bunhdlurkaww\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-565a3ed7-87cb-4e7f-8220-1c9e756cf8cd.png\"\n    },\n    {\n      \"id\": \"8vzyjmonwz\",\n      \"aliases\": [],\n      \"name\": \"bunhdrainbow\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ae6f9395-38fe-4dbf-89b6-b22b4566988b.apng\"\n    },\n    {\n      \"id\": \"8vzyjm4jwl\",\n      \"aliases\": [],\n      \"name\": \"bunhd_sadpat\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/45bf8130-2091-4d46-b1e2-07936f0d0595.apng\"\n    },\n    {\n      \"id\": \"8vzyjmcqwp\",\n      \"aliases\": [],\n      \"name\": \"bunhd_sleep\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-945906ec-0e28-4a30-9aff-5fde0651d4f4.png\"\n    },\n    {\n      \"id\": \"8vzyjmvyx3\",\n      \"aliases\": [],\n      \"name\": \"bunlewd\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4d7ef594-4a2d-4cd1-abfb-b963b41901a5.png\"\n    },\n    {\n      \"id\": \"8vzyjlj3w5\",\n      \"aliases\": [],\n      \"name\": \"bunpats\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/253446d4-d6ce-488c-a26e-ce72fed0de59.apng\"\n    },\n    {\n      \"id\": \"8vzyjl07vr\",\n      \"aliases\": [],\n      \"name\": \"bunsad\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f509e30b-b941-400d-95db-5198d7e5b900.png\"\n    },\n    {\n      \"id\": \"8vzyjn44x7\",\n      \"aliases\": [],\n      \"name\": \"bunsleep\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b5fe7c4e-4c48-4c8c-9aa7-967ab96302b1.png\"\n    },\n    {\n      \"id\": \"8vzyjkwhvp\",\n      \"aliases\": [],\n      \"name\": \"bunthinking\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6ec00b8c-5fec-4f57-b967-58769349bce5.png\"\n    },\n    {\n      \"id\": \"8vzyjkf0vf\",\n      \"aliases\": [],\n      \"name\": \"bun_up\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/71b71778-f835-4cee-ba83-a62272549a76.apng\"\n    },\n    {\n      \"id\": \"8vzyjn9ax9\",\n      \"aliases\": [],\n      \"name\": \"cofebun1\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-478f8fc1-ccf8-4359-a923-22aa02b07e2a.png\"\n    },\n    {\n      \"id\": \"8vzyjl4hvt\",\n      \"aliases\": [],\n      \"name\": \"cofebun3\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5664056c-2724-4185-914e-01548322c2c1.png\"\n    },\n    {\n      \"id\": \"8vzyjne0xb\",\n      \"aliases\": [],\n      \"name\": \"revbunhdgoogly\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8a2832f3-5bde-4d2c-872c-3f0895f4373d.png\"\n    },\n    {\n      \"id\": \"8vzyjn0tx5\",\n      \"aliases\": [],\n      \"name\": \"revbunhdsmug\",\n      \"category\": \"Bunny\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-40422d53-81ab-4673-9273-8aff3903b639.png\"\n    },\n    {\n      \"id\": \"8vzyjixmuv\",\n      \"aliases\": [],\n      \"name\": \"cat_on_laptop\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8aa51a7d-0b44-4c17-b9a7-ef984de86635.png\"\n    },\n    {\n      \"id\": \"8vzyk1jd3p\",\n      \"aliases\": [\n        \"dance\",\n        \"楽しい\",\n        \"たのしい\",\n        \"だんす\",\n        \"ダンス\",\n        \"tanoshii\",\n        \"tanosii\"\n      ],\n      \"name\": \"hyper_vibecat\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/8c522386-3173-4449-833d-2e94ce47fb6d\"\n    },\n    {\n      \"id\": \"8vzyj0i4mg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_cats_eye\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-50681139-1395-4ad0-8221-f4e826df1ebb.png\"\n    },\n    {\n      \"id\": \"8vzyj0d6me\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_cats_eye_blue\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-483277fd-330e-4d92-94d4-41bc13f5ceaf.png\"\n    },\n    {\n      \"id\": \"8vzyiyxllu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_eyes_shut\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f4775fe8-ee36-44a7-bfa9-4a7b29213b69.png\"\n    },\n    {\n      \"id\": \"8vzyizx4m8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_fish\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6390dfa7-4ead-4a31-abd7-a846fd67561d.png\"\n    },\n    {\n      \"id\": \"8vzyixn5lc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_frowning\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-89edd8e8-2302-445b-ba09-c59bee43111d.png\"\n    },\n    {\n      \"id\": \"8vzyiyswls\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_glasses3\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-32e0e436-f105-4ab9-81bd-42ea41481d3b.png\"\n    },\n    {\n      \"id\": \"8vzyiydxlm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_gray\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5b79c4c9-9fb5-4c43-9d01-735c3f47e9b9.png\"\n    },\n    {\n      \"id\": \"8vzyj0nqmj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_nyaan\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-25302f93-de0c-4b17-bbee-4b868ff7a7ea.png\"\n    },\n    {\n      \"id\": \"8vzyiyillo\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_oinari\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bd3fc671-a4c5-464f-9fc4-5a4206a6dd15.png\"\n    },\n    {\n      \"id\": \"8vzyiy2yli\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_relax\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e09e80c3-d6f7-4dd0-a99c-0087112f0de7.png\"\n    },\n    {\n      \"id\": \"8vzyizrnm6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_roling_eyes\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-657dc0b9-44ac-4b76-8f87-10c834d8a95f.png\"\n    },\n    {\n      \"id\": \"8vzyj02uma\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_roling_eyes2\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-236f467f-7a84-4d54-831d-9ec1d7318e50.png\"\n    },\n    {\n      \"id\": \"8vzyiz7aly\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_sad\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d85deaf1-da54-42e8-8fae-1e68798b8403.png\"\n    },\n    {\n      \"id\": \"8vzyixrile\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_siam\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fe956850-13cc-4c4d-b183-2a4e14271cc8.png\"\n    },\n    {\n      \"id\": \"8vzyixxplg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_smiley\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-46daeb33-943b-4ef7-9e71-32c5d5550a31.png\"\n    },\n    {\n      \"id\": \"8vzyizmsm4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_smirk\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-81b7a16d-811a-4e91-97c1-a79b28398c81.png\"\n    },\n    {\n      \"id\": \"8vzyiy7xlk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_star_eyes\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-640b4f78-07a6-4933-81ba-3559b23971fb.png\"\n    },\n    {\n      \"id\": \"8vzyizi1m2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_sunglasses\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dbf5dd54-cbad-4967-a102-2a3a6b99823c.png\"\n    },\n    {\n      \"id\": \"8vzyizcqm0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_sweat\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d8752d08-9d7c-404d-be12-644b6569519b.png\"\n    },\n    {\n      \"id\": \"8vzyj07ymc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_thinking\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-52f3c22a-0b64-4a6f-a307-4d6f782eeac0.png\"\n    },\n    {\n      \"id\": \"8vzyiz26lw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_tired2\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ff04113d-1e6d-4217-ae9e-f75a6070f229.png\"\n    },\n    {\n      \"id\": \"8vzyiynslq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neko_xd\",\n      \"category\": \"Cat\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-88c19681-7e61-4d89-90bd-34a7ecb6fe44.png\"\n    },\n    {\n      \"id\": \"8vzyjgm1u4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aifukkyu\",\n      \"category\": \"Character / Angry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d190a651-1623-4b9f-862e-cd4765622dc2.png\"\n    },\n    {\n      \"id\": \"8vzygtr1pn\",\n      \"aliases\": [\n        \"ai\",\n        \"angry\",\n        \"oko\"\n      ],\n      \"name\": \"angry_ai\",\n      \"category\": \"Character / Angry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c08fc248-2938-4be3-8a00-ca80fd8ecafc.png\"\n    },\n    {\n      \"id\": \"8vzykcmn8e\",\n      \"aliases\": [],\n      \"name\": \"angry_shibe\",\n      \"category\": \"Character / Angry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/98a9dd23-5b8f-42b6-99be-0685c1e2b929\"\n    },\n    {\n      \"id\": \"8vzyk3rz4j\",\n      \"aliases\": [],\n      \"name\": \"nya_angry\",\n      \"category\": \"Character / Angry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3886c9fb-c5c1-427b-a413-1cd5500c1e1d.webp\"\n    },\n    {\n      \"id\": \"8vzyjbq0ru\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"puniko_pout\",\n      \"category\": \"Character / Angry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bc4106b6-41cc-42bf-9077-ba16d4801300.png\"\n    },\n    {\n      \"id\": \"8vzyil3yg0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"reeEEE\",\n      \"category\": \"Character / Angry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/57c8c16f-27e1-4824-bb6a-94c76987796c.apng\"\n    },\n    {\n      \"id\": \"8vzyhwr377\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ShibeAngery\",\n      \"category\": \"Character / Angry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fb96995b-2b3f-4a09-8c5f-545f2c7d0125.png\"\n    },\n    {\n      \"id\": \"8vzyhv4q6j\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aqua_crying\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-185aeac1-dbab-45be-9b1e-8b3faac57dbe.png\"\n    },\n    {\n      \"id\": \"8vzyhv0m6h\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"AstolfoCry\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-28e9981f-c778-4e06-b3d0-40e8760565f8.png\"\n    },\n    {\n      \"id\": \"8vzyl3eiei\",\n      \"aliases\": [\n        \"ちるの\",\n        \"チルノ\"\n      ],\n      \"name\": \"cirno_saddest\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-370a0c12-eb03-4099-8e27-e5477278441b.png\"\n    },\n    {\n      \"id\": \"8vzyit0aj8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"cri\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1d662b50-44ac-4526-bd5c-1fdd57eb86e0.png\"\n    },\n    {\n      \"id\": \"8vzygtvvpp\",\n      \"aliases\": [\n        \"ai\",\n        \"cry\"\n      ],\n      \"name\": \"crying_ai\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d252848d-ad7d-40a9-8bdd-196e71c5e639.png\"\n    },\n    {\n      \"id\": \"8vzyiqe3i6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"molcar_cry\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4f425c96-92af-4b93-86bb-794a4328ca82.png\"\n    },\n    {\n      \"id\": \"8vzyin9rgs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ota\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-49730e9d-caf8-41b7-a869-498d4ac25870.png\"\n    },\n    {\n      \"id\": \"8vzyi9nlco\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"owonervous\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5aaf6514-cba0-4290-add8-cfa61986a577.png\"\n    },\n    {\n      \"id\": \"8vzyjc1ws0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"puniko_cry\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5e3044d5-1406-4a6e-9c19-6cdf0b130a9e.png\"\n    },\n    {\n      \"id\": \"8vzykcpe8g\",\n      \"aliases\": [\n        \"cry\",\n        \"sad\",\n        \"かなしい\",\n        \"悲しい\",\n        \"ぐにょぐにょ\"\n      ],\n      \"name\": \"sadblob\",\n      \"category\": \"Character / Cry\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3ad6e003-7f58-4489-a8a0-5c52e283dd98\"\n    },\n    {\n      \"id\": \"8vzyjgh9u2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aiwave2\",\n      \"category\": \"Character / Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8cdae703-7b83-4b4d-89f2-7b25e4cecb41.png\"\n    },\n    {\n      \"id\": \"8vzylp5xoj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-767bbc92-5eeb-4990-9395-cf0d8f93a7be.png\"\n    },\n    {\n      \"id\": \"8vzylp9con\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_a\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2cdc961e-8eea-42f1-b8bd-bea8455c1f5c.gif\"\n    },\n    {\n      \"id\": \"8vzylpoioz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_a2\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/7a30d4c3-95ec-4ec2-8dd4-2f83e62d691b.apng\"\n    },\n    {\n      \"id\": \"8vzylpbfop\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_angry\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/8e0155e5-5465-41ce-952c-0dfdf5e07912.gif\"\n    },\n    {\n      \"id\": \"8vzyloapo5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_blush\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/74c4f565-4c94-42be-81ba-8251086e0603.gif\"\n    },\n    {\n      \"id\": \"8vzylg09k7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"guradance\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/07dfa077-69f4-4ee6-bcbc-246fe2dfef0e\"\n    },\n    {\n      \"id\": \"8vzylnp4nt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_dance2\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2655523f-5d65-443c-95a0-f74c671ffa5f.gif\"\n    },\n    {\n      \"id\": \"8vzyloheo9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_fingerguns\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/62d52894-1cca-4eb5-8734-676c10cf7f28.gif\"\n    },\n    {\n      \"id\": \"8vzylp76ol\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_gaw\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/aa17be83-5bf3-4eb2-99b1-7b7d11e6610b.gif\"\n    },\n    {\n      \"id\": \"8vzylpdzor\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_hydrodynamic\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c5f04c5d-144e-430d-9a03-0844b2cf0f43.gif\"\n    },\n    {\n      \"id\": \"8vzylnyhnz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_laugh\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d6cc6914-eda5-455e-b2ff-c594eaaa93b6.gif\"\n    },\n    {\n      \"id\": \"8vzylp17oh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_love\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e726fef7-b289-4f41-8cc3-b4f7f48a4a2d.png\"\n    },\n    {\n      \"id\": \"8vzylok2ob\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_nom\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e69a1a8e-ca02-49d7-b1bc-fe6cb886815c.gif\"\n    },\n    {\n      \"id\": \"8vzylo4zo1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gurapat\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8df7d0c5-6fe1-4714-99a6-fbf7d7cbae3b.png\"\n    },\n    {\n      \"id\": \"8vzylog5o7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_peek\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-59e6c8b2-35ae-4cab-8a03-76d182ec308a.png\"\n    },\n    {\n      \"id\": \"8vzylpm3ox\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_scared\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/7e299cfe-ad01-4ac2-937b-b943424a700a.gif\"\n    },\n    {\n      \"id\": \"8vzylooiod\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gurashades\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c5c2a0e3-d846-4894-850f-470bcd1b2a23.png\"\n    },\n    {\n      \"id\": \"8vzylo7fo3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_sing\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/eb355b62-767d-4a45-a3bd-38304bf7024c.gif\"\n    },\n    {\n      \"id\": \"8vzylntsnv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gurasleep\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6ca47965-545d-43ad-8283-23de41d62796.png\"\n    },\n    {\n      \"id\": \"8vzylpjmov\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_smug\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0b240147-9fd1-4323-ba60-8fa37267777d.gif\"\n    },\n    {\n      \"id\": \"8vzylnw8nx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_wah\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f539e2fc-567a-4e61-a668-5457e942b20d.gif\"\n    },\n    {\n      \"id\": \"8vzylph4ot\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gura_wink\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c6409307-f63c-4243-af37-59e3e76e641f.gif\"\n    },\n    {\n      \"id\": \"8vzylovrof\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gurayaya\",\n      \"category\": \"Character / Gawr Gura\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8b17f46d-db44-4771-9b88-4aed52c12750.png\"\n    },\n    {\n      \"id\": \"8x7tveftbc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"green_poop\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-86f000a7-487f-4ec7-a6b1-86bad61d575f.png\"\n    },\n    {\n      \"id\": \"8vzyjeert6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hinata_hyper\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d4d5222b-accc-4fe9-b10e-1c3b54aced96.gif\"\n    },\n    {\n      \"id\": \"8wa3mco4xw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kawaii_denmark\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ce4ffb38-0c7f-4b87-a2bd-9ccc9526b2c5.png\"\n    },\n    {\n      \"id\": \"8vzylm6nmz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"koisuru_doragon\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cab09e5a-b05f-4494-9a3f-bc91ee0ef60f.png\"\n    },\n    {\n      \"id\": \"8vzylfcdjz\",\n      \"aliases\": [],\n      \"name\": \"konomi_good\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6ccf0c4b-54e8-44e9-bfc2-646e6dbaaf06.png\"\n    },\n    {\n      \"id\": \"8vzyhtnl5r\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"lul\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e74919b4-f201-466e-9b77-81498421a315.png\"\n    },\n    {\n      \"id\": \"8vzyi720be\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mikuXD\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-47e888bf-c8b3-491d-bf86-39219c178ea9.png\"\n    },\n    {\n      \"id\": \"8vzyh66uvq\",\n      \"aliases\": [\n        \"miyano\"\n      ],\n      \"name\": \"miyano_trippin\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5da0a121-0ff7-449c-b44e-245de394b863.gif\"\n    },\n    {\n      \"id\": \"8vzyit5njc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"miyano_wild\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c8882e2f-bf83-4ee5-8095-05d4460b6165.gif\"\n    },\n    {\n      \"id\": \"8vzyh646vo\",\n      \"aliases\": [\n        \"miyano\",\n        \"yay\"\n      ],\n      \"name\": \"miyano_yay\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/4b75d7a5-edd3-4738-af1f-cff2cdab8527.apng\"\n    },\n    {\n      \"id\": \"8vzylckmii\",\n      \"aliases\": [],\n      \"name\": \"owo_hyper\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ebad6c15-f344-4c83-a241-f082858b1ebb\"\n    },\n    {\n      \"id\": \"8vzyj5cfob\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"paimon_good\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-67fb974c-73f0-463d-b2ce-323959e0e417.png\"\n    },\n    {\n      \"id\": \"8vzyiozpho\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"relaxed_baby\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e139d9d5-cd9c-43f6-9df1-fded9c0ed887.png\"\n    },\n    {\n      \"id\": \"8vzyhx1e7b\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"SenkoHappyNosies\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f7929054-9e91-44f0-bb2c-af02b09738c8.png\"\n    },\n    {\n      \"id\": \"8vzyhwvu79\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ShibeSoHappy\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-692b77b7-cd70-4d13-b644-4f68e3202b91.png\"\n    },\n    {\n      \"id\": \"8vzygtm3pl\",\n      \"aliases\": [\n        \"ai\",\n        \"smile\"\n      ],\n      \"name\": \"smiling_ai\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-699dc895-7aae-4a27-a6b1-55dd0de54af7.png\"\n    },\n    {\n      \"id\": \"8vzyl5jufk\",\n      \"aliases\": [],\n      \"name\": \"smiling_face_with_a_lot_of_hearts\",\n      \"category\": \"Character / Happy\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-37d7200e-59cc-44a7-829c-0b152f0b7a19.png\"\n    },\n    {\n      \"id\": \"8vzyhufn69\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"NepHug\",\n      \"category\": \"Character / Hug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5bb3e7d4-aed3-40a9-abb8-fbbc30874715.png\"\n    },\n    {\n      \"id\": \"8vzyjfkcto\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"02lewd\",\n      \"category\": \"Character / lewd\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4a0a9f7d-a16e-426b-95b1-c60e9ba04e59.png\"\n    },\n    {\n      \"id\": \"8vzyjfywtu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"akko_lewd\",\n      \"category\": \"Character / lewd\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a84e77ce-d195-49c9-9aba-b042d2f2c405.png\"\n    },\n    {\n      \"id\": \"8vzyjfpftq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"lewd\",\n      \"category\": \"Character / lewd\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-84098041-239d-44fd-9828-1569ddcd7cd1.png\"\n    },\n    {\n      \"id\": \"8vzyjg88ty\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"lewd_sistine\",\n      \"category\": \"Character / lewd\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1ea3ff53-b141-4170-a764-722f1e75778c.png\"\n    },\n    {\n      \"id\": \"8vzyjftxts\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"rimuru_lewd_hearteyes\",\n      \"category\": \"Character / lewd\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2bf81de3-5d9e-4003-ad05-3246c79c93f3.png\"\n    },\n    {\n      \"id\": \"8vzyjg3ftw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sagiri_lewd\",\n      \"category\": \"Character / lewd\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-42fc2a62-ec7e-443e-af69-003ec6e55c7b.png\"\n    },\n    {\n      \"id\": \"8vzyk2qt45\",\n      \"aliases\": [],\n      \"name\": \"chick_wink_heart\",\n      \"category\": \"Character / Love\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-47133933-42ce-4c4b-9422-b69ce59ed0ec.png\"\n    },\n    {\n      \"id\": \"8vzyhvaa6l\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gustafgaveyoumyheart\",\n      \"category\": \"Character / Love\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c8e98579-53c6-43ef-81dd-83ff8524153f.png\"\n    },\n    {\n      \"id\": \"8vzylr0kpj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"love_nullcat\",\n      \"category\": \"Character / Love\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f7641f4b-f332-4bed-ba33-3d0c7d8068c4.png\"\n    },\n    {\n      \"id\": \"8vzyht6f5j\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mikulove\",\n      \"category\": \"Character / Love\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-af4608cf-bd7e-4f9c-88fd-6b6abf55cd8a.png\"\n    },\n    {\n      \"id\": \"8vzyj352nl\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"char_nachoneko_baa\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0accadc5-e1b4-40aa-b99d-efef01168d9b.png\"\n    },\n    {\n      \"id\": \"8vzyj265n5\",\n      \"aliases\": [\n        \"angry\",\n        \"おこ\",\n        \"おこる\"\n      ],\n      \"name\": \"nacho_angry\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2155f834-8b96-4223-aa38-d8b84428e7be.png\"\n    },\n    {\n      \"id\": \"8vzykztzcp\",\n      \"aliases\": [\n        \"なちょ猫\",\n        \"neko\",\n        \"kawaii\",\n        \"かわいい\",\n        \"うわあ\",\n        \"びっくり\",\n        \"bikkuri\",\n        \"ビックリ\",\n        \"驚く\",\n        \"odoroku\",\n        \"おどろく\",\n        \"虹色\",\n        \"にじいろ\",\n        \"rainbow\"\n      ],\n      \"name\": \"nacho_colors\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3111b4eb-8af6-4905-8926-6221d0da7204\"\n    },\n    {\n      \"id\": \"8vzyivptkm\",\n      \"aliases\": [\n        \"cry\",\n        \"泣く\",\n        \"しくしく\",\n        \"なみだ\"\n      ],\n      \"name\": \"nacho_cry\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f6ac4005-5dfd-4e63-8c61-c6db5355e887.png\"\n    },\n    {\n      \"id\": \"8vzyivccki\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nacho_hi\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-105da421-b3af-48fa-af6f-d616f9510823.png\"\n    },\n    {\n      \"id\": \"8vzyj2sdnb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nacho_look\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-07f27579-3472-47c5-bff0-d9ce6270e0b8.png\"\n    },\n    {\n      \"id\": \"8vzyj2lzn9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nacho_love\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1f583001-cb64-4776-9dde-f7e55f0a06bd.png\"\n    },\n    {\n      \"id\": \"8vzykhe492\",\n      \"aliases\": [\n        \"なちょ猫\",\n        \"neko\",\n        \"kawaii\",\n        \"かわいい\",\n        \"怒る\",\n        \"おこ\",\n        \"oko\",\n        \"angry\",\n        \"glitch\"\n      ],\n      \"name\": \"nachoneko_exasperated\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/99dc6658-e2a0-409c-a72f-5e7d6214a68f\"\n    },\n    {\n      \"id\": \"8vzyk9kj78\",\n      \"aliases\": [\n        \"なちょ猫\",\n        \"neko\",\n        \"kawaii\",\n        \"かわいい\",\n        \"うわあ\",\n        \"びっくり\",\n        \"bikkuri\",\n        \"ビックリ\",\n        \"驚く\",\n        \"odoroku\",\n        \"おどろく\",\n        \"虹色\",\n        \"にじいろ\",\n        \"rainbow\",\n        \"shake\",\n        \"ふるえる\",\n        \"震える\"\n      ],\n      \"name\": \"nachoneko_hyper\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f41eaf56-fe4b-4d35-ba7e-0a4934c7716c\"\n    },\n    {\n      \"id\": \"8vzykzwdcr\",\n      \"aliases\": [\n        \"なちょ猫\",\n        \"neko\",\n        \"kawaii\",\n        \"かわいい\",\n        \"love\",\n        \"あいしてる\",\n        \"はーと\",\n        \"らぶ\",\n        \"虹色\",\n        \"にじいろ\",\n        \"rainbow\",\n        \"shake\",\n        \"ふるえる\",\n        \"震える\"\n      ],\n      \"name\": \"nachoneko_lewd\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/9332d132-fba5-48e6-a17f-7484d65ca828\"\n    },\n    {\n      \"id\": \"8vzykzz6ct\",\n      \"aliases\": [\n        \"なちょ猫\",\n        \"neko\",\n        \"kawaii\",\n        \"かわいい\",\n        \"love\",\n        \"あいしてる\",\n        \"はーと\",\n        \"らぶ\",\n        \"虹色\",\n        \"にじいろ\",\n        \"rainbow\"\n      ],\n      \"name\": \"nachoneko_mesmerized\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/9ffbd2a1-2083-456c-9def-e618463745c4\"\n    },\n    {\n      \"id\": \"8vzykjmm98\",\n      \"aliases\": [\n        \"なちょ猫\",\n        \"neko\",\n        \"kawaii\",\n        \"かわいい\",\n        \"うわあ\",\n        \"びっくり\",\n        \"bikkuri\",\n        \"ビックリ\",\n        \"驚く\"\n      ],\n      \"name\": \"nachoneko_whoa\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c2a9bb87-e375-4a74-a569-a0eefcc040b3.png\"\n    },\n    {\n      \"id\": \"8vzyj2dun7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nacho_nya\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1fdba2fa-5d83-4dfb-8352-e4afac08674d.png\"\n    },\n    {\n      \"id\": \"8vzyj3lbnp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nacho_sleepy\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d21238f0-4c91-4d42-92dc-07fbf42239c7.png\"\n    },\n    {\n      \"id\": \"8vzyivjlkk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nacho_smile\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7b84cebd-9fdd-4dc0-bcb5-a2b7e2837145.png\"\n    },\n    {\n      \"id\": \"8vzyj3dunn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nacho_suki\",\n      \"category\": \"Character / Nachoneko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9b67d111-1f66-472e-8e59-ece139edcb83.png\"\n    },\n    {\n      \"id\": \"8vzyhuoi6d\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"notlikemiya\",\n      \"category\": \"Character / NotLike\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1e30c111-4157-4fd2-94cd-e2701358ccd4.png\"\n    },\n    {\n      \"id\": \"8vzyibotdk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"02pat\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-02003edb-40e9-4205-903b-d75ce856ab55.png\"\n    },\n    {\n      \"id\": \"8vzykzfxcj\",\n      \"aliases\": [],\n      \"name\": \"02peek\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-09efa40d-1457-4e76-9f82-32165698b9ba.png\"\n    },\n    {\n      \"id\": \"8vzyikd1fm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aaawoo\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/55cd103c-b7e2-4b4b-afa7-7a6d3b9d3b50.apng\"\n    },\n    {\n      \"id\": \"8vzykaoi7o\",\n      \"aliases\": [],\n      \"name\": \"ablobdjveryslow\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/798397d8-24ad-4f44-b72b-9a1fd81d2d1e\"\n    },\n    {\n      \"id\": \"8vzyji7nuj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ablobmaracas\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/bac27bb5-bce2-4867-a100-c701ba4686cb.apng\"\n    },\n    {\n      \"id\": \"8vzygvr7qp\",\n      \"aliases\": [\n        \"ai\"\n      ],\n      \"name\": \"ai_icon\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fb3c78da-a2ad-488c-a830-b033a55c3b9a.png\"\n    },\n    {\n      \"id\": \"8vzyjgq6u6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aismart\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7b91e104-9fb9-4131-8667-f5278287946c.png\"\n    },\n    {\n      \"id\": \"8vzyjjxhv9\",\n      \"aliases\": [],\n      \"name\": \"aissh\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-34fd54e1-41d5-4750-b8a4-cee74048e420.png\"\n    },\n    {\n      \"id\": \"8vzylcpcik\",\n      \"aliases\": [],\n      \"name\": \"AkaneShrug\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9057a802-24cc-4b85-a1c0-a00ecfff7249.png\"\n    },\n    {\n      \"id\": \"8vzyh05gsv\",\n      \"aliases\": [],\n      \"name\": \"angry_thinking_sleeping_face_with_tongue_sticking_out\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f2ac0ef4-a58a-4680-8ba4-703daa5dedd7.png\"\n    },\n    {\n      \"id\": \"8vzyj3qmnr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aqua\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-158d96ca-d72d-4554-b920-7ba63cea1a3d.png\"\n    },\n    {\n      \"id\": \"8vzyjegxt8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"bap\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/1a8e89a6-10fd-4315-85ad-491bd1144058.gif\"\n    },\n    {\n      \"id\": \"8vzylvdnql\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"bibibi_nullcat\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b7241cd1-9462-4b4e-bf18-b6053a844601.png\"\n    },\n    {\n      \"id\": \"8vzyj54jo7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"char_paimon\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3558384e-620f-456d-b68e-113ca24e5903.png\"\n    },\n    {\n      \"id\": \"8vzyk5wq5h\",\n      \"aliases\": [],\n      \"name\": \"chicken_roll\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3765d8e6-8344-4209-9a04-0389921e25e3\"\n    },\n    {\n      \"id\": \"8vzym478tf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chika_bonk\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/21777e66-f850-4697-b837-a3eb3d57e0a2.gif\"\n    },\n    {\n      \"id\": \"8vzykrp19s\",\n      \"aliases\": [\n        \"チルノ\",\n        \"ちるの\"\n      ],\n      \"name\": \"cirno_when\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c8626dc7-dd4a-4043-9c5d-7da893519d7b.png\"\n    },\n    {\n      \"id\": \"8vzyhrv24x\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"creeper\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b45d180d-ff9f-42b9-9590-db8490ac4ffd.png\"\n    },\n    {\n      \"id\": \"8vzyi2pd9m\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"danboard\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3d0d53ad-661a-4032-a75c-1bb63c6d3d3c.png\"\n    },\n    {\n      \"id\": \"8vzyhsix59\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"doge\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a28a87f0-b5e7-443a-83cb-102c86beb70e.png\"\n    },\n    {\n      \"id\": \"8vzyi7qcbq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"exploding_woozy\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0661a41d-824a-4d62-aa0e-e29da99143d0.png\"\n    },\n    {\n      \"id\": \"8vzyisgtj0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"eyes_blink\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5f7b6567-3589-4066-a409-e35cd5f7e87d.gif\"\n    },\n    {\n      \"id\": \"8vzykdcj8q\",\n      \"aliases\": [],\n      \"name\": \"foxjump\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5c311826-ec13-411e-b6ac-ecdc124272f1\"\n    },\n    {\n      \"id\": \"8vzyhrci4p\",\n      \"aliases\": [],\n      \"name\": \"genbaneko\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-84e370bb-bc1e-4ad7-b54f-c67b16438603.png\"\n    },\n    {\n      \"id\": \"8vzyjep0tc\",\n      \"aliases\": [\n        \"もこう\",\n        \"藤原妹紅\"\n      ],\n      \"name\": \"gyate_mokou_fire\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aca076fd-7ab4-4523-9a86-96a224f0b7bb.png\"\n    },\n    {\n      \"id\": \"8vzyll7rml\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"half_closed_eyes_woozy\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b94cfadd-0400-4a04-bacc-69f0785c6d5f.png\"\n    },\n    {\n      \"id\": \"8vzyisw5j6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hibiki_flex\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-778c8183-cae7-42ef-90dd-58340b8614f4.png\"\n    },\n    {\n      \"id\": \"8vzyl28de0\",\n      \"aliases\": [],\n      \"name\": \"hifumiblush\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9ea0bd33-76d3-477d-b821-c2729cdab0e3.png\"\n    },\n    {\n      \"id\": \"8vzyiv5nkg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hinata_acid\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/20e62301-87b2-4eac-b6af-30d9755b2dee.gif\"\n    },\n    {\n      \"id\": \"8vzyiogbhg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"icon_long_mewlme_bottom\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c846786a-1dd1-4bce-be54-cb4a7f7aaf04.png\"\n    },\n    {\n      \"id\": \"8vzyio50he\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"icon_long_mewlme_chest\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8909d42c-1d75-43b6-aa95-164117f97edc.png\"\n    },\n    {\n      \"id\": \"8vzyios0hk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"icon_long_mewlme_head\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-68b812b8-326e-498c-a075-025321ffb030.png\"\n    },\n    {\n      \"id\": \"8vzyiom1hi\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"icon_long_mewlme_middle\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-feefcd82-9c90-4856-92fa-15da4864787f.png\"\n    },\n    {\n      \"id\": \"8vzyl0z3d9\",\n      \"aliases\": [\n        \"scream\",\n        \"thinaticsystem\",\n        \"しなちくシステム\",\n        \"sinatikusisutemu\",\n        \"shinatikushisutemu\",\n        \"しなちくしすてむ\",\n        \"しなちなち\",\n        \"sinati\",\n        \"sinachi\",\n        \"thinachi\",\n        \"thinati\",\n        \"エクレール\",\n        \"マルティノッジ\",\n        \"Martinozzi\",\n        \"Éclair\",\n        \"Martinodge\",\n        \"Eclair\",\n        \"ekure-ru\",\n        \"marutexinozzi\",\n        \"marutelinozzi\",\n        \"叫ぶ\",\n        \"さけぶ\",\n        \"sakebu\",\n        \"驚く\",\n        \"おどろく\",\n        \"odoroku\",\n        \"surprised\"\n      ],\n      \"name\": \"icon_thinaticsystem\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-531619aa-de96-45d5-b6ba-437dcfefad77.png\"\n    },\n    {\n      \"id\": \"8zi5qwt0fy\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"illya_panic\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/25383f57-0e7e-4f3d-a630-8c7a0c8ac031.gif\"\n    },\n    {\n      \"id\": \"8vzyi8ytcc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"joshu\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-88468b76-7168-4c9e-8d52-b1b181e1d099.png\"\n    },\n    {\n      \"id\": \"8vzyhvex6n\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"KannaBlob\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a622887e-4608-4b97-94c4-80d4a3125532.png\"\n    },\n    {\n      \"id\": \"8vzyho292r\",\n      \"aliases\": [],\n      \"name\": \"kobatokokoa\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9ecd2a92-fb0e-4330-a581-448dea7ffd5c.png\"\n    },\n    {\n      \"id\": \"8vzyh98yx0\",\n      \"aliases\": [],\n      \"name\": \"kyle\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4271b238-fe71-46e4-80ec-8d9ce2437ac6.png\"\n    },\n    {\n      \"id\": \"8vzyj5gzof\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"maid_nod\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/878ee041-9e1c-4250-b63e-08d9006db97a.gif\"\n    },\n    {\n      \"id\": \"8vzyil8kg4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mastodon_oops\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/b77573b2-61db-47ec-bf09-1880f0c9b714.apng\"\n    },\n    {\n      \"id\": \"8vzyh8pcws\",\n      \"aliases\": [],\n      \"name\": \"mei23\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6fc3e232-dc0e-4179-97fd-34d88344529f.png\"\n    },\n    {\n      \"id\": \"8vzyimrpgk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"menharayippie\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/bd5771ec-9de9-45bc-86e5-e5cd274f1963.gif\"\n    },\n    {\n      \"id\": \"8vzyi776bg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mikuDab\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d3b4c097-82f7-4fc1-8f54-e66d26a41127.png\"\n    },\n    {\n      \"id\": \"8vzym64uu9\",\n      \"aliases\": [\n        \"kro\",\n        \"stackoverflow\",\n        \"500\",\n        \"\"\n      ],\n      \"name\": \"misskeystackoverflow\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/8aa9c4e9-c830-4bfd-9929-12af21b3e689.gif\"\n    },\n    {\n      \"id\": \"8vzyiqrgic\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"molcar\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-75b902bb-bc1a-4dc1-b77b-c37babc7f410.png\"\n    },\n    {\n      \"id\": \"8vzyiqn7ia\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"molcar_police\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-735f2b1e-5702-4139-aa17-ea1cafd67d6a.png\"\n    },\n    {\n      \"id\": \"8vzyiqiki8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"molcar_troubled\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0d1905d8-f79b-4886-ab11-935be6ec7b4c.png\"\n    },\n    {\n      \"id\": \"8vzylv0eqj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"monster_nullcat\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bb95742a-4b29-4f15-9917-09b4f5b44135.png\"\n    },\n    {\n      \"id\": \"8vzylxcpr1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mutsuki_surprised\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e4c3728d-ca50-4e69-9497-6afba14b2ec8.png\"\n    },\n    {\n      \"id\": \"8vzyh5rsvh\",\n      \"aliases\": [],\n      \"name\": \"neko_kitui_scp_040_jp_j_snoj_Ikr_4185_cc_by_sa_3_0\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-11142ba0-73e9-4707-8119-70b7da8bd5a1.png\"\n    },\n    {\n      \"id\": \"8vzyh5n5vf\",\n      \"aliases\": [\n        \"neko_test\"\n      ],\n      \"name\": \"neko_scp_040_jp_Ikr_4185_cc_by_sa_3_0\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-59312373-78f0-4ee3-a731-2812d2ae4dd0.png\"\n    },\n    {\n      \"id\": \"8vzyit3bja\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"oh_shoboon\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5f41c3ec-6cc9-4836-9701-377ebe316162.png\"\n    },\n    {\n      \"id\": \"8vzyj9ezq9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"Otachan_DRINKING\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/8124c0af-2dce-4265-a9d7-4944f13cb9d5.gif\"\n    },\n    {\n      \"id\": \"8vzyl3j5ek\",\n      \"aliases\": [\n        \"ポプ子\",\n        \"popteamepic\",\n        \"ポプテピピック\",\n        \"popuko\"\n      ],\n      \"name\": \"o_wa\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8f2306c2-8727-4b23-9618-d375764fe4e2.png\"\n    },\n    {\n      \"id\": \"8vzyhoup3n\",\n      \"aliases\": [],\n      \"name\": \"owaaaaaa\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/adeff4c0-82fd-4f0c-98b9-2edbc73ca95f.gif\"\n    },\n    {\n      \"id\": \"8vzym68uub\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"oyaji_body\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-90f57e07-3664-4df5-a443-5443dceb4e82.png\"\n    },\n    {\n      \"id\": \"8vzyj50oo5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"paimonknife\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1a8cf90f-e6e8-46c1-8e3a-698b7e5cbd53.png\"\n    },\n    {\n      \"id\": \"8vzyhykx7n\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"parrot_sorena\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-542af3cf-8f87-476b-9fed-69dba2c44e55.png\"\n    },\n    {\n      \"id\": \"8vzym1azs7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"petthex_nullcat\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/61eea53f-00e4-464e-b9f9-5f7d2f1ce0a1.gif\"\n    },\n    {\n      \"id\": \"8vzykwrtb5\",\n      \"aliases\": [],\n      \"name\": \"praise\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4ca9d0f2-9921-4cc6-a124-f33250b07c2f.png\"\n    },\n    {\n      \"id\": \"8vzylk8hm5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"psychedelic_fits\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/571fb5f8-bb6d-4456-9fb9-2f3338459106.gif\"\n    },\n    {\n      \"id\": \"8vzyjc4bs2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"puniko_hi\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/11895c58-17fe-4ce5-baa7-1029340db948.apng\"\n    },\n    {\n      \"id\": \"8vzyhor63j\",\n      \"aliases\": [],\n      \"name\": \"rhaha_anger_loop\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ee2ad99a-d365-41b6-8b9f-c39b16c38b12.gif\"\n    },\n    {\n      \"id\": \"8vzyhop53h\",\n      \"aliases\": [],\n      \"name\": \"rhaha_norinori\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/9e243e06-0361-4323-93e5-f19ac101ceb8.gif\"\n    },\n    {\n      \"id\": \"8vzyhosy3l\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"rhaha_norinori_loop\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/4b845ba6-33a9-4c34-8f1b-7418763838cd.gif\"\n    },\n    {\n      \"id\": \"8vzym0fort\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sad_nullcat\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9e36ca47-0ae8-4722-95fc-7f9489e613ea.png\"\n    },\n    {\n      \"id\": \"8vzyj4n2nz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shizuku_ah\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cbacca07-b120-413a-b80e-1e8e4281c40b.png\"\n    },\n    {\n      \"id\": \"8vzyj3zgnt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shizuku_look\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ae92dfa3-4bda-4085-96a1-80e2fdcd44af.png\"\n    },\n    {\n      \"id\": \"8vzyj4ghnx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shizuku_oh\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8f7f5145-fdd0-4823-88f4-260ef120cc46.png\"\n    },\n    {\n      \"id\": \"8vzygu5wpt\",\n      \"aliases\": [\n        \"ai\",\n        \"sleep\",\n        \"oyasumi\",\n        \"suya\"\n      ],\n      \"name\": \"sleeping_ai\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7ee80661-c910-454b-97dc-36628078292a.png\"\n    },\n    {\n      \"id\": \"8vzyi7spbs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"smile_woozy\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d12ef4c7-a4f9-4e1c-a3d1-606cb194adef.gif\"\n    },\n    {\n      \"id\": \"8vzyiircey\",\n      \"aliases\": [\n        \"ai\",\n        \"surprise\"\n      ],\n      \"name\": \"surprised_ai\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bfc771ee-818b-4360-b961-3c5afa6213e3.png\"\n    },\n    {\n      \"id\": \"8vzyj7y9pf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"take_this\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/14e1f618-d319-43ff-9e6a-a53c534bab4e.gif\"\n    },\n    {\n      \"id\": \"8vzym10mrv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"think_nullcat\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-177b88c3-24d8-4af9-938f-aeef5c1cbc64.png\"\n    },\n    {\n      \"id\": \"8vzyh8ycww\",\n      \"aliases\": [],\n      \"name\": \"tvchan\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3d2c68f5-69b8-4ee8-b06e-47bf5b817275.png\"\n    },\n    {\n      \"id\": \"8vzyh0cjsx\",\n      \"aliases\": [],\n      \"name\": \"vomiting_thinking_skeptical_face_with_hugging_hands\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-94d3d42d-a3b2-47f5-bb47-d1cbf81e14bc.png\"\n    },\n    {\n      \"id\": \"8vzyhone3f\",\n      \"aliases\": [],\n      \"name\": \"wobbly_chicken\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2ce0c29c-4fd6-45e3-891a-50210a893976.gif\"\n    },\n    {\n      \"id\": \"8vzyl4b8ew\",\n      \"aliases\": [],\n      \"name\": \"woozy_angry\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-62ac8ea3-52eb-4800-a8e4-54bf6517eda7.png\"\n    },\n    {\n      \"id\": \"8vzyl5zdfs\",\n      \"aliases\": [],\n      \"name\": \"woozy_sob\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ffed2953-bac6-41b0-b90f-603baf163e6b.png\"\n    },\n    {\n      \"id\": \"8vzyk2153v\",\n      \"aliases\": [],\n      \"name\": \"woozytoocold\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3257d308-8a68-40a1-9384-f8dc7103b8d0.png\"\n    },\n    {\n      \"id\": \"8vzyk2953x\",\n      \"aliases\": [],\n      \"name\": \"woozytoohot\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e5f1700b-70a2-4621-8e41-3be531c9783c.png\"\n    },\n    {\n      \"id\": \"8vzyi7flbm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yen_face\",\n      \"category\": \"Character / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-01a86122-8862-4183-8c74-049b5e64e2c8.png\"\n    },\n    {\n      \"id\": \"8vzykz4ycb\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"mogumogu\",\n        \"モグモグ\",\n        \"食べ物\",\n        \"ご馳走\",\n        \"food\",\n        \"おいしい\",\n        \"delicious\",\n        \"美味しい\",\n        \"oishii\"\n      ],\n      \"name\": \"paimon_hungry\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6710f3c5-f4c0-4c00-aa49-46ded764b032.png\"\n    },\n    {\n      \"id\": \"8vzyk3ui4l\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"mogumogu\",\n        \"モグモグ\",\n        \"食べ物\",\n        \"ご馳走\",\n        \"food\",\n        \"おいしい\",\n        \"delicious\",\n        \"美味しい\",\n        \"oishii\"\n      ],\n      \"name\": \"paimon_nomming\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e596980b-b49c-42b3-9f94-3a5b5bf3d15b\"\n    },\n    {\n      \"id\": \"8vzykz7kcf\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"ひょこ\",\n        \"hyoko\"\n      ],\n      \"name\": \"paimon_out_of_nowhere\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2838d0ef-e8fe-4338-8245-86b948333a06.apng\"\n    },\n    {\n      \"id\": \"8vzykyvdc7\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"nemui\",\n        \"oyasumi\",\n        \"ねむい\",\n        \"眠い\",\n        \"おやすみ\",\n        \"neteru\",\n        \"寝てる\",\n        \"寝ている\",\n        \"neteiru\"\n      ],\n      \"name\": \"paimon_peacefully\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bab5b93b-b590-4da4-a992-860c1ed98a40.png\"\n    },\n    {\n      \"id\": \"8vzykz65cd\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"ひょこ\",\n        \"hyoko\"\n      ],\n      \"name\": \"paimon_peek\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/178a1e82-729b-471f-8315-b1d60bb1b36e.apng\"\n    },\n    {\n      \"id\": \"8vzykz06c9\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"nemui\",\n        \"oyasumi\",\n        \"ねむい\",\n        \"眠い\",\n        \"おやすみ\",\n        \"neteru\",\n        \"寝てる\",\n        \"寝ている\",\n        \"neteiru\"\n      ],\n      \"name\": \"paimon_sleepy\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8e4321ce-4659-476e-b989-a170f863924e.png\"\n    },\n    {\n      \"id\": \"8vzyj58ao9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"paimon_surprised\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dbf35190-b22a-4e42-a229-353582589753.png\"\n    },\n    {\n      \"id\": \"8vzyk75k66\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"びっくり\"\n      ],\n      \"name\": \"paimon_surprised_in_a_washmachine\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f92a9dbd-45eb-4eb6-87e4-8abae4ca6f1d\"\n    },\n    {\n      \"id\": \"8vzyka257e\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"びっくり\"\n      ],\n      \"name\": \"paimon_surprised_quake\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/51a89642-f870-4492-ad34-a2c9328055d9\"\n    },\n    {\n      \"id\": \"8vzyk73q64\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"びっくり\"\n      ],\n      \"name\": \"paimon_surprised_zoom\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c699a836-4df8-4685-a3c7-87b030b1df47\"\n    },\n    {\n      \"id\": \"8vzykalc7m\",\n      \"aliases\": [\n        \"ぱいもん\",\n        \"パイモン\",\n        \"genshin\",\n        \"げんしん\",\n        \"原神\",\n        \"びっくり\"\n      ],\n      \"name\": \"paimon_surprised_zoomout\",\n      \"category\": \"Character / Paimon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/02084a80-fec0-4b86-8c91-804a77b64257\"\n    },\n    {\n      \"id\": \"8vzyhsnv5b\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pepehands\",\n      \"category\": \"Character / Pepe\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bf563a41-3d64-458a-88ff-e2a8eb95cc4e.png\"\n    },\n    {\n      \"id\": \"8vzyl66kfw\",\n      \"aliases\": [\n        \"pepe\",\n        \"ペペ\",\n        \"ぺぺ\"\n      ],\n      \"name\": \"pepejam\",\n      \"category\": \"Character / Pepe\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/617c1008-237f-42c9-9ab0-e0f579b235ea.apng\"\n    },\n    {\n      \"id\": \"8vzyl6aofy\",\n      \"aliases\": [\n        \"sad\",\n        \"pepe\",\n        \"ペペ\",\n        \"ぺぺ\",\n        \"\"\n      ],\n      \"name\": \"pepesad\",\n      \"category\": \"Character / Pepe\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-45f98518-7b64-4042-8a2b-786f7c1fbb81.png\"\n    },\n    {\n      \"id\": \"8vzyl64efu\",\n      \"aliases\": [\n        \"pepe\",\n        \"smug\",\n        \"どやがお\",\n        \"ドヤ顔\",\n        \"ペペ\",\n        \"ペペ\"\n      ],\n      \"name\": \"pepesmug\",\n      \"category\": \"Character / Pepe\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f852194c-0ab9-45b1-aa7c-ff85db6dd76a.png\"\n    },\n    {\n      \"id\": \"8vzyl6etg0\",\n      \"aliases\": [\n        \"think\",\n        \"pepe\",\n        \"ぺぺ\",\n        \"ペペ\",\n        \"\"\n      ],\n      \"name\": \"pepethinking\",\n      \"category\": \"Character / Pepe\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cbb4ea16-73d9-43be-852d-ca71ee6e30e7.png\"\n    },\n    {\n      \"id\": \"8vzykvj5ah\",\n      \"aliases\": [\n        \"蚊取り線香\",\n        \"かとりせんこう\",\n        \"katorisennkou\"\n      ],\n      \"name\": \"katorisenkou\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f925e726-d8d9-4265-bf9e-04b2e09515eb.png\"\n    },\n    {\n      \"id\": \"8vzykw51an\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko1\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/6e3e5675-81c1-4e50-b78f-dd3f3e54dd2a\"\n    },\n    {\n      \"id\": \"8vzykw7pap\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko2\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/efd9068e-934b-4bc3-86dd-8402cd3c3a67\"\n    },\n    {\n      \"id\": \"8vzykw9gar\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko3\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/138f5eb1-9856-4366-bec7-2af6fe900573\"\n    },\n    {\n      \"id\": \"8vzykwbcat\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko4\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d5dc40ee-db68-4b00-802f-8c56e0ae1b60\"\n    },\n    {\n      \"id\": \"8vzykwe8av\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko5\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e46fc1aa-b244-43ab-b5c1-c3c66eb2155d\"\n    },\n    {\n      \"id\": \"8vzykwgbax\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko6\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3be6a454-0a31-4aac-858d-6770312d87df\"\n    },\n    {\n      \"id\": \"8vzykwidaz\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko7\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/65a8a969-6f06-48ad-a732-17df197d63fb\"\n    },\n    {\n      \"id\": \"8vzykwlcb1\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\"\n      ],\n      \"name\": \"senko8\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2ada6d48-584d-406b-bf45-da4b9a60eb14\"\n    },\n    {\n      \"id\": \"8vzykwncb3\",\n      \"aliases\": [\n        \"big\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"dance\",\n        \"ダンス\",\n        \"kawaii\",\n        \"かわいい\",\n        \"可愛い\"\n      ],\n      \"name\": \"senko9\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5b987fe4-0fd9-4bbb-8e9d-f78c7760a6b0\"\n    },\n    {\n      \"id\": \"8vzyj98yq5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senko_araara\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/94841bb7-3227-4dff-9749-b3fcae665eb4.gif\"\n    },\n    {\n      \"id\": \"8vzykv1ea9\",\n      \"aliases\": [\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"自慢\",\n        \"じまん\",\n        \"jiman\",\n        \"ziman\",\n        \"ドヤ\",\n        \"どや\",\n        \"doya\",\n        \"ドヤ顔\",\n        \"どや顔\",\n        \"doyagao\"\n      ],\n      \"name\": \"senko_boast\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f30df6f5-f15a-473e-b331-c4475f5897ce.png\"\n    },\n    {\n      \"id\": \"8vzykuf2a0\",\n      \"aliases\": [\n        \"bread\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"パン\",\n        \"ぱん\",\n        \"pan\",\n        \"食パン\",\n        \"しょくぱん\",\n        \"syokupan\",\n        \"food\",\n        \"食べ物\",\n        \"たべもの\"\n      ],\n      \"name\": \"senko_bread\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a1a0f2cf-7d02-464b-9f07-6aac81ee2ef3.png\"\n    },\n    {\n      \"id\": \"8vzykupla4\",\n      \"aliases\": [\n        \"cry\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"泣く\",\n        \"なく\",\n        \"naku\",\n        \"涙\",\n        \"なみだ\",\n        \"namida\"\n      ],\n      \"name\": \"senkocry\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-050f335a-b289-4ea4-9d7c-29f92f664cee.png\"\n    },\n    {\n      \"id\": \"8vzyj7pxpb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senko_dance\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0dd7245c-d313-42be-9386-e23263ec077a.gif\"\n    },\n    {\n      \"id\": \"8vzykv70ac\",\n      \"aliases\": [\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"嫌\",\n        \"いや\",\n        \"iya\",\n        \"無理\",\n        \"むり\",\n        \"muri\",\n        \"キツい\",\n        \"きつい\",\n        \"kitsui\",\n        \"kitui\"\n      ],\n      \"name\": \"senko_disgust\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ca2314bf-96fc-4fb3-bcea-dcc2feb46276.png\"\n    },\n    {\n      \"id\": \"8vzyjf54ti\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senkohappy\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2a4fd369-b0ad-4d18-a64b-baa9688a5f1b.png\"\n    },\n    {\n      \"id\": \"8vzyjf0dtg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senko_happy4\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-303f9a2d-993d-4081-8114-665d86de7389.png\"\n    },\n    {\n      \"id\": \"8vzyiiwif0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senkohmm\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-947e0767-78c1-4093-8f97-9f23f9eaeb3d.png\"\n    },\n    {\n      \"id\": \"8vzyj4vjo3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senko_lewd\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a0f86624-6c8a-40fd-9a77-f9f2181199b3.png\"\n    },\n    {\n      \"id\": \"8vzyjfeytm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senkolewd\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5409035a-5ade-4060-9c3b-d4fc6c4158b8.png\"\n    },\n    {\n      \"id\": \"8vzykqbs9q\",\n      \"aliases\": [\n        \"nom\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"モグモグ\",\n        \"もぐもぐ\",\n        \"mogumogu\",\n        \"美味しい\",\n        \"おいしい\",\n        \"oishii\",\n        \"幸せ\",\n        \"しあわせ\",\n        \"shiawase\",\n        \"happy\",\n        \"food\",\n        \"eat\"\n      ],\n      \"name\": \"senkonom\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-42fabe83-e7a3-4047-80e3-3bfff68a914b.png\"\n    },\n    {\n      \"id\": \"8vzyjeupte\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senko_oh\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ce72871b-762d-4d66-bfec-456e28b3c5b8.png\"\n    },\n    {\n      \"id\": \"8vzyku1c9y\",\n      \"aliases\": [\n        \"please\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"お願い\",\n        \"おねがい\",\n        \"onegai\",\n        \"上目遣い\",\n        \"上目づかい\",\n        \"うわめづかい\",\n        \"uwamedukai\"\n      ],\n      \"name\": \"senko_please\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-74ed278b-8b44-46f3-992a-8b655453f1cf.png\"\n    },\n    {\n      \"id\": \"8vzykw1yal\",\n      \"aliases\": [\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"驚く\",\n        \"おどろく\",\n        \"odoroku\",\n        \"wow\",\n        \"びっくり\",\n        \"ビックリ\",\n        \"bikkuri\"\n      ],\n      \"name\": \"senkopog\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7bc25c7e-e6b8-45bb-8c96-c93ac4a1c936.png\"\n    },\n    {\n      \"id\": \"8vzykuk2a2\",\n      \"aliases\": [\n        \"scream\",\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"叫ぶ\",\n        \"さけぶ\",\n        \"sakebu\",\n        \"scream\"\n      ],\n      \"name\": \"senko_scream\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-da2b1b53-d6b8-434c-8fea-5cdc66178a18.png\"\n    },\n    {\n      \"id\": \"8vzyjfajtk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senko_scream2\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5e2b94f0-494b-44b2-aa57-258e6cb4b1e0.png\"\n    },\n    {\n      \"id\": \"8vzykvobaj\",\n      \"aliases\": [\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"驚く\",\n        \"おどろく\",\n        \"odoroku\",\n        \"wow\",\n        \"びっくり\",\n        \"ビックリ\",\n        \"bikkuri\",\n        \"無表情\",\n        \"むひょうじょう\",\n        \"muhyouzyou\",\n        \"ショック\",\n        \"しょっく\",\n        \"syokku\"\n      ],\n      \"name\": \"senko_shock\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7406a7c4-08d5-48ed-a3ea-3c962ea3bb42.png\"\n    },\n    {\n      \"id\": \"8vzyi9aaci\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senkosmug\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-30c135c1-965f-4c39-b299-9bb9fe094ed1.png\"\n    },\n    {\n      \"id\": \"8vzykveraf\",\n      \"aliases\": [\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"恥ずかしい\",\n        \"はずかしい\",\n        \"hazukashii\",\n        \"焦る\",\n        \"あせる\",\n        \"aseru\",\n        \"顔が赤い\",\n        \"かおがあかい\",\n        \"kaogaakai\",\n        \"赤い\",\n        \"あかい\",\n        \"akai\",\n        \"エッチ\",\n        \"えっち\",\n        \"ecchi\"\n      ],\n      \"name\": \"senko_stop\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d600ad33-561c-4f39-a103-9772529395a9.png\"\n    },\n    {\n      \"id\": \"8vzykuw7a7\",\n      \"aliases\": [\n        \"sennko\",\n        \"仙狐さん\",\n        \"せんこさん\",\n        \"驚く\",\n        \"おどろく\",\n        \"odoroku\",\n        \"wow\",\n        \"びっくり\",\n        \"ビックリ\",\n        \"bikkuri\"\n      ],\n      \"name\": \"senko_wow2\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7c171461-7b6c-436b-bf9e-4c3a8598dfd9.png\"\n    },\n    {\n      \"id\": \"8vzyi95tcg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"senko_wubbel\",\n      \"category\": \"Character / Senko\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/809f37eb-318b-44a5-8a0a-63574db37359.gif\"\n    },\n    {\n      \"id\": \"8vzyguqbq9\",\n      \"aliases\": [\n        \"ai\",\n        \"doya\",\n        \"kiri\",\n        \"smirk\"\n      ],\n      \"name\": \"doya_ai\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7a5417c8-d7bf-4549-a8e7-ccee77b6812b.png\"\n    },\n    {\n      \"id\": \"8vzyjbh2rq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hehe\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d649e1d0-bf08-4c21-89b1-53c96e0e6689.png\"\n    },\n    {\n      \"id\": \"8vzyhw0l6x\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"JahySmug\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f4b6a97b-5d36-4a3b-ad0c-83dae8c5d982.png\"\n    },\n    {\n      \"id\": \"8vzyjbtxrw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"puniko_smug2\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f1d23f65-4d22-42a8-9e36-12ff851e8c35.png\"\n    },\n    {\n      \"id\": \"8vzyjbyhry\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"puniko_smug3\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e3565bf3-e8be-4cd3-afac-3fc202a0fbfe.png\"\n    },\n    {\n      \"id\": \"8vzyhw5l6z\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ShibeSmug\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bad6a30d-e4d6-42b9-90d6-5ab69801cb80.png\"\n    },\n    {\n      \"id\": \"8vzyhwcw71\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ShinobuSmug\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f9cc6ca9-7f98-4ea0-8838-95091ba419f9.png\"\n    },\n    {\n      \"id\": \"8vzyhvww6v\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"smugai\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-05c70dae-8150-47a6-ae1e-ad6786d9528a.png\"\n    },\n    {\n      \"id\": \"8vzyhvrx6t\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"smugIsabelle\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-394f09db-20f2-4369-8ff2-d772253a5215.png\"\n    },\n    {\n      \"id\": \"8vzyhvni6r\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tohrusmug\",\n      \"category\": \"Character / Smug\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0d9baf66-5e2e-416d-8a9a-d656248b8ecd.png\"\n    },\n    {\n      \"id\": \"8vzyk67r5o\",\n      \"aliases\": [],\n      \"name\": \"akko_thonk\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-34ea87f8-08e9-4a02-9c64-71bf5458565d.png\"\n    },\n    {\n      \"id\": \"8vzyhuw76f\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"AnimuThinku\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-17300695-ecee-4e21-beed-daca91f51647.png\"\n    },\n    {\n      \"id\": \"8vzyh5wbvj\",\n      \"aliases\": [\n        \"thinking\"\n      ],\n      \"name\": \"hyperthink\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-669ac733-4632-4e2d-9107-823b150dcfde.png\"\n    },\n    {\n      \"id\": \"8vzyk1413j\",\n      \"aliases\": [],\n      \"name\": \"syncing_face\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5b88142e-2ccd-48d5-a1a1-86e66a7184c9.png\"\n    },\n    {\n      \"id\": \"8vzyik21fg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"taniguti_hyperthink\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cd40ae84-1e62-483a-a860-cb7ec770971d.png\"\n    },\n    {\n      \"id\": \"8vzyik6ffi\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"taniguti_thinking\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-836e6ab8-361d-4f67-8757-0d0978e55c9e.png\"\n    },\n    {\n      \"id\": \"8vzyl0r6d7\",\n      \"aliases\": [\n        \"thinking\",\n        \"ターニャ\",\n        \"デグレチャフ\",\n        \"Tanya\",\n        \"Degurechaff\",\n        \"幼女戦記\",\n        \"youzyosenki\",\n        \"youjosenki\",\n        \"考える\",\n        \"かんがえる\",\n        \"kangaeru\",\n        \"考えている\",\n        \"かんがえている\",\n        \"kangaeteiru\"\n      ],\n      \"name\": \"tanya_thinking\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-db117413-7d88-4954-bf5f-1960f02a2cb5.png\"\n    },\n    {\n      \"id\": \"8vzyh61nvm\",\n      \"aliases\": [\n        \"thinking\",\n        \"happy\"\n      ],\n      \"name\": \"thinkhappy\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-58482b90-ce3d-4416-89d7-d871da8bc954.png\"\n    },\n    {\n      \"id\": \"8vzyibjldi\",\n      \"aliases\": [\n        \"ai\"\n      ],\n      \"name\": \"thinking__ai\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bc1bd076-13c9-483b-ac14-12f1fa18d23a.png\"\n    },\n    {\n      \"id\": \"8vzygu0dpr\",\n      \"aliases\": [\n        \"ai\",\n        \"thinking\"\n      ],\n      \"name\": \"thinking_ai\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a69350ed-82b2-4765-8856-af4cc70afea1.png\"\n    },\n    {\n      \"id\": \"8vzyk3i04h\",\n      \"aliases\": [],\n      \"name\": \"thinking_cat_face\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5997e8ae-a1a5-4912-8ae3-47c319b5b4a0.png\"\n    },\n    {\n      \"id\": \"8vzyk38e4d\",\n      \"aliases\": [],\n      \"name\": \"thinking_clap\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aaecafa2-9cea-411a-89de-31fc09003ab9.png\"\n    },\n    {\n      \"id\": \"8vzyk33s4b\",\n      \"aliases\": [],\n      \"name\": \"thinking_face_both\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-00cd19d7-d6c0-42bf-b719-14a2d23ad078.png\"\n    },\n    {\n      \"id\": \"8vzyjzs02x\",\n      \"aliases\": [],\n      \"name\": \"thinking_framing\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d305b6cb-6ddb-407c-8881-2110222d6acc.png\"\n    },\n    {\n      \"id\": \"8vzyhnhp2h\",\n      \"aliases\": [\n        \"thinking\"\n      ],\n      \"name\": \"thinking_rotate\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/85cf322d-d9aa-43c7-862a-d80f73b81ddb.apng\"\n    },\n    {\n      \"id\": \"8vzyi7xvbu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"thinking_shamiko\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cf2c3609-7038-4b11-a8da-a155134de63c.png\"\n    },\n    {\n      \"id\": \"8vzyl23xdy\",\n      \"aliases\": [],\n      \"name\": \"thinking_sunriseovermountains\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-18d66d2c-3bb0-456e-b25e-51b80e010901.png\"\n    },\n    {\n      \"id\": \"8vzyj7vypd\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"thinking_woozy\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7accb944-a993-49a7-a1ab-a2e15fbac714.png\"\n    },\n    {\n      \"id\": \"8vzyji5iuh\",\n      \"aliases\": [],\n      \"name\": \"thinknyan\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9b73b364-578a-4bef-bf38-d29f91aee0cf.png\"\n    },\n    {\n      \"id\": \"8vzyhsws5f\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"thonk\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4726b976-089f-4846-82c6-089c69a4dbd9.png\"\n    },\n    {\n      \"id\": \"8vzyk5z75j\",\n      \"aliases\": [],\n      \"name\": \"thonk_roll\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5f099ff0-3ba9-4f5b-abb5-31bc943651f2\"\n    },\n    {\n      \"id\": \"8vzyk62c5l\",\n      \"aliases\": [],\n      \"name\": \"thonk_spin\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/abf0e649-6204-410c-8533-2c3a587506be\"\n    },\n    {\n      \"id\": \"8vzyjydy2b\",\n      \"aliases\": [],\n      \"name\": \"verifinking\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fe09ba79-3175-44e8-992e-a0f2e59310a2.png\"\n    },\n    {\n      \"id\": \"8vzyk2vq47\",\n      \"aliases\": [],\n      \"name\": \"zen_thinking\",\n      \"category\": \"Character / Think\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6a838e14-417e-451e-8fef-925ef3cf6b04.png\"\n    },\n    {\n      \"id\": \"8vzyjgd0u0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aishock\",\n      \"category\": \"Character / What\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ff72e2d9-7dba-4307-9286-4e55820c5236.png\"\n    },\n    {\n      \"id\": \"8vzyhwhd73\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"AquaWut\",\n      \"category\": \"Character / What\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-75927051-10ec-4763-807d-e673693029d2.png\"\n    },\n    {\n      \"id\": \"8vzyhviv6p\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"KannaWhat\",\n      \"category\": \"Character / What\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-65d5e4a1-8d14-4954-aca8-6448306bd0eb.png\"\n    },\n    {\n      \"id\": \"8vzyhwmk75\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shibawhat\",\n      \"category\": \"Character / What\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ad7d9bcd-b5e8-4ab1-b3db-f10c99ed692a.png\"\n    },\n    {\n      \"id\": \"8vzyj490nv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shizuku_questioning\",\n      \"category\": \"Character / What\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-efa39c78-c941-48f3-b1be-c5d34967d4e5.png\"\n    },\n    {\n      \"id\": \"8vzyh9cwx2\",\n      \"aliases\": [],\n      \"name\": \"happymac\",\n      \"category\": \"Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-27c23df3-933d-40f2-adcd-a41c29e9a21d.png\"\n    },\n    {\n      \"id\": \"8vzyh9gmx4\",\n      \"aliases\": [\n        \"gamingshark\"\n      ],\n      \"name\": \"rainbowshark\",\n      \"category\": \"Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f774be9e-f383-4384-8200-8f04aa405d11.png\"\n    },\n    {\n      \"id\": \"8vzyh8tawu\",\n      \"aliases\": [],\n      \"name\": \"sadmac\",\n      \"category\": \"Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0667a5c8-1761-4d16-9b78-615f5b2ae879.png\"\n    },\n    {\n      \"id\": \"8vzyh0glt1\",\n      \"aliases\": [\n        \"stat\",\n        \"sake\",\n        \"beer\"\n      ],\n      \"name\": \"stat_sake\",\n      \"category\": \"Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e4f9f119-5605-41a5-95da-e46fac35c86d.apng\"\n    },\n    {\n      \"id\": \"8vzyh0ixt3\",\n      \"aliases\": [],\n      \"name\": \"stat_sing\",\n      \"category\": \"Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ed4cc231-7f19-436e-891f-0c1e599c5b47.apng\"\n    },\n    {\n      \"id\": \"8vzyh0met5\",\n      \"aliases\": [\n        \"stat\",\n        \"sweets\",\n        \"cake\"\n      ],\n      \"name\": \"stat_sweets\",\n      \"category\": \"Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/65b4e02e-5a91-456c-abde-885b87f00497.apng\"\n    },\n    {\n      \"id\": \"8vzyh0ehsz\",\n      \"aliases\": [\n        \"stat\",\n        \"tea\"\n      ],\n      \"name\": \"stat_tea\",\n      \"category\": \"Cute\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3dc00c4e-07d7-4d66-8e1c-c9b0b266d4b3.apng\"\n    },\n    {\n      \"id\": \"8vzyhuas67\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aawoo\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5c96ebc7-bec0-4e1c-a8d4-f56fd974c351.apng\"\n    },\n    {\n      \"id\": \"8vzyhu0e61\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"anidab_left\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3a61cd95-4344-4d75-87b7-43520c0c1bd4.png\"\n    },\n    {\n      \"id\": \"8vzyhu4k63\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"anidab_right\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1d572689-d0f4-41ad-a13b-aa274390a196.png\"\n    },\n    {\n      \"id\": \"8vzyl1zddw\",\n      \"aliases\": [],\n      \"name\": \"aqua_dance\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0320dbf3-7ded-4f16-9242-929ec47f2f1f.apng\"\n    },\n    {\n      \"id\": \"8vzyll1wmj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chikaposinginhighspirits\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0b50fb9d-37fa-4d47-b381-eccca0c4487d.gif\"\n    },\n    {\n      \"id\": \"8vzyjejkta\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chika_shake\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/1d666d3d-1742-4ec7-bf3a-b7913b0bce5f.gif\"\n    },\n    {\n      \"id\": \"8vzykcwb8k\",\n      \"aliases\": [\n        \"subaru\",\n        \"hololive\"\n      ],\n      \"name\": \"duckdance\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/573b450c-ff63-46e5-803b-6b477a6cdbb1\"\n    },\n    {\n      \"id\": \"8vzyj4q9o1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"jahy_rappin\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/66437084-6358-4107-a2c7-98e597f18b5c.gif\"\n    },\n    {\n      \"id\": \"8vzylfmdk3\",\n      \"aliases\": [],\n      \"name\": \"kirbydancing\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c252be18-94ba-4fb4-84f9-e950ca02f5c4\"\n    },\n    {\n      \"id\": \"8vzyi6gsb6\",\n      \"aliases\": [\n        \"kyouko_dance\"\n      ],\n      \"name\": \"KyoukoDance\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/708b8b56-77e3-46a0-a3dd-f29473187a32.gif\"\n    },\n    {\n      \"id\": \"8vzyikf4fo\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nekobounce\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/d253a2bd-d82c-4bb5-9cc6-dbd9e67caeb7.gif\"\n    },\n    {\n      \"id\": \"8vzykn2f9f\",\n      \"aliases\": [],\n      \"name\": \"nyanners\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ea0053dc-cb18-4992-863e-f949650a1111\"\n    },\n    {\n      \"id\": \"8vzykotq9o\",\n      \"aliases\": [],\n      \"name\": \"nyanners2\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/64a69a44-74c5-4626-bebe-647db009c8a9\"\n    },\n    {\n      \"id\": \"8vzyj9bnq7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nyanners_hyper\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/bd376ec4-9c4c-4741-a3d0-01e00c2a2ae0.gif\"\n    },\n    {\n      \"id\": \"8vzyinbpgu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"padoru_spin\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/a9cd18f8-834a-4078-805b-e721e7e0ea74.gif\"\n    },\n    {\n      \"id\": \"8vzyk8x96y\",\n      \"aliases\": [],\n      \"name\": \"parrot_wave1\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/b52de2b6-eef9-422f-bcfd-7362beddfd7c.apng\"\n    },\n    {\n      \"id\": \"8vzyjhs6ua\",\n      \"aliases\": [],\n      \"name\": \"rainbowneko\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e4cff965-b42b-4d75-bfd0-ef46d62ac70f\"\n    },\n    {\n      \"id\": \"8vzyiamgd2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"smugDance\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/57054d08-b8d3-467e-bb0d-9b7ff6961dd9.apng\"\n    },\n    {\n      \"id\": \"8vzyh3kyuj\",\n      \"aliases\": [\n        \"parrot\"\n      ],\n      \"name\": \"twinsparrot\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c1cc2c23-c138-4be0-a747-e72d0a5faf5e.gif\"\n    },\n    {\n      \"id\": \"8vzyh3j5uh\",\n      \"aliases\": [\n        \"parrot\"\n      ],\n      \"name\": \"ultrafastparrot\",\n      \"category\": \"Dance\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/ff05cb0f-3c2c-4bcc-8bdc-079b4bd02f5b.gif\"\n    },\n    {\n      \"id\": \"8vzyj8wppx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"cool_doggo\",\n      \"category\": \"Dog\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/fb4061ac-ade7-49b5-b9f0-7f8d5faae9d5.gif\"\n    },\n    {\n      \"id\": \"8vzyj960q3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"dog_smile\",\n      \"category\": \"Dog\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/c866a376-0752-414c-90b3-d94615ee3021.gif\"\n    },\n    {\n      \"id\": \"8vzyk7wz6i\",\n      \"aliases\": [\n        \"プリン\",\n        \"噴火\",\n        \"食べ物\",\n        \"food\",\n        \"mountain\",\n        \"magma\"\n      ],\n      \"name\": \"erupting_pudding\",\n      \"category\": \"Food\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c88c36c6-e252-4d12-bd5c-ff8495187172.png\"\n    },\n    {\n      \"id\": \"910zotjc7e\",\n      \"aliases\": [\n        \"プリン\",\n        \"ねこ\",\n        \"ねこプリン\"\n      ],\n      \"name\": \"pudding_cat\",\n      \"category\": \"Food\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b7ad4dec-018e-43a1-aeb3-035d8f3df101.png\"\n    },\n    {\n      \"id\": \"8vzyl1bqdm\",\n      \"aliases\": [\n        \"プリン\",\n        \"顔\",\n        \"ぼんやり\",\n        \"face\",\n        \"食べ物\",\n        \"food\"\n      ],\n      \"name\": \"pudding_woozy\",\n      \"category\": \"Food\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b470bb2c-71db-471c-9d72-030569e517b8.png\"\n    },\n    {\n      \"id\": \"910zp1qoj3\",\n      \"aliases\": [\n        \"プリン\",\n        \"すしプリン\"\n      ],\n      \"name\": \"sushi_pudding\",\n      \"category\": \"Food\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-556f3d81-e988-4858-ae6f-6b718fff1128.png\"\n    },\n    {\n      \"id\": \"8vzylh74kp\",\n      \"aliases\": [],\n      \"name\": \"colaup\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-419557dc-c5dd-4aa9-a8c4-1629a7d8d8a0.png\"\n    },\n    {\n      \"id\": \"8vzyh492ut\",\n      \"aliases\": [\n        \"sushi\"\n      ],\n      \"name\": \"desyo\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8299b0c7-ff48-46a5-bbb3-e39960625602.png\"\n    },\n    {\n      \"id\": \"8vzyh539v7\",\n      \"aliases\": [\n        \"pancake\"\n      ],\n      \"name\": \"long_pancakes_bottom\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ecc5b983-f34c-4994-b15f-7268656416bc.png\"\n    },\n    {\n      \"id\": \"8vzyh4yov5\",\n      \"aliases\": [\n        \"pancake\"\n      ],\n      \"name\": \"long_pancakes_middle\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5968591c-66be-411a-8565-49c6f0c337a6.png\"\n    },\n    {\n      \"id\": \"8vzyh4u6v3\",\n      \"aliases\": [\n        \"pancake\"\n      ],\n      \"name\": \"long_pancakes_top\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bffe07dc-da69-4309-9a5f-62e358921324.png\"\n    },\n    {\n      \"id\": \"8vzyk4ao4t\",\n      \"aliases\": [],\n      \"name\": \"monster_absolutely_zero\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2bbd823b-dde2-4c40-878f-c4b10b34c065.png\"\n    },\n    {\n      \"id\": \"8vzyl1v3ds\",\n      \"aliases\": [],\n      \"name\": \"monster_chaos\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c1d30aa1-00e0-4886-8e05-f5cd2990b9fa.png\"\n    },\n    {\n      \"id\": \"8vzyk4em4v\",\n      \"aliases\": [],\n      \"name\": \"monster_cuba_libre\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2e39683b-a975-44d4-a363-6696d4fdb4ff.png\"\n    },\n    {\n      \"id\": \"8vzyk2eo3z\",\n      \"aliases\": [],\n      \"name\": \"monsterenergy\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dae102c6-e92f-4d46-915a-677a929a95e9.png\"\n    },\n    {\n      \"id\": \"8vzyk4664r\",\n      \"aliases\": [],\n      \"name\": \"monster_pipeline_punch\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ff9f1048-4441-41b6-97ee-542bfc6d2694.png\"\n    },\n    {\n      \"id\": \"8vzyk4224p\",\n      \"aliases\": [],\n      \"name\": \"monster_ultra\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6f93bfa8-3eff-413b-9cc1-32539a396c09.png\"\n    },\n    {\n      \"id\": \"8vzyliwjlb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pat_colaup\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/17ee6e79-2798-4dda-a053-3216fc23d23c.gif\"\n    },\n    {\n      \"id\": \"8vzylmjgn5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pizza_charged_with_electricity\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5e9ed365-2d83-4db3-87e5-5ef2761c27ff.png\"\n    },\n    {\n      \"id\": \"8vzyj5s8oj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pudding_verified\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7b24cfa2-cbcb-4cfe-b2b5-40a9c67773e2.png\"\n    },\n    {\n      \"id\": \"8vzyk2k641\",\n      \"aliases\": [],\n      \"name\": \"redbull\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-80dd9843-40b8-4126-955f-bdac44c64147.png\"\n    },\n    {\n      \"id\": \"8vzyinvtha\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sandwich_buns_bottom\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cb0124ff-183c-43f9-b6c9-63f89aa003d5.png\"\n    },\n    {\n      \"id\": \"8vzyinezgw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sandwich_buns_top_a\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e36acf82-0e09-4c56-be86-c2abb18909cc.png\"\n    },\n    {\n      \"id\": \"8vzyinzphc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sandwich_buns_top_b\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-270b3c3d-a0b9-4100-b8d7-01d99e5b7741.png\"\n    },\n    {\n      \"id\": \"8vzyini3gy\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sandwich_lettuce\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-51b12758-a4b2-4fa7-8e61-7455b99e6d5c.png\"\n    },\n    {\n      \"id\": \"8vzyinl9h0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sandwich_tomato\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7f8d467f-30c5-4d28-b685-b04381f19aaf.png\"\n    },\n    {\n      \"id\": \"8vzygzwqst\",\n      \"aliases\": [],\n      \"name\": \"sijimi\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5e0295d5-c388-4f1f-a08e-cc20e5c1b409.png\"\n    },\n    {\n      \"id\": \"8vzyh78fw4\",\n      \"aliases\": [],\n      \"name\": \"spam\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1d6e9759-e598-4362-8f70-db56a0e468c3.png\"\n    },\n    {\n      \"id\": \"8vzykdvh8u\",\n      \"aliases\": [],\n      \"name\": \"suika\",\n      \"category\": \"Food drink\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b534fa8f-6890-4db5-ac10-b418908ae9b5.png\"\n    },\n    {\n      \"id\": \"8vzyimcfga\",\n      \"aliases\": [\n        \"axtu\"\n      ],\n      \"name\": \"altu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e06dc0f5-9050-4952-b953-1d6010c45b36.png\"\n    },\n    {\n      \"id\": \"8vzyjt16zv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"baltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c09bfb63-8e23-43a4-9529-17b8f732614d.png\"\n    },\n    {\n      \"id\": \"8vzyjstuzr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"daltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6d79697c-ebd1-48e4-a689-821fcc6d9418.png\"\n    },\n    {\n      \"id\": \"8vzyjv6p15\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"deltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-33b480ea-43f7-4a55-a8e3-bad5055c362c.png\"\n    },\n    {\n      \"id\": \"8vzyjsxszt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"doltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ead70342-9bf8-4f3f-87d0-9fecc75580ca.png\"\n    },\n    {\n      \"id\": \"8vzyimimge\",\n      \"aliases\": [\n        \"extu\"\n      ],\n      \"name\": \"eltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c87f4ac1-9589-435b-b691-716e94fc8ee3.png\"\n    },\n    {\n      \"id\": \"8vzyjsjjzl\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"galtu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-272df06b-a28c-417d-b612-86963c4a23af.png\"\n    },\n    {\n      \"id\": \"8vzyimlogg\",\n      \"aliases\": [\n        \"gextu\"\n      ],\n      \"name\": \"geltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7702ebc4-58f6-42ed-968f-a441aa59bc11.png\"\n    },\n    {\n      \"id\": \"8vzyjsn6zn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"goltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1f7b01ad-6a71-47df-8c07-01f00f653265.png\"\n    },\n    {\n      \"id\": \"8vzyjrw4z7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1404b415-6aa5-461c-9767-1ae2782844d0.png\"\n    },\n    {\n      \"id\": \"8vzyjtle07\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"haltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5923aa5f-84a9-474f-b643-5fdef72c1eaf.png\"\n    },\n    {\n      \"id\": \"8vzyjvf319\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"heltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ca604556-4739-4e2e-8e8d-8145d04797b3.png\"\n    },\n    {\n      \"id\": \"8vzyjs2szb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hiltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b4383098-88ea-40f3-9218-58404ff67667.png\"\n    },\n    {\n      \"id\": \"8vzyjvax17\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"holtu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5af91fd4-e106-4219-9f5c-1c31f71cec46.png\"\n    },\n    {\n      \"id\": \"8vzyjrspz5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-33eec09e-865d-4e7e-ae54-e282bd1bc6c8.png\"\n    },\n    {\n      \"id\": \"8vzyjtia05\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kaltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7f4073e7-9bea-479e-b974-130cd17f5472.png\"\n    },\n    {\n      \"id\": \"8vzyjv3913\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"keltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-77db5178-77dd-43ef-9629-57d95f40bd01.png\"\n    },\n    {\n      \"id\": \"8vzyjuwt0z\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kiltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-31bf335c-54d7-420b-a10c-72b98cea75cc.png\"\n    },\n    {\n      \"id\": \"8vzyjudp0n\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"koltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-81943005-0faa-434f-adfc-0d17d1de29dd.png\"\n    },\n    {\n      \"id\": \"8vzyjtbg01\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8bf22bcc-15e5-4a3f-b321-70e1d0f8006a.png\"\n    },\n    {\n      \"id\": \"8vzyimuggm\",\n      \"aliases\": [\n        \"xtu\"\n      ],\n      \"name\": \"ltuu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8d074693-5e7f-44f6-aed8-9a0286da6d0a.png\"\n    },\n    {\n      \"id\": \"8vzyjs63zd\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"maltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7d5deb4c-04e5-4d00-b6d0-49a8e3f3a0c6.png\"\n    },\n    {\n      \"id\": \"8vzyjscszh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"meltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a8a51e7b-3086-4469-a85f-bfbfc5ce23ba.png\"\n    },\n    {\n      \"id\": \"8vzyju290h\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"miltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-319e5320-a96c-4539-9275-2099bc678340.png\"\n    },\n    {\n      \"id\": \"8vzyjsfqzj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"moltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0223767f-dbfd-49bd-9a01-723f04a9501d.png\"\n    },\n    {\n      \"id\": \"8vzyjs90zf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"multu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f6866eea-752a-4b0d-ab20-f998e59e037c.png\"\n    },\n    {\n      \"id\": \"8vzyjrzlz9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"naltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-08fc7e6e-2d49-4a9b-b34b-37bfa3e053e7.png\"\n    },\n    {\n      \"id\": \"8vzyjujx0r\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-16cdcce7-74d7-4369-b587-5ba8a7418cf9.png\"\n    },\n    {\n      \"id\": \"8vzyjugu0p\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"niltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-692052ea-ee39-474c-94d1-eb495725dc41.png\"\n    },\n    {\n      \"id\": \"8vzyjt7qzz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nnltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ab70920f-365d-4c2f-9032-5e5afc9d216e.png\"\n    },\n    {\n      \"id\": \"8vzyimoqgi\",\n      \"aliases\": [\n        \"nuxtu\"\n      ],\n      \"name\": \"nultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9dc918df-b7ac-4ccd-9222-4ea4d6cc368a.png\"\n    },\n    {\n      \"id\": \"8vzyi81ibw\",\n      \"aliases\": [\n        \"oxtu\"\n      ],\n      \"name\": \"oltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5e174083-efc4-4c18-827f-28f8ace98e0d.png\"\n    },\n    {\n      \"id\": \"8vzyjt43zx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0f23cdd6-8dbb-454c-89dc-cac5b98e0ae9.png\"\n    },\n    {\n      \"id\": \"8vzyjutt0x\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"riltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e823b64a-98e1-4540-8a22-a6050146d67f.png\"\n    },\n    {\n      \"id\": \"8vzyjtf003\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"roltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a8e021e5-4a5e-4011-b8ee-af1bf47d99dc.png\"\n    },\n    {\n      \"id\": \"8vzyjuqo0v\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"rultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e553bc54-726a-4787-96cc-d95454f594b8.png\"\n    },\n    {\n      \"id\": \"8vzyju5b0j\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"siltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ec305864-d2fd-4234-a215-c54ea53acd6f.png\"\n    },\n    {\n      \"id\": \"8vzyjun20t\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f5a16308-8388-4384-83aa-c7394294eaef.png\"\n    },\n    {\n      \"id\": \"8vzyjv0111\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"taltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-35c0e415-602e-4270-9210-37cc4ebd1f27.png\"\n    },\n    {\n      \"id\": \"8vzyjtyt0f\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"teltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-740c8045-0cdb-4965-88d8-598c1d944d61.png\"\n    },\n    {\n      \"id\": \"8vzyju9o0l\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tiltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5c197a1a-bd0e-4600-ac4a-5aa42687a7ff.png\"\n    },\n    {\n      \"id\": \"8vzyk1rg3t\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-91ff3f9f-81d8-43eb-8592-7139cd2adf4d.png\"\n    },\n    {\n      \"id\": \"8vzyimfpgc\",\n      \"aliases\": [\n        \"uxtu\"\n      ],\n      \"name\": \"ultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6f62ad33-9c3b-43d5-868e-8c7dfaeef6e9.png\"\n    },\n    {\n      \"id\": \"8vzyjtop09\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"waltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-50816c7c-93ff-4605-a10d-00c42f37e885.png\"\n    },\n    {\n      \"id\": \"8vzyjtvb0d\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yaltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9cf61096-f323-4efb-9cfc-040260d27636.png\"\n    },\n    {\n      \"id\": \"8vzyjvix1b\",\n      \"aliases\": [\n        \"よっ\",\n        \"ヨッ\"\n      ],\n      \"name\": \"yoltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-90dbaa75-973b-467b-bf17-7dab0c0790ac.png\"\n    },\n    {\n      \"id\": \"8vzyjts20b\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yultu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6b2965d0-3698-4edc-9b13-b4b4a678d7b4.png\"\n    },\n    {\n      \"id\": \"8vzyjsqhzp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"zoltu\",\n      \"category\": \"Fortis Interjection\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2f637a6e-82d1-49f7-abea-ba5406969386.png\"\n    },\n    {\n      \"id\": \"8vzyk1nr3r\",\n      \"aliases\": [],\n      \"name\": \"share\",\n      \"category\": \"Guide / Icon\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0ee40d57-ca78-40be-b520-e646b1bde69e.png\"\n    },\n    {\n      \"id\": \"8vzylecpjc\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypotterto\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-56427e3a-7209-4117-afc9-e3107448a880.png\"\n    },\n    {\n      \"id\": \"8vzyldwdj4\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertohyougennnoziyuu\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a68184a2-20c2-40c4-b2da-e2949856c771.png\"\n    },\n    {\n      \"id\": \"8vzyldp3j0\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertojunntakunasekiyushigenn\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1228f956-d34c-4e10-b64c-e2ba6644e678.png\"\n    },\n    {\n      \"id\": \"8vzyldlaiy\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertojyuusyakaihenoakogare\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7d7225d1-f70a-476f-9a61-ad01d24a7332.png\"\n    },\n    {\n      \"id\": \"8vzyle8uja\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertokeikakuseinonasa\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f19dcfeb-a845-4ead-897e-1532cfdff15d.png\"\n    },\n    {\n      \"id\": \"8vzyldcoiu\",\n      \"aliases\": [\n        \"ハリーポッターと無茶な要求\",\n        \"無茶な要求\",\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertomutyanayoukyuu\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5461d992-9dae-4715-9683-834e15b8b7fb.png\"\n    },\n    {\n      \"id\": \"8vzylek8jg\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypotterto_newline\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ab46d915-c8c8-488e-8681-4664e6170836.png\"\n    },\n    {\n      \"id\": \"8vzyle4vj8\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertoniranomisoshiru\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f9dca55c-3f4d-474b-8d77-5bbf4a3dfd0e.png\"\n    },\n    {\n      \"id\": \"8vzyldsxj2\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertosennryokunotikujitounyuu\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f150469a-fecf-4dd8-adf5-025dd64206fc.png\"\n    },\n    {\n      \"id\": \"8vzylegpje\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertozennti2syuukannnokega\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-177e986c-f572-400f-9f26-1b1e2107b114.png\"\n    },\n    {\n      \"id\": \"8vzyle0kj6\",\n      \"aliases\": [\n        \"haripota\",\n        \"ハリポタ\",\n        \"potter\",\n        \"harry\",\n        \"ハリー\",\n        \"ポッター\"\n      ],\n      \"name\": \"harrypottertozissekinonaimusyoku\",\n      \"category\": \"Harry Potter\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5bb8dd8d-c13f-4e2a-b5d1-4703904a2732.png\"\n    },\n    {\n      \"id\": \"8vzym3dst1\",\n      \"aliases\": [\n        \"doko\",\n        \"\"\n      ],\n      \"name\": \"kanneiyahataseitetsusyo\",\n      \"category\": \"Irregular Width\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-16b6cdee-ec4e-4769-b7bd-c37ad7832180.png\"\n    },\n    {\n      \"id\": \"8vzyhnl82j\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nemo\",\n      \"category\": \"Irregular Width\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7dbe2c9f-1380-4bf0-9e0d-5267c8b4e4c7.png\"\n    },\n    {\n      \"id\": \"8vzyhnpd2l\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nemonemo\",\n      \"category\": \"Irregular Width\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b1a5914e-51c5-410b-9fb4-6c4881f10b05.png\"\n    },\n    {\n      \"id\": \"8vzyiav8d6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"0\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e7c56f9b-00ea-4a75-9192-f6b8d7677c38.png\"\n    },\n    {\n      \"id\": \"8vzylq46pb\",\n      \"aliases\": [\n        \"nisuru\",\n        \"にする\"\n      ],\n      \"name\": \"1_nisuru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8b35ecc1-b336-4e03-84b6-42083b72634d.png\"\n    },\n    {\n      \"id\": \"8vzyin49gq\",\n      \"aliases\": [\n        \"shi\",\n        \"si\",\n        \"し\"\n      ],\n      \"name\": \"5000t_death\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-424cf38c-95de-4819-a8f0-37e4e9eb4abc.png\"\n    },\n    {\n      \"id\": \"8vzyk9a274\",\n      \"aliases\": [],\n      \"name\": \"a\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8c33203f-5d69-4f25-aa01-72de35328ea2.png\"\n    },\n    {\n      \"id\": \"8vzylsgmpr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aaaaaaaaaaaaaaaaaaaaaaaaa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-99c297c0-60a6-4c8b-a6f1-3d23b1882f73.png\"\n    },\n    {\n      \"id\": \"8vzygul5q7\",\n      \"aliases\": [],\n      \"name\": \"ai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-489e15ba-2700-4af2-9579-f4f894151eb4.png\"\n    },\n    {\n      \"id\": \"8vzylpvup1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ai_koreyarimashitaka\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4e77892a-65cb-4262-8a8d-93ced5137a0e.png\"\n    },\n    {\n      \"id\": \"8vzym2pwsp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"akan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d488b8e8-875f-4ca1-871b-93232bd0ad0d.png\"\n    },\n    {\n      \"id\": \"8vzyiwsjkw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"akanyatsuya\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-62c8abd8-6277-4256-9040-e9d0535a885a.png\"\n    },\n    {\n      \"id\": \"8vzym39ksz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"akugyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a2cec9df-6b8a-492b-b238-4d2d09a77758.png\"\n    },\n    {\n      \"id\": \"8vzyhse757\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"akusaa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e466140c-6f94-4233-90a5-837b7eebb1bf.png\"\n    },\n    {\n      \"id\": \"8wrc1pst10\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"anataima_unkotte_iimashitane\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fe2df65b-831c-4edd-b75e-95750b895e2b.png\"\n    },\n    {\n      \"id\": \"8vzymbs6ws\",\n      \"aliases\": [],\n      \"name\": \"anatano_jitakuwo_keibishimasu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ab7147af-6d9e-4781-83fd-a9173f9f4783.png\"\n    },\n    {\n      \"id\": \"8vzyhzjf81\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"arama\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ef3607e9-9e50-42ff-8d3f-533f8237bc78.png\"\n    },\n    {\n      \"id\": \"8vzygwgyr1\",\n      \"aliases\": [\n        \"that\"\n      ],\n      \"name\": \"are\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aa94df95-db35-4de6-a48a-693e299b6eff.png\"\n    },\n    {\n      \"id\": \"8vzyl7pygk\",\n      \"aliases\": [],\n      \"name\": \"arienai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-50c4f6e7-c7e1-4971-b023-953dae539723.png\"\n    },\n    {\n      \"id\": \"8vzyhrlc4t\",\n      \"aliases\": [],\n      \"name\": \"arigato\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dd58c807-2d04-489e-b2e0-5ec3b77b3378.png\"\n    },\n    {\n      \"id\": \"8vzyi4niae\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"arigato_2\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bb87c7cd-6721-4aba-b28f-ad989faf011f.png\"\n    },\n    {\n      \"id\": \"8vzyi4jeac\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"arigatofes\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ddbfee9d-91ab-419a-9247-64dd90b62fac.png\"\n    },\n    {\n      \"id\": \"8vzyi5qdau\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"arigatougozaimasu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fdc37703-b650-47fd-90c4-f89c01c64e08.png\"\n    },\n    {\n      \"id\": \"8vzyjozjxz\",\n      \"aliases\": [],\n      \"name\": \"arigunyatogonyainyasu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-df7549b9-7cd7-4067-9874-154c289b0d6e.png\"\n    },\n    {\n      \"id\": \"8vzyi1t398\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"arisou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-96f4dfb9-0043-463f-8d15-79a4bfe6ad60.png\"\n    },\n    {\n      \"id\": \"8vzyi45ia6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ariyorinoari\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f8050fee-0a36-4a2f-93b4-0e4c7771318e.png\"\n    },\n    {\n      \"id\": \"8vzyi3u2a2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5a859a4c-6796-4c1d-972e-045d7174c2b8.png\"\n    },\n    {\n      \"id\": \"8vzyhnf82f\",\n      \"aliases\": [],\n      \"name\": \"aruaru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f286a06d-5f34-4674-bbee-b5f405a0cce8.png\"\n    },\n    {\n      \"id\": \"8vzyhr0g4j\",\n      \"aliases\": [],\n      \"name\": \"arusa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f975fcc2-d79f-4ad4-a83d-c6bcb325aa85.png\"\n    },\n    {\n      \"id\": \"8vzyhqw84h\",\n      \"aliases\": [],\n      \"name\": \"ashitaga\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-663475f8-49a6-4683-9294-e62e6e4379d2.png\"\n    },\n    {\n      \"id\": \"8vzylh30kn\",\n      \"aliases\": [],\n      \"name\": \"at_kobayashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7bf0de8a-ba51-4eef-b8c4-71eee9175710.png\"\n    },\n    {\n      \"id\": \"8zp7yjw3i9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"atode_kesu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6026b373-f7cf-4a5f-a39d-8cd47616e1fe.png\"\n    },\n    {\n      \"id\": \"8zp7ym9s42\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"atode_kiku\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bdec18e5-7b97-446e-b0da-1597596fd14c.png\"\n    },\n    {\n      \"id\": \"8zp7yobpye\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"atode_miru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-16bb6f30-79ee-4a9a-af50-d013980f3745.png\"\n    },\n    {\n      \"id\": \"8vzyk8n86s\",\n      \"aliases\": [],\n      \"name\": \"atsumori\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fbbb55cf-72a9-45df-b776-454ac4b48515.png\"\n    },\n    {\n      \"id\": \"8w2pw9b1f1\",\n      \"aliases\": [],\n      \"name\": \"attaka_i\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7850c1eb-5173-4b38-a677-76ae2487d259.png\"\n    },\n    {\n      \"id\": \"8vzyltqjq1\",\n      \"aliases\": [\n        \"怪しい日本語\"\n      ],\n      \"name\": \"ayashii_nihongo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-66a657d8-ac50-44b6-aaa6-de74204dc596.png\"\n    },\n    {\n      \"id\": \"8vzyi3kz9y\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aza\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-32575ec6-3e35-48ed-a8b1-6d3104f57a07.png\"\n    },\n    {\n      \"id\": \"8vzyi5bbao\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"azamasu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-11531844-a25d-4f19-8c00-65143cef5044.png\"\n    },\n    {\n      \"id\": \"8vzyiqvsie\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"bababa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e7a477c3-ca31-4ca0-ad2c-8d4a1398356a.png\"\n    },\n    {\n      \"id\": \"8vzykbw084\",\n      \"aliases\": [\n        \"banana\",\n        \"ばにゃにゃ\"\n      ],\n      \"name\": \"banyanya\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-03d9ca8d-f7ca-4da8-bdcc-96bdfa211261.png\"\n    },\n    {\n      \"id\": \"8vzymb33wg\",\n      \"aliases\": [],\n      \"name\": \"benkyou_shiro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-51c6522a-72c8-40f6-b19a-69b91c6c2081.png\"\n    },\n    {\n      \"id\": \"8vzylxnsr3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"bishoujodesukedo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a70ed750-41c2-493b-9e5d-acc6b7acb434.png\"\n    },\n    {\n      \"id\": \"8vzylfh6k1\",\n      \"aliases\": [],\n      \"name\": \"bread_from_hell\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ca56ca7c-6080-4050-8bb8-2f62bbd7e644.png\"\n    },\n    {\n      \"id\": \"8vzyipw5hy\",\n      \"aliases\": [\n        \"demo_omae\"\n      ],\n      \"name\": \"but_you_are\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-29e263c8-ef89-4c6d-811e-7a79f547a682.png\"\n    },\n    {\n      \"id\": \"8vzyluf1qf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chanto_tabero\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6eadd597-0887-4614-8ad9-50f54b677586.png\"\n    },\n    {\n      \"id\": \"8vzyhyvr7r\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chasmo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bf3d1ece-6c03-4a36-b91a-14b96d0a1519.png\"\n    },\n    {\n      \"id\": \"8vzyj6y1p1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chet\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e62aa3d4-6b59-48ce-9ea2-208deedf2fc0.png\"\n    },\n    {\n      \"id\": \"8vzym4pjtt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chigau_soujanai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-61ff1139-6c4d-44ff-89d9-bd67edc8e6e8.jpg\"\n    },\n    {\n      \"id\": \"8vzyljifln\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chinchin\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a1d410e0-c53e-474b-a752-abe13663c25d.png\"\n    },\n    {\n      \"id\": \"8vzyi16s8r\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chottodannshii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3d4f15cf-8246-41ab-97bf-79b99224e2f5.png\"\n    },\n    {\n      \"id\": \"8vzyi3gv9w\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"chottodekiru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-591b7736-648f-494f-bbb7-9f61dc1c9475.png\"\n    },\n    {\n      \"id\": \"8vzyl6uqg6\",\n      \"aliases\": [\n        \"ちょっとなにいってるかわかんない\"\n      ],\n      \"name\": \"chottonaniitterukawanannai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dbd6cd65-9f27-410f-8b21-d06922cc003c.png\"\n    },\n    {\n      \"id\": \"8vzymbfjwm\",\n      \"aliases\": [],\n      \"name\": \"chou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-24104c34-4427-4a5a-8291-b077a5937735.png\"\n    },\n    {\n      \"id\": \"8vzyhsau55\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"custom_emoji\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f229b0b2-f1a6-43b9-bc9d-543d5ca77947.png\"\n    },\n    {\n      \"id\": \"8vzyi4exaa\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"dad\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8a99a29c-23f7-4116-8a34-c087e2768568.png\"\n    },\n    {\n      \"id\": \"8vzyi3cn9s\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"daijoubu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2dd6b44b-1ae9-4a78-9d31-f865cb4dd4f7.png\"\n    },\n    {\n      \"id\": \"8vzyi1228p\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"daijoubu_ask\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2c8c89e2-e135-4d0b-9338-962965f7f413.png\"\n    },\n    {\n      \"id\": \"8vzym9dyvw\",\n      \"aliases\": [],\n      \"name\": \"daijyoubuda_mondainai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-16691f17-3876-497b-916d-c5dd6860c67e.png\"\n    },\n    {\n      \"id\": \"8vzyi55jam\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"daikansya\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a4a85577-58c3-4f28-942a-d1c53d0003b0.png\"\n    },\n    {\n      \"id\": \"8vzym2aqsj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"daisuki\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-96c321f1-a73d-4399-9159-3c99f3de790f.png\"\n    },\n    {\n      \"id\": \"8vzygvz4qt\",\n      \"aliases\": [\n        \"bad\"\n      ],\n      \"name\": \"dame\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f2078de9-e26a-4e7e-aa85-96f03aad82d0.png\"\n    },\n    {\n      \"id\": \"8vzykbpx82\",\n      \"aliases\": [\n        \"who\",\n        \"だれ\",\n        \"誰\"\n      ],\n      \"name\": \"dare\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-10bca1ab-a06d-492a-b5e2-8aa5fbc42460.png\"\n    },\n    {\n      \"id\": \"8vzyly7brf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"darega_umaikotoieto\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e343bb07-6e2a-4954-8982-2bfe7054652c.png\"\n    },\n    {\n      \"id\": \"8vzymd4fxc\",\n      \"aliases\": [],\n      \"name\": \"darenimo_aisarenai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a82f33fd-4b48-42ae-8a81-08c6b2f08db7.png\"\n    },\n    {\n      \"id\": \"8vzyirf3im\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"datou_corona\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-94a26435-2a7a-4cb7-afbc-a23b3b43527b.png\"\n    },\n    {\n      \"id\": \"8vzygzdasd\",\n      \"aliases\": [],\n      \"name\": \"de\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b0665811-e26c-47dc-8362-f760c1340724.png\"\n    },\n    {\n      \"id\": \"8vzylhuxkx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"debobigego\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-13669b5e-bce2-4134-a73f-915d056dcd2f.png\"\n    },\n    {\n      \"id\": \"8vzyl929h2\",\n      \"aliases\": [\n        \"できぬ\"\n      ],\n      \"name\": \"dekinu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f515d8aa-f170-4681-8798-022a70387a49.png\"\n    },\n    {\n      \"id\": \"8vzyl973h4\",\n      \"aliases\": [\n        \"できる\"\n      ],\n      \"name\": \"dekiru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8cbb8686-8fc7-4c83-9612-06e28e0d3883.png\"\n    },\n    {\n      \"id\": \"8vzyi508ak\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"desho\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8ad68761-5aae-41a4-8a27-259e18a5e657.png\"\n    },\n    {\n      \"id\": \"8vzyi2tp9o\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"desu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7862aeeb-090d-466e-8a42-ac8dea461104.png\"\n    },\n    {\n      \"id\": \"8vzygylxrz\",\n      \"aliases\": [],\n      \"name\": \"desuka\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b6f696e3-7a29-43a7-aaaf-d0eb2f47dd42.png\"\n    },\n    {\n      \"id\": \"8vzyk6lo5u\",\n      \"aliases\": [\n        \"ですわよ\"\n      ],\n      \"name\": \"desuwayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a08796eb-be97-4056-b864-78916ff803a0.png\"\n    },\n    {\n      \"id\": \"8vzygw3hqv\",\n      \"aliases\": [],\n      \"name\": \"desuyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fb70900e-b0d2-48f8-9c45-ca0e1e5e3825.png\"\n    },\n    {\n      \"id\": \"8vzyi3959q\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"desuyone\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e5ccbd60-bc8d-4ff7-9709-3676212cc2d4.png\"\n    },\n    {\n      \"id\": \"8vzyi3xta4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"doihii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-00171f09-a20a-4369-b9fb-a08fefa05d1c.png\"\n    },\n    {\n      \"id\": \"8vzyi5lpas\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"dokidoki\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-34011ae8-cf0c-4994-9f71-8fcbb9cde86c.png\"\n    },\n    {\n      \"id\": \"8vzylx4iqz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"dokozumi_tekamisskey_yatteru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a8985818-c9d9-4fc9-96a1-7effc9aad866.png\"\n    },\n    {\n      \"id\": \"8vzyikaifk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"done_is_better_than_perfect\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-06e7bedc-28b9-44f3-af97-85fc7033f2a4.png\"\n    },\n    {\n      \"id\": \"8vzyi6e1b4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"donmai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-98cfef4a-4ca5-4c55-9470-14f58208ea53.png\"\n    },\n    {\n      \"id\": \"8vzygzsosr\",\n      \"aliases\": [\n        \"which\"\n      ],\n      \"name\": \"dore\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b07fba67-7545-47ae-9bd3-17ce0a0a1461.png\"\n    },\n    {\n      \"id\": \"8vzyiw73ks\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"dosi_1\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8e51e6df-8333-4edd-953e-129131f5ca56.png\"\n    },\n    {\n      \"id\": \"8vzyiwnoku\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"dosi_2\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1a88e1b1-9ecc-4171-aa63-349025a4c8ae.png\"\n    },\n    {\n      \"id\": \"8vzyip43hq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"douita\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1be40ba7-69f9-4f4c-8446-fe0c03132d81.png\"\n    },\n    {\n      \"id\": \"8vzylwn5qv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"downlo_do\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-81079895-0f7a-4e21-b50d-eaa2d2076670.png\"\n    },\n    {\n      \"id\": \"8vzyj0u5ml\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"dyomero\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a45dfa37-9e96-4b61-927a-6cd2f6e7c738.png\"\n    },\n    {\n      \"id\": \"8vzyir36ii\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ee\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-80d6a5c7-a0b5-451b-8eb3-b348372d2d0a.png\"\n    },\n    {\n      \"id\": \"8vzyivuvko\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"eeyan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-748890ad-4e8a-4447-a62a-eac6f9e0042a.png\"\n    },\n    {\n      \"id\": \"8vzyjnyexl\",\n      \"aliases\": [],\n      \"name\": \"eeyan_2\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8769bf83-7f13-4465-96a2-d3602f22dd8d.png\"\n    },\n    {\n      \"id\": \"8vzygz4ys9\",\n      \"aliases\": [],\n      \"name\": \"emoit\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a31b060c-fd9c-408d-9c3e-04f1f68f16aa.png\"\n    },\n    {\n      \"id\": \"8vzygubjpv\",\n      \"aliases\": [],\n      \"name\": \"erait\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-156470b9-faa7-4e9a-a72c-954acefe1070.png\"\n    },\n    {\n      \"id\": \"8vzym4kutj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"erajan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bb5531a5-bef0-4b98-91bf-cb43a52fe65f.png\"\n    },\n    {\n      \"id\": \"8vzyiu0wjq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"eroit\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f30308e9-fcc1-4b41-bdb3-78671fb8492b.png\"\n    },\n    {\n      \"id\": \"8vzykgae90\",\n      \"aliases\": [\n        \"えろじゃん\",\n        \"erozyann\",\n        \"jp\",\n        \"エロじゃん\"\n      ],\n      \"name\": \"erojan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2b41e794-abb0-4316-ac96-ac8802f5f34d.png\"\n    },\n    {\n      \"id\": \"8vzyl8dvgs\",\n      \"aliases\": [],\n      \"name\": \"ete\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f24d4e35-70b3-42f3-86ad-33c2e5d60f69.png\"\n    },\n    {\n      \"id\": \"8vzyl8k3gu\",\n      \"aliases\": [],\n      \"name\": \"ete_fuete\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ff704ad6-f1ef-4ebb-a88e-24befbe6d0e3.png\"\n    },\n    {\n      \"id\": \"8vzygxd6rf\",\n      \"aliases\": [\n        \"h\"\n      ],\n      \"name\": \"eti\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-59e9b91f-f82f-4b49-9dfe-83d9b80a82fa.png\"\n    },\n    {\n      \"id\": \"915tn0c4gf\",\n      \"aliases\": [\n        \"すりすり\",\n        \"surisuri\",\n        \"sulisuli\",\n        \"\"\n      ],\n      \"name\": \"eti_suri\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-649a1797-9f54-4026-b12c-49c45e77bf2a.png\"\n    },\n    {\n      \"id\": \"8vzylj2jlh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"everyday_behavior\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f6e24041-1abb-41ba-8471-3bc55464d00d.png\"\n    },\n    {\n      \"id\": \"8vzylhy4kz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"fruit_megamori_ynts\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-62a75c7f-7c64-4465-9b90-d54929b349be.jpg\"\n    },\n    {\n      \"id\": \"8vzyl85xgq\",\n      \"aliases\": [],\n      \"name\": \"fuete\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bd5aca3a-8a34-47c8-9658-9104e2ae033b.png\"\n    },\n    {\n      \"id\": \"8vzyl73mga\",\n      \"aliases\": [\n        \"furyouhinn\"\n      ],\n      \"name\": \"furyouhin\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-853fbade-936c-4b45-b1a2-c28a7b563e6b.png\"\n    },\n    {\n      \"id\": \"8vzygypzs1\",\n      \"aliases\": [],\n      \"name\": \"ga\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9302a8ca-ea6d-4c89-8223-9a533f8aa55d.png\"\n    },\n    {\n      \"id\": \"8y07p2mhsn\",\n      \"aliases\": [\n        \"学生気分が抜けすぎ,\",\n        \"がくせいきぶんがぬけすぎ\"\n      ],\n      \"name\": \"gakuseikibunga_nukesugi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a2d2dd97-2178-45c4-917d-a009bb9b7950.png\"\n    },\n    {\n      \"id\": \"8vzymfjyya\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gakuseikibunga_nuketenai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1c20aac8-8f29-4883-ad8f-4e0ff8605e3e.png\"\n    },\n    {\n      \"id\": \"8vzym90svq\",\n      \"aliases\": [],\n      \"name\": \"gamamayo_sarada\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bb8e13a7-d6ad-4737-9bb8-0bc0378939c2.png\"\n    },\n    {\n      \"id\": \"8woiylhkw3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ganbare\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c2d0c755-4514-4733-ab42-d9e0e25e8a3b.png\"\n    },\n    {\n      \"id\": \"8vzygv3sqf\",\n      \"aliases\": [],\n      \"name\": \"gateway\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-eeac2040-828a-4782-8a43-f4e927ebd394.png\"\n    },\n    {\n      \"id\": \"8vzyk7be68\",\n      \"aliases\": [\n        \"げげーっ\"\n      ],\n      \"name\": \"gege_ltu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2d15c553-427d-4b47-a195-92e32fab8f48.png\"\n    },\n    {\n      \"id\": \"8vzymbwpwu\",\n      \"aliases\": [],\n      \"name\": \"gekijouban_misskey_mugenmenntehenn\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-573abad6-d253-49f8-bdd3-cd7e8e521c6b.png\"\n    },\n    {\n      \"id\": \"8vzyhr6v4n\",\n      \"aliases\": [],\n      \"name\": \"genbaneko_yoshi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-141aa7aa-08c0-44a7-a726-fb0944af7bc5.png\"\n    },\n    {\n      \"id\": \"8vzyiq44i2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gomamayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-094e2297-abb8-4be8-a560-83b6a373fd4f.png\"\n    },\n    {\n      \"id\": \"8vzyjnjmxd\",\n      \"aliases\": [\n        \"ごめんね\"\n      ],\n      \"name\": \"gomenne\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-736c3566-239a-40d9-880f-4fe3e06756b2.png\"\n    },\n    {\n      \"id\": \"8vzyirjqio\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"go_study\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0de9a262-68e2-4003-95fb-2ce9e43e1b8a.png\"\n    },\n    {\n      \"id\": \"8vzyirtmis\",\n      \"aliases\": [\n        \"shigoto_shiro\"\n      ],\n      \"name\": \"go_work\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b42c2772-0cca-40d5-afc3-a83c3649e6e4.png\"\n    },\n    {\n      \"id\": \"8vzyj6o0ox\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gyafun\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d9414c62-ef84-4871-b1a7-496782ad196a.png\"\n    },\n    {\n      \"id\": \"8vzyltgspz\",\n      \"aliases\": [\n        \"逆だったかもしれねェ\"\n      ],\n      \"name\": \"gyakudatta_kamo_shirenee\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7a816456-55d4-4d0e-a60e-88253c3a765a.png\"\n    },\n    {\n      \"id\": \"8vzyir8kik\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"gyoi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5050cabc-c1f8-4e96-b566-6ee62df99d43.png\"\n    },\n    {\n      \"id\": \"8vzygz9asb\",\n      \"aliases\": [\n        \"is\"\n      ],\n      \"name\": \"ha\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a30104ef-07aa-406e-883c-79c40e116f8e.png\"\n    },\n    {\n      \"id\": \"8vzylcv7im\",\n      \"aliases\": [],\n      \"name\": \"haccp_approved\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a6179499-5511-4874-a811-30cf39655540.png\"\n    },\n    {\n      \"id\": \"8vzyld0pio\",\n      \"aliases\": [],\n      \"name\": \"haccp_non_approved\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9ee4dee1-8b56-4190-ac57-537cdcf09713.png\"\n    },\n    {\n      \"id\": \"8vzyi8ejc2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-201140c9-a837-4c86-9aa0-46884c566a54.png\"\n    },\n    {\n      \"id\": \"8vzyj6t1oz\",\n      \"aliases\": [\n        \"sale\"\n      ],\n      \"name\": \"hangaku\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bc1424cf-c7e5-4f98-9fe1-891b597e8192.png\"\n    },\n    {\n      \"id\": \"8vzyk87z6m\",\n      \"aliases\": [],\n      \"name\": \"hanko_sumi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-23513f56-0494-490b-b09e-2fcb706e7bf4.png\"\n    },\n    {\n      \"id\": \"8vzyh6akvs\",\n      \"aliases\": [],\n      \"name\": \"ha_q\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-da6e6735-b315-4434-b75a-ed16b5bf26b8.png\"\n    },\n    {\n      \"id\": \"8vzyltuwq3\",\n      \"aliases\": [\n        \"ヘイトスピーチ\"\n      ],\n      \"name\": \"hate_speech\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/27e5df7a-5e55-4b0c-beff-9297e2c01e4a.gif\"\n    },\n    {\n      \"id\": \"8vzyi5u8aw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hayai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-daa15278-93bc-4d25-bbdb-c753ecd0b4ae.png\"\n    },\n    {\n      \"id\": \"8vzyjxfz1z\",\n      \"aliases\": [],\n      \"name\": \"hayasugite_mienai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e5b22fa7-80ed-4378-83bf-2b785f979809.png\"\n    },\n    {\n      \"id\": \"8vzylmuhn9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"heiomachi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-02e47e47-3a6c-40be-89e8-4c2bbb007869.png\"\n    },\n    {\n      \"id\": \"8vzyl7dtge\",\n      \"aliases\": [\n        \"hennkinn\"\n      ],\n      \"name\": \"henkin\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-208affbb-7cd3-433e-9941-5c87401e4194.png\"\n    },\n    {\n      \"id\": \"8vzyl7iegg\",\n      \"aliases\": [\n        \"hennpinn\"\n      ],\n      \"name\": \"henpin\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-adbab555-bfcc-4ec5-9b06-6c20ab902ad1.png\"\n    },\n    {\n      \"id\": \"8vzyjia6ul\",\n      \"aliases\": [],\n      \"name\": \"hidoihanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/9212346b-f4d6-44f5-bb4d-b9a1e5033357\"\n    },\n    {\n      \"id\": \"8vzyjvz11h\",\n      \"aliases\": [],\n      \"name\": \"hikaru_heart\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-19a1f27e-7331-4da0-9eee-5dd3af609c75.png\"\n    },\n    {\n      \"id\": \"8vzylhb3kr\",\n      \"aliases\": [],\n      \"name\": \"hires_spatial_pressure\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-769e924c-1220-49ed-98f9-fcda5c9201ef.png\"\n    },\n    {\n      \"id\": \"8vzyi4aua8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hiroukonpaira\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0fc28208-07af-4c9b-9da8-d393756e20c1.png\"\n    },\n    {\n      \"id\": \"8vzyh9lkx6\",\n      \"aliases\": [],\n      \"name\": \"ho\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-06b4d19c-7dcc-4bd0-b7bc-8fb4068e81f2.png\"\n    },\n    {\n      \"id\": \"8vzyiuakjv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"honi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9e00ddf1-cbeb-4800-b142-0edc4afbc595.png\"\n    },\n    {\n      \"id\": \"8vzyln67nl\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"honi_jibunndeshirabero\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-831feb62-bd22-4162-a5c5-c15e93301669.png\"\n    },\n    {\n      \"id\": \"8vzyi8atc0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"honmaka\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-00d9df8a-b317-489c-9ef3-1607b274bd0c.png\"\n    },\n    {\n      \"id\": \"8vzyi1kk94\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"honmaya\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4e8f13f7-4ef5-498b-b139-6913defdc580.png\"\n    },\n    {\n      \"id\": \"8vzymfmryc\",\n      \"aliases\": [],\n      \"name\": \"horoboshimashou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/06fb41c0-a1bc-4263-a566-80fad3432c07.gif\"\n    },\n    {\n      \"id\": \"8vzyi5ggaq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b4bfdbb5-2ec7-45bd-88f1-85dc0b794c83.png\"\n    },\n    {\n      \"id\": \"8vzym2xxst\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hutomomo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1df23406-9e05-46b8-966c-edddfb4f8057.png\"\n    },\n    {\n      \"id\": \"8vzyk7m76c\",\n      \"aliases\": [\n        \"いえっさー\",\n        \"イエッサー\"\n      ],\n      \"name\": \"iessa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-46c11e91-ea40-49e1-b2fc-b6e7a1eaeebd.png\"\n    },\n    {\n      \"id\": \"9016dfxsky\",\n      \"aliases\": [\n        \"misetehosii\",\n        \"i-filter\",\n        \"filtering\",\n        \"show\"\n      ],\n      \"name\": \"ifilter_misetehoshii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-53a88df3-f02c-40f7-8208-7bb621472ce9.png\"\n    },\n    {\n      \"id\": \"90mce57cxe\",\n      \"aliases\": [\n        \"tukaitai\",\n        \"i-filter\",\n        \"filtering\",\n        \"use\"\n      ],\n      \"name\": \"ifilter_tsukaitai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-55de45c1-04ed-432b-be80-4451188787f0.png\"\n    },\n    {\n      \"id\": \"8vzyi3poa0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"igyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d50d9d65-8413-4236-9762-393e4f3585ce.png\"\n    },\n    {\n      \"id\": \"8vzygvvkqr\",\n      \"aliases\": [\n        \"yoi\",\n        \"good\"\n      ],\n      \"name\": \"ii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-912cdfd1-297c-40ab-a22e-3de33e607db5.png\"\n    },\n    {\n      \"id\": \"8vzyi8imc4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iie\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6eb4e14f-addd-40fe-b1cb-beb77cfafeff.png\"\n    },\n    {\n      \"id\": \"8vzyi3ec9u\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iihanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/013cf04e-a057-4aed-ab40-4e0ea97b1aa2.gif\"\n    },\n    {\n      \"id\": \"8vzyibeldg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iizo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1f5a7b0d-a14e-4f0e-9049-f3194d812c5b.png\"\n    },\n    {\n      \"id\": \"8vzyl2z0ea\",\n      \"aliases\": [],\n      \"name\": \"ijo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-085c1e56-1157-4c7a-9b93-b43be4f7d7ef.png\"\n    },\n    {\n      \"id\": \"8vzyis1xiu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ikasune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a5b5b44a-1e2c-4c9d-9fa6-e6cdaef65bb5.png\"\n    },\n    {\n      \"id\": \"8vzymaicw6\",\n      \"aliases\": [],\n      \"name\": \"index_out_of_range\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-edafddb4-6fce-4b07-a9f4-bbcb28b071b0.png\"\n    },\n    {\n      \"id\": \"8vzylzddrn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"inochinokiken\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1d4ed064-23a1-46d6-9811-49578e476e39.png\"\n    },\n    {\n      \"id\": \"8vzyldh9iw\",\n      \"aliases\": [],\n      \"name\": \"internetkemutukasisaconcours\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-546b6a18-ba05-4f09-a47c-4b49d5d5c437.png\"\n    },\n    {\n      \"id\": \"8vzyijxvfe\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"io_update\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/01c734ec-b509-4107-af33-df19a64c3b04.gif\"\n    },\n    {\n      \"id\": \"8vzym41ftb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iovc_came\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c9570cb9-de1f-40c9-b979-4624a4a477d0.png\"\n    },\n    {\n      \"id\": \"8vzym5sru5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iovc_come\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bb14c559-5384-4864-ad3b-f52260ef7fb3.png\"\n    },\n    {\n      \"id\": \"8vzylz2vrl\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iovc_go\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c434ef5a-2966-4db5-8616-ec06b71858b3.png\"\n    },\n    {\n      \"id\": \"8vzylwvbqx\",\n      \"aliases\": [\n        \"いっぱんのごかてい\"\n      ],\n      \"name\": \"ippannno_gokatei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3d020973-006e-4db2-9d60-986e6d358222.png\"\n    },\n    {\n      \"id\": \"8vzyiaf0cy\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ippantekinikaimononiikutotukaretesimaimasu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-78ea3e68-ca88-4283-888c-b404c79b68b5.png\"\n    },\n    {\n      \"id\": \"8vzyguz6qd\",\n      \"aliases\": [\n        \"ilo\",\n        \"color\"\n      ],\n      \"name\": \"iro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1aa3ab08-1064-405b-abd9-3ff13686d8b7.png\"\n    },\n    {\n      \"id\": \"9016jcks4o\",\n      \"aliases\": [\n        \"fraud\",\n        \"hasubete_sagidesu\"\n      ],\n      \"name\": \"is_all_scam\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bda059c5-2150-4baf-be28-2c76d0b07ee9.png\"\n    },\n    {\n      \"id\": \"8vzylspjpt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"issue\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6cd5b7b8-3c4f-440f-91de-372f92593976.png\"\n    },\n    {\n      \"id\": \"8vzyk8rw6u\",\n      \"aliases\": [],\n      \"name\": \"janoute\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5739feeb-13de-4fe4-95f4-ec0d26eee23b.png\"\n    },\n    {\n      \"id\": \"8vzymayywe\",\n      \"aliases\": [],\n      \"name\": \"java_dl\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4bb9c14e-d766-4fcc-bf20-8246c28d72f2.png\"\n    },\n    {\n      \"id\": \"8vzyl5azfg\",\n      \"aliases\": [],\n      \"name\": \"jigatiisasugitemienai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-86a335e7-5653-4936-a8f8-eee3075cf1d1.png\"\n    },\n    {\n      \"id\": \"8vzylg9ukb\",\n      \"aliases\": [],\n      \"name\": \"jinsei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0f4f07b2-ba1e-4eea-8d34-62e65cec912e.png\"\n    },\n    {\n      \"id\": \"8vzyj739p3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"jinseikan_kawaruyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5dd95a35-ac79-43b1-8221-417e75cc755d.png\"\n    },\n    {\n      \"id\": \"8vzyl6z5g8\",\n      \"aliases\": [\n        \"zisseki_kaizyo\"\n      ],\n      \"name\": \"jisseki_kaijyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5992211c-b6b9-45bb-9cf9-901e689ec52c.png\"\n    },\n    {\n      \"id\": \"8vzylansho\",\n      \"aliases\": [\n        \"zisyushite\",\n        \"jisyusite\",\n        \"zisyusite\",\n        \"自首して\",\n        \"じしゅして\"\n      ],\n      \"name\": \"jisyushite\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-873a476a-cda7-4ee8-972c-2aa9981873eb.png\"\n    },\n    {\n      \"id\": \"8vzykday8o\",\n      \"aliases\": [\n        \"しょく\",\n        \"職\"\n      ],\n      \"name\": \"job\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2d100802-5a42-4d19-83c7-210fcdd901d7.png\"\n    },\n    {\n      \"id\": \"8vzylrpspn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"jouhourouei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e706b0f5-2636-4417-9923-4b0dde748ddd.png\"\n    },\n    {\n      \"id\": \"8vzylrbkpl\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"jouhouryuushitsu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-32eb7376-ab3e-4a7d-aa85-a230364746a9.png\"\n    },\n    {\n      \"id\": \"8vzylndunn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"joule_netsu_de_jurultu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2dc23c50-80ed-4aaf-b4d6-a5f9d8d065cc.png\"\n    },\n    {\n      \"id\": \"8vzyi9xbcq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kaeritai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-24cc8f4a-9e21-4bf2-9082-2b04fce9320a.png\"\n    },\n    {\n      \"id\": \"8vzym326sv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kaeroune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-eb63f672-eeed-43d5-99fb-795a4259c263.png\"\n    },\n    {\n      \"id\": \"8vzyk0692z\",\n      \"aliases\": [],\n      \"name\": \"kaishaku_chigai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-69d4517d-2bae-453e-a045-446b4028e140.png\"\n    },\n    {\n      \"id\": \"8vzylzlhrp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kakedasanai_engineer\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f143192c-7d8e-414a-9b46-2fd63aa0b400.jpg\"\n    },\n    {\n      \"id\": \"8zgq6185ht\",\n      \"aliases\": [\n        \"かきんさんざい,\",\n        \"課金散財\"\n      ],\n      \"name\": \"kakin_sanzai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9247adc8-01c6-4929-aff7-bf94a1fc5c8b.png\"\n    },\n    {\n      \"id\": \"8vzyiqzkig\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kakkoii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-38ebfefc-12d0-4ae9-88b1-c46209a473d2.png\"\n    },\n    {\n      \"id\": \"8vzylimel5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kakujikkensuruzo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a040fa70-950c-44bf-b0d8-41e7508d2b93.png\"\n    },\n    {\n      \"id\": \"8vzylqp6ph\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kami\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ba2dc3ba-53e5-4eb3-90e0-ace6c25aea9c.png\"\n    },\n    {\n      \"id\": \"8vzylvmiqn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kami_desukedo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a2e411f2-b204-48b2-923e-079662646bec.png\"\n    },\n    {\n      \"id\": \"8vzylzxcrr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kamo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-368ece45-34b9-4a87-99ca-b80482fc7bd9.png\"\n    },\n    {\n      \"id\": \"8vzyiab4cw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kanjouganai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c9bf8ce1-34a0-445c-8a9d-af1f146343e5.png\"\n    },\n    {\n      \"id\": \"8vzym1smsb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kashiko_marihachi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1ba0c13d-bdba-4ee7-b336-2d76a8e6114f.png\"\n    },\n    {\n      \"id\": \"8vzyguh5q5\",\n      \"aliases\": [\n        \"cute\"\n      ],\n      \"name\": \"kawaii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6d8e6a1f-e7f1-47be-a1bf-58ae0966c883.png\"\n    },\n    {\n      \"id\": \"8vzyi1p096\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kawaiii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-59da0cdd-4071-4573-bf58-a9a07f9ba2fc.png\"\n    },\n    {\n      \"id\": \"8vzyla7hhi\",\n      \"aliases\": [],\n      \"name\": \"kawaiine\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-206784f3-dc2d-4fd5-80b3-5fdb6733bf52.png\"\n    },\n    {\n      \"id\": \"8vzyitm5ji\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kiaide_nantoka_shiro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-158bc42b-ef5c-4fb0-a056-2b4d09ffcee0.png\"\n    },\n    {\n      \"id\": \"8vzymadyw4\",\n      \"aliases\": [],\n      \"name\": \"kimitatchi_mounenasai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-86d242a7-25a0-4888-a881-174c375bcc69.png\"\n    },\n    {\n      \"id\": \"8vzyla1hhg\",\n      \"aliases\": [\n        \"気にすんな\",\n        \"きにすんな\"\n      ],\n      \"name\": \"kinisunna\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2515be99-dcfc-416f-8f8f-26cce907f43c.png\"\n    },\n    {\n      \"id\": \"8vzyijm9f8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kirasiteta\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1bb6f166-e069-4003-80b3-53f4053c4c40.png\"\n    },\n    {\n      \"id\": \"8vzyjqxwyv\",\n      \"aliases\": [\n        \"きたない\",\n        \"汚い\"\n      ],\n      \"name\": \"kitanai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2d9e4e13-735b-4176-b179-f0e57e8827dd.png\"\n    },\n    {\n      \"id\": \"8vzylqg6pf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kitanyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6fb1ddb7-33d8-4f47-918d-1538a2c37f1f.png\"\n    },\n    {\n      \"id\": \"8vzylm0ymx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"koippoikoto_siyouzele\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-718d8f5a-89aa-4bf6-9ba0-86a02b20ed86.png\"\n    },\n    {\n      \"id\": \"8vzyk1go3n\",\n      \"aliases\": [],\n      \"name\": \"koke\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0bfe2918-9deb-48ce-8445-20afff91175f.png\"\n    },\n    {\n      \"id\": \"8vzyk1af3l\",\n      \"aliases\": [\n        \"burger\",\n        \"こけ\",\n        \"苔\"\n      ],\n      \"name\": \"koke_burger\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-135cc48e-ef2d-4dca-8379-4b11f95a4ed8.png\"\n    },\n    {\n      \"id\": \"8vzymc0vww\",\n      \"aliases\": [],\n      \"name\": \"kokodakeno_hanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3cfe0d7a-c161-4826-9847-b6d94ebc52e7.png\"\n    },\n    {\n      \"id\": \"8zec846jrz\",\n      \"aliases\": [\n        \"こくたいごじ,\",\n        \"國體護持\"\n      ],\n      \"name\": \"kokutai_goji\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1eb3d810-8872-4498-b37a-18a415126115.png\"\n    },\n    {\n      \"id\": \"8vzyjiscut\",\n      \"aliases\": [],\n      \"name\": \"kolonyanyachiwala\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1fcf1200-34fd-4bf7-beda-117d4bb2a251.png\"\n    },\n    {\n      \"id\": \"8wkm171i42\",\n      \"aliases\": [\n        \"mrhc\",\n        \"marihachi\"\n      ],\n      \"name\": \"ko_marihachi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9bf3aa14-e40c-4b4a-854a-34571c8796fc.png\"\n    },\n    {\n      \"id\": \"8w26ypwiv3\",\n      \"aliases\": [\n        \"\",\n        \"\"\n      ],\n      \"name\": \"konni_tiha\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-71e719bf-9efe-4964-a2e5-50c259a128e2.png\"\n    },\n    {\n      \"id\": \"8vzyljdull\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"konyanyachiwa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7aacb020-29c0-4ee5-bca6-5be1913bba17.png\"\n    },\n    {\n      \"id\": \"8vzygx21rb\",\n      \"aliases\": [\n        \"angry\"\n      ],\n      \"name\": \"kora\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fd85e824-c63f-48ae-a163-1151dd73cba5.png\"\n    },\n    {\n      \"id\": \"8vzygwpkr5\",\n      \"aliases\": [\n        \"this\"\n      ],\n      \"name\": \"kore\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6c679212-75d3-4c26-b18e-3424bb033ff4.png\"\n    },\n    {\n      \"id\": \"8vzyhs7k53\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"koreha_tukaesou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2bd0cc30-3643-46ee-888f-9fe0b1af8fd8.png\"\n    },\n    {\n      \"id\": \"8vzym1lgs9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"koresuki\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-de142a9d-7c25-4290-a1af-9b4227b95f2a.png\"\n    },\n    {\n      \"id\": \"8vzyjqcvyh\",\n      \"aliases\": [\n        \"こうこくのしな\",\n        \"広告の品\"\n      ],\n      \"name\": \"koukokunoshina\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1d65950d-fa01-4fcc-84ca-28fe230dfc5e.png\"\n    },\n    {\n      \"id\": \"8vzyjo95xp\",\n      \"aliases\": [],\n      \"name\": \"kowai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-60a1e85e-7c1b-4d1f-a093-86d625aa4018.png\"\n    },\n    {\n      \"id\": \"8vzyk2yr49\",\n      \"aliases\": [\n        \"こわいはなし\"\n      ],\n      \"name\": \"kowaihanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f801148b-31be-4ffe-9786-0d79c2e4864a\"\n    },\n    {\n      \"id\": \"8vzygxgwrh\",\n      \"aliases\": [\n        \"lol\",\n        \"grass\"\n      ],\n      \"name\": \"kusa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b2664125-675f-4a6a-87d3-e80c7215e598.png\"\n    },\n    {\n      \"id\": \"8vzym99pvu\",\n      \"aliases\": [],\n      \"name\": \"kusyami_deta\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-27fe8616-153f-4aae-a427-1f89472d5975.png\"\n    },\n    {\n      \"id\": \"8vzyme11xo\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"kyokutan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-87537b53-2a24-47d7-84a8-09710d9da78f.png\"\n    },\n    {\n      \"id\": \"8vzyi4rfag\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"lgtm\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6228d3f5-d497-4647-9bed-0ea4176c84cd.png\"\n    },\n    {\n      \"id\": \"8vzyjzeq2r\",\n      \"aliases\": [],\n      \"name\": \"maanantekoto\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-15ec5fe4-42ec-41f8-8cd8-fdfafefea93c.png\"\n    },\n    {\n      \"id\": \"8vzym20ssf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mada\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cdfe7680-f724-48f7-8230-f6bff8c238fe.png\"\n    },\n    {\n      \"id\": \"8vzyi0ir8h\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"majikayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a2303f05-791f-4a8e-ae6b-084aadfc72a6.png\"\n    },\n    {\n      \"id\": \"8vzyi27f9e\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"majisuka\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-da253c6c-6078-40ea-8499-55fabfe8a88e.png\"\n    },\n    {\n      \"id\": \"8vzyk6pv5w\",\n      \"aliases\": [\n        \"まことに\",\n        \"おっしゃる\",\n        \"とおりですわ\",\n        \"誠に\",\n        \"通りですわ\"\n      ],\n      \"name\": \"makotoniossharutooridesuwa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2a7ee1e6-9d3a-4010-a7db-208b7897ba48.png\"\n    },\n    {\n      \"id\": \"8vzyirosiq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"makotonokansha\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1d88b299-942c-4942-aee6-f54420480666.png\"\n    },\n    {\n      \"id\": \"8vzyi4w9ai\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mama\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4ca90435-85ad-4d83-bb23-e51782daf7e3.png\"\n    },\n    {\n      \"id\": \"8vzyl78tgc\",\n      \"aliases\": [],\n      \"name\": \"matakayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-471d5595-a495-4427-bd59-cdf95f9b9b59.png\"\n    },\n    {\n      \"id\": \"8vzyi04c8b\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"matareyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-69be9fe6-d51c-46eb-8d9d-23f8a9cff14f.png\"\n    },\n    {\n      \"id\": \"8vzylgk3kf\",\n      \"aliases\": [],\n      \"name\": \"mayonnaisekaketeagemashoune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2e8b0ef4-1153-4e11-afde-d93209b18e5b.png\"\n    },\n    {\n      \"id\": \"8vzyjj7quz\",\n      \"aliases\": [],\n      \"name\": \"mazide\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4c8d1c1c-8ae3-4b04-8fc2-7a8a043da3a0.png\"\n    },\n    {\n      \"id\": \"8vzyhs4651\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"meigen\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-54620783-bc80-487d-a4be-ff2095dab63c.png\"\n    },\n    {\n      \"id\": \"8vzyi8tyca\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"meijitsutomonitaikin\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/178d355d-5291-4d9c-8083-3e1867f909dc.gif\"\n    },\n    {\n      \"id\": \"8vzyiou1hm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"meijitsutomonityahan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/56267f1d-9ef1-4412-9d9b-2f194056d0eb.gif\"\n    },\n    {\n      \"id\": \"8vzyh4ptv1\",\n      \"aliases\": [\n        \"mei2\"\n      ],\n      \"name\": \"meimei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8bbb5354-d61a-42da-b8a3-a9705df208f9.png\"\n    },\n    {\n      \"id\": \"8vzyles7ji\",\n      \"aliases\": [],\n      \"name\": \"mendou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b9da45c2-1cdf-4a95-8c9f-8f652fb63caf.png\"\n    },\n    {\n      \"id\": \"8vzyisqej4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"midyomidyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d0ac2ec7-2cfb-4e9d-8353-e8dd2c07baa6.png\"\n    },\n    {\n      \"id\": \"8x7tynhzng\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"miesugite_miushinaigachi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ad1261b4-9195-46ce-aff9-90d0a188b3f0.png\"\n    },\n    {\n      \"id\": \"8vzyl7ztgo\",\n      \"aliases\": [],\n      \"name\": \"mimige\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-31b8d77e-db68-45e7-9602-e1810008072d.png\"\n    },\n    {\n      \"id\": \"8vzyhtao5l\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mitsu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1c7efcda-9c56-49f9-a224-075ae09dc8e5.png\"\n    },\n    {\n      \"id\": \"8vzyhtey5n\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mitsu_desu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7339f78e-a2cb-43e4-a933-ce4b5d906d56.png\"\n    },\n    {\n      \"id\": \"8vzyislzj2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mochimochi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2d6d5814-ca88-4c22-aa44-2f05e37ad1a8.png\"\n    },\n    {\n      \"id\": \"8vzyl9i5h8\",\n      \"aliases\": [\n        \"燃えそう\",\n        \"萌えそう\",\n        \"もえそう\"\n      ],\n      \"name\": \"moesou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b1e3e5c1-66c9-42fc-8577-cf75d531f7f1.png\"\n    },\n    {\n      \"id\": \"8vzyi631b0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mofumofu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d27c4781-06ae-4530-a7cd-93320450eba6.png\"\n    },\n    {\n      \"id\": \"8vzyiaz6d8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mog\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-eb0a6f88-85e4-439c-93f6-70106f0d0cf8.png\"\n    },\n    {\n      \"id\": \"8vzylci8ig\",\n      \"aliases\": [],\n      \"name\": \"mogesou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3e3e780e-7a8e-444c-9fd0-bd933f6378b4.png\"\n    },\n    {\n      \"id\": \"8vzylu3dq5\",\n      \"aliases\": [\n        \"文字化け\"\n      ],\n      \"name\": \"mojibake\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fcc2e516-5467-46a6-b455-4718eb1f35bb.png\"\n    },\n    {\n      \"id\": \"8vzyjza12p\",\n      \"aliases\": [],\n      \"name\": \"mondaihanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/63585271-dffc-4a6a-86bf-ea75ec811d5f\"\n    },\n    {\n      \"id\": \"8vzykc2e86\",\n      \"aliases\": [\n        \"もれそう\"\n      ],\n      \"name\": \"moresou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-120871c5-6def-44fa-8b7e-bfc7f8738f07.png\"\n    },\n    {\n      \"id\": \"8vzylb67hy\",\n      \"aliases\": [],\n      \"name\": \"motto\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f6c5f267-d589-423e-87ff-f7608b394fa0.png\"\n    },\n    {\n      \"id\": \"8vzym8wbvo\",\n      \"aliases\": [],\n      \"name\": \"mou3jidashi_daisanjittekanji\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8b964e48-5d17-43ef-a8cf-f6125094057b.png\"\n    },\n    {\n      \"id\": \"8vzymauvwc\",\n      \"aliases\": [],\n      \"name\": \"mouissyoniha_ikenai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f227406a-3c14-4786-82fe-153d1e262996.png\"\n    },\n    {\n      \"id\": \"8vzyl4zqf4\",\n      \"aliases\": [],\n      \"name\": \"mukityoueki\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f32971d9-3c05-4c7b-a01d-825dcc55e737.png\"\n    },\n    {\n      \"id\": \"8vzymdivxg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mumei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-58682452-650e-4c9e-88ee-59d7c2cbf502.png\"\n    },\n    {\n      \"id\": \"8vzyi2c99g\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"murishinaide\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-547238c6-7361-41d0-8279-ac1aeeab0a69.png\"\n    },\n    {\n      \"id\": \"8vzylk0alx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"murishite\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1f9050ad-bdc8-4c86-8c07-68f70f55f887.png\"\n    },\n    {\n      \"id\": \"8vzyljwalv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mushiru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-80f78f0a-0867-465c-ad84-8e6c4c219617.png\"\n    },\n    {\n      \"id\": \"8vzykb557u\",\n      \"aliases\": [\n        \"むすめ\",\n        \"娘\"\n      ],\n      \"name\": \"musume\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4c414bc7-aafe-4a80-908d-1c52c6f9c420.png\"\n    },\n    {\n      \"id\": \"8vzylnlqnr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"muzukashiihanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5dcf18d0-9d17-4fad-9a1b-1f5b9b9ee793.gif\"\n    },\n    {\n      \"id\": \"8vzyjxop23\",\n      \"aliases\": [],\n      \"name\": \"nai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-de297953-24b0-46e6-adb5-04637c0b138f.png\"\n    },\n    {\n      \"id\": \"8vzyjxuw25\",\n      \"aliases\": [],\n      \"name\": \"nainai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-40635714-7c51-4c13-9898-c39a52d5938c.png\"\n    },\n    {\n      \"id\": \"8vzyj78dp5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"namennayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-76b2043c-a943-499e-b24f-6b05f04ee62b.png\"\n    },\n    {\n      \"id\": \"8vzyi1xh9a\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nandato\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5b94ac7b-c6d2-4695-8fcf-184d1d439a70.png\"\n    },\n    {\n      \"id\": \"8vzyk6ha5s\",\n      \"aliases\": [\n        \"なんですの\"\n      ],\n      \"name\": \"nandesuno\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a872acc1-297c-4d3d-a897-c1165fda077c.png\"\n    },\n    {\n      \"id\": \"8vzygx7rrd\",\n      \"aliases\": [\n        \"what\"\n      ],\n      \"name\": \"nani\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2b7d064d-3af2-4442-90e5-79cc846e4011.png\"\n    },\n    {\n      \"id\": \"8vzyi2g39i\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nanikore\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-42ed05fb-80ac-421c-bafb-fbd5359911aa.png\"\n    },\n    {\n      \"id\": \"8vzym3nkt5\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"naniwoitteru_nokawakarimase_n\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7ff1a3e3-e959-4955-b13a-d0764a28bf95.png\"\n    },\n    {\n      \"id\": \"8vzyi9evck\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nanmowakaran\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1c630953-c79c-47ad-a31e-1000d9a0d4d3.png\"\n    },\n    {\n      \"id\": \"8vzymc6bwy\",\n      \"aliases\": [],\n      \"name\": \"nannmo_wakarannzu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8d44d2ef-784e-42af-9249-5f8f52103074.png\"\n    },\n    {\n      \"id\": \"8vzyhzt885\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nanodesu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-13682b53-2cda-4edf-ac9a-fcb014e1426a.png\"\n    },\n    {\n      \"id\": \"8vzyj66lop\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nantokashiro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-015b946c-43d3-456c-b002-77c34e4108f9.png\"\n    },\n    {\n      \"id\": \"8vzyjvtu1f\",\n      \"aliases\": [\n        \"なぬ\",\n        \"what\"\n      ],\n      \"name\": \"nanu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-818a2fdb-56da-4c88-97e6-adbff8bd397b.png\"\n    },\n    {\n      \"id\": \"8vzyi2209c\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"naruhodo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6c9b724e-6966-4314-9a3c-c1ad21febeaa.png\"\n    },\n    {\n      \"id\": \"8vzyi0el8f\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"naruhodofes\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b11537b4-db1e-4689-804f-90a0d76b8cb6.png\"\n    },\n    {\n      \"id\": \"8vzyhz677v\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nayomiya\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f9d5b032-471c-4841-8c56-0ea1a8c38a82.png\"\n    },\n    {\n      \"id\": \"8vzyi1fg92\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nazo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-80967c6a-e926-45a1-a40c-77a9b651e2df.png\"\n    },\n    {\n      \"id\": \"8vzym52etx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nekochan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b5cab739-3ec0-4047-8628-18961ad68020.png\"\n    },\n    {\n      \"id\": \"8vzym57ptz\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nekojan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0335062f-bdaf-4d3c-a6f5-0131704b68c7.png\"\n    },\n    {\n      \"id\": \"8vzyjjiav5\",\n      \"aliases\": [],\n      \"name\": \"nemu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0ef56f1c-b4ec-4464-88f1-299554be5d97.png\"\n    },\n    {\n      \"id\": \"8vzyjxat1x\",\n      \"aliases\": [\n        \"ネムイわよ!!\",\n        \"ねむい\"\n      ],\n      \"name\": \"nemuiwayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-40922e31-9f41-4c39-bf1a-9d0a1c9c11fd.png\"\n    },\n    {\n      \"id\": \"8vzymclyx4\",\n      \"aliases\": [],\n      \"name\": \"nenaito_shinu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a1a6ae45-0a2c-4adc-bbf3-6496869b2fdd.png\"\n    },\n    {\n      \"id\": \"8vzymf0qy4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nero\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f9e0d5d3-9661-4946-bd02-6d3a9a30cebc.png\"\n    },\n    {\n      \"id\": \"8vzym9y5vy\",\n      \"aliases\": [],\n      \"name\": \"neru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dea58842-658f-4b1d-a114-0bf2af760c5a.png\"\n    },\n    {\n      \"id\": \"8vzyjoejxr\",\n      \"aliases\": [\n        \"ねっとでしんじつ\"\n      ],\n      \"name\": \"netdeshinjitsu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5c253e05-07e2-4589-9195-558fd3ef4167.png\"\n    },\n    {\n      \"id\": \"8vzyikwbfw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"neyoune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6cb61c25-2e27-4c67-a273-9d518061731e.png\"\n    },\n    {\n      \"id\": \"8vzymbnewq\",\n      \"aliases\": [],\n      \"name\": \"niconico_choukaigi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5e3d42a7-689d-4fa0-aa5c-19adcfd8fb9f.png\"\n    },\n    {\n      \"id\": \"8vzymcvvx8\",\n      \"aliases\": [],\n      \"name\": \"niconico_namahousou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-79f53aee-8751-482f-a1ae-8a60429cb1fe.png\"\n    },\n    {\n      \"id\": \"8vzylunuqh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ningen_desukedo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f6d6d9f0-afc3-42a8-b5b1-0aa8d8ff3937.png\"\n    },\n    {\n      \"id\": \"8vzygyxss5\",\n      \"aliases\": [\n        \"of\"\n      ],\n      \"name\": \"no\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c17d3612-813b-4b8c-9032-bb330c16de74.png\"\n    },\n    {\n      \"id\": \"8xmr2rcixi\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nurashitemo_nakanaide\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e0bf7d79-f34a-4479-bbc0-e926f406b597.png\"\n    },\n    {\n      \"id\": \"8vzyi0rk8l\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ochitsuke\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ad44e36a-d389-4ac4-84a2-be6e7fadd9d6.png\"\n    },\n    {\n      \"id\": \"8vzyi0n08j\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"odaijini\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fc1a2857-ea90-416a-9d47-69782a52ff41.png\"\n    },\n    {\n      \"id\": \"8vzyhzoe83\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"oh\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2ef322fe-dd58-4341-8735-5d4107934fe7.png\"\n    },\n    {\n      \"id\": \"8vzyi2k99k\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ohayou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d52fe4bc-7924-4d17-8d78-f1e0b324fffe.png\"\n    },\n    {\n      \"id\": \"8vzyk9yt7a\",\n      \"aliases\": [],\n      \"name\": \"ohayougozaimasen\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0f93623a-25f7-4c35-b7dc-435051fe6317\"\n    },\n    {\n      \"id\": \"8vzyhzur87\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ohayougozaimasu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/569c3157-9122-45b9-9b08-b48764d0f1cb.gif\"\n    },\n    {\n      \"id\": \"8vzylmo6n7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ojiichan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8f51fa2b-4a94-4de4-b71f-ff21ef658566.png\"\n    },\n    {\n      \"id\": \"8vzyl5f9fi\",\n      \"aliases\": [\n        \"おかえり\",\n        \"お帰り\"\n      ],\n      \"name\": \"okaeri\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8ecd72a0-4b62-426a-9ff0-36f9759f9ed8.png\"\n    },\n    {\n      \"id\": \"8vzylsy6pv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"okometabenasai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-34ef0984-3242-4a57-b086-d81924f167e1.png\"\n    },\n    {\n      \"id\": \"8vzyk8vi6w\",\n      \"aliases\": [\n        \"お前\",\n        \"おまえ\",\n        \"jp\"\n      ],\n      \"name\": \"omae\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1be8437e-0900-4a5a-abd8-d97abc7b5f48.png\"\n    },\n    {\n      \"id\": \"8vzyjq8pyf\",\n      \"aliases\": [\n        \"omaegatsukure\",\n        \"omaegatukure\",\n        \"お前が作れ\",\n        \"おまえがつくれ\",\n        \"jp\"\n      ],\n      \"name\": \"omae_ga_tsukure\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0c0c7db8-359b-4caf-ae95-5e9a47312f42.png\"\n    },\n    {\n      \"id\": \"8vzyld4uiq\",\n      \"aliases\": [],\n      \"name\": \"omaegawarui\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a5824398-d048-422d-bc63-2692fb0f7803.png\"\n    },\n    {\n      \"id\": \"8vzyjqldyj\",\n      \"aliases\": [\n        \"congrats\",\n        \"congratulation\"\n      ],\n      \"name\": \"omedetou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-53982a0f-a0d6-4583-b16b-701019e38592.png\"\n    },\n    {\n      \"id\": \"8vzylnk6np\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"onaka_pekosugi_no_kei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f85f8de6-92cf-4ab8-b42d-be248406b640.png\"\n    },\n    {\n      \"id\": \"8vzyl9bfh6\",\n      \"aliases\": [],\n      \"name\": \"oneechan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dbac10da-9d7e-43f9-8fa4-d6d37b305eea.png\"\n    },\n    {\n      \"id\": \"8vzylf6zjx\",\n      \"aliases\": [],\n      \"name\": \"oniichan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6364380d-015b-4a89-b5cf-a4d692736429.png\"\n    },\n    {\n      \"id\": \"8vzykari7q\",\n      \"aliases\": [\n        \"大損\",\n        \"おおぞん\",\n        \"損\"\n      ],\n      \"name\": \"oozon\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/39e252c9-4ec1-45d9-a09a-5e4dc3dacae7.apng\"\n    },\n    {\n      \"id\": \"8vzyl9r2hc\",\n      \"aliases\": [\n        \"大曽根\",\n        \"おおぞね\"\n      ],\n      \"name\": \"oozone\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3f0f8576-bebf-43f5-9a0f-02e912431097.png\"\n    },\n    {\n      \"id\": \"8vzykcek8a\",\n      \"aliases\": [\n        \"俺\",\n        \"おれ\",\n        \"オレ\"\n      ],\n      \"name\": \"ore\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-66250f4a-ae48-4b39-a9ad-abef031046d4.png\"\n    },\n    {\n      \"id\": \"8vzyld8wis\",\n      \"aliases\": [],\n      \"name\": \"oregawarui\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-76658fc0-00d5-41a0-8b75-29919893b245.png\"\n    },\n    {\n      \"id\": \"8vzykkr99a\",\n      \"aliases\": [\n        \"おそすぎてみえっぱなし\",\n        \"遅すぎて見えっぱなし\"\n      ],\n      \"name\": \"ososugite_mieppanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7c9dd715-b277-42e9-8011-7ac2467d4050.png\"\n    },\n    {\n      \"id\": \"8vzykadu7i\",\n      \"aliases\": [\n        \"おたく\",\n        \"オタク\"\n      ],\n      \"name\": \"otaku\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8e684a7d-fe89-47c9-a0f8-ee5c06c5c508.png\"\n    },\n    {\n      \"id\": \"8vzyka6s7g\",\n      \"aliases\": [\n        \"お得\",\n        \"おとく\",\n        \"とく\"\n      ],\n      \"name\": \"otoku\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e6a66819-82e8-49ed-bb7e-17eb50a9939c.png\"\n    },\n    {\n      \"id\": \"8vzyhzza89\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"otukaresama\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3bd341aa-0d70-497b-b3c0-f18489746521.png\"\n    },\n    {\n      \"id\": \"8vzyj6a2or\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"oyurushikudasai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d4dac46b-bfef-4b49-afd0-6de8c76aabf5.png\"\n    },\n    {\n      \"id\": \"8vzyl04ecv\",\n      \"aliases\": [\n        \"パクパクですわ！\",\n        \"ぱくぱくですわ！\",\n        \"jp\"\n      ],\n      \"name\": \"pakupakudesuwa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-833e9a79-4a00-4d19-8028-c87f649c06ea.png\"\n    },\n    {\n      \"id\": \"8vzylxwird\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pan_jan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-02f08842-a85f-4036-aefd-03e9828348e9.png\"\n    },\n    {\n      \"id\": \"8vzyl6r3g4\",\n      \"aliases\": [],\n      \"name\": \"pc\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2fd8c7dc-dc9a-4f10-bbd5-3c9dc6b49eee.png\"\n    },\n    {\n      \"id\": \"8vzymdm5xi\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pecchintosh\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d5f5106e-55b5-4553-a281-6a40bd1fd8e7.png\"\n    },\n    {\n      \"id\": \"8vzyjwz81v\",\n      \"aliases\": [\n        \"ペコイわよ!!\",\n        \"ぺこい\"\n      ],\n      \"name\": \"pekoiwayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bdbe8cb3-c3c1-49c4-afdf-066fea207c85.png\"\n    },\n    {\n      \"id\": \"8vzykcs98i\",\n      \"aliases\": [\n        \"ほーん\",\n        \"ホーン\"\n      ],\n      \"name\": \"phon\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4b748b0e-0153-44d4-b49a-b17375823b74.png\"\n    },\n    {\n      \"id\": \"8vzymaqrwa\",\n      \"aliases\": [],\n      \"name\": \"pojittelibu_sunao_keikakusei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-801c59d9-d420-41d7-8eef-f558e96d5528.png\"\n    },\n    {\n      \"id\": \"8vzym44vtd\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ponkotsu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cc2f0b46-9751-4c0b-a897-7855eaafb726.png\"\n    },\n    {\n      \"id\": \"8vzymcb3x0\",\n      \"aliases\": [],\n      \"name\": \"reino_are\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aa7fc19c-863d-4d89-a84b-02cd22ef86d4.png\"\n    },\n    {\n      \"id\": \"8vzyllwamv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ryoukai_shinnpann\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ba998806-0882-442f-ade4-fb3f8891780a.png\"\n    },\n    {\n      \"id\": \"8vzyiar1d4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"s\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-acfc3033-5d33-43b7-954e-1aba23e7f5c2.png\"\n    },\n    {\n      \"id\": \"8vzyj0zgmn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sasuga\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a50720c2-2893-463b-a9f9-0dd3fb60731d.png\"\n    },\n    {\n      \"id\": \"8vzylqb7pd\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sasuga_neet\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1436cb59-2cfc-4d12-b9bb-fa63b8c27eb4.png\"\n    },\n    {\n      \"id\": \"8vzygyggrx\",\n      \"aliases\": [],\n      \"name\": \"sekinin\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-65afe18c-30dc-4d68-bdab-5985613b383e.png\"\n    },\n    {\n      \"id\": \"8vzyimzqgo\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sekiro_death\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-77e4a3ca-c698-4add-aa44-453ee5b699e0.png\"\n    },\n    {\n      \"id\": \"9016hl3oj4\",\n      \"aliases\": [\n        \"letterpack\",\n        \"cash\",\n        \"fraud\",\n        \"scam\"\n      ],\n      \"name\": \"send_money\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-50a9f50d-9b4d-42ed-8838-0bd71114222c.png\"\n    },\n    {\n      \"id\": \"8vzyhz1m7t\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"setafunyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-30e96a3f-6ced-4b3d-afec-7d55ed37a294.png\"\n    },\n    {\n      \"id\": \"8vzyhn6k2d\",\n      \"aliases\": [],\n      \"name\": \"seyana\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2a6e0089-b96d-432b-bcc2-334810948c57.png\"\n    },\n    {\n      \"id\": \"8vzyijhxf6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shark_syukka\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6a5b9ad0-4f78-423d-96c6-04863f02a004.png\"\n    },\n    {\n      \"id\": \"8vzyley8jt\",\n      \"aliases\": [],\n      \"name\": \"shigoto\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-160e712f-1f52-46de-9dc3-dedf1d0b1fc5.png\"\n    },\n    {\n      \"id\": \"8vzykiw796\",\n      \"aliases\": [\n        \"しかかたん\",\n        \"しか勝たん\"\n      ],\n      \"name\": \"shikakatan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ae54ea39-3786-4cb0-b63d-b27982f448a8.png\"\n    },\n    {\n      \"id\": \"8vzyj60qon\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shikei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-01d065e5-a99e-455b-b449-f96b4a79fb52.png\"\n    },\n    {\n      \"id\": \"8vzyl4s8f2\",\n      \"aliases\": [],\n      \"name\": \"shikkouyuuyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-04ac271e-161d-43cd-848a-6e7a19c91099.png\"\n    },\n    {\n      \"id\": \"8vzymet2y0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shinanai_teidode\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-403ec0c9-dd61-4a6a-a60f-25512663c7a4.png\"\n    },\n    {\n      \"id\": \"8vzyl9vrhe\",\n      \"aliases\": [\n        \"知れてえらい\",\n        \"しれてえらい\",\n        \"sireteerai\",\n        \"shireteerai\"\n      ],\n      \"name\": \"shirete_erai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a4e144d5-f48f-4eff-bf12-384d92626883.png\"\n    },\n    {\n      \"id\": \"8vzym5iqu1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shitenainoha_omaedake\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-417a18e1-bd30-40e6-890a-94f7dd3c0a5f.png\"\n    },\n    {\n      \"id\": \"8vzylahxhm\",\n      \"aliases\": [\n        \"syoppu\",\n        \"ショップ\",\n        \"しょっぷ\"\n      ],\n      \"name\": \"shop\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-482e3c19-b6ef-4018-b252-1b6191d7dcf0.png\"\n    },\n    {\n      \"id\": \"8vzyi0918d\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"shou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5105fab3-cf2b-4b68-ae4a-534540fb00f9.png\"\n    },\n    {\n      \"id\": \"8vzyl8shgy\",\n      \"aliases\": [],\n      \"name\": \"shouganaihanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/208057d0-9afa-4166-90e8-06e3791266cc\"\n    },\n    {\n      \"id\": \"8vzyl456eu\",\n      \"aliases\": [\n        \"しゅぷしゅぷ\",\n        \"温野菜\"\n      ],\n      \"name\": \"shupushupuonyasai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2e9914d1-0311-45ae-a461-c4f3c55d165d.png\"\n    },\n    {\n      \"id\": \"8vzyh6kpvw\",\n      \"aliases\": [\n        \"shinngikyohi\"\n      ],\n      \"name\": \"sinngikyohi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2cbdb107-692c-4ed0-8a47-bd29a69af899.png\"\n    },\n    {\n      \"id\": \"8vzymex0y2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"siranke_do\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fad17b04-6300-43de-8d45-f852cd9b9a30.png\"\n    },\n    {\n      \"id\": \"8vzygzmjsh\",\n      \"aliases\": [],\n      \"name\": \"sitenai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b0a77e71-2d8e-460c-a881-f2197846e7ef.png\"\n    },\n    {\n      \"id\": \"8vzygzhlsf\",\n      \"aliases\": [],\n      \"name\": \"siteru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-39b1dad0-9d1d-4d27-8049-fff0184c5568.png\"\n    },\n    {\n      \"id\": \"8vzyhtih5p\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"social_distance\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a6aeb2ff-0edd-41fd-8cba-3c2044909585.png\"\n    },\n    {\n      \"id\": \"8vzygvcdqj\",\n      \"aliases\": [],\n      \"name\": \"sodane\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b8c69af1-9359-4a98-8ee3-f552bf0b5cd8.png\"\n    },\n    {\n      \"id\": \"8wjenx5el8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sodatiga_futsuu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e7664d0a-620e-44c6-aac1-3cf03a2415bf.png\"\n    },\n    {\n      \"id\": \"8vzymfewy8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sodatiga_warui\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-75d3563d-0f14-41be-b547-dc6fd3a7eec4.png\"\n    },\n    {\n      \"id\": \"8vzylwfwqt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sokoni_attemo_naidesune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-15ff4958-ae02-4be2-b002-1d223ae17b12.png\"\n    },\n    {\n      \"id\": \"8vzylw7cqr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sokoni_nakereba_naidesune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4a176ec0-c4dd-446d-8699-1f6ed307111f.png\"\n    },\n    {\n      \"id\": \"8vzykaiw7k\",\n      \"aliases\": [\n        \"損\",\n        \"そん\"\n      ],\n      \"name\": \"son\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-578191a4-082f-4982-a0ed-c5a0b01b84a5.png\"\n    },\n    {\n      \"id\": \"8vzyjpqgy9\",\n      \"aliases\": [\n        \"そんなことあるんだ\"\n      ],\n      \"name\": \"sonnakotoarunda\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-52ee9700-7114-4690-88cf-8633b2ad962a.png\"\n    },\n    {\n      \"id\": \"8vzyl6kxg2\",\n      \"aliases\": [],\n      \"name\": \"sonnakotodekinai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b81af4ed-923a-4bdd-84a1-eef233f1f79d.png\"\n    },\n    {\n      \"id\": \"8vzylhijkt\",\n      \"aliases\": [],\n      \"name\": \"sonnakotodekirunda\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8024b0e8-fe9d-43b5-a0f4-f565f27e4a04.png\"\n    },\n    {\n      \"id\": \"8vzylhptkv\",\n      \"aliases\": [],\n      \"name\": \"sonnakotodekitanda\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-353a2d6b-5728-4aed-8d59-2ad8cf2eee85.png\"\n    },\n    {\n      \"id\": \"8vzyliasl3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sonnakotonai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6c4fa881-c720-46de-8bc3-58cc0d2d7515.png\"\n    },\n    {\n      \"id\": \"8vzyjpwbyb\",\n      \"aliases\": [\n        \"そんなものあるんだ\"\n      ],\n      \"name\": \"sonnamonoarunda\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2316b652-646c-43d3-8929-75cafae4f8f8.png\"\n    },\n    {\n      \"id\": \"8vzyjq3syd\",\n      \"aliases\": [\n        \"そんなのいらない\",\n        \"sonnnanoiranai\"\n      ],\n      \"name\": \"sonnnano_iranai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2443624d-57f5-45ac-9abc-3bfb9d242bc4.png\"\n    },\n    {\n      \"id\": \"8vzymamiw8\",\n      \"aliases\": [],\n      \"name\": \"sonnnasoubide_daijoubuka\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-98483f8c-412a-4e83-9ca4-88bffd0f26bb.png\"\n    },\n    {\n      \"id\": \"8vzyliqdl7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sonokanouseiwaaru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1599ffbd-512c-49c4-8efc-11ceea6edd62.png\"\n    },\n    {\n      \"id\": \"8vzygwlcr3\",\n      \"aliases\": [\n        \"it\"\n      ],\n      \"name\": \"sore\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d0093836-7523-4e3f-a326-59092fc1d3b2.png\"\n    },\n    {\n      \"id\": \"8vzym959vs\",\n      \"aliases\": [],\n      \"name\": \"sore_575\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-20a740d0-163a-4d4c-aee8-4ea6140a0dfe.png\"\n    },\n    {\n      \"id\": \"8vzyh4hwux\",\n      \"aliases\": [],\n      \"name\": \"sorehasou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-23b52552-a751-4a31-9f2d-b8459f9a4596.png\"\n    },\n    {\n      \"id\": \"8vzykawq7s\",\n      \"aliases\": [\n        \"そうだそうだ\"\n      ],\n      \"name\": \"soudasouda\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fd3360d0-be5f-4572-a2da-93d5bb4d3841.png\"\n    },\n    {\n      \"id\": \"8vzyl8xph0\",\n      \"aliases\": [\n        \"そうはならんやろ\"\n      ],\n      \"name\": \"souhanaranyaro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e76693a6-7bf0-4877-83a9-3e8f7cbc9da1.png\"\n    },\n    {\n      \"id\": \"8vzymchmx2\",\n      \"aliases\": [],\n      \"name\": \"souiugamezyaneekara_kore\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4a12b13e-4334-430a-b7f4-39d9d4a734e5.png\"\n    },\n    {\n      \"id\": \"8vzylbt6i6\",\n      \"aliases\": [],\n      \"name\": \"souiuhimoaru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e8e774fc-62b3-4f83-892f-30a491d5d07b.png\"\n    },\n    {\n      \"id\": \"8vzylcc2ie\",\n      \"aliases\": [],\n      \"name\": \"souiukoto\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c6000a10-824b-4286-a837-fcf2e0eb47c1.png\"\n    },\n    {\n      \"id\": \"8vzylc7hic\",\n      \"aliases\": [],\n      \"name\": \"souiutokimoaru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4819ce1c-cae4-4889-9d7c-50c0d0061fe9.png\"\n    },\n    {\n      \"id\": \"8vzylby2i8\",\n      \"aliases\": [],\n      \"name\": \"souiutokoyazo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d8fcbbb6-32e1-4a82-ae34-68518968308d.png\"\n    },\n    {\n      \"id\": \"8vzylc2fia\",\n      \"aliases\": [],\n      \"name\": \"souiutoshigoro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c161bc44-3312-447e-9210-84cc04591ac7.png\"\n    },\n    {\n      \"id\": \"8vzyjo3qxn\",\n      \"aliases\": [\n        \"そうかも\"\n      ],\n      \"name\": \"soukamo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ea065d03-baef-47b7-9753-995f5481da1f.png\"\n    },\n    {\n      \"id\": \"8vzyjoorxv\",\n      \"aliases\": [\n        \"そうおもう\",\n        \"think_so\"\n      ],\n      \"name\": \"souomou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f3b8febb-a298-42f6-a451-f7fc7405ab26.png\"\n    },\n    {\n      \"id\": \"8vzyme6nxq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sou_omouyona\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-093051e9-12ee-4dfa-ac8f-b62efa0a8ac3.png\"\n    },\n    {\n      \"id\": \"8vzylasghq\",\n      \"aliases\": [\n        \"なっとるやろがい\",\n        \"nattoruyarogai\"\n      ],\n      \"name\": \"stamp_nattoruyarogai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-589c0bf5-d8a6-48ae-b70d-6c8a2a525a6d.png\"\n    },\n    {\n      \"id\": \"8vzylbnwi4\",\n      \"aliases\": [\n        \"nemui\",\n        \"眠い\",\n        \"ねむい\"\n      ],\n      \"name\": \"stamp_nemui\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-67df3d1a-c033-445d-87bf-7b37dbc6f6fb.png\"\n    },\n    {\n      \"id\": \"8vzyjwl51r\",\n      \"aliases\": [\n        \"おいパイ食わねぇか\",\n        \"oipaikuwaneleka\"\n      ],\n      \"name\": \"stamp_pie\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dcf41e2b-ad61-4e36-a84c-376ad9cd4921.png\"\n    },\n    {\n      \"id\": \"8vzyjwh51p\",\n      \"aliases\": [],\n      \"name\": \"stamp_pie_bug\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ca8c16ae-68ee-4043-89a2-cc4c4a6d047a.png\"\n    },\n    {\n      \"id\": \"8vzyj1hlmv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"str_hametsu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9576a4d6-b9da-45c6-a48d-c366d44a83f9.png\"\n    },\n    {\n      \"id\": \"8vzymdbzxe\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"strings_validation_error\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-31616850-f844-444e-ad01-d4e07abaa9da.png\"\n    },\n    {\n      \"id\": \"8vzylackhk\",\n      \"aliases\": [\n        \"すごい\"\n      ],\n      \"name\": \"sugoi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1875d28b-8890-4c1e-96b3-b114c7a13e31.png\"\n    },\n    {\n      \"id\": \"8vzykyptc3\",\n      \"aliases\": [\n        \"すごいはなし\",\n        \"点滅\",\n        \"てんめつ\",\n        \"tenmetu\",\n        \"jp\"\n      ],\n      \"name\": \"sugoihanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/fb1304b4-04a0-48ff-a14b-fa447cf66682\"\n    },\n    {\n      \"id\": \"8vzym2l4sn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"suibotsu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a0f8293e-9ab9-42d8-b386-ce897362acba.png\"\n    },\n    {\n      \"id\": \"8vzyh72ww2\",\n      \"aliases\": [],\n      \"name\": \"sukebe\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-81e86ce8-0540-4595-a3cb-85234de5a466.png\"\n    },\n    {\n      \"id\": \"8vzyjnqsxf\",\n      \"aliases\": [\n        \"すけべ!\",\n        \"すけべ！\"\n      ],\n      \"name\": \"sukebe_2\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a8f34192-b51b-4e76-8f4e-18cf1f5b070b.png\"\n    },\n    {\n      \"id\": \"8vzygwtkr7\",\n      \"aliases\": [\n        \"syuki\",\n        \"like\",\n        \"love\"\n      ],\n      \"name\": \"suki\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-85bb38d8-791f-46f2-b844-abc0bbb9ffe7.png\"\n    },\n    {\n      \"id\": \"8vzymfa6y6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"sumimasendesita\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3737c1d6-d294-428c-b93a-263b5d5b88b7.png\"\n    },\n    {\n      \"id\": \"8vzyllldmr\",\n      \"aliases\": [\n        \"スピリタス\",\n        \"入れて\",\n        \"あげましょうね\"\n      ],\n      \"name\": \"supiritasu_irete_agemashoune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0ed36d3b-0d22-4da9-9a5b-4d1d8e8483c9.png\"\n    },\n    {\n      \"id\": \"8vzyl7u5gm\",\n      \"aliases\": [\n        \"sapo-tosennta-\"\n      ],\n      \"name\": \"support_center\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a0b10105-bb9e-4f0d-b5eb-e9023cf780ed.png\"\n    },\n    {\n      \"id\": \"8vzyib3ida\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"syo_ga_nai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-be473c6a-266f-4097-9b55-c169a12d5374.png\"\n    },\n    {\n      \"id\": \"8vzyguurqb\",\n      \"aliases\": [],\n      \"name\": \"syu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d3f78963-cd84-495d-8395-a37c6123df99.png\"\n    },\n    {\n      \"id\": \"8vzyh6ymw0\",\n      \"aliases\": [],\n      \"name\": \"syuilo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c9db2347-7d07-4665-811c-a2004cddf99b.png\"\n    },\n    {\n      \"id\": \"8vzyl7lagi\",\n      \"aliases\": [],\n      \"name\": \"syuuri\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f2e315bc-c5d3-49f2-af9e-ea2cad8bab39.png\"\n    },\n    {\n      \"id\": \"8vzymeftxu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"taiha_nai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c342e81e-3054-466b-9ed2-d09ca9ca0fa4.png\"\n    },\n    {\n      \"id\": \"8vzyi86nby\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"taikin\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-94bdf381-356d-4e02-8fd5-1736ae0e18aa.png\"\n    },\n    {\n      \"id\": \"8vzymeotxy\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"taishika_nai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9ad095ab-19ca-46f4-a969-26d3840fab3e.png\"\n    },\n    {\n      \"id\": \"8vzyis6biw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"take_a_break\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fc90308d-397b-48fd-8985-2c906fe931e0.png\"\n    },\n    {\n      \"id\": \"8vzylgf0kd\",\n      \"aliases\": [\n        \"tako\",\n        \"たこ\",\n        \"タコ\",\n        \"octopus\"\n      ],\n      \"name\": \"tako\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1ba20a33-cbf7-4ac4-b4cb-2e865b78a1f7.png\"\n    },\n    {\n      \"id\": \"8vzylgt8kj\",\n      \"aliases\": [],\n      \"name\": \"takosune\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1689cb5c-76f3-4d44-8284-36b9d99f183a.png\"\n    },\n    {\n      \"id\": \"8vzym4v2tv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tameninattane\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2be513ba-f531-40af-a86b-de377a4d5d61.png\"\n    },\n    {\n      \"id\": \"8vzymbk2wo\",\n      \"aliases\": [],\n      \"name\": \"taninnokotobaja_dame\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-43895e79-5f18-4ebe-98e9-deaeea2b28d3.png\"\n    },\n    {\n      \"id\": \"8vzyjokpxt\",\n      \"aliases\": [],\n      \"name\": \"tanoshisou\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f5b9c887-8d21-40a9-ac3a-fe12aeacd0c8.png\"\n    },\n    {\n      \"id\": \"8vzyjin8ur\",\n      \"aliases\": [\n        \"タピオカナタデココラーメン\"\n      ],\n      \"name\": \"tapioca_natadecoco_ramen\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2d78b36d-85d1-49a7-879f-a4755ba37984.png\"\n    },\n    {\n      \"id\": \"8vzyh4m8uz\",\n      \"aliases\": [\n        \"reiwa\"\n      ],\n      \"name\": \"tapioka\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5be01dc1-7bc0-4f44-996e-1a783a7b61fa.png\"\n    },\n    {\n      \"id\": \"8vzyi8mpc6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tashikani\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-be4ab471-ec54-4255-bb9c-6e0696fc81ab.png\"\n    },\n    {\n      \"id\": \"8vzygv80qh\",\n      \"aliases\": [],\n      \"name\": \"taso\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7e2b207a-a53f-406d-b9ee-602179133403.png\"\n    },\n    {\n      \"id\": \"8vzyjpjdy7\",\n      \"aliases\": [\n        \"たすかるまつり\",\n        \"thanks\",\n        \"fes\",\n        \"saved\",\n        \"helpful\",\n        \"rescured\"\n      ],\n      \"name\": \"tasukarufes\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-789dab42-8231-4ceb-837f-11ed7afc087b.png\"\n    },\n    {\n      \"id\": \"8vzyij0pf2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tasukete\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c75eadc7-7c90-4d3f-8319-bc10ecc9fac5.png\"\n    },\n    {\n      \"id\": \"8vzyjpdky5\",\n      \"aliases\": [\n        \"help\",\n        \"たすけてまつり\"\n      ],\n      \"name\": \"tasuketefes\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4e11f25a-fa7e-4b03-8846-cd12ccd54b03.png\"\n    },\n    {\n      \"id\": \"8vzyi5yway\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tehepero\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-86ca1233-a5af-488e-8146-6ef49e9478a4.png\"\n    },\n    {\n      \"id\": \"8vzygwd0qz\",\n      \"aliases\": [\n        \"slash\",\n        \"comment\"\n      ],\n      \"name\": \"tere\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b57f94b2-082b-4fb6-889a-5d74f4adff51.png\"\n    },\n    {\n      \"id\": \"8vzymcs4x6\",\n      \"aliases\": [],\n      \"name\": \"test\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5543703a-db27-4593-92b5-e24215379621.png\"\n    },\n    {\n      \"id\": \"8vzylawehs\",\n      \"aliases\": [\n        \"グリルでグリッ\",\n        \"gurirudeguri\",\n        \"ぐりるでぐりっ\"\n      ],\n      \"name\": \"t_grill_de_gri\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-704f3bac-8f18-4b91-948a-ff695cacca12.png\"\n    },\n    {\n      \"id\": \"8vzyk96372\",\n      \"aliases\": [],\n      \"name\": \"thaikick\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8a5fbc01-56bc-4a1c-9e0e-306f9e6c87ad.png\"\n    },\n    {\n      \"id\": \"8vzylrydpp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"t_heyakata\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0cab2708-e056-4bab-a27e-7ed7a7d8dbde.png\"\n    },\n    {\n      \"id\": \"8vzykzmgcl\",\n      \"aliases\": [],\n      \"name\": \"t_hodai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-52e5d147-1018-4111-8911-68597092c88f.png\"\n    },\n    {\n      \"id\": \"8vzyiq8qi4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tiken\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7bea2ff3-f604-438a-85f3-1b82c687ca18.png\"\n    },\n    {\n      \"id\": \"8vzyl9mgha\",\n      \"aliases\": [\n        \"色々やばい\",\n        \"いろいろやばい\"\n      ],\n      \"name\": \"t_iroiroyabai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-178b2395-6f2f-4e44-96d4-787c579c45c7.png\"\n    },\n    {\n      \"id\": \"8vzygz0ts7\",\n      \"aliases\": [\n        \"with\"\n      ],\n      \"name\": \"to\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-313f7dcd-078d-49c1-b87f-86816b424d61.png\"\n    },\n    {\n      \"id\": \"8vzym4dqth\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"today_break\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e3a58f93-9528-479b-9cfc-5cd56cb1746f.png\"\n    },\n    {\n      \"id\": \"8vzyi933ce\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"t_ofuton\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-791cba5c-51e3-463b-a88f-92408e796a11.png\"\n    },\n    {\n      \"id\": \"8vzym1wpsd\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"t_oishii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5bba883c-b1a0-4cf6-8e7b-5120a3d07583.png\"\n    },\n    {\n      \"id\": \"8vzymeb1xs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tokuni_omae\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b81463cd-2687-4259-83ae-1f0c8bd24e7b.png\"\n    },\n    {\n      \"id\": \"8vzyk8jh6q\",\n      \"aliases\": [\n        \"とくしゅ\",\n        \"トクシュ\",\n        \"tokusyu\"\n      ],\n      \"name\": \"tokushu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5d3bff2a-c25e-49b8-84d1-b2dd9706080e.png\"\n    },\n    {\n      \"id\": \"8vzylkcrm7\",\n      \"aliases\": [\n        \"emoji\",\n        \"gyakukarayondemo\",\n        \"ぎゃくからよんでも\",\n        \"かいぶん\",\n        \"にほんご\"\n      ],\n      \"name\": \"tomato\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6eb0b56d-f17b-4b08-875a-07fd06a17d8d.png\"\n    },\n    {\n      \"id\": \"8vzyhzf47z\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tomimya\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6aaeeba5-4db6-4a8f-b6c5-37d5e3eed02c.png\"\n    },\n    {\n      \"id\": \"8vzym8gnvi\",\n      \"aliases\": [\n        \"kanjikata\",\n        \"kanji_ga_oosugiru\"\n      ],\n      \"name\": \"too_many_kanji\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aa6820cb-644d-4f89-9ad9-73adfe3a508e.png\"\n    },\n    {\n      \"id\": \"8vzyl5q7fm\",\n      \"aliases\": [],\n      \"name\": \"too_many_katakana\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6e113f35-cd6d-45a5-9c62-9abda9b92aa5.png\"\n    },\n    {\n      \"id\": \"8vzyk5oe5b\",\n      \"aliases\": [\n        \"ぴろぴろ\",\n        \"ピロピロ\"\n      ],\n      \"name\": \"t_piropiro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2cf00c57-a0b5-4be2-843a-1f30a814d723.apng\"\n    },\n    {\n      \"id\": \"8vzyhqr14f\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"translate\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e36da6e6-e58c-49b3-974c-289204356ab5.png\"\n    },\n    {\n      \"id\": \"8vzyl4o1f0\",\n      \"aliases\": [\n        \"とろじゃん\",\n        \"torojan\"\n      ],\n      \"name\": \"trojan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b869487f-ed6f-43a0-919a-cddd7cea2768.png\"\n    },\n    {\n      \"id\": \"8w2pw9awv0\",\n      \"aliases\": [],\n      \"name\": \"tsumeta_i\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6aef7c4e-7269-4477-8bae-7365840aa595.png\"\n    },\n    {\n      \"id\": \"8vzyl417es\",\n      \"aliases\": [\n        \"つらたん\",\n        \"tsuratan\",\n        \"turatan\"\n      ],\n      \"name\": \"t_tsuratan\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-59000c86-da8e-4935-ac0e-1c4277be84b3.png\"\n    },\n    {\n      \"id\": \"8vzyk91b70\",\n      \"aliases\": [\n        \"wakutin\",\n        \"ワクチン\"\n      ],\n      \"name\": \"t_vaccine\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-94d2595d-a1ce-495d-90ce-fd39bf1e90f8.png\"\n    },\n    {\n      \"id\": \"8vzyj1lsmx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"t_wakarimitaro\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0126bc5a-88d1-43bf-b7c1-54d4a2dc9878.png\"\n    },\n    {\n      \"id\": \"8vzyk7or6e\",\n      \"aliases\": [\n        \"slack\",\n        \"ちょくせつはなした\",\n        \"chokusetsu\"\n      ],\n      \"name\": \"tyokusetu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5c5a992e-89eb-4e44-8357-1e3fd6f87fb1.png\"\n    },\n    {\n      \"id\": \"8x7u04zuty\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"ukiashidattesoudesuwa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-424a3d33-9c83-460e-a9df-92bbf17d3ee1.png\"\n    },\n    {\n      \"id\": \"8vzymdw0xm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"unchi_gebo_saurus\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-75708e8a-4d9a-483b-b354-8c5c4077724d.png\"\n    },\n    {\n      \"id\": \"8vzykezt8w\",\n      \"aliases\": [\n        \"違憲\",\n        \"いけん\",\n        \"ikenn\"\n      ],\n      \"name\": \"unconstitutionality\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5ea8debd-8d1a-493a-8d2d-116d78a3624e.png\"\n    },\n    {\n      \"id\": \"8vzyma4bw0\",\n      \"aliases\": [],\n      \"name\": \"utsu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0d881599-1d08-44b1-8d9f-4b2de9fd526c.png\"\n    },\n    {\n      \"id\": \"8vzyjrb3yz\",\n      \"aliases\": [],\n      \"name\": \"utsukushii\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c0c7db10-ed63-4a20-89b4-50e2fcb9bec0.png\"\n    },\n    {\n      \"id\": \"8wje8hpigh\",\n      \"aliases\": [\n        \"iovc\"\n      ],\n      \"name\": \"vio_hair_removal_do\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0ff95686-466f-4949-88f4-df525f8b58f9.png\"\n    },\n    {\n      \"id\": \"8vzyiv07kc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"vnn\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-62940c1b-1a25-42e7-83f4-3ce1869e818c.png\"\n    },\n    {\n      \"id\": \"8vzyiuwqka\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"vun\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ee22c622-4e20-42a0-8b20-e542b79783cd.png\"\n    },\n    {\n      \"id\": \"8vzylt7spx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"wainohanashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5219e526-289f-4cf0-bea5-baab71adf16c.png\"\n    },\n    {\n      \"id\": \"8vzygyc9rv\",\n      \"aliases\": [],\n      \"name\": \"wakaiseyo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-80b314d3-6732-42ce-941f-44b586129f23.png\"\n    },\n    {\n      \"id\": \"8vzygvluqn\",\n      \"aliases\": [\n        \"idk\"\n      ],\n      \"name\": \"wakaranai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c304c85f-8bce-4b5c-b95b-37f07d610bd0.png\"\n    },\n    {\n      \"id\": \"8vzymds4xk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"wakarikake\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-68e7345c-b92e-4214-85e4-f7926fcbce18.png\"\n    },\n    {\n      \"id\": \"8vzyh6tzvy\",\n      \"aliases\": [],\n      \"name\": \"wakarimi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d8d638e6-3ef3-4532-8bb9-205ae050681b.png\"\n    },\n    {\n      \"id\": \"8vzygvhdql\",\n      \"aliases\": [\n        \"understand\",\n        \"gotit\",\n        \"agree\"\n      ],\n      \"name\": \"wakaru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dd617e46-fdde-41ce-8ff6-9b95a071adeb.png\"\n    },\n    {\n      \"id\": \"8vzyho712t\",\n      \"aliases\": [],\n      \"name\": \"wakatte\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4a2a6c68-dda8-4dfc-9704-733e24e2f888.png\"\n    },\n    {\n      \"id\": \"8vzyljmclp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"wakuwaku\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f26ee424-49fb-4002-b611-1306e64dc265.png\"\n    },\n    {\n      \"id\": \"8vzyiv2tke\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"waruihanasi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/bc7e6cc6-f401-4b07-ae77-e9ecd3bd9dea.gif\"\n    },\n    {\n      \"id\": \"8vzyk71r62\",\n      \"aliases\": [\n        \"わたくしだってそうですわ\",\n        \"watakusidattesoudesuwa\"\n      ],\n      \"name\": \"watakushidattesoudesuwa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b91e7a09-6e1b-4dbe-86de-35d9bc6dbc9b.png\"\n    },\n    {\n      \"id\": \"8vzym2tvsr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"watashi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e122daff-acfd-4a42-b473-b7c3a5e7fccd.png\"\n    },\n    {\n      \"id\": \"8vzygwx9r9\",\n      \"aliases\": [\n        \"nami\"\n      ],\n      \"name\": \"wave\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-127746e0-08fe-4e86-be39-1d71a9d35eeb.png\"\n    },\n    {\n      \"id\": \"8vzyljsjlt\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"what_is\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dc938a3a-fbc2-4fa9-97b1-2fb4b4e46a23.png\"\n    },\n    {\n      \"id\": \"8vzym26ash\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"what_is_mrhc\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e35704d6-7ec4-4b72-b6b2-faec14411598.png\"\n    },\n    {\n      \"id\": \"8vzyk7h56a\",\n      \"aliases\": [\n        \"omhnc\"\n      ],\n      \"name\": \"what_is_omhnc\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-13dcaebd-083f-43b1-8291-173b53ae8c74.png\"\n    },\n    {\n      \"id\": \"8vzymb7ewi\",\n      \"aliases\": [],\n      \"name\": \"wikipedia_wo_wiki_tte_ryakusuna\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-95add7f6-a722-456c-9be1-eb5d0b33e787.png\"\n    },\n    {\n      \"id\": \"8vzygytss3\",\n      \"aliases\": [],\n      \"name\": \"wo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cdac844c-e184-442e-99a3-a4b74ed1a09d.png\"\n    },\n    {\n      \"id\": \"8vzygw8nqx\",\n      \"aliases\": [\n        \"ltu\"\n      ],\n      \"name\": \"xtu\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a3201b9e-32fa-4de3-ba11-09dc2326aef1.png\"\n    },\n    {\n      \"id\": \"8vzym2fgsl\",\n      \"aliases\": [\n        \"yavai\"\n      ],\n      \"name\": \"yabai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bad671be-7cd9-4aaa-b1c9-a7b20ae3583e.png\"\n    },\n    {\n      \"id\": \"8vzyk6ww60\",\n      \"aliases\": [\n        \"ヤバい\",\n        \"やばい\"\n      ],\n      \"name\": \"yabaidesukoto\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-64707dfb-446f-4acd-81fb-3386c65cd611.png\"\n    },\n    {\n      \"id\": \"8vzyk6t95y\",\n      \"aliases\": [\n        \"やばい\",\n        \"ヤバい\"\n      ],\n      \"name\": \"yabaidesuwa\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-af24dafd-040a-4a5a-9927-967d5cbbda6c.png\"\n    },\n    {\n      \"id\": \"8vzyh6ftvu\",\n      \"aliases\": [],\n      \"name\": \"yabaiwayo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4c3e962c-2b2a-48fa-845b-a0822eef733d.png\"\n    },\n    {\n      \"id\": \"8vzylgnwkh\",\n      \"aliases\": [],\n      \"name\": \"yakinikunotare\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1c6f3f34-ecec-4b42-a892-2aa9c8ba97ab.png\"\n    },\n    {\n      \"id\": \"8vzyl4hrey\",\n      \"aliases\": [\n        \"やめたれ\"\n      ],\n      \"name\": \"yametare\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dd177cac-0810-4200-9cc6-913cc8606895.png\"\n    },\n    {\n      \"id\": \"8vzymekbxw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yareba_dekiru\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a3e3574b-54f9-4d63-b08a-11789fc0d70b.png\"\n    },\n    {\n      \"id\": \"8vzyj7dyp7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yareyare\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a9cfd029-97ca-4c27-a808-2b12f16e7e2b.png\"\n    },\n    {\n      \"id\": \"8vzyma9ew2\",\n      \"aliases\": [],\n      \"name\": \"yarukiga_denai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5d46173b-ab67-47f1-a91a-62b1fc5d31a3.png\"\n    },\n    {\n      \"id\": \"8vzyi68kb2\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yattane\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f97042df-1dce-46a0-b42a-3a968a7caa90.png\"\n    },\n    {\n      \"id\": \"8vzykc9c88\",\n      \"aliases\": [\n        \"やったれ\"\n      ],\n      \"name\": \"yattare\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d72c0c65-e8ff-4678-9b9f-60a5597e9691.png\"\n    },\n    {\n      \"id\": \"8vzyhzae7x\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yonutiwo\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dac99212-95b2-4f3b-b655-f4f05c699674.png\"\n    },\n    {\n      \"id\": \"8vzykblf80\",\n      \"aliases\": [\n        \"please\",\n        \"よろしく\",\n        \"おねがいします\",\n        \"お願いします\"\n      ],\n      \"name\": \"yorosiku_onegai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f4d4f9c9-4839-4edf-9640-ab2d9ec61db9.png\"\n    },\n    {\n      \"id\": \"8vzyjj3zux\",\n      \"aliases\": [],\n      \"name\": \"yumei\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9d753d05-3423-46aa-a4ff-2375e7b1c01b.png\"\n    },\n    {\n      \"id\": \"8vzym8m9vk\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yurushite_kamisama\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3a07e2d7-ac5d-4c87-a689-13dc030e9c78.png\"\n    },\n    {\n      \"id\": \"8vzyk5m859\",\n      \"aliases\": [\n        \"是非\",\n        \"ぜひ\",\n        \"jp\"\n      ],\n      \"name\": \"zehi\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-85d5ad33-03b3-4b9c-8cf4-f3a60f91754b.png\"\n    },\n    {\n      \"id\": \"8vzymczkxa\",\n      \"aliases\": [],\n      \"name\": \"_zhhwe7eo_\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3c64f39a-7623-4626-87a9-e9d394616d42.png\"\n    },\n    {\n      \"id\": \"8vzyl1gcdo\",\n      \"aliases\": [\n        \"ずるい\"\n      ],\n      \"name\": \"zurui\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-afd01863-7194-46f3-a78a-b2820cc493df.png\"\n    },\n    {\n      \"id\": \"8vzymbbxwk\",\n      \"aliases\": [],\n      \"name\": \"zutsuuga_itai\",\n      \"category\": \"Japanese decorative character\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2d4ed4a3-18aa-42c1-8269-35d27ef577ee.png\"\n    },\n    {\n      \"id\": \"8vzyh9pqx8\",\n      \"aliases\": [],\n      \"name\": \"_a\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-787d3bc6-3887-4067-944b-2083df94b9ca.png\"\n    },\n    {\n      \"id\": \"8vzyhj3c0v\",\n      \"aliases\": [],\n      \"name\": \"_ba\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-93b1cbf5-e693-4e6f-b288-10b31df5a46f.png\"\n    },\n    {\n      \"id\": \"8vzyhjtq11\",\n      \"aliases\": [],\n      \"name\": \"_be\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d9893aa2-3335-44f6-afda-c34a184d9555.png\"\n    },\n    {\n      \"id\": \"8vzyhjbv0x\",\n      \"aliases\": [],\n      \"name\": \"_bi\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a52622be-5106-4138-82cc-e339f47187ba.png\"\n    },\n    {\n      \"id\": \"8vzyhk2g13\",\n      \"aliases\": [],\n      \"name\": \"_bo\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6cd17bfc-0d32-4588-be0f-9db87b594c2f.png\"\n    },\n    {\n      \"id\": \"8vzyhjmq0z\",\n      \"aliases\": [],\n      \"name\": \"_bu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f31e366e-2fe9-4246-bbe0-d4ebf62bafd2.png\"\n    },\n    {\n      \"id\": \"8vzyhhux0d\",\n      \"aliases\": [],\n      \"name\": \"_da\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-76196838-81ad-4d27-891c-6e35a55a607f.png\"\n    },\n    {\n      \"id\": \"8vzyhil90r\",\n      \"aliases\": [],\n      \"name\": \"_de\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-875cf2fc-ad48-4dd4-81d6-9bc8d8436d0e.png\"\n    },\n    {\n      \"id\": \"8vzyhi520n\",\n      \"aliases\": [],\n      \"name\": \"_di\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e2d0a42f-aef4-4a35-9d23-9b09d726f92a.png\"\n    },\n    {\n      \"id\": \"8vzyhiun0t\",\n      \"aliases\": [],\n      \"name\": \"_do\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3a2a0fec-7aa3-4541-ad38-f48ad8bce9de.png\"\n    },\n    {\n      \"id\": \"8vzyhicz0p\",\n      \"aliases\": [],\n      \"name\": \"_du\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bb73e4c6-223e-4f98-95b2-f957e58378cb.png\"\n    },\n    {\n      \"id\": \"8vzyha1fxe\",\n      \"aliases\": [],\n      \"name\": \"_e\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9c58465f-c7c6-474c-a043-1e2250d5bae0.png\"\n    },\n    {\n      \"id\": \"8vzyhd4myq\",\n      \"aliases\": [\n        \"_hu\"\n      ],\n      \"name\": \"_fu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1457df5b-c1c4-4386-aff2-87007d4af932.png\"\n    },\n    {\n      \"id\": \"8vzyhfgszt\",\n      \"aliases\": [],\n      \"name\": \"_ga\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f71ee911-87e8-492c-adb5-3f9e9ba7387d.png\"\n    },\n    {\n      \"id\": \"8vzyhg1zzz\",\n      \"aliases\": [],\n      \"name\": \"_ge\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dbfe65ad-97e3-45a2-8c28-011f3b06d96a.png\"\n    },\n    {\n      \"id\": \"8vzyhfl0zv\",\n      \"aliases\": [],\n      \"name\": \"_gi\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3206359e-047d-40a7-9527-3cc38be3f48b.png\"\n    },\n    {\n      \"id\": \"8vzyhge001\",\n      \"aliases\": [],\n      \"name\": \"_go\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ec56231b-0c11-4f71-9821-936f2ea4cbb3.png\"\n    },\n    {\n      \"id\": \"8vzyhftizx\",\n      \"aliases\": [],\n      \"name\": \"_gu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e3aea916-a695-42a5-99f5-751b554cab71.png\"\n    },\n    {\n      \"id\": \"8vzyhcsyym\",\n      \"aliases\": [],\n      \"name\": \"_ha\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e80021f8-4e45-417d-ac67-f4d78c9c7bd0.png\"\n    },\n    {\n      \"id\": \"8vzyhd98ys\",\n      \"aliases\": [],\n      \"name\": \"_he\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0ebaec99-ab4d-4e02-a2ae-47d9adbfa698.png\"\n    },\n    {\n      \"id\": \"8vzyhcywyo\",\n      \"aliases\": [],\n      \"name\": \"_hi\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e38f5f2a-adb7-4f44-978b-2d481e1f5288.png\"\n    },\n    {\n      \"id\": \"8vzyhdd7yu\",\n      \"aliases\": [],\n      \"name\": \"_ho\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4cfd9408-efbe-4a5c-af90-21ee9a21482c.png\"\n    },\n    {\n      \"id\": \"8vzyh9tixa\",\n      \"aliases\": [],\n      \"name\": \"_i\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-434f4a6f-48b3-4a17-9a70-2b9488de9597.png\"\n    },\n    {\n      \"id\": \"8vzyhaadxi\",\n      \"aliases\": [],\n      \"name\": \"_ka\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c8b12310-0e29-4aa6-ae48-2f972492fa4d.png\"\n    },\n    {\n      \"id\": \"8vzyhao3xo\",\n      \"aliases\": [],\n      \"name\": \"_ke\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8980e729-30e9-4249-9e50-1c8eddc42317.png\"\n    },\n    {\n      \"id\": \"8vzyhaedxk\",\n      \"aliases\": [],\n      \"name\": \"_ki\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ae353d86-489e-4178-b568-89b37ab0c16c.png\"\n    },\n    {\n      \"id\": \"8vzyhmi421\",\n      \"aliases\": [],\n      \"name\": \"_kka\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2a01664c-4430-4921-86bc-d4c003ed90e1.png\"\n    },\n    {\n      \"id\": \"8vzyhmml23\",\n      \"aliases\": [],\n      \"name\": \"_kkb\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f9db0dc8-5d1d-459b-bf0a-f4ca806687af.png\"\n    },\n    {\n      \"id\": \"8vzyhasyxq\",\n      \"aliases\": [],\n      \"name\": \"_ko\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7b93324c-9561-425d-9559-87b87c05ec8e.png\"\n    },\n    {\n      \"id\": \"8vzyhai5xm\",\n      \"aliases\": [],\n      \"name\": \"_ku\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ed1d15d0-283f-44d2-923d-d2a0e01df172.png\"\n    },\n    {\n      \"id\": \"8vzyhlr51n\",\n      \"aliases\": [\n        \"_xa\"\n      ],\n      \"name\": \"_la\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8b94331d-cc10-45af-9c03-64ef6c08af2a.png\"\n    },\n    {\n      \"id\": \"8vzyhlz91r\",\n      \"aliases\": [\n        \"_xe\"\n      ],\n      \"name\": \"_le\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d0f9bc51-fbc1-4e98-8747-7c7b23d7b7fd.png\"\n    },\n    {\n      \"id\": \"8vzyhmxl29\",\n      \"aliases\": [\n        \"_xi\"\n      ],\n      \"name\": \"_li\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6d88f8dd-7e60-4a34-a8d1-fc1c0893a9f4.png\"\n    },\n    {\n      \"id\": \"8vzyhm331t\",\n      \"aliases\": [\n        \"_xo\"\n      ],\n      \"name\": \"_lo\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5056771e-12e4-418c-a302-34371afa34ef.png\"\n    },\n    {\n      \"id\": \"8vzyhn1k2b\",\n      \"aliases\": [\n        \"_xtsu\"\n      ],\n      \"name\": \"_ltsu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a643205f-c2e3-437a-aeea-5bd952de9efd.png\"\n    },\n    {\n      \"id\": \"8vzyhlv71p\",\n      \"aliases\": [\n        \"_xu\"\n      ],\n      \"name\": \"_lu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-db0a5adf-e461-4f01-aea0-b9dd89c52534.png\"\n    },\n    {\n      \"id\": \"8vzyhm6u1v\",\n      \"aliases\": [\n        \"_xya\"\n      ],\n      \"name\": \"_lya\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-18a97bab-1b74-4dec-a4ae-a07295166f04.png\"\n    },\n    {\n      \"id\": \"8vzyhmep1z\",\n      \"aliases\": [\n        \"_xyo\"\n      ],\n      \"name\": \"_lyo\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b2878d4a-0a26-4274-8733-b5afec41e611.png\"\n    },\n    {\n      \"id\": \"8vzyhmaq1x\",\n      \"aliases\": [\n        \"_xyu\"\n      ],\n      \"name\": \"_lyu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c61ce250-353f-4531-b882-50b722c665c4.png\"\n    },\n    {\n      \"id\": \"8vzyhdhkyw\",\n      \"aliases\": [],\n      \"name\": \"_ma\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0ae1a8d7-af48-471e-9c8f-0f5016735499.png\"\n    },\n    {\n      \"id\": \"8vzyhmq525\",\n      \"aliases\": [],\n      \"name\": \"_maru\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4e2e9760-950b-43ae-9c0c-bb9d7c3f8938.png\"\n    },\n    {\n      \"id\": \"8vzyhdvlz3\",\n      \"aliases\": [],\n      \"name\": \"_me\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b6ef0055-f1b7-4077-8dda-bdb6e6c1bd49.png\"\n    },\n    {\n      \"id\": \"8vzyhdllyy\",\n      \"aliases\": [],\n      \"name\": \"_mi\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c8fce31c-edce-4098-b652-82f36e1486dd.png\"\n    },\n    {\n      \"id\": \"8vzyhdzrz5\",\n      \"aliases\": [],\n      \"name\": \"_mo\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9518a244-b529-4e40-9a40-e8f4e0513f10.png\"\n    },\n    {\n      \"id\": \"8vzyhdpwz0\",\n      \"aliases\": [],\n      \"name\": \"_mu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aaa82f28-68ba-45f4-b30b-f6eefa8356f6.png\"\n    },\n    {\n      \"id\": \"8vzyhfcdzr\",\n      \"aliases\": [],\n      \"name\": \"_n\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-62d3cf46-5a36-4898-90ac-811042c47791.png\"\n    },\n    {\n      \"id\": \"8vzyhc5pyc\",\n      \"aliases\": [],\n      \"name\": \"_na\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e2fc2622-f226-4b76-b708-e4a0f2b555d1.png\"\n    },\n    {\n      \"id\": \"8vzyhcjfyi\",\n      \"aliases\": [],\n      \"name\": \"_ne\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-afd681e3-69de-4457-8b1d-71cd1c2cfaa2.png\"\n    },\n    {\n      \"id\": \"8vzyhca7ye\",\n      \"aliases\": [],\n      \"name\": \"_ni\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-49c9a365-8b4c-4e22-8d37-e16b771f91f9.png\"\n    },\n    {\n      \"id\": \"8vzyhcngyk\",\n      \"aliases\": [],\n      \"name\": \"_no\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-227678bc-fa1c-48e6-b03b-5baa19f88ec4.png\"\n    },\n    {\n      \"id\": \"8vzyhcewyg\",\n      \"aliases\": [],\n      \"name\": \"_nu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-be93c969-ed15-4c58-b31c-e7fd8d79dc72.png\"\n    },\n    {\n      \"id\": \"8vzyha66xg\",\n      \"aliases\": [],\n      \"name\": \"_o\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0d04a6a9-f2f2-4c90-a922-f622f6c0ebc7.png\"\n    },\n    {\n      \"id\": \"8vzyhkc015\",\n      \"aliases\": [],\n      \"name\": \"_pa\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d96c26f8-d2a5-443e-9590-d971d8f63cc2.png\"\n    },\n    {\n      \"id\": \"8vzyhl7e1j\",\n      \"aliases\": [],\n      \"name\": \"_pe\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4c4454e2-aa2e-44be-a33e-0f41e8ba94df.png\"\n    },\n    {\n      \"id\": \"8vzyhkna17\",\n      \"aliases\": [],\n      \"name\": \"_pi\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a9d8f84b-7189-42cb-b88c-0089b401c386.png\"\n    },\n    {\n      \"id\": \"8vzyhlgc1l\",\n      \"aliases\": [],\n      \"name\": \"_po\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-99f39e9d-b978-4773-b91f-cd0df042a8db.png\"\n    },\n    {\n      \"id\": \"8vzyhky91h\",\n      \"aliases\": [],\n      \"name\": \"_pu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3add4c40-64cf-4104-8d07-437ba910e714.png\"\n    },\n    {\n      \"id\": \"8vzyhei0zd\",\n      \"aliases\": [],\n      \"name\": \"_ra\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ec7cf5e6-92a3-4a8f-a25b-56b1a8f1dda0.png\"\n    },\n    {\n      \"id\": \"8vzyhetlzj\",\n      \"aliases\": [],\n      \"name\": \"_re\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5c38f3a3-ccd8-4f66-869a-df1b2b422621.png\"\n    },\n    {\n      \"id\": \"8vzyhelfzf\",\n      \"aliases\": [],\n      \"name\": \"_ri\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9382f36a-47ff-4147-92b2-777f3fdcf448.png\"\n    },\n    {\n      \"id\": \"8vzyhey5zl\",\n      \"aliases\": [],\n      \"name\": \"_ro\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9b45480c-fa64-4cea-be52-a71c4e67d15a.png\"\n    },\n    {\n      \"id\": \"8vzyhepfzh\",\n      \"aliases\": [],\n      \"name\": \"_ru\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-da6277cd-b142-4a05-af34-67989e0ecc31.png\"\n    },\n    {\n      \"id\": \"8vzyhaxfxs\",\n      \"aliases\": [],\n      \"name\": \"_sa\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0171de28-f821-48d0-9182-02a40396d26f.png\"\n    },\n    {\n      \"id\": \"8vzyhb5kxw\",\n      \"aliases\": [],\n      \"name\": \"_se\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5183093b-e089-4a47-823a-ec99afde4f82.png\"\n    },\n    {\n      \"id\": \"8vzyhbday0\",\n      \"aliases\": [\n        \"_si\"\n      ],\n      \"name\": \"_shi\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-08e38c49-2a7d-4537-a410-4799c5f927e5.png\"\n    },\n    {\n      \"id\": \"8vzyhb9gxy\",\n      \"aliases\": [],\n      \"name\": \"_so\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-73f79a60-b9a8-4bdd-bb6f-df0c1a62190d.png\"\n    },\n    {\n      \"id\": \"8vzyhb1bxu\",\n      \"aliases\": [],\n      \"name\": \"_su\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-91ec1ee3-23d2-42c7-890c-0ef9eed65620.png\"\n    },\n    {\n      \"id\": \"8vzyhbhiy2\",\n      \"aliases\": [],\n      \"name\": \"_ta\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-867a43d2-3c59-4044-9f6a-8b0e051b4178.png\"\n    },\n    {\n      \"id\": \"8vzyhbugy8\",\n      \"aliases\": [],\n      \"name\": \"_te\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-26866348-7267-4787-8bcd-7a6d9ca2b7c1.png\"\n    },\n    {\n      \"id\": \"8vzyhmtn27\",\n      \"aliases\": [],\n      \"name\": \"_ten\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c14e5ec5-b406-4490-a154-bd4d9d114273.png\"\n    },\n    {\n      \"id\": \"8vzyhblvy4\",\n      \"aliases\": [],\n      \"name\": \"_ti\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-90fef8e2-b140-4963-81c4-4709b28fa8d5.png\"\n    },\n    {\n      \"id\": \"8vzyhbz9ya\",\n      \"aliases\": [],\n      \"name\": \"_to\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-94dc772b-8245-4451-9191-87dc44bd17be.png\"\n    },\n    {\n      \"id\": \"8vzyhbq7y6\",\n      \"aliases\": [\n        \"_tu\"\n      ],\n      \"name\": \"_tsu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c7518274-d895-497f-b288-cadfe818fb78.png\"\n    },\n    {\n      \"id\": \"8vzyh9xdxc\",\n      \"aliases\": [],\n      \"name\": \"_u\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f749b911-68b8-4c21-8333-2104079ef3cb.png\"\n    },\n    {\n      \"id\": \"8vzyhf41zn\",\n      \"aliases\": [],\n      \"name\": \"_wa\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c4540231-2316-429f-a339-d92cfb8299f7.png\"\n    },\n    {\n      \"id\": \"8vzyhf7tzp\",\n      \"aliases\": [],\n      \"name\": \"_wo\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c904ec8c-90a4-45c5-9271-1943fc0c9fec.png\"\n    },\n    {\n      \"id\": \"8vzyhe4qz7\",\n      \"aliases\": [],\n      \"name\": \"_ya\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-707cd94d-70e2-4621-a2d5-30f15535ae32.png\"\n    },\n    {\n      \"id\": \"8vzyhee9zb\",\n      \"aliases\": [],\n      \"name\": \"_yo\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-670fde91-6b79-4dc2-b4f3-bb159caf5e6d.png\"\n    },\n    {\n      \"id\": \"8vzyhe9jz9\",\n      \"aliases\": [],\n      \"name\": \"_yu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0122c279-2cc0-4186-a3bb-50596328ce1e.png\"\n    },\n    {\n      \"id\": \"8vzyhgmp03\",\n      \"aliases\": [],\n      \"name\": \"_za\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d7fc9cef-60eb-4301-91e0-8c74bc41be2a.png\"\n    },\n    {\n      \"id\": \"8vzyhhds09\",\n      \"aliases\": [],\n      \"name\": \"_ze\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fcf3f781-4225-43d5-a5df-53b8936fad4d.png\"\n    },\n    {\n      \"id\": \"8vzyhguv05\",\n      \"aliases\": [],\n      \"name\": \"_zi\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ce09b89f-ea89-4d38-8954-c7a1489a57d4.png\"\n    },\n    {\n      \"id\": \"8vzyhhlx0b\",\n      \"aliases\": [],\n      \"name\": \"_zo\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-34019fcf-e964-46a5-8beb-2ab1d99cae5c.png\"\n    },\n    {\n      \"id\": \"8vzyhh4g07\",\n      \"aliases\": [],\n      \"name\": \"_zu\",\n      \"category\": \"Japanese Hiragana\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ebf07574-4405-471d-a452-08a0e95e3ecd.png\"\n    },\n    {\n      \"id\": \"8vzylytzrj\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"acrobat_pdf\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-88e6930e-2e71-43cd-b16f-f82cbbe54447.png\"\n    },\n    {\n      \"id\": \"8vzyh2y4u7\",\n      \"aliases\": [\n        \"ae\"\n      ],\n      \"name\": \"aftereffects\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c5a5ad89-0a1b-4659-b6d9-2c13ba35b261.png\"\n    },\n    {\n      \"id\": \"8vzyjw961l\",\n      \"aliases\": [],\n      \"name\": \"aviutl\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8ca950dc-a82c-48e2-9a66-889c43664301.png\"\n    },\n    {\n      \"id\": \"8vzyh1b5tf\",\n      \"aliases\": [\n        \"daw\"\n      ],\n      \"name\": \"bitwig\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-73eb18cc-ca29-44d5-ae39-8c6dc0a15aab.png\"\n    },\n    {\n      \"id\": \"8vzyh373ub\",\n      \"aliases\": [],\n      \"name\": \"blender\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f7451dcc-5dac-473b-a2f4-fb4d431f095e.png\"\n    },\n    {\n      \"id\": \"8vzyhpsu41\",\n      \"aliases\": [],\n      \"name\": \"brave\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6d1d3274-d289-4dca-91d1-081318865ad1.png\"\n    },\n    {\n      \"id\": \"8vzyh169td\",\n      \"aliases\": [\n        \"browser\"\n      ],\n      \"name\": \"chrome\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a7015f22-c6a6-4b67-83b4-8c65177ce1e5.png\"\n    },\n    {\n      \"id\": \"8vzyhq2845\",\n      \"aliases\": [],\n      \"name\": \"cr-edge\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3b3f1d2c-ec9d-44fc-8b8b-5d746f5446a9.png\"\n    },\n    {\n      \"id\": \"8vzyjw4l1j\",\n      \"aliases\": [\n        \"social\",\n        \"ディスコード\",\n        \"でぃすこーど\"\n      ],\n      \"name\": \"discord\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5155d61d-27b1-49f9-9c3b-8267ff209761.png\"\n    },\n    {\n      \"id\": \"8vzyh200tl\",\n      \"aliases\": [\n        \"browser\"\n      ],\n      \"name\": \"edge\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ecec70ae-15a9-4dc8-94f2-8ac5b4d47761.png\"\n    },\n    {\n      \"id\": \"8vzyh85qwk\",\n      \"aliases\": [],\n      \"name\": \"excel\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e7020e72-71da-48a0-bd82-ae0fd0e13ff7.png\"\n    },\n    {\n      \"id\": \"8vzyh1s5th\",\n      \"aliases\": [\n        \"browser\"\n      ],\n      \"name\": \"firefox\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-570680e9-5519-453d-bf16-bf3e93e1351f.png\"\n    },\n    {\n      \"id\": \"8vzyh24vtn\",\n      \"aliases\": [\n        \"fl\",\n        \"daw\"\n      ],\n      \"name\": \"flstudio\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-705caf6e-97e8-4ce1-8099-4246dbeda9dc.png\"\n    },\n    {\n      \"id\": \"8vzyh3chud\",\n      \"aliases\": [\n        \"browser\"\n      ],\n      \"name\": \"ie\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-50faa4ca-d08a-4809-8f73-4a623d8cfbcc.png\"\n    },\n    {\n      \"id\": \"8vzyib86dc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"illustrator\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d0149d24-b456-4ebd-8e0d-bc04300c6ec5.png\"\n    },\n    {\n      \"id\": \"8vzyh89nwm\",\n      \"aliases\": [],\n      \"name\": \"office\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6e79d6fc-deea-4d13-8bbc-095ad6fdc136.png\"\n    },\n    {\n      \"id\": \"8vzyh8krwq\",\n      \"aliases\": [],\n      \"name\": \"onenote\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-28a7b144-2879-4d26-ae83-9819706dd8db.png\"\n    },\n    {\n      \"id\": \"8vzyhpxj43\",\n      \"aliases\": [],\n      \"name\": \"opera\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9f0eccdf-08e6-4242-834a-fe2bd8d49f92.png\"\n    },\n    {\n      \"id\": \"8vzylyiurh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pdf\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b39f7f8d-8597-4f3d-9af6-053c971572c7.png\"\n    },\n    {\n      \"id\": \"8vzyh8e8wo\",\n      \"aliases\": [],\n      \"name\": \"powerpoint\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4f66b4b9-d34f-4ef3-b08e-2d488d6f2e1b.png\"\n    },\n    {\n      \"id\": \"8vzyjr24yx\",\n      \"aliases\": [],\n      \"name\": \"reaper\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3aa09517-d628-49fc-8c26-3f8a9002e1b1.png\"\n    },\n    {\n      \"id\": \"8vzyh1wgtj\",\n      \"aliases\": [\n        \"browser\"\n      ],\n      \"name\": \"safari\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c36c7e0c-015d-4d4e-b003-06390a594379.png\"\n    },\n    {\n      \"id\": \"8vzyh4dsuv\",\n      \"aliases\": [\n        \"daw\"\n      ],\n      \"name\": \"studio_one\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e4fca648-2987-4025-9f51-2d6c3276409c.png\"\n    },\n    {\n      \"id\": \"8vzyhssp5d\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"vivaldi\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-697d4155-28d2-480c-a3af-1305916e28aa.png\"\n    },\n    {\n      \"id\": \"8vzyjeb3t4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"vlc\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-88d144ca-74fe-4156-ad6d-37883e373a14.png\"\n    },\n    {\n      \"id\": \"8vzyh81gwi\",\n      \"aliases\": [],\n      \"name\": \"word\",\n      \"category\": \"Logo / Apps\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b3fe144c-9c76-44f8-91bb-8ff4c3ed8ca1.png\"\n    },\n    {\n      \"id\": \"8vzyidktdy\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"ac\"\n      ],\n      \"name\": \"appcode\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-67aef922-315c-4a47-b1c4-727a189493fc.png\"\n    },\n    {\n      \"id\": \"8vzyiedoe4\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"cl\"\n      ],\n      \"name\": \"clion\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-996a8daa-3ba9-4edb-bd84-616b82acc898.png\"\n    },\n    {\n      \"id\": \"8vzyh7gjw8\",\n      \"aliases\": [],\n      \"name\": \"cloudflare\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b89917fe-eb50-47ab-b4bf-a9b2d6cc65bd.png\"\n    },\n    {\n      \"id\": \"8vzyidgjdw\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"dg\"\n      ],\n      \"name\": \"datagrip\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c40c3568-bcda-48df-b72e-336f097095c1.png\"\n    },\n    {\n      \"id\": \"8vzyiev5e8\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"dl\"\n      ],\n      \"name\": \"datalore\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-98c4cf13-15eb-4815-a8c4-c652fa8a928e.png\"\n    },\n    {\n      \"id\": \"8vzyh7kcwa\",\n      \"aliases\": [],\n      \"name\": \"digitalocean\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7fcff3d5-1204-477c-a777-4118bbb96142.png\"\n    },\n    {\n      \"id\": \"8vzyh7o9wc\",\n      \"aliases\": [],\n      \"name\": \"docker\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-008f29b5-fa2f-4b9b-8275-3321c174d53b.png\"\n    },\n    {\n      \"id\": \"8vzyif7yea\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"dc\"\n      ],\n      \"name\": \"dotcover\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-fcaafa43-c23f-4a5a-bc1c-dfe7c09806dc.png\"\n    },\n    {\n      \"id\": \"8vzyifkoec\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"dm\"\n      ],\n      \"name\": \"dotmemory\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-224e47da-090e-48b0-8bcb-fdfd932cffa6.png\"\n    },\n    {\n      \"id\": \"8vzyifvxee\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"dp\"\n      ],\n      \"name\": \"dotpeek\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0c845867-f590-44a8-bc7a-1c5b8e712e7e.png\"\n    },\n    {\n      \"id\": \"8vzyig85eg\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"dt\"\n      ],\n      \"name\": \"dottrace\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5fcb8635-c23c-4233-b7f0-8120e3926986.png\"\n    },\n    {\n      \"id\": \"8vzyhxo67h\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"EclipseIDE\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-98d4619d-be91-4a31-b58e-6ac68e1ea089.png\"\n    },\n    {\n      \"id\": \"8vzygy73rt\",\n      \"aliases\": [],\n      \"name\": \"github\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-54d487b1-1d34-46c8-a892-382c00c8f830.png\"\n    },\n    {\n      \"id\": \"8vzygy2srr\",\n      \"aliases\": [],\n      \"name\": \"gitlab\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b89bbe20-632e-4206-8326-27db145fc790.png\"\n    },\n    {\n      \"id\": \"8vzyieqle6\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"go\"\n      ],\n      \"name\": \"goland\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-46a81976-c123-4246-8881-ead2bdd9eaf4.png\"\n    },\n    {\n      \"id\": \"8vzyh2nvtw\",\n      \"aliases\": [],\n      \"name\": \"grunt\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-024eac3b-1c2a-4295-b752-e108a8b7ddca.png\"\n    },\n    {\n      \"id\": \"8vzyigbwei\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"hb\"\n      ],\n      \"name\": \"hub\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-455ad7f8-be27-46fb-b34c-0e545b63bb28.png\"\n    },\n    {\n      \"id\": \"8vzyic2xdo\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"ij\",\n        \"idea\"\n      ],\n      \"name\": \"intellij\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-199c168e-a500-414c-84b5-c6eb19ea6aa7.png\"\n    },\n    {\n      \"id\": \"8vzyi9iwcm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"javascript\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-607b5a30-9e3e-48f9-9767-4cec0ea092a9.png\"\n    },\n    {\n      \"id\": \"8vzyhqjk4d\",\n      \"aliases\": [\n        \"jetbrains\"\n      ],\n      \"name\": \"kotlin\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-70135032-4b89-4753-8981-0c400c9ed4ea.png\"\n    },\n    {\n      \"id\": \"8vzyhxhd7f\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"linux\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9219016e-43e1-46bd-b22f-7bf3173d1e1a.png\"\n    },\n    {\n      \"id\": \"8vzyh28ttp\",\n      \"aliases\": [],\n      \"name\": \"mongodb\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-efbc7c87-f9c4-48d9-a5d6-a2b3762f0309.png\"\n    },\n    {\n      \"id\": \"8vzyigr2ek\",\n      \"aliases\": [\n        \"jetbrains\"\n      ],\n      \"name\": \"mps\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f1ee09ad-5db6-46d7-b76f-3ade8fa00128.png\"\n    },\n    {\n      \"id\": \"8vzyhx897d\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"MySQL\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-09f945c0-c49c-48c1-b309-61643736fb3b.png\"\n    },\n    {\n      \"id\": \"8vzyh2dytr\",\n      \"aliases\": [],\n      \"name\": \"nodejs\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c2e1f40b-b5e6-4d56-bd59-44cc4d88ef78.png\"\n    },\n    {\n      \"id\": \"8vzyh2hutt\",\n      \"aliases\": [],\n      \"name\": \"npm\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-95968c97-3e05-4902-b61b-9c5cae1deaea.png\"\n    },\n    {\n      \"id\": \"8vzyh7skwe\",\n      \"aliases\": [],\n      \"name\": \"openstack\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-56f1875c-f8e1-4b7b-8c32-e78792b88350.png\"\n    },\n    {\n      \"id\": \"8vzyid3adu\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"ps\"\n      ],\n      \"name\": \"phpstorm\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3d50a3a9-9fc9-4adb-9ce8-7d44e15975c3.png\"\n    },\n    {\n      \"id\": \"8vzyicendq\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"pc\"\n      ],\n      \"name\": \"pycharm\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3be046d9-9654-4bfe-ad2a-1dcfcf48d7a9.png\"\n    },\n    {\n      \"id\": \"8vzyjri2z1\",\n      \"aliases\": [],\n      \"name\": \"python\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-b45e3a94-276b-4510-9fad-b108c4c5c5fe.png\"\n    },\n    {\n      \"id\": \"8vzyhq6q47\",\n      \"aliases\": [],\n      \"name\": \"redis\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e6c73cb3-a51e-4459-bc43-94be14371309.png\"\n    },\n    {\n      \"id\": \"8vzyih2nem\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"rs\"\n      ],\n      \"name\": \"resharper\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8b75f6ec-b428-4e11-b33d-5ab3a0a83daf.png\"\n    },\n    {\n      \"id\": \"8vzyiheaeo\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"rsc\"\n      ],\n      \"name\": \"resharper-cpp\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aaf7d589-a77c-46ba-b470-3aa59683ed45.png\"\n    },\n    {\n      \"id\": \"8vzyijduf4\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"rd\"\n      ],\n      \"name\": \"rider\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e5917adf-dfdd-4be8-9f9d-dcc177a77d97.png\"\n    },\n    {\n      \"id\": \"8vzyidxpe0\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"rm\"\n      ],\n      \"name\": \"rubymine\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-41816125-120a-4400-85f6-f21cc2450306.png\"\n    },\n    {\n      \"id\": \"8vzyli3zl1\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"rust\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c7cb470d-9ea0-42c9-bf43-1753a2d92731.png\"\n    },\n    {\n      \"id\": \"8vzyihjweq\",\n      \"aliases\": [\n        \"jetbrains\"\n      ],\n      \"name\": \"space\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e4636998-1e28-4330-972e-7f81483d2811.png\"\n    },\n    {\n      \"id\": \"8vzyihwbes\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"tc\"\n      ],\n      \"name\": \"teamcity\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-319167aa-863d-44cc-981e-4f797e3fb732.png\"\n    },\n    {\n      \"id\": \"8vzyie9le2\",\n      \"aliases\": [\n        \"jetbrains\"\n      ],\n      \"name\": \"toolbox\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4b0affa3-c35d-48e9-8808-7a98f66054e3.png\"\n    },\n    {\n      \"id\": \"8vzyii9keu\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"up\"\n      ],\n      \"name\": \"upsource\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-da5c83d7-7016-4b7b-8be2-16064551faa8.png\"\n    },\n    {\n      \"id\": \"8vzyh0r2t7\",\n      \"aliases\": [],\n      \"name\": \"vim\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ed79f830-f0ac-4881-b6f9-a5a65ded6bbe.png\"\n    },\n    {\n      \"id\": \"8vzyh2tsu5\",\n      \"aliases\": [],\n      \"name\": \"vscode\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c8042e46-0d70-4340-97ff-8fb6c18dc1bd.png\"\n    },\n    {\n      \"id\": \"8vzyh43vur\",\n      \"aliases\": [],\n      \"name\": \"vue\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cd39261d-ec8c-4886-97c1-6bec14594cd0.png\"\n    },\n    {\n      \"id\": \"8vzyh7chw6\",\n      \"aliases\": [],\n      \"name\": \"wasabi\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a4d68c66-9290-4f2b-b96c-d74bd20e66a0.png\"\n    },\n    {\n      \"id\": \"8vzyicq5ds\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"ws\"\n      ],\n      \"name\": \"webstorm\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ebe651f5-d6f8-4b86-92c3-0d7e6a3de157.png\"\n    },\n    {\n      \"id\": \"8vzyiim9ew\",\n      \"aliases\": [\n        \"jetbrains\",\n        \"yt\"\n      ],\n      \"name\": \"youtrack\",\n      \"category\": \"Logo / Develop\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6fd76bc3-fd78-4681-a10f-ce0af7aaa7eb.png\"\n    },\n    {\n      \"id\": \"8vzyh57fv9\",\n      \"aliases\": [],\n      \"name\": \"amd\",\n      \"category\": \"Logo / Famous\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4007e7bd-b9df-4ee0-9397-4b7e5891144e.png\"\n    },\n    {\n      \"id\": \"8vzyhrgj4r\",\n      \"aliases\": [],\n      \"name\": \"android\",\n      \"category\": \"Logo / Famous\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dbb137d7-f732-4952-9093-007bb1217f00.png\"\n    },\n    {\n      \"id\": \"8vzygxyjrp\",\n      \"aliases\": [],\n      \"name\": \"intel\",\n      \"category\": \"Logo / Famous\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2fc4d6fe-edee-42b7-824b-5b7da4692f0e.png\"\n    },\n    {\n      \"id\": \"8vzyhy9e7j\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"iOS\",\n      \"category\": \"Logo / Famous\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-aea3bceb-0d94-4bb2-9d26-efd0121101d2.png\"\n    },\n    {\n      \"id\": \"8vzyh937wy\",\n      \"aliases\": [],\n      \"name\": \"microsoft\",\n      \"category\": \"Logo / Famous\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e6c9b52a-97fb-4a17-9ae2-0f4960ef5b2c.png\"\n    },\n    {\n      \"id\": \"8vzyh3hduf\",\n      \"aliases\": [\n        \"kani\"\n      ],\n      \"name\": \"realtek\",\n      \"category\": \"Logo / Famous\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6968494d-4be9-44ca-bdb6-346ae32a5008.png\"\n    },\n    {\n      \"id\": \"8vzyk0ci32\",\n      \"aliases\": [\n        \"ea\"\n      ],\n      \"name\": \"apex\",\n      \"category\": \"Logo / Games\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e7264cf1-2dd2-447d-aefe-e6253f75a195.png\"\n    },\n    {\n      \"id\": \"8vzyipeahs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"cyberpunk2077\",\n      \"category\": \"Logo / Games\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-87541fe8-1865-4055-8dec-20c07b9d4b77.png\"\n    },\n    {\n      \"id\": \"8vzyk0hb3b\",\n      \"aliases\": [\n        \"ea\"\n      ],\n      \"name\": \"knockout_city\",\n      \"category\": \"Logo / Games\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-146a702e-7546-499f-9c4f-953c47c46bf8.png\"\n    },\n    {\n      \"id\": \"8vzyhyg27l\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"leagueoflegends\",\n      \"category\": \"Logo / Games\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7d5f18d1-19a4-4832-aa75-bd47ebfe20df.png\"\n    },\n    {\n      \"id\": \"8vzyhypo7p\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"mabinogi\",\n      \"category\": \"Logo / Games\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-10380519-759f-45d2-b925-fb49bc80d63b.png\"\n    },\n    {\n      \"id\": \"8vzyhrzn4z\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"osu\",\n      \"category\": \"Logo / Games\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d9e74683-cba6-4933-8730-7197dd57007e.png\"\n    },\n    {\n      \"id\": \"8vzyhp5c3r\",\n      \"aliases\": [],\n      \"name\": \"steam\",\n      \"category\": \"Logo / Games\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-644f1f48-e009-442f-984c-5a3a0213ebb9.png\"\n    },\n    {\n      \"id\": \"8vzyjrpnz3\",\n      \"aliases\": [\n        \"android\"\n      ],\n      \"name\": \"lineage_os\",\n      \"category\": \"Logo / OS\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0d9c5979-c0d6-4c94-b1b8-ba76435ddf01.png\"\n    },\n    {\n      \"id\": \"8vzyh3tlun\",\n      \"aliases\": [],\n      \"name\": \"ubuntu\",\n      \"category\": \"Logo / OS\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-776f5b70-275c-4954-92c4-7bf82c52ed12.png\"\n    },\n    {\n      \"id\": \"8vzygxq0rl\",\n      \"aliases\": [],\n      \"name\": \"aified\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4095daff-f1b6-4dce-ae4f-c4dbd830cefd.png\"\n    },\n    {\n      \"id\": \"8vzyjih7un\",\n      \"aliases\": [],\n      \"name\": \"anchan\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-255a36a1-037b-418b-b478-386933120910.png\"\n    },\n    {\n      \"id\": \"8vzyhqb249\",\n      \"aliases\": [],\n      \"name\": \"bitcoin\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5a649c62-9af4-4a03-b404-6c98cae1479a.png\"\n    },\n    {\n      \"id\": \"8vzyk4n34x\",\n      \"aliases\": [\n        \"でまえかん\",\n        \"出前館\"\n      ],\n      \"name\": \"demaekan\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4f4a0765-989d-4652-aa50-46f769efa79e.png\"\n    },\n    {\n      \"id\": \"8vzyj6dgot\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"goodtale\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0b9c0485-d844-4638-af72-cfcf0570c000.png\"\n    },\n    {\n      \"id\": \"8vzyjwog1t\",\n      \"aliases\": [\n        \"audio\"\n      ],\n      \"name\": \"hires\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-82e36850-15b9-4643-9c8a-b26e14828e79.jpg\"\n    },\n    {\n      \"id\": \"8vzyl1nfdq\",\n      \"aliases\": [],\n      \"name\": \"kimwipe\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9880754b-841d-4524-8b02-bd6b12005428.png\"\n    },\n    {\n      \"id\": \"8vzyipq3hw\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"marukame\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-276a64ce-2a03-4600-8790-d6454848ccb7.png\"\n    },\n    {\n      \"id\": \"8vzyhqeq4b\",\n      \"aliases\": [],\n      \"name\": \"mcdonalds\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6d558160-949d-4578-826a-65d74f7d04b2.png\"\n    },\n    {\n      \"id\": \"8vzygxukrn\",\n      \"aliases\": [],\n      \"name\": \"nasa\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ceb8171b-d6ea-4bae-8779-ce431cbd8606.png\"\n    },\n    {\n      \"id\": \"8vzyklk79c\",\n      \"aliases\": [\n        \"らいぜん\",\n        \"ライゼン\",\n        \"\"\n      ],\n      \"name\": \"ryzen_circle\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-332a1afd-1789-424d-8812-747a248c9fcc.png\"\n    },\n    {\n      \"id\": \"8vzyh5esvb\",\n      \"aliases\": [],\n      \"name\": \"scp_foundation_cc_by_sa_3_0\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e9cf752f-c280-4b59-b739-73eaaaf5193e.png\"\n    },\n    {\n      \"id\": \"8vzym3xgt9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"stamp_qcpass\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5d776491-90b1-459b-a7bc-048e615f8f2a.png\"\n    },\n    {\n      \"id\": \"8vzyjho4u8\",\n      \"aliases\": [],\n      \"name\": \"type_local\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c441fa8a-d3b7-4d16-b991-2e98edcc4cd0.png\"\n    },\n    {\n      \"id\": \"8vzyipjwhu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yodobashi\",\n      \"category\": \"Logo / Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d9bf8a84-d7a0-4dc6-95b4-2f149080d765.png\"\n    },\n    {\n      \"id\": \"8vzyia3dcs\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"5g\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ab123d0a-4f78-42cd-926b-47fde7661bc3.png\"\n    },\n    {\n      \"id\": \"8vzyhr3t4l\",\n      \"aliases\": [],\n      \"name\": \"ap_amzn\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d9e16082-788c-4f8b-868b-beba3e2928b2.png\"\n    },\n    {\n      \"id\": \"8vzyje32t0\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"aws\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-96b42905-fcc4-4837-94e9-a0833fe3c098.png\"\n    },\n    {\n      \"id\": \"8vzyjdzcsy\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"azure\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-94a53b5f-0295-4848-bf96-e75c82c48a72.png\"\n    },\n    {\n      \"id\": \"8vzylf3bjv\",\n      \"aliases\": [],\n      \"name\": \"dlsite\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a6037cc8-2b43-4a1a-9e5f-71ec4afa8579.png\"\n    },\n    {\n      \"id\": \"8vzyjvnm1d\",\n      \"aliases\": [\n        \"pornhub\"\n      ],\n      \"name\": \"hub_porn\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-117ccc15-28de-458b-86ea-3b7dd5133b1a.png\"\n    },\n    {\n      \"id\": \"8vzyhpe33v\",\n      \"aliases\": [],\n      \"name\": \"keybase\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9b522253-9932-45a1-8789-329ad4915e80.png\"\n    },\n    {\n      \"id\": \"8vzyjotexx\",\n      \"aliases\": [\n        \"social\",\n        \"sns\",\n        \"ますとどん\",\n        \"マストドン\"\n      ],\n      \"name\": \"mastodon\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6b511a40-9ece-4c5f-bf79-10865f5414a4.png\"\n    },\n    {\n      \"id\": \"8vzyiul5k6\",\n      \"aliases\": [\n        \"misskey\"\n      ],\n      \"name\": \"misskey\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f3ca12a3-0254-4326-aac8-b79915fc34d6.png\"\n    },\n    {\n      \"id\": \"8vzyiurnk8\",\n      \"aliases\": [\n        \"misskey\"\n      ],\n      \"name\": \"misskey11\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d97c432c-e49f-406e-b02a-32fa851ae595.png\"\n    },\n    {\n      \"id\": \"8vzyhpii3x\",\n      \"aliases\": [],\n      \"name\": \"slack\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d5e801c2-755d-46d4-93c8-37da5dcdad9f.png\"\n    },\n    {\n      \"id\": \"8vzyhp9s3t\",\n      \"aliases\": [],\n      \"name\": \"soundcloud\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a9632c65-a1ea-45cd-8fd0-9c0f18bc6f9d.png\"\n    },\n    {\n      \"id\": \"8vzyjcdgs6\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"telegram\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bc7937b1-561a-4bd4-a0d0-ad50cf978718.png\"\n    },\n    {\n      \"id\": \"8vzyh7w4wg\",\n      \"aliases\": [],\n      \"name\": \"twitter\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-14cc307e-77a2-4a76-ab7b-4a4a3ffab530.png\"\n    },\n    {\n      \"id\": \"8vzylg3zk9\",\n      \"aliases\": [],\n      \"name\": \"unext\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-36fbfd3c-5a3a-4d97-b2f3-c8dc96087b64.png\"\n    },\n    {\n      \"id\": \"8vzyhozm3p\",\n      \"aliases\": [\n        \"misskey\"\n      ],\n      \"name\": \"v12\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-97edf971-c6ed-49c0-a119-f181d9f0b85d.png\"\n    },\n    {\n      \"id\": \"8vzyhpnp3z\",\n      \"aliases\": [],\n      \"name\": \"youtube\",\n      \"category\": \"Logo / Service\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-dd5d0a3b-c8c1-46e4-b6d9-e9386eba0f6e.png\"\n    },\n    {\n      \"id\": \"8vzyi6l0b8\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"00\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-a321b9ef-fff8-436c-9313-b596b05b7996.png\"\n    },\n    {\n      \"id\": \"8vzyi6pzba\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"000\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d4344d82-f76f-457a-8253-c466de40134e.png\"\n    },\n    {\n      \"id\": \"8vzykd2x8m\",\n      \"aliases\": [],\n      \"name\": \"04\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3eb3f7ec-68f2-40ea-8d8c-196c79ec2107.png\"\n    },\n    {\n      \"id\": \"8vzykzbmch\",\n      \"aliases\": [\n        \"点数\",\n        \"points\"\n      ],\n      \"name\": \"100minuspts\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2daf9ca4-1378-4e15-97ea-11cbd5ee2a85.png\"\n    },\n    {\n      \"id\": \"8vzylmxunb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"110\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-7b22e1ec-38c3-46da-9cc8-bcc4ba8adaba.png\"\n    },\n    {\n      \"id\": \"8vzyiseeiy\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"1up\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-be70fa7f-a7da-4631-98df-256e4aae741a.png\"\n    },\n    {\n      \"id\": \"8vzyk82s6k\",\n      \"aliases\": [\n        \"hanshin\",\n        \"はんしん\",\n        \"阪神\",\n        \"なんでや！阪神関係ないやろ！\",\n        \"なんでや!阪神関係ないやろ!\"\n      ],\n      \"name\": \"334\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-2e235be0-2a33-436f-9db7-b7fb1ba3d6a2.png\"\n    },\n    {\n      \"id\": \"8vzyl15kdk\",\n      \"aliases\": [],\n      \"name\": \"575\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4f1ec765-c793-404d-a687-2536d591afdd.png\"\n    },\n    {\n      \"id\": \"8vzyl0egd1\",\n      \"aliases\": [\n        \"clock\",\n        \"時計\",\n        \"とけい\"\n      ],\n      \"name\": \"acceleratedclock\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/340bd8cf-19c9-4ae5-a79a-602a29f004e7\"\n    },\n    {\n      \"id\": \"8vzyia5fcu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"agooglehearts\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/798ac694-76c1-49bb-ad9f-0f4a977b813f.apng\"\n    },\n    {\n      \"id\": \"8vzym5olu3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"agoogleoctopus\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/85bfe151-eabb-4ddd-a094-b74e52ea4582.apng\"\n    },\n    {\n      \"id\": \"8vzyki8x94\",\n      \"aliases\": [\n        \"dangerous\"\n      ],\n      \"name\": \"ba90\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1b7eb12f-663b-42ed-ab46-2d7eb1b2ce70.png\"\n    },\n    {\n      \"id\": \"8vzyh32lu9\",\n      \"aliases\": [],\n      \"name\": \"blank\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0346df19-7cb8-4a20-a08a-5aaf44a8da38.png\"\n    },\n    {\n      \"id\": \"8vzyk7qe6g\",\n      \"aliases\": [\n        \"fire\",\n        \"火\",\n        \"ひ\"\n      ],\n      \"name\": \"blaze\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/912dfc7a-cb46-4726-ac8b-f11285d09b03\"\n    },\n    {\n      \"id\": \"8vzyhrpv4v\",\n      \"aliases\": [],\n      \"name\": \"chikuwa\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5219ff7e-3f27-4991-9403-f43775daf027.png\"\n    },\n    {\n      \"id\": \"8vzyl0bncz\",\n      \"aliases\": [\n        \"時計\",\n        \"とけい\"\n      ],\n      \"name\": \"clock\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/a08f8d23-f0bf-4eb7-a2fb-5cede758249a\"\n    },\n    {\n      \"id\": \"8vzygxlfrj\",\n      \"aliases\": [],\n      \"name\": \"cv\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e0fdba9c-ee7f-4ddd-95a6-3b162fdf0b54.png\"\n    },\n    {\n      \"id\": \"8vzyka087c\",\n      \"aliases\": [\n        \"matrix\",\n        \"まとりっくす\",\n        \"マトリックス\"\n      ],\n      \"name\": \"cyber_hacking\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f4ace218-272f-49e7-8813-66f47db9efba\"\n    },\n    {\n      \"id\": \"8vzyiksffu\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"disputed\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e36394b7-af8b-46d3-bc52-ecde5fe223b2.png\"\n    },\n    {\n      \"id\": \"8vzykdef8s\",\n      \"aliases\": [],\n      \"name\": \"emergency\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/50bce5ca-48cd-4c87-acde-541dc49127c3.apng\"\n    },\n    {\n      \"id\": \"8vzylb2khw\",\n      \"aliases\": [],\n      \"name\": \"error\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-88c43915-1b5a-4188-a867-6e0de4149457.png\"\n    },\n    {\n      \"id\": \"8vzyljotlr\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"explosion\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/783ac928-acf5-408e-b763-d49ea5aa4461.apng\"\n    },\n    {\n      \"id\": \"8vzyi6wlbc\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"github_unicorn\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-14c039ad-997f-41f4-8b49-9504d46a95df.png\"\n    },\n    {\n      \"id\": \"8vzym15vrx\",\n      \"aliases\": [\n        \"hamburger\",\n        \"naderu\"\n      ],\n      \"name\": \"hamburger_petthex\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5f32fa52-aa3d-4a1c-87d9-f9da5ead56b3.gif\"\n    },\n    {\n      \"id\": \"8vzylgz9kl\",\n      \"aliases\": [],\n      \"name\": \"hasta_la_vista\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3a2572cf-6bfa-459a-b6b8-1bd5da0cf5ce.png\"\n    },\n    {\n      \"id\": \"8vzyj7lbp9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"hokkaidou\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f8c1acd0-1d6d-47e2-abc3-d9c3c1ccc5e6.png\"\n    },\n    {\n      \"id\": \"8vzyl0hdd3\",\n      \"aliases\": [\n        \"clock\",\n        \"時計\",\n        \"とけい\"\n      ],\n      \"name\": \"hyperacceleratedclock_backwards\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/6179cac1-0999-4cfb-a125-0760991d8b40\"\n    },\n    {\n      \"id\": \"8vzyjqoiyl\",\n      \"aliases\": [],\n      \"name\": \"iihanashi_zh\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/0f9ba58d-a1c7-4a28-bdcf-33f9958fa77b\"\n    },\n    {\n      \"id\": \"8vzykbh17y\",\n      \"aliases\": [\n        \"china\"\n      ],\n      \"name\": \"jiangshi\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c3538779-c0cd-49d6-8535-2ae69cbf7213.png\"\n    },\n    {\n      \"id\": \"8vzyk9fi76\",\n      \"aliases\": [],\n      \"name\": \"karakarauo\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-941dd497-055d-4dad-8f63-f655c3a0a621.png\"\n    },\n    {\n      \"id\": \"8vzyh0vnt9\",\n      \"aliases\": [],\n      \"name\": \"laser\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1dc21041-e855-4dd7-afb7-b66cc395da23.png\"\n    },\n    {\n      \"id\": \"8vzyibq5dm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"loading\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5ed13b28-4029-4016-a4bf-0a039893ecfe.apng\"\n    },\n    {\n      \"id\": \"8vzyhnx92p\",\n      \"aliases\": [],\n      \"name\": \"mappin\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-03b767b9-9797-441b-9702-bd53a9c44f07.png\"\n    },\n    {\n      \"id\": \"8vzyk5th5f\",\n      \"aliases\": [\n        \"cake\",\n        \"ケーキ\",\n        \"マイクラ\"\n      ],\n      \"name\": \"minecraft_cake\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2172a3c9-928b-409f-a61e-6276340675ba\"\n    },\n    {\n      \"id\": \"8vzyk5r35d\",\n      \"aliases\": [\n        \"tnt\",\n        \"マイクラ\"\n      ],\n      \"name\": \"minecraft_tnt\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/5b1c6fcb-7847-41a0-a468-d0790fb50c22\"\n    },\n    {\n      \"id\": \"8zp7xaf740\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nananana\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-482f61bb-f251-4fc3-934f-bdba7c4f4caa.png\"\n    },\n    {\n      \"id\": \"8vzym3jlt3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"need_for_sleep\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-47dc426b-9930-4ee0-8f1f-b138530bbf19.png\"\n    },\n    {\n      \"id\": \"8vzyi0wt8n\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"negi\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5fe3c984-3882-41a3-9df3-54af9cca90ca.png\"\n    },\n    {\n      \"id\": \"8vzyj8u8pv\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"nervouscursor\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/53f6ab9a-5859-478c-8696-a0caba8513b2.gif\"\n    },\n    {\n      \"id\": \"8vzyhod437\",\n      \"aliases\": [],\n      \"name\": \"new_l\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f9bd8ff1-057c-4018-a656-d2b6c212d184.png\"\n    },\n    {\n      \"id\": \"8vzyhogf39\",\n      \"aliases\": [],\n      \"name\": \"new_r\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ca4917f0-f76f-4979-a846-455f134816ec.png\"\n    },\n    {\n      \"id\": \"8vzyjjdlv3\",\n      \"aliases\": [],\n      \"name\": \"pangya_jikan\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/24f24a4c-751f-4cc2-a21a-e8057d9e3fe4.apng\"\n    },\n    {\n      \"id\": \"8vzyjp7yy3\",\n      \"aliases\": [\n        \"ban\"\n      ],\n      \"name\": \"prohibit_bath\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8aa02864-a9d5-4e69-a370-79cb62bc923f.png\"\n    },\n    {\n      \"id\": \"8vzyjp3vy1\",\n      \"aliases\": [\n        \"ban\"\n      ],\n      \"name\": \"prohibit_water\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bf61567a-1b1a-46f7-84de-aa07e8f0a63c.png\"\n    },\n    {\n      \"id\": \"8vzyit9qje\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"pui\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6326bb3a-91ce-4b54-9019-7d1d45b68e7a.png\"\n    },\n    {\n      \"id\": \"8vzyh106tb\",\n      \"aliases\": [],\n      \"name\": \"radioactive\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0cf75719-2745-43bb-8626-4e8cba1a644d.png\"\n    },\n    {\n      \"id\": \"8vzyl8pegw\",\n      \"aliases\": [],\n      \"name\": \"score_65535\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-0e564cdf-24b5-4003-8576-187f05dddaf9.png\"\n    },\n    {\n      \"id\": \"8vzym8rsvm\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"simcard\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4ca8f0cf-6392-444a-80f7-214c725314ff.png\"\n    },\n    {\n      \"id\": \"8vzylkhim9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"speechbubble\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-5d24b46d-d65c-4400-8867-82622667c9d3.png\"\n    },\n    {\n      \"id\": \"8vzylkp5md\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"speechbubble_\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-057a0f83-ca0c-4365-9a6c-40e9fcd4ff8c.png\"\n    },\n    {\n      \"id\": \"8vzylkyrmh\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"speechbubble_rant_left\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-faf0ab99-2435-4d3d-980a-4ef097e3389f.png\"\n    },\n    {\n      \"id\": \"8vzylktvmf\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"speechbubble_zigzag_left\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8c0827bb-204f-499c-a019-ddebdf7ed5e8.png\"\n    },\n    {\n      \"id\": \"8vzylkljmb\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"speechbubble_zigzag_right\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-4ac8b301-1be0-469e-b3ea-d3522255a1b0.png\"\n    },\n    {\n      \"id\": \"8vzyjijmup\",\n      \"aliases\": [],\n      \"name\": \"supertada\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/e9794209-1544-47ec-b510-e37bfdd46653\"\n    },\n    {\n      \"id\": \"8vzym5x9u7\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"tada_broccoli\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-99e91f34-d930-4662-99c3-fb0267c3731c.png\"\n    },\n    {\n      \"id\": \"8vzyjxkp21\",\n      \"aliases\": [],\n      \"name\": \"tetrapod1\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-915e1f29-29c7-4294-8675-cec6a5aa0ce7.png\"\n    },\n    {\n      \"id\": \"8vzyllc3mn\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"thought_bubble\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-6afe354b-1379-4013-b6ac-82acb386e7b2.png\"\n    },\n    {\n      \"id\": \"8vzyllghmp\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"thought_bubble_\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-41595380-2f55-4a8e-9132-cfff3e07bed0.png\"\n    },\n    {\n      \"id\": \"8vzykbc77w\",\n      \"aliases\": [\n        \"china\"\n      ],\n      \"name\": \"touhuku\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-1f1c3ffd-6097-483f-90c1-bbc8c01c804d.png\"\n    },\n    {\n      \"id\": \"8vzyjc8es4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"twitter_fact_check\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-068f5072-5c9e-4316-a9bb-22d85750b49d.png\"\n    },\n    {\n      \"id\": \"8vzyk2m143\",\n      \"aliases\": [],\n      \"name\": \"twitter_heart\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/f56cdfe2-3a54-4dcc-859e-82f21caba66b.apng\"\n    },\n    {\n      \"id\": \"8vzyiufhk4\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"uni\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-011e2147-8cd1-41cc-89a2-694e79799973.png\"\n    },\n    {\n      \"id\": \"8vzyliufl9\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"uptoyou\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-21bb6c38-5147-4ef9-a8e0-c6ba3d5842b2.png\"\n    },\n    {\n      \"id\": \"8vzyhola3d\",\n      \"aliases\": [],\n      \"name\": \"verify\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/6b61b9fc-6c8d-4728-88ff-545e80b120ca.gif\"\n    },\n    {\n      \"id\": \"8vzykfgu8y\",\n      \"aliases\": [],\n      \"name\": \"vs\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2e4fc5be-2099-46d9-bc7a-201def2a9fc9\"\n    },\n    {\n      \"id\": \"8vzyiw0dkq\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"win_computer\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-deff9c0d-b5fd-4303-b04b-196d3d659460.png\"\n    },\n    {\n      \"id\": \"8vzylmeqn3\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"woozy_cute\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-d9729dc8-6786-49cf-acd4-186f5bafd8ff.png\"\n    },\n    {\n      \"id\": \"8vzyithvjg\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"you_are_winner\",\n      \"category\": \"Other\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-00781754-3bbe-47c9-8ae9-09272ca723f7.png\"\n    },\n    {\n      \"id\": \"8vzyjyv62h\",\n      \"aliases\": [],\n      \"name\": \"avocado_verified\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f3678a9a-7170-4cfa-91ec-4f780c245411.png\"\n    },\n    {\n      \"id\": \"8vzyjz0g2j\",\n      \"aliases\": [],\n      \"name\": \"duck_verified\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-bc75598a-78b2-435e-928b-d6799c764761.png\"\n    },\n    {\n      \"id\": \"8vzylbd4i0\",\n      \"aliases\": [],\n      \"name\": \"fact\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-3c70e8b0-9618-47fc-9f71-e79928d5d4f6.png\"\n    },\n    {\n      \"id\": \"8vzylbjri2\",\n      \"aliases\": [],\n      \"name\": \"fake\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-9156de3e-995f-4ea3-b6cb-f12300d2b0d4.png\"\n    },\n    {\n      \"id\": \"8vzyjyoz2f\",\n      \"aliases\": [],\n      \"name\": \"ferdiverified\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-cd7790fa-2a06-4951-89f4-5f3833c9b999.png\"\n    },\n    {\n      \"id\": \"8vzyk0u93f\",\n      \"aliases\": [\n        \"却下\",\n        \"認証\",\n        \"プリン\",\n        \"ベリファイ\",\n        \"食べ物\",\n        \"food\",\n        \"x\"\n      ],\n      \"name\": \"puddingified_rejected\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-523dd81a-5f51-481b-919d-05ccda7b3417.png\"\n    },\n    {\n      \"id\": \"8vzyk4yc53\",\n      \"aliases\": [\n        \"承認\",\n        \"認証\",\n        \"プリン\",\n        \"ベリファイ\",\n        \"食べ物\",\n        \"food\",\n        \"check\"\n      ],\n      \"name\": \"puddingified_verified_recursion\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-261972de-6f0a-46ce-831d-654465525355.png\"\n    },\n    {\n      \"id\": \"8vzyk0pr3d\",\n      \"aliases\": [\n        \"承認\",\n        \"認証\",\n        \"プリン\",\n        \"ベリファイ\",\n        \"食べ物\",\n        \"food\",\n        \"check\"\n      ],\n      \"name\": \"puddingified_verify\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-492bc59d-39d7-48f6-ac95-df24ef271096.png\"\n    },\n    {\n      \"id\": \"8vzyk5hy57\",\n      \"aliases\": [\n        \"承認\",\n        \"認証\",\n        \"プリン\",\n        \"ベリファイ\",\n        \"食べ物\",\n        \"food\"\n      ],\n      \"name\": \"pudding_puddingified_verified\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-ca0e3b47-e961-4956-adb0-c4ec3afeacc1.png\"\n    },\n    {\n      \"id\": \"8vzyjy1o27\",\n      \"aliases\": [],\n      \"name\": \"rejected_verify\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-180c88f8-da28-4694-9579-4280a2972886.png\"\n    },\n    {\n      \"id\": \"8vzyk57455\",\n      \"aliases\": [\n        \"承認\",\n        \"認証\",\n        \"プリン\",\n        \"ベリファイ\",\n        \"食べ物\",\n        \"food\",\n        \"check\"\n      ],\n      \"name\": \"verified_puddingified_verify\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-f3bf9626-3269-4efa-8be9-2886b035296b.png\"\n    },\n    {\n      \"id\": \"8vzyjy7v29\",\n      \"aliases\": [],\n      \"name\": \"verified_reject\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-08de88f8-c17e-47e6-b638-5ffaa3e8b692.png\"\n    },\n    {\n      \"id\": \"8vzyjyk22d\",\n      \"aliases\": [],\n      \"name\": \"verifiedsabakan\",\n      \"category\": \"Verification\",\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c7e8fdad-bb56-4f03-b6af-754ba71cc9a8.png\"\n    },\n    {\n      \"id\": \"91lio0zo6h\",\n      \"aliases\": [],\n      \"name\": \"creditcard_face\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-e4f7d69b-f0a7-4916-bdc7-c2a64053e292.png\"\n    },\n    {\n      \"id\": \"90xnlzz5ev\",\n      \"aliases\": [],\n      \"name\": \"eyes_fidgeting\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/3d81894c-da77-490f-87ed-0bf2e8a6c4cb.GIF\"\n    },\n    {\n      \"id\": \"91aqltc1h1\",\n      \"aliases\": [],\n      \"name\": \"iihanashi_move\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/38439d56-2f14-4492-9467-2f75e5ae7807\"\n    },\n    {\n      \"id\": \"8vzyililg8\",\n      \"aliases\": [],\n      \"name\": \"neko_closing_eyes\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-8b031225-fb0a-4a63-b04d-4936a14ee8f0.png\"\n    },\n    {\n      \"id\": \"8vzyildtg6\",\n      \"aliases\": [],\n      \"name\": \"neko_tired\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-c4dbdbf4-097c-4a3c-98cf-409b00711c1d.png\"\n    },\n    {\n      \"id\": \"8xzj82vhs1\",\n      \"aliases\": [],\n      \"name\": \"polarbear\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/a5a9d62a-4bfc-4d9a-8949-3ec9aa151e2b.png\"\n    },\n    {\n      \"id\": \"8xzj8ag133\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"polarbear_slow\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/2342b2b3-712a-478c-b7bb-702f54403b49.png\"\n    },\n    {\n      \"id\": \"91d6gmsuvx\",\n      \"aliases\": [\n        \"\"\n      ],\n      \"name\": \"yabai_logo\",\n      \"category\": null,\n      \"host\": null,\n      \"url\": \"https://s3.arkjp.net/misskey/webpublic-adaab349-6626-4fe2-9de9-d544e26c8cb5.png\"\n    }\n  ],\n  \"defaultLightTheme\": null,\n  \"defaultDarkTheme\": null,\n  \"ads\": [\n    {\n      \"id\": \"8riz9d7mt0\",\n      \"url\": \"http://go.misskey.io/nextdns\",\n      \"place\": \"horizontal\",\n      \"ratio\": 3,\n      \"imageUrl\": \"https://s3.arkjp.net/misskey/03992473-790d-4e50-9f70-f12ed1a5aabb.png\"\n    },\n    {\n      \"id\": \"8rkte84ghf\",\n      \"url\": \"https://go.misskey.io/vultr\",\n      \"place\": \"horizontal\",\n      \"ratio\": 2,\n      \"imageUrl\": \"https://s3.arkjp.net/misskey/fa1421c3-fabc-4dbc-a688-52dfb7491660.webp\"\n    },\n    {\n      \"id\": \"8rktfod5ue\",\n      \"url\": \"https://go.misskey.io/vultr\",\n      \"place\": \"horizontal\",\n      \"ratio\": 3,\n      \"imageUrl\": \"https://s3.arkjp.net/misskey/fa1421c3-fabc-4dbc-a688-52dfb7491660.webp\"\n    }\n  ],\n  \"enableEmail\": true,\n  \"enableTwitterIntegration\": false,\n  \"enableGithubIntegration\": true,\n  \"enableDiscordIntegration\": true,\n  \"enableServiceWorker\": true,\n  \"translatorAvailable\": true,\n  \"pinnedPages\": [\n    \"/announcements\",\n    \"/featured\",\n    \"/channels\",\n    \"/pages\",\n    \"/explore\",\n    \"/clips/8eo7p0vm7x\",\n    \"/games/reversi\",\n    \"/about-misskey\"\n  ],\n  \"pinnedClipId\": null,\n  \"cacheRemoteFiles\": false,\n  \"requireSetup\": false,\n  \"proxyAccountName\": \"ghost\",\n  \"features\": {\n    \"registration\": true,\n    \"localTimeLine\": true,\n    \"globalTimeLine\": true,\n    \"emailRequiredForSignup\": true,\n    \"elasticsearch\": false,\n    \"hcaptcha\": false,\n    \"recaptcha\": true,\n    \"objectStorage\": true,\n    \"twitter\": false,\n    \"github\": true,\n    \"discord\": true,\n    \"serviceWorker\": true,\n    \"miauth\": true\n  }\n}"
  },
  {
    "path": "modules/worker/.gitignore",
    "content": "/build"
  },
  {
    "path": "modules/worker/build.gradle",
    "content": "plugins {\n    id 'com.android.library'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt'\n    id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n    namespace 'net.pantasystem.milktea.worker'\n    compileSdk 35\n\n    defaultConfig {\n        minSdk 21\n        targetSdk 35\n\n        testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\n        consumerProguardFiles \"consumer-rules.pro\"\n    }\n\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\n        }\n    }\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_17\n        targetCompatibility JavaVersion.VERSION_17\n    }\n    kotlinOptions {\n        jvmTarget = '17'\n    }\n    // for junit5\n    testOptions {\n        unitTests.all {\n            useJUnitPlatform()\n        }\n    }\n}\n\ndependencies {\n\n    implementation libs.androidx.core.ktx\n    implementation libs.appcompat.appcompat\n    implementation libs.android.material.material\n    implementation project(path: ':modules:common')\n    implementation project(path: ':modules:model')\n    implementation project(path: ':modules:common_android')\n\n    testImplementation libs.junit\n    androidTestImplementation libs.androidx.test.ext.junit\n    androidTestImplementation libs.androidx.test.espresso.core\n\n    // hilt\n    implementation libs.hilt.android\n    kapt libs.hilt.compiler\n    androidTestImplementation  libs.hilt.android.testing\n    kaptAndroidTest libs.hilt.compiler\n    testImplementation libs.hilt.android.testing\n    kaptTest libs.hilt.compiler\n    implementation libs.activity.ktx\n    implementation libs.androidx.work.ktx\n    implementation libs.hilt.work\n    kapt libs.androidx.hilt.compiler\n\n    implementation libs.coroutines.android\n    implementation libs.lifecycle.livedata\n\n    testImplementation libs.junit.jupiter.api\n    testRuntimeOnly libs.junit.jupiter.engine\n}"
  },
  {
    "path": "modules/worker/consumer-rules.pro",
    "content": ""
  },
  {
    "path": "modules/worker/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguardFiles setting in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile"
  },
  {
    "path": "modules/worker/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_DATA_SYNC\"/>\n    <application >\n        <service\n            android:name=\"androidx.work.impl.foreground.SystemForegroundService\"\n            android:foregroundServiceType=\"dataSync\"\n            tools:node=\"merge\" />\n    </application>\n</manifest>"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/SyncAccountInfoWorker.kt",
    "content": "package net.pantasystem.milktea.worker\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.account.SyncAccountInfoUseCase\nimport java.util.concurrent.TimeUnit\n\n@HiltWorker\nclass SyncAccountInfoWorker @AssistedInject constructor(\n    @Assisted val context: Context,\n    @Assisted val params: WorkerParameters,\n    private val accountRepository: AccountRepository,\n    private val loggerFactory: Logger.Factory,\n    private val syncAccountInfoUseCase: SyncAccountInfoUseCase,\n) : CoroutineWorker(context, params) {\n\n    private val logger by lazy {\n        loggerFactory.create(\"SyncAccountInfoWorker\")\n    }\n\n    companion object {\n        fun createPeriodicWorkRequest(): PeriodicWorkRequest {\n            return PeriodicWorkRequestBuilder<SyncAccountInfoWorker>(90, TimeUnit.DAYS)\n                .build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n        try {\n            val accounts = accountRepository.findAll().getOrThrow()\n            if (accounts.isEmpty()) {\n                return Result.success()\n            }\n\n            val successfulCounts = accounts.map { account ->\n                syncAccountInfoUseCase(account).onFailure {\n                    logger.error(\"failed to sync account info\", it)\n                }.fold(\n                    onSuccess = {\n                        true\n                    },\n                    onFailure = {\n                        false\n                    }\n                )\n            }.count {\n                it\n            }\n            if (successfulCounts <= 0) {\n                return Result.failure()\n            }\n\n        } catch (e: Exception) {\n            return Result.failure()\n        }\n\n        return Result.success()\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/SyncNodeInfoCacheWorker.kt",
    "content": "package net.pantasystem.milktea.worker\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport net.pantasystem.milktea.model.nodeinfo.NodeInfoRepository\nimport java.util.concurrent.TimeUnit\n\n@HiltWorker\nclass SyncNodeInfoCacheWorker @AssistedInject constructor(\n    @Assisted val context: Context,\n    @Assisted val params: WorkerParameters,\n    private val nodeInfoRepository: NodeInfoRepository,\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        fun createPeriodicWorkRequest(): PeriodicWorkRequest {\n            return PeriodicWorkRequestBuilder<SyncNodeInfoCacheWorker>(12, TimeUnit.HOURS)\n                .build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n        return nodeInfoRepository.syncAll().fold(\n            onSuccess = {\n                Result.success()\n            },\n            onFailure = {\n                Result.failure()\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/WorkerIdsModel.kt",
    "content": "package net.pantasystem.milktea.worker\n\nimport androidx.work.WorkInfo\nimport java.util.*\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n/**\n * 作成されたWorkerがアプリ生存中であるかそうでないかを判定するためのModel\n * アプリがKillされればメモリ上からSingletonなオブジェクトの状態も解放されるだろうという考え方。\n */\n@Singleton\nclass WorkerIdsModel @Inject constructor() {\n    private var workerIds: Set<UUID> = emptySet()\n\n    /**\n     * UI上などで処理する必要性があればここにWorkerのIDを入れる\n     */\n    fun add(id: UUID) {\n        synchronized(workerIds) {\n            workerIds = workerIds + id\n        }\n    }\n\n    /**\n     * UI上などで処理する必要性がなくなればこれを呼び出す\n     */\n    fun remove(id: UUID) {\n        synchronized(workerIds) {\n            workerIds = workerIds - id\n        }\n    }\n\n    fun contains(id: UUID): Boolean {\n        return synchronized(workerIds) {\n            workerIds.contains(id)\n        }\n    }\n\n    fun filterActiveWorkInfoList(list: List<WorkInfo>): List<WorkInfo> {\n        return list.filter { info ->\n            workerIds.any { memId ->\n                memId == info.id\n            }\n        }\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/WorkerTags.kt",
    "content": "package net.pantasystem.milktea.worker\n\nenum class WorkerTags {\n    CreateNote,\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/di/module/ExecutorModule.kt",
    "content": "package net.pantasystem.milktea.worker.di.module\n\nimport dagger.Binds\nimport dagger.Module\nimport dagger.hilt.InstallIn\nimport dagger.hilt.components.SingletonComponent\nimport net.pantasystem.milktea.model.instance.SyncMetaExecutor\nimport net.pantasystem.milktea.worker.meta.SyncMetaExecutorImpl\nimport javax.inject.Singleton\n\n@InstallIn(SingletonComponent::class)\n@Module\nabstract class ExecutorBindModule {\n\n    @Binds\n    @Singleton\n    abstract fun bindSyncMetaExecutor(impl: SyncMetaExecutorImpl): SyncMetaExecutor\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/drive/CleanupUnusedCacheWorker.kt",
    "content": "package net.pantasystem.milktea.worker.drive\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.OneTimeWorkRequest\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.drive.FilePropertyDataSource\nimport net.pantasystem.milktea.model.note.NoteDataSource\nimport net.pantasystem.milktea.model.user.UserDataSource\n\n@HiltWorker\nclass CleanupUnusedCacheWorker @AssistedInject constructor(\n    @Assisted context: Context,\n    @Assisted params: WorkerParameters,\n    private val filePropertyDataSource: FilePropertyDataSource,\n    private val noteDataSource: NoteDataSource,\n    private val userDataSource: UserDataSource,\n    private val loggerFactory: Logger.Factory\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        fun createOneTimeRequest(): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<CleanupUnusedCacheWorker>()\n                .build()\n        }\n    }\n    private val logger by lazy {\n        loggerFactory.create(\"CleanupUnusedCacheWorker\")\n    }\n    override suspend fun doWork(): Result {\n        return try {\n            if (noteDataSource.findLocalCount().getOrThrow() > 20000) {\n                noteDataSource.clear().getOrThrow()\n            }\n            filePropertyDataSource.clearUnusedCaches().getOrThrow()\n\n            if (userDataSource.count().getOrThrow() > 10000) {\n                userDataSource.clear(1000).getOrThrow()\n            }\n            Result.success()\n        } catch (e: Exception) {\n            logger.error(\"Failed to cleanup unused cache\", e)\n            Result.failure()\n        }\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/emoji/cache/CacheCustomEmojiImageWorker.kt",
    "content": "package net.pantasystem.milktea.worker.emoji.cache\n\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.content.Context\nimport android.content.pm.ServiceInfo\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport androidx.core.app.NotificationCompat\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.Constraints\nimport androidx.work.CoroutineWorker\nimport androidx.work.ForegroundInfo\nimport androidx.work.NetworkType\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkManager\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport kotlinx.coroutines.delay\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.emoji.CustomEmojiRepository\nimport net.pantasystem.milktea.model.emoji.SaveCustomEmojiImageUseCase\nimport net.pantasystem.milktea.model.image.ImageCacheRepository\nimport net.pantasystem.milktea.worker.R\nimport java.util.concurrent.TimeUnit\nimport kotlin.math.min\n\n@HiltWorker\nclass CacheCustomEmojiImageWorker @AssistedInject constructor(\n    private val accountRepository: AccountRepository,\n    private val customEmojiRepository: CustomEmojiRepository,\n    private val imageCacheRepository: ImageCacheRepository,\n    private val saveCustomEmojiImageUseCase: SaveCustomEmojiImageUseCase,\n    private val loggerFactory: Logger.Factory,\n    @Assisted context: Context,\n    @Assisted params: WorkerParameters,\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        const val NOTIFICATION_CHANNEL_ID = \"CACHE_CUSTOM_EMOJI_IMAGE_WORKER\"\n        const val WORKER_NAME = \"cacheEmojiImages\"\n\n        fun createPeriodicWorkRequest(): PeriodicWorkRequest {\n            val constraints = Constraints.Builder()\n                .setRequiredNetworkType(NetworkType.UNMETERED) // Wi-Fi (or Ethernet etc) required\n                .build()\n\n            return PeriodicWorkRequestBuilder<CacheCustomEmojiImageWorker>(1, TimeUnit.DAYS)\n                .setConstraints(constraints)\n                .build()\n        }\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"CacheCustomEmojiImageWorker\")\n    }\n\n    override suspend fun doWork(): Result {\n        setForeground(createForegroundInfo())\n        try {\n            val hosts = accountRepository.findAll().getOrThrow().map {\n                it.getHost()\n            }.distinct().shuffled()\n            imageCacheRepository.deleteExpiredCaches()\n            coroutineScope {\n                hosts.forEach {\n                    // 全てのインスタンスの絵文字を一括でメモリ上に展開すると、メモリの確保が間に合わずOOMになる可能性があるので、\n                    // インスタンスごとにメモリ上に展開されるように実行している\n                    val emojis = customEmojiRepository.findBy(it).getOrElse { emptyList() }\n\n                    // 絵文字の個数分並列で実行すると、ネットワークに負荷がかかりすぎるのと、メモリの消費量が大きくなりすぎるので、3分割して実行する\n                    val chunkedSize = if (emojis.isEmpty()) 0 else min(emojis.size / 3, emojis.size)\n                    emojis.chunked(chunkedSize).map { chunkedEmojis ->\n                        async {\n                            chunkedEmojis.map { emoji ->\n                                saveCustomEmojiImageUseCase(emoji).onFailure { e ->\n                                    logger.error(\"Failed to cache custom emoji image\", e)\n                                }\n                            }\n                        }\n                    }.awaitAll()\n                    delay(1000)\n                }\n            }\n            return Result.success()\n        } catch (e: Exception) {\n            logger.error(\"Failed to cache custom emoji images\", e)\n            return Result.failure()\n        }\n    }\n\n    private fun createForegroundInfo(): ForegroundInfo {\n        val title = applicationContext.getString(R.string.notification_sync_download_custom_emoji_title)\n\n        // Create a Notification channel if necessary\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            createChannel()\n        }\n\n        val cancelPendingIntent = WorkManager.getInstance(applicationContext)\n            .createCancelPendingIntent(id)\n\n\n        val notification = NotificationCompat.Builder(applicationContext, NOTIFICATION_CHANNEL_ID)\n            .setContentTitle(title)\n            .setTicker(title)\n            .setSmallIcon(android.R.drawable.stat_sys_download)\n            .setOngoing(true)\n            .addAction(android.R.drawable.ic_delete, applicationContext.getString(android.R.string.cancel), cancelPendingIntent)\n            .build()\n\n        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n            ForegroundInfo(7, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC)\n        } else {\n            ForegroundInfo(7, notification)\n        }\n    }\n\n    @RequiresApi(Build.VERSION_CODES.O)\n    private fun createChannel() {\n        val notificationManager =\n            applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n        // Create a Notification channel\n        if (notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) == null) {\n            val channel =\n                NotificationChannel(NOTIFICATION_CHANNEL_ID, \"Custom emoji download notification\", NotificationManager.IMPORTANCE_HIGH)\n            channel.description = \"Notification representing custom emoji download\"\n            notificationManager.createNotificationChannel(channel)\n        }\n    }\n\n\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/filter/SyncMastodonFilterWorker.kt",
    "content": "package net.pantasystem.milktea.worker.filter\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.account.Account\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.filter.MastodonWordFilterRepository\nimport java.util.concurrent.TimeUnit\n\n@HiltWorker\nclass SyncMastodonFilterWorker @AssistedInject constructor(\n    @Assisted private val context: Context,\n    @Assisted private val params: WorkerParameters,\n    private val accountRepository: AccountRepository,\n    private val wordFilterRepository: MastodonWordFilterRepository,\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        fun createPeriodicWorkerRequest(): PeriodicWorkRequest {\n            return PeriodicWorkRequestBuilder<SyncMastodonFilterWorker>(2, TimeUnit.DAYS)\n                .build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n        return accountRepository.findAll().mapCancellableCatching { accounts ->\n            accounts.filter {\n                it.instanceType == Account.InstanceType.MASTODON || it.instanceType == Account.InstanceType.PLEROMA\n            }\n        }.mapCancellableCatching { accounts ->\n            coroutineScope {\n                accounts.map {\n                    async {\n                        wordFilterRepository.sync(it.accountId)\n                    }\n                }.awaitAll()\n            }\n        }.mapCancellableCatching { results ->\n            results.map {\n                it.getOrThrow()\n            }\n        }.fold(\n            onSuccess = {\n                Result.success()\n            },\n            onFailure = {\n                Result.failure()\n            }\n        )\n    }\n\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/meta/SpecifiedSyncMetaWorker.kt",
    "content": "package net.pantasystem.milktea.worker.meta\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.*\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport net.pantasystem.milktea.model.instance.SyncMetaExecutor\nimport javax.inject.Inject\n\n@HiltWorker\nclass SpecifiedSyncMetaWorker  @AssistedInject constructor(\n    @Assisted private val context: Context,\n    @Assisted private val params: WorkerParameters,\n    private val instanceInfoService: InstanceInfoService,\n): CoroutineWorker(context, params) {\n\n    companion object {\n        const val EXTRA_INSTANCE_BASE_URL = \"EXTRA_INSTANCE_BASE_URL\"\n        fun createOneTimeWorkRequest(instanceBaseUrl: String): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<SpecifiedSyncMetaWorker>()\n                .setInputData(\n                    workDataOf(\n                        EXTRA_INSTANCE_BASE_URL to instanceBaseUrl\n                    )\n                )\n                .build()\n        }\n    }\n    override suspend fun doWork(): Result {\n        return instanceInfoService.sync(\n            requireNotNull(params.inputData.getString(EXTRA_INSTANCE_BASE_URL))\n        ).fold(\n            onSuccess = {\n                Result.success()\n            },\n            onFailure = {\n                Result.failure()\n            }\n        )\n    }\n}\n\nclass SyncMetaExecutorImpl @Inject constructor(\n    @ApplicationContext val context: Context\n) : SyncMetaExecutor {\n    override fun invoke(instanceBaseUrl: String) {\n        WorkManager.getInstance(context).enqueue(\n            SpecifiedSyncMetaWorker.createOneTimeWorkRequest(instanceBaseUrl)\n        )\n\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/meta/SyncMetaWorker.kt",
    "content": "package net.pantasystem.milktea.worker.meta\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.instance.InstanceInfoService\nimport java.util.concurrent.TimeUnit\n\n@HiltWorker\nclass SyncMetaWorker @AssistedInject constructor(\n    @Assisted private val context: Context,\n    @Assisted private val params: WorkerParameters,\n    private val instanceInfoService: InstanceInfoService,\n    private val accountRepository: AccountRepository,\n    private val loggerFactory: Logger.Factory,\n): CoroutineWorker(context, params) {\n\n    companion object {\n        fun createPeriodicWorkRequest(): PeriodicWorkRequest {\n            return PeriodicWorkRequestBuilder<SyncMetaWorker>(12, TimeUnit.HOURS)\n                .build()\n        }\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"SyncMetaWorker\")\n    }\n\n    override suspend fun doWork(): Result {\n        return accountRepository.findAll().mapCancellableCatching { accounts ->\n            val domains = accounts.map { it.normalizedInstanceUri }.distinct()\n            coroutineScope {\n                domains.map {\n                    async {\n                        instanceInfoService.sync(it)\n                    }\n                }.awaitAll()\n            }.count { result ->\n                result.onFailure {\n                    logger.error(\"Fetch instance info failed\", it)\n                }.isSuccess\n            } == domains.size\n        }.fold(\n            onSuccess = {\n                if (it) Result.success() else Result.failure()\n            },\n            onFailure = {\n                Result.failure()\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/note/BackgroundSyncTimelineWorker.kt",
    "content": "package net.pantasystem.milktea.worker.note\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.OneTimeWorkRequest\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport net.pantasystem.milktea.model.note.timeline.SyncTimelineFromLatestToCurrentUseCase\nimport java.util.concurrent.TimeUnit\n\n@HiltWorker\nclass BackgroundSyncTimelineWorker @AssistedInject constructor(\n    @Assisted context: Context,\n    @Assisted val params: WorkerParameters,\n    private val syncTimelineUseCase: SyncTimelineFromLatestToCurrentUseCase,\n): CoroutineWorker(context, params) {\n\n    companion object {\n        const val WORKER_NAME = \"BackgroundSyncTimelineWorker\"\n        fun createPeriodicWorkRequest(): PeriodicWorkRequest {\n            return PeriodicWorkRequestBuilder<BackgroundSyncTimelineWorker>(30, TimeUnit.MINUTES)\n                .build()\n        }\n\n        fun createOneTimeWorkRequest(): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<BackgroundSyncTimelineWorker>()\n                .build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n        syncTimelineUseCase().fold(\n            onSuccess = {\n                return Result.success()\n            },\n            onFailure = {\n                return Result.failure()\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/note/CreateNoteWorker.kt",
    "content": "package net.pantasystem.milktea.worker.note\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.OneTimeWorkRequest\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport androidx.work.workDataOf\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport net.pantasystem.milktea.common.APIError\nimport net.pantasystem.milktea.common.ErrorType\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.MisskeyErrorCodes\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.file.FileUploadFailedException\nimport net.pantasystem.milktea.model.note.CreateNoteUseCase\nimport net.pantasystem.milktea.model.note.draft.DraftNoteRepository\nimport net.pantasystem.milktea.model.note.toCreateNote\nimport net.pantasystem.milktea.worker.WorkerTags\nimport java.io.IOException\n\n@HiltWorker\nclass CreateNoteWorker @AssistedInject constructor(\n    @Assisted context: Context,\n    @Assisted val params: WorkerParameters,\n    private val createNoteUseCase: CreateNoteUseCase,\n    private val draftNoteRepository: DraftNoteRepository,\n    private val accountRepository: AccountRepository,\n    loggerFactory: Logger.Factory\n) : CoroutineWorker(context, params) {\n\n    enum class ErrorReasonType {\n        NetworkError,\n        FileUploadDeviceSecurityError,\n        FileUploadDriveNoFreeSpaceError,\n        ServerError,\n        ClientError,\n        UnauthorizedError,\n        IAmAiError,\n        ToManyRequestError,\n        NotFoundError,\n        UnknownError,\n    }\n\n    companion object {\n        const val EXTRA_DRAFT_NOTE_ID = \"DRAFT_NOTE_ID\"\n        const val EXTRA_NOTE_ID = \"NOTE_ID\"\n        const val EXTRA_ACCOUNT_ID = \"ACCOUNT_ID\"\n\n        const val EXTRA_FAILED_STACKTRACE = \"FAILED_STACKTRACE\"\n        const val EXTRA_FAILED_MESSAGE = \"FAILED_MESSAGE\"\n        const val EXTRA_FAILED_CAUSE = \"FAILED_CAUSE\"\n        const val EXTRA_FAILED_THROWABLE_TO_STRING = \"FAILED_THROWABLE_TO_STRING\"\n        const val EXTRA_FAILED_REASON = \"FAILED_REASON\"\n\n        fun createWorker(draftNoteId: Long): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<CreateNoteWorker>()\n                .addTag(WorkerTags.CreateNote.name)\n                .setInputData(\n                    workDataOf(\n                        EXTRA_DRAFT_NOTE_ID to draftNoteId,\n                    )\n                ).build()\n        }\n    }\n\n    val logger = loggerFactory.create(\"CreateNoteWorker\")\n\n    override suspend fun doWork(): Result {\n        val draftNoteId = params.inputData.getLong(EXTRA_DRAFT_NOTE_ID, -1)\n        if (draftNoteId == -1L) {\n            return Result.failure()\n        }\n        return draftNoteRepository.findOne(draftNoteId).mapCancellableCatching {\n            it.toCreateNote(accountRepository.get(it.accountId).getOrThrow())\n        }.mapCancellableCatching {\n            createNoteUseCase.invoke(it).getOrThrow()\n        }.onFailure {\n            logger.error(\"Create Failed\", it)\n        }.fold(\n            onSuccess = {\n                Result.success(workDataOf(\n                    EXTRA_NOTE_ID to it.id.noteId,\n                    EXTRA_ACCOUNT_ID to it.id.accountId,\n                ))\n            },\n            onFailure = {\n                val data = workDataOf(\n                    EXTRA_DRAFT_NOTE_ID to inputData.getLong(EXTRA_DRAFT_NOTE_ID, -1),\n                    EXTRA_FAILED_STACKTRACE to it.stackTraceToString(),\n                    EXTRA_FAILED_MESSAGE to it.message,\n                    EXTRA_FAILED_CAUSE to it.cause?.toString(),\n                    EXTRA_FAILED_THROWABLE_TO_STRING to it.toString(),\n                    EXTRA_FAILED_REASON to convertToErrorReason(it).name,\n                )\n                Result.failure(data)\n            }\n        )\n    }\n\n    private fun convertToErrorReason(type: Throwable): ErrorReasonType {\n        return when(type) {\n            is APIError -> {\n                convertToErrorReasonFromApiError(type)\n            }\n            is SecurityException -> {\n                ErrorReasonType.FileUploadDeviceSecurityError\n            }\n            is FileUploadFailedException -> {\n                type.throwable?.let {\n                    convertToErrorReason(it)\n                } ?: ErrorReasonType.UnknownError\n            }\n            is IOException -> {\n                ErrorReasonType.NetworkError\n            }\n            else -> ErrorReasonType.UnknownError\n        }\n    }\n\n    private fun convertToErrorReasonFromApiError(type: APIError): ErrorReasonType {\n        return when (type) {\n            is APIError.AuthenticationException -> ErrorReasonType.UnauthorizedError\n            is APIError.ClientException -> {\n                when(val errorType = type.error) {\n                    is ErrorType.Misskey -> {\n                        when(errorType.errorCodeeType) {\n                            MisskeyErrorCodes.NoFreeSpace -> ErrorReasonType.FileUploadDriveNoFreeSpaceError\n                            else -> ErrorReasonType.ClientError\n                        }\n                    }\n                    is ErrorType.Raw -> ErrorReasonType.ClientError\n                    null -> ErrorReasonType.ClientError\n                }\n            }\n            is APIError.ForbiddenException -> ErrorReasonType.UnauthorizedError\n            is APIError.IAmAIException -> ErrorReasonType.IAmAiError\n            is APIError.InternalServerException -> ErrorReasonType.ServerError\n            is APIError.NotFoundException -> ErrorReasonType.NotFoundError\n            is APIError.SomethingException -> ErrorReasonType.UnknownError\n            is APIError.ToManyRequestsException -> ErrorReasonType.ToManyRequestError\n        }\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/note/CreateNoteWorkerExecutor.kt",
    "content": "package net.pantasystem.milktea.worker.note\n\nimport android.content.Context\nimport androidx.lifecycle.asFlow\nimport androidx.work.WorkInfo\nimport androidx.work.WorkManager\nimport androidx.work.WorkQuery\nimport dagger.hilt.android.qualifiers.ApplicationContext\nimport kotlinx.coroutines.flow.Flow\nimport kotlinx.coroutines.flow.filterNotNull\nimport kotlinx.coroutines.flow.map\nimport net.pantasystem.milktea.worker.WorkerIdsModel\nimport net.pantasystem.milktea.worker.WorkerTags\nimport java.util.*\nimport javax.inject.Inject\nimport javax.inject.Singleton\n\n@Singleton\nclass CreateNoteWorkerExecutor @Inject constructor(\n    @ApplicationContext private val context: Context,\n    private val workerIdsModel: WorkerIdsModel,\n){\n\n    fun enqueue(draftNoteId: Long) {\n        val request = CreateNoteWorker.createWorker(draftNoteId)\n        workerIdsModel.add(request.id)\n        WorkManager.getInstance(context)\n            .enqueue(request)\n    }\n\n    /**\n     * アプリ存在中に発生したCreateNote関連のWorkInfoのイベントを取得する\n     */\n    fun getCreateNoteWorkInfosInAppActives(): Flow<List<WorkInfo>> {\n        val query =\n            WorkQuery.Builder.fromTags(listOf(WorkerTags.CreateNote.name)).addStates(\n                listOf(\n                    WorkInfo.State.SUCCEEDED,\n                    WorkInfo.State.FAILED,\n                )\n            ).build()\n        return WorkManager.getInstance(context)\n            .getWorkInfosLiveData(query)\n            .asFlow()\n            .filterNotNull().map {\n                workerIdsModel.filterActiveWorkInfoList(it)\n            }\n    }\n\n    fun onHandled(id: UUID) {\n        workerIdsModel.remove(id)\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/note/SyncTimelineWorker.kt",
    "content": "package net.pantasystem.milktea.worker.note\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.OneTimeWorkRequest\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport net.pantasystem.milktea.model.note.timeline.SyncTimelineUseCase\nimport java.util.concurrent.TimeUnit\n\n@HiltWorker\n\nclass SyncTimelineWorker @AssistedInject constructor(\n    @Assisted context: Context,\n    @Assisted val params: WorkerParameters,\n    private val syncTimelineUseCase: SyncTimelineUseCase,\n): CoroutineWorker(context, params) {\n\n    companion object {\n        const val WORKER_NAME = \"SyncTimelineWorker\"\n        fun createPeriodicWorkRequest(): PeriodicWorkRequest {\n            return PeriodicWorkRequestBuilder<SyncTimelineWorker>(1, TimeUnit.MINUTES)\n                .build()\n        }\n\n        fun createOneTimeWorkRequest(): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<SyncTimelineWorker>()\n                .build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n        syncTimelineUseCase().fold(\n            onSuccess = {\n                return Result.success()\n            },\n            onFailure = {\n                return Result.failure()\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/sw/RegisterAllSubscriptionRegistration.kt",
    "content": "package net.pantasystem.milktea.worker.sw\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.OneTimeWorkRequest\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport net.pantasystem.milktea.common.runCancellableCatching\nimport net.pantasystem.milktea.model.sw.register.SubscriptionRegistration\n\n@HiltWorker\nclass RegisterAllSubscriptionRegistration @AssistedInject constructor(\n    @Assisted val context: Context,\n    @Assisted val params: WorkerParameters,\n    private val subscriptionRegistration: SubscriptionRegistration,\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        fun createWorkRequest(): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<RegisterAllSubscriptionRegistration>()\n                .build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n        return runCancellableCatching {\n            subscriptionRegistration.registerAll()\n        }.fold(\n            onSuccess = {\n                Result.success()\n            },\n            onFailure = {\n                Result.failure()\n            }\n        )\n\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/sw/SubscriptionRegistrationWorker.kt",
    "content": "package net.pantasystem.milktea.worker.sw\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.Dispatchers\nimport kotlinx.coroutines.withContext\nimport net.pantasystem.milktea.model.sw.register.SubscriptionRegistration\n\n\n@HiltWorker\nclass SubscriptionRegistrationWorker @AssistedInject constructor(\n    @Assisted context: Context,\n    @Assisted params: WorkerParameters,\n    private val subscriptionRegistration: SubscriptionRegistration,\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        const val TOKEN = \"SubscriptionRegistrationWorker.TOKEN\"\n    }\n\n    override suspend fun doWork(): Result {\n        return try {\n            return withContext(Dispatchers.IO) {\n                subscriptionRegistration.registerAll()\n                Result.success()\n            }\n        } catch (e: Exception) {\n            Result.failure()\n        }\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/user/SyncLoggedInUserInfoWorker.kt",
    "content": "package net.pantasystem.milktea.worker.user\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.PeriodicWorkRequest\nimport androidx.work.PeriodicWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.User\nimport net.pantasystem.milktea.model.user.UserRepository\nimport java.util.concurrent.TimeUnit\n\n@HiltWorker\nclass SyncLoggedInUserInfoWorker @AssistedInject constructor(\n    @Assisted val context: Context,\n    @Assisted val params: WorkerParameters,\n    private val userRepository: UserRepository,\n    private val accountRepository: AccountRepository,\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        fun createPeriodicWorkRequest(): PeriodicWorkRequest {\n            return PeriodicWorkRequestBuilder<SyncLoggedInUserInfoWorker>(12, TimeUnit.HOURS)\n                .build()\n        }\n    }\n\n    override suspend fun doWork(): Result {\n        return accountRepository.findAll().mapCancellableCatching { accounts ->\n            val userIds = accounts.map {\n                User.Id(it.accountId, it.remoteId)\n            }\n            coroutineScope {\n                userIds.map {\n                    async {\n                        userRepository.sync(it).getOrThrow()\n                    }\n                }\n            }.awaitAll()\n        }.fold(\n            onSuccess = {\n                Result.success()\n            },\n            onFailure = {\n                Result.failure()\n            }\n        )\n    }\n}"
  },
  {
    "path": "modules/worker/src/main/java/net/pantasystem/milktea/worker/user/renote/mute/SyncRenoteMutesWorker.kt",
    "content": "package net.pantasystem.milktea.worker.user.renote.mute\n\nimport android.content.Context\nimport androidx.hilt.work.HiltWorker\nimport androidx.work.CoroutineWorker\nimport androidx.work.OneTimeWorkRequest\nimport androidx.work.OneTimeWorkRequestBuilder\nimport androidx.work.WorkerParameters\nimport dagger.assisted.Assisted\nimport dagger.assisted.AssistedInject\nimport kotlinx.coroutines.async\nimport kotlinx.coroutines.awaitAll\nimport kotlinx.coroutines.coroutineScope\nimport net.pantasystem.milktea.common.Logger\nimport net.pantasystem.milktea.common.mapCancellableCatching\nimport net.pantasystem.milktea.model.account.AccountRepository\nimport net.pantasystem.milktea.model.user.renote.mute.RenoteMuteRepository\n\n@HiltWorker\nclass SyncRenoteMutesWorker @AssistedInject constructor(\n    @Assisted private val context: Context,\n    @Assisted private val params: WorkerParameters,\n    private val accountRepository: AccountRepository,\n    private val renoteMuteRepository: RenoteMuteRepository,\n    private val loggerFactory: Logger.Factory,\n) : CoroutineWorker(context, params) {\n\n    companion object {\n        fun createOneTimeWorkRequest(): OneTimeWorkRequest {\n            return OneTimeWorkRequestBuilder<SyncRenoteMutesWorker>()\n                .build()\n        }\n    }\n\n    private val logger by lazy {\n        loggerFactory.create(\"SyncRenoteMutesWorker\")\n    }\n\n    override suspend fun doWork(): Result {\n        return accountRepository.findAll().mapCancellableCatching { accounts ->\n            coroutineScope {\n                accounts.map {\n                    async {\n                        renoteMuteRepository.syncBy(it.accountId)\n                    }\n                }\n            }.awaitAll()\n        }.mapCancellableCatching { list ->\n            list.map { result ->\n                result.onFailure {\n                    logger.error(\"RenoteMuteの同期に失敗\", it)\n                }.getOrThrow()\n            }\n        }.fold(\n            onSuccess = {\n                Result.success()\n            },\n            onFailure = {\n                Result.failure()\n            }\n        )\n    }\n\n}"
  },
  {
    "path": "privacy_policy_ch.md",
    "content": "# 隐私政策。\n由pantasystem（以下简称 \"开发者\"）运营和开发的分布式微博SNS Misskey的第三方应用程序 \"Milktea\"（以下简称 \"服务\"）的隐私政策如下所示 以下是由pantasystem（以下简称 \"开发者\"）运营和开发的分布式微博SNS Misskey的第三方应用程序 \"Milktea\"（以下简称 \"本服务\"）中关于隐私信息处理的隐私政策（以下简称 \"隐私政策\"）。 以下隐私政策（\"政策\"）载于网站（\"网站\"）。\n\n## 第1条（隐私信息）\n隐私信息部分的 \"个人信息 \"是指《个人数据保护法》中定义的 \"个人信息\"。\n与在世的个人有关的信息，可以通过信息中的出生日期或其他描述来识别。\n1. 在隐私信息中，\"历史信息 \"是指可以识别特定个人的信息。\n2. 隐私信息中的'历史和特征信息'是指除上述定义的'个人信息'以外的信息，如用户浏览的网页和搜索的关键词、使用日期和时间、使用方法、使用的终端、年龄、位置信息和终端的个人识别信息。\n\n## 第2条（收集个人数据的方法）。\n1. 本服务收集用户的历史和特征信息，如用户使用的服务、浏览的网页和操作的按钮，当用户使用本服务时。 如果用户同意，还将使用谷歌分析，这是谷歌提供的访问分析工具。 2.\n2. 如果用户同意，本服务使用谷歌的日志工具 \"Firebase Crasylitics \"来收集错误日志、崩溃日志等。\n## 第3条（收集和使用个人信息的目的）。\n本服务收集和使用个人信息的目的如下： 1.\n\n1. 用于提供和运营服务\n2. 对用户的询问作出回应\n3. 在必要时与用户联系，以进行维护、重要通知等。\n4. 为发展和改进服务进行分析\n5. 与上述使用目的相关的目的。\n\n\n## 第4条（向第三方提供个人信息）。\n1. 未经用户事先同意，开发者不会向第三方提供个人信息，但以下情况除外。 但是，这不包括《个人数据保护法》和其他法律和法规允许的情况。\n    1. 为保护一个人的生命、身体或财产而有必要，并且难以获得用户的同意时\n    2. 当需要与国家机关、地方当局或受其委托的个人或实体合作执行法律规定的事务，而获得有关人员的同意可能会妨碍有关事务的执行。\n    3. 当以下事项已经提前通知或公布，并且开发商已经通知个人数据保护委员会时\n        1. 使用的目的包括向第三方提供数据\n        2. 将提供给第三方的数据项目\n        3. 向第三方提供的手段或方法\n        4. 应当事人的要求，停止向第三方提供个人数据\n        5. 接受当事人请求的方法\n2. 尽管有前款的规定，在下列情况下，接受信息的一方不应视为第三方。\n    1. 在实现使用目的所需的范围内，开发商将个人信息的全部或部分处理工作外包出去。\n    2. 由于合并或其他原因导致的业务继承而提供的个人信息\n    3. 如果个人信息要与特定的人共同使用，而且这一事实、共同使用的个人信息项目、共同使用者的范围、使用者的使用目的以及负责管理有关个人信息的人的姓名都事先通知了该人，或者让该人很容易就能得到。 个人信息，其使用目的以及负责管理个人信息的人的姓名或职务。\n## 第5条（个人信息的披露）\n原则上，历史和特征信息等非个人信息不应披露。\n\n### 第6条（隐私政策的变更） \n\n1. 本政策的内容可以在不通知用户的情况下进行修改。\n2. 除非本服务另有规定，修订后的隐私政策应自其在网站上公布时起生效。修订后的隐私政策应自其在网站上公布时起生效，除非该服务另有规定。\n\n以上。"
  },
  {
    "path": "privacy_policy_en.md",
    "content": "# Privacy Policy\nThe following is the privacy policy of the third party application \"Milktea\" (hereinafter referred to as the \"Service\") of Misskey, a distributed microblogging SNS operated and developed by pantasystem, Inc. (hereinafter referred to as the \"Developer\"), a third party application of the distributed microblogging SNS Misskey (hereinafter referred to as the \"Service\") operated and developed by Pantasystem (hereinafter referred to as the \"Developer\"), has established the following privacy policy (hereinafter referred to as the \"Policy\") for the handling of privacy information on its website (hereinafter referred to as the \"Website\"). (hereinafter referred to as the \"Service\").\n\n## Article 1 (Privacy Information)\n1. The term \"personal information\" as used in the Privacy Policy shall mean \"personal information\" as defined in the Personal Information Protection Law.\nPersonal information\" refers to information about a living individual that can be used to identify a specific individual by birth date, other descriptions, etc., contained in the said information.\nPersonal information\" in privacy information refers to \"personal information\" as defined in the Personal Information Protection Law. \n2. \"Historical and characteristic information\" in privacy information refers to information other than \"personal information\" as defined above, such as pages viewed and keywords searched, date and time of use, method of use, terminal used, age, location information, and individual identification information of the terminal.\n\n## Article 2 (Method of Collecting Personal Information)\n1. The Service collects historical and characteristic information about users, such as services used, pages viewed, and buttons operated, when users use the Service. In addition, Google Analytics, an access analysis tool by Google, will be used if the user agrees.\n2. If the user agrees, this service uses the logging tool \"Firebase Crasylitics\" by Google to collect error logs and crash logs.\n## Article 3 (Purpose of collecting and using personal information)\nThe purposes for which the Service collects and uses personal information are as follows.\n\n1. To provide and operate services\n2. To respond to inquiries from users\n3. To contact you as necessary for maintenance, important notices, etc.\n4. Analysis for development and improvement of services\n5. Purposes incidental to the above purposes of use\n\n\n## Article 4 (Provision of Personal Information to Third Parties)\n1. The Developer will not provide personal information to any third party without the prior consent of the User, except in the following cases. However, this excludes cases permitted under the Personal Information Protection Law and other laws and regulations.\n    1. When it is necessary for the protection of the life, body, or property of an individual and it is difficult to obtain the consent of the individual\n    2. When it is necessary to cooperate with a national agency, a local government, or an individual or entity entrusted by either a national agency or local government to execute affairs prescribed by law, and obtaining the consent of the individual is likely to impede the execution of such affairs.\n    3. When the following items are notified or announced in advance and the developer notifies the Personal Information Protection Committee\n        1. The purpose of use must include provision to a third party\n        2. Data items provided to third parties\n        3. Means or method of provision to third parties\n        4. Stopping the provision of personal information to third parties at the request of the individual\n        5. How to accept the person's request\n2. Notwithstanding the preceding paragraph, in the following cases, the recipient of such information shall not fall under the category of a third party.\n    1. When the Developer outsources all or part of the handling of personal information within the scope necessary to achieve the purpose of use\n    2. Cases in which personal information is provided as a result of the succession of business due to merger or other reasons\n    3. In cases where personal information is used jointly with a specific person, and where this fact, the items of personal information jointly used, the scope of joint use, the purpose of use by the person using the information, and the name of the person responsible for managing the personal information are notified to the person in advance or made readily available to the person in question.\n\n## Article 5 (Disclosure of Personal Information)\nIn principle, the Company will not disclose any information other than personal information, such as historical information and characteristic information.\n\n### Article 6 (Modification of Privacy Policy)\n\n1. The contents of this policy may be changed without notice to the user.\n2. Unless otherwise specified by the Service, the revised Privacy Policy\nThe revised privacy policy shall take effect from the time it is posted on this website.\n\n\nAbove"
  },
  {
    "path": "privacy_policy_ja.md",
    "content": "# プライバシーポリシー\npantasystem（以下，「開発者」といいます。）の運営・開発する分散型マイクロブログSNS Misskeyのサードパーティアプリ「Milktea」(以下「本サービス」といいます)おけるプライバシー情報の取り扱いについて以下の通りプライバシーポリシー(以下「本ポリシー」)をWebサイト(以下「本ウェブサイト」)に定めます。\n\n## 第一条(プライバシー情報)\n1. プライバシー情報のうち「個人情報」とは、個人情報保護法にいう「個人情報」を指すものとし\n生存する個人に関する情報であって,当該情報に含まれる生年月日やその他の記述等により\n特定の個人を識別できる情報を指します。\n2. プライバシー情報のうち「履歴情報及び特性情報」とは,上記に定める「個人情報」以外のものをいい,ユーザーが閲覧したページや検索したキーワード,利用日時,利用方法,利用端末,年齢,位置情報,端末の個体識別情報などを指します。\n\n## 第2条（個人情報の収集方法）\n1. 本サービスは,ユーザーについて,利用したサービスや,閲覧したページや操作したボタンなどの履歴情報及び特性情報をユーザーが本サービスを利用した場合に収集します。また、ユーザーが同意した場合はGoogleによるアクセス解析ツール「Googleアナリティクス」を利用します。\n2. 本サービスは,ユーザーが同意した場合はGoogleによるロギングツール「Firebase Crasylitics」を利用し,エラーログや,クラッシュしたログなどを収集します。\n## 第3条（個人情報を収集・利用する目的）\n本サービスが個人情報を収集・利用する目的は，以下のとおりです。\n\n1. サービスの提供・運営のため\n2. ユーザーからのお問い合わせに回答するため\n3. メンテナンス、重要なお知らせなど必要に応じたご連絡のため\n4. サービスの開発・改善のための分析\n5. 上記利用目的に付随する目的\n\n\n\n## 第4条（個人情報の第三者提供）\n1. 開発者は，次に掲げる場合を除いて，あらかじめユーザーの同意を得ることなく，第三者に個人情報を提供することはありません。ただし，個人情報保護法その他の法令で認められる場合を除きます。\n    1. 人の生命，身体または財産の保護のために必要がある場合であって，本人の同意を得ることが困難であるとき\n    2. 国の機関もしくは地方公共団体またはその委託を受けた者が法令の定める事務を遂行することに対して協力する必要がある場合であって，本人の同意を得ることにより当該事務の遂行に支障を及ぼすおそれがあるとき\n    3. 予め次の事項を告知あるいは公表し，かつ開発者が個人情報保護委員会に届出をしたとき\n        1. 利用目的に第三者への提供を含むこと\n        2. 第三者に提供されるデータの項目\n        3. 第三者への提供の手段または方法\n        4. 本人の求めに応じて個人情報の第三者への提供を停止すること\n        5. 本人の求めを受け付ける方法\n    2. 前項の定めにかかわらず，次に掲げる場合には，当該情報の提供先は第三者に該当しないものとします。\n        1. 開発者が利用目的の達成に必要な範囲内において個人情報の取扱いの全部または一部を委託する場合\n        2. 合併その他の事由による事業の承継に伴って個人情報が提供される場合\n        3. 個人情報を特定の者との間で共同して利用する場合であって，その旨並びに共同して利用される個人情報の項目，共同して利用する者の範囲，利用する者の利用目的および当該個人情報の管理について責任を有する者の氏名または名称について，あらかじめ本人に通知し，または本人が容易に知り得る状態に置いた場合\n## 第5条(個人情報の開示)\n1. 履歴情報および特性情報などの個人情報以外の情報については原則として開示いたしません。\n\n### 第6条 (プライバシーポリシーの変更)\n\n1. 本ポリシーの内容は、ユーザーに通知することなく、変更することができるものとします。\n2. 本サービスが別途定める場合を除いて、変更後のプライバシーポリシーは\n本ウェブサイトに掲載したときから効力を生じるものとします。\n\n以上"
  },
  {
    "path": "pull_request_template.md",
    "content": "## やったこと\n\n\n## 動作確認\n\n\n## スクリーンショット(任意)\n\n\n## 備考\n\n\n## Issue番号\n\n\n\n"
  },
  {
    "path": "push-to-fcm/.air.toml",
    "content": "# Config file for [Air](https://github.com/cosmtrek/air) in TOML format\n\n# Working directory\n# . or absolute path, please note that the directories following must be under root.\nroot = \".\"\ntmp_dir = \"tmp\"\n\n[build]\n# Just plain old shell command. You could use `make` as well.\ncmd = \"go build -o ./tmp/main .\"\n# Binary file yields from `cmd`.\nbin = \"tmp/main\"\n# Customize binary, can setup environment variables when run your app.\nfull_bin = \"APP_ENV=dev APP_USER=air ./tmp/main\"\n# Watch these filename extensions.\ninclude_ext = [\"go\", \"tpl\", \"tmpl\", \"html\"]\n# Ignore these filename extensions or directories.\nexclude_dir = [\"assets\", \"tmp\", \"vendor\", \"client/node_modules\", \"client.old\"]\n# Watch these directories if you specified.\ninclude_dir = []\n# Exclude files.\nexclude_file = []\n# Exclude specific regular expressions.\nexclude_regex = [\"_test.go\"]\n# Exclude unchanged files.\nexclude_unchanged = true\n# Follow symlink for directories\nfollow_symlink = true\n# This log file places in your tmp_dir.\nlog = \"air.log\"\n# It's not necessary to trigger build each time file changes if it's too frequent.\ndelay = 1000 # ms\n# Stop running old binary when build errors occur.\nstop_on_error = true\n# Send Interrupt signal before killing process (windows does not support this feature)\nsend_interrupt = false\n# Delay after sending Interrupt signal\nkill_delay = 500 # ms\n\n[log]\n# Show log time\ntime = false\n\n[color]\n# Customize each part's color. If no color found, use the raw app log.\nmain = \"magenta\"\nwatcher = \"cyan\"\nbuild = \"yellow\"\nrunner = \"green\"\n\n[misc]\n# Delete tmp directory on exit\nclean_on_exit = true"
  },
  {
    "path": "push-to-fcm/.gitignore",
    "content": "# Created by https://www.toptal.com/developers/gitignore/api/go,visualstudiocode\n# Edit at https://www.toptal.com/developers/gitignore?templates=go,visualstudiocode\n\n### Go ###\n# If you prefer the allow list template instead of the deny list, see community template:\n# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore\n#\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\n# vendor/\n\n# Go workspace file\ngo.work\n\n### VisualStudioCode ###\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n!.vscode/*.code-snippets\n\n# Local History for Visual Studio Code\n.history/\n\n# Built Visual Studio Code Extensions\n*.vsix\n\n### VisualStudioCode Patch ###\n# Ignore all local history of files\n.history\n.ionide\n\n# End of https://www.toptal.com/developers/gitignore/api/go,visualstudiocode\n\n.env\n\ntmp/"
  },
  {
    "path": "push-to-fcm/Dockerfile",
    "content": "FROM golang:1.20.2-alpine3.17\n\nENV GOPATH /go\nENV GO111MODULE on\n\nRUN apk update && \\\n    apk --no-cache add git\n\nRUN mkdir /go/src/app\nWORKDIR /go/src/app\n\nADD . /go/src/app\n\nRUN go mod tidy && \\\n    go install github.com/cosmtrek/air@v1.27.3\n\nCMD [\"air\", \"-c\", \".air.toml\"]"
  },
  {
    "path": "push-to-fcm/docker-compose.yml",
    "content": "version: \"3\"\nservices:\n  api:\n    build:  .\n    tty: true\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - \"./:/go/src/app\"\n  db:\n    container_name: \"db\"\n    image: postgres:latest\n    restart: always\n    environment:\n      POSTGRES_PASSWORD: secret\n      POSTGRES_USER: dbuser\n      POSTGRES_DB: database\n    ports:\n      - \"5432:5432\""
  },
  {
    "path": "push-to-fcm/go.mod",
    "content": "module systems.panta.milktea/push-to-fcm\n\ngo 1.20\n\nrequire (\n\tgithub.com/aead/ecdh v0.2.0\n\tgithub.com/gin-gonic/gin v1.9.1\n\tgithub.com/google/uuid v1.3.0\n\tgithub.com/joho/godotenv v1.5.1\n\tgithub.com/stretchr/testify v1.8.3\n\tgorm.io/driver/postgres v1.5.0\n\tgorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11\n)\n\nrequire (\n\tgithub.com/bytedance/sonic v1.9.1 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.2 // indirect\n\tgithub.com/gin-contrib/sse v0.1.0 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.14.0 // indirect\n\tgithub.com/goccy/go-json v0.10.2 // indirect\n\tgithub.com/jackc/pgpassfile v1.0.0 // indirect\n\tgithub.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect\n\tgithub.com/jackc/pgx/v5 v5.3.1 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/leodido/go-urn v1.2.4 // indirect\n\tgithub.com/mattn/go-isatty v0.0.19 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.0.8 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.2.11 // indirect\n\tgolang.org/x/arch v0.3.0 // indirect\n\tgolang.org/x/crypto v0.9.0 // indirect\n\tgolang.org/x/net v0.10.0 // indirect\n\tgolang.org/x/sys v0.8.0 // indirect\n\tgolang.org/x/text v0.9.0 // indirect\n\tgoogle.golang.org/protobuf v1.30.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "push-to-fcm/go.sum",
    "content": "github.com/aead/ecdh v0.2.0 h1:pYop54xVaq/CEREFEcukHRZfTdjiWvYIsZDXXrBapQQ=\ngithub.com/aead/ecdh v0.2.0/go.mod h1:a9HHtXuSo8J1Js1MwLQx2mBhkXMT6YwUmVVEY4tTB8U=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=\ngithub.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=\ngithub.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=\ngithub.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=\ngithub.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=\ngithub.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=\ngithub.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=\ngithub.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=\ngithub.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=\ngithub.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\ngithub.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=\ngithub.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=\ngithub.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=\ngithub.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8=\ngithub.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU=\ngithub.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8=\ngithub.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=\ngithub.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=\ngithub.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=\ngithub.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=\ngithub.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=\ngithub.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=\ngithub.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=\ngithub.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=\ngithub.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=\ngithub.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=\ngithub.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=\ngithub.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=\ngithub.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=\ngithub.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=\ngolang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=\ngolang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=\ngolang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=\ngolang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=\ngolang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=\ngolang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=\ngolang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=\ngolang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=\ngoogle.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=\ngopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U=\ngorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A=\ngorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11 h1:9qNbmu21nNThCNnF5i2R3kw2aL27U8ZwbzccNjOmW0g=\ngorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "push-to-fcm/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/joho/godotenv\"\n\t\"gorm.io/driver/postgres\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/config\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/handler\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/root/impl\"\n)\n\nfunc main() {\n\tfmt.Println(\"Hello, World!\")\n\terr := godotenv.Load(\".env\")\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tconfig := &config.Config{}\n\tconfig.LoadFromEnv()\n\n\tdb, err := gorm.Open(postgres.Open(config.Dsn), &gorm.Config{})\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tdb.AutoMigrate(\n\t\t&entity.ClientAccount{},\n\t\t&entity.PushSubscription{},\n\t)\n\n\trootModule := impl.NewModule(db, config)\n\taccountHandler := handler.ClientAccountHandler{\n\t\tServiceModule:    rootModule.GetServiceModule(),\n\t\tRepositoryModule: rootModule.GetRepositoryModule(),\n\t}\n\tsubscriptionHandler := handler.SubscriptionHandler{\n\t\tServiceModule:    rootModule.GetServiceModule(),\n\t\tRepositoryModule: rootModule.GetRepositoryModule(),\n\t}\n\tr := gin.Default()\n\taccountHandler.RegisterHandlers(r)\n\tsubscriptionHandler.RegisterHandlers(r)\n\n\tr.Run(fmt.Sprintf(\":%d\", config.Port))\n\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/mastodon/account.go",
    "content": "package mastodon\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n)\n\ntype AccountClient struct {\n\tBaseUrl string\n\tToken   string\n}\n\nfunc (r *AccountClient) VerifyCredentials(ctx context.Context) (*Account, error) {\n\treqURL := fmt.Sprintf(\"%s/api/v1/accounts/verify_credentials\", r.BaseUrl)\n\treq, err := http.NewRequest(\"GET\", reqURL, nil)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Set(\"Authorization\", \"Bearer \"+r.Token)\n\n\t// Send HTTP request\n\tclient := http.DefaultClient\n\tresp, err := client.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\t// Decode JSON response\n\tvar account Account\n\tif err := json.NewDecoder(resp.Body).Decode(&account); err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &account, nil\n}\n\ntype Account struct {\n\tID             string         `json:\"id\"`\n\tAcct           string         `json:\"acct\"`\n\tDisplayName    string         `json:\"display_name\"`\n\tLocked         bool           `json:\"locked\"`\n\tBot            bool           `json:\"bot\"`\n\tCreatedAt      time.Time      `json:\"created_at\"`\n\tNote           string         `json:\"note\"`\n\tURL            string         `json:\"url\"`\n\tAvatar         string         `json:\"avatar\"`\n\tAvatarStatic   string         `json:\"avatar_static\"`\n\tHeader         string         `json:\"header\"`\n\tHeaderStatic   string         `json:\"header_static\"`\n\tEmojis         []TootEmojiDTO `json:\"emojis\"`\n\tFollowersCount int64          `json:\"followers_count\"`\n\tFollowingCount int64          `json:\"following_count\"`\n\tStatusesCount  int64          `json:\"statuses_count\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/mastodon/emoji.go",
    "content": "package mastodon\n\ntype TootEmojiDTO struct {\n\tShortCode string `json:\"shortcode\"`\n\tURL       string `json:\"url\"`\n\tStaticURL string `json:\"static_url\"`\n\tCategory  string `json:\"category\"`\n\tVisibleIn bool   `json:\"visible_in_picker\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/mastodon/notification.go",
    "content": "package mastodon\n\nimport (\n\t\"time\"\n)\n\ntype MstNotificationDTO struct {\n\tID            string           `json:\"id\"`\n\tType          NotificationType `json:\"type\"`\n\tCreatedAt     time.Time        `json:\"created_at\"`\n\tAccount       Account          `json:\"account\"`\n\tStatus        *TootStatusDTO   `json:\"status,omitempty\"`\n\tReport        *MstReportDTO    `json:\"report,omitempty\"`\n\tEmojiReaction *EmojiReaction   `json:\"emoji_reaction,omitempty\"`\n}\n\ntype NotificationType string\n\nconst (\n\tMention         NotificationType = \"mention\"\n\tStatus          NotificationType = \"status\"\n\tReblog          NotificationType = \"reblog\"\n\tFollow          NotificationType = \"follow\"\n\tFollowRequest   NotificationType = \"follow_request\"\n\tFavourite       NotificationType = \"favourite\"\n\tPoll            NotificationType = \"poll\"\n\tUpdate          NotificationType = \"update\"\n\tAdminSignUp     NotificationType = \"admin.sign_up\"\n\tAdminReport     NotificationType = \"admin.report\"\n\tEmojiReactionNT NotificationType = \"emoji_reaction\"\n)\n\ntype EmojiReaction struct {\n\tName      string  `json:\"name\"`\n\tCount     int     `json:\"count\"`\n\tMe        *bool   `json:\"me,omitempty\"`\n\tURL       *string `json:\"url,omitempty\"`\n\tDomain    *string `json:\"domain,omitempty\"`\n\tStaticURL *string `json:\"static_url,omitempty\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/mastodon/notification_subscription.go",
    "content": "package mastodon\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"net/http\"\n)\n\ntype NotificationSubscriptionClient struct {\n\tBaseUrl string\n\tToken   string\n}\n\nfunc (r *NotificationSubscriptionClient) Subscribe(ctx context.Context, req PushSubscriptionRequest) (*PushSubscription, error) {\n\trj, err := json.Marshal(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc := &http.Client{}\n\trequest, err := http.NewRequest(\"POST\", r.BaseUrl+\"/api/v1/push/subscription\", bytes.NewReader(rj))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\trequest.Header.Add(\"Content-Type\", \"application/json\")\n\tif r.Token != \"\" {\n\t\trequest.Header.Add(\"Authorization\", \"Bearer \"+r.Token)\n\t}\n\n\tres, err := c.Do(request)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer res.Body.Close()\n\n\tif res.StatusCode >= 400 {\n\t\treturn nil, errors.New(res.Status)\n\t}\n\n\tbody, err := io.ReadAll(res.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar ps PushSubscription\n\n\terr = json.Unmarshal(body, &ps)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &ps, nil\n}\n\ntype PushSubscription struct {\n\tID        int64  `json:\"id\"`\n\tEndpoint  string `json:\"endpoint\"`\n\tServerKey string `json:\"server_key\"`\n\tAlerts    struct {\n\t\tMention       bool `json:\"mention,omitempty\"`\n\t\tStatus        bool `json:\"status,omitempty\"`\n\t\tReblog        bool `json:\"reblog,omitempty\"`\n\t\tFollow        bool `json:\"follow,omitempty\"`\n\t\tFollowRequest bool `json:\"follow_request,omitempty\"`\n\t\tFavourite     bool `json:\"favourite,omitempty\"`\n\t\tPoll          bool `json:\"poll,omitempty\"`\n\t\tUpdate        bool `json:\"update,omitempty\"`\n\t\tAdminSignUp   bool `json:\"admin.sign_up,omitempty\"`\n\t\tAdminReport   bool `json:\"admin.report,omitempty\"`\n\t} `json:\"alerts,omitempty\"`\n}\n\ntype PushSubscriptionRequest struct {\n\tSubscrption Subscrption `json:\"subscription,omitempty\"`\n\tData        Data        `json:\"data,omitempty\"`\n}\n\ntype Subscrption struct {\n\tEndpoint string `json:\"endpoint\"`\n\tKeys     Keys   `json:\"keys\"`\n}\n\ntype Keys struct {\n\tP256dh string `json:\"p256dh\"`\n\tAuth   string `json:\"auth\"`\n}\n\ntype Data struct {\n\tAlerts *Alerts `json:\"alerts,omitempty\"`\n\tPolicy string  `json:\"policy,omitempty\"`\n}\n\ntype Alerts struct {\n\tMention       bool `json:\"mention,omitempty\"`\n\tStatus        bool `json:\"status,omitempty\"`\n\tReblog        bool `json:\"reblog,omitempty\"`\n\tFollow        bool `json:\"follow,omitempty\"`\n\tFollowRequest bool `json:\"follow_request,omitempty\"`\n\tFavourite     bool `json:\"favourite,omitempty\"`\n\tPoll          bool `json:\"poll,omitempty\"`\n\tUpdate        bool `json:\"update,omitempty\"`\n\tAdminSignUp   bool `json:\"admin.sign_up,omitempty\"`\n\tAdminReport   bool `json:\"admin.report,omitempty\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/mastodon/report.go",
    "content": "package mastodon\n\nimport \"time\"\n\ntype MstReportDTO struct {\n\tID            string     `json:\"id\"`\n\tActionTaken   *bool      `json:\"action_taken,omitempty\"`\n\tActionTakenAt *time.Time `json:\"action_taken_at,omitempty\"`\n\tCategory      *string    `json:\"category,omitempty\"`\n\tComment       *string    `json:\"comment,omitempty\"`\n\tForwarded     *bool      `json:\"forwarded,omitempty\"`\n\tCreatedAt     *time.Time `json:\"created_at,omitempty\"`\n\tStatusIDs     []string   `json:\"status_ids,omitempty\"`\n\tRuleIDs       []string   `json:\"rule_ids,omitempty\"`\n\tTargetAccount *Account   `json:\"target_account,omitempty\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/mastodon/status.go",
    "content": "package mastodon\n\nimport \"time\"\n\ntype TootStatusDTO struct {\n\tID               string                `json:\"id\"`\n\tURI              string                `json:\"uri\"`\n\tCreatedAt        time.Time             `json:\"created_at\"`\n\tAccount          Account               `json:\"account\"`\n\tContent          *string               `json:\"content,omitempty\"`\n\tSensitive        bool                  `json:\"sensitive\"`\n\tSpoilerText      string                `json:\"spoiler_text\"`\n\tMediaAttachments []TootMediaAttachment `json:\"media_attachments\"`\n\tEmojis           []TootEmojiDTO        `json:\"emojis\"`\n\tReblogsCount     int                   `json:\"reblogs_count\"`\n\tFavouritesCount  *int                  `json:\"favourites_count,omitempty\"`\n\tRepliesCount     int                   `json:\"replies_count\"`\n\tURL              *string               `json:\"url,omitempty\"`\n\tInReplyToID      *string               `json:\"in_reply_to_id,omitempty\"`\n\tInReplyAccountID *string               `json:\"in_reply_account_id,omitempty\"`\n\tReblog           *TootStatusDTO        `json:\"reblog,omitempty\"`\n\tPoll             *TootPollDTO          `json:\"poll,omitempty\"`\n\tLanguage         *string               `json:\"language,omitempty\"`\n\tText             *string               `json:\"text,omitempty\"`\n\tEditedAt         *time.Time            `json:\"edited_at,omitempty\"`\n\tFavourited       *bool                 `json:\"favourited,omitempty\"`\n\tReblogged        *bool                 `json:\"reblogged,omitempty\"`\n\tMuted            *bool                 `json:\"muted,omitempty\"`\n\tBookmarked       *bool                 `json:\"bookmarked,omitempty\"`\n\tPinned           *bool                 `json:\"pinned,omitempty\"`\n\tEmojiReactions   []EmojiReactionCount  `json:\"emoji_reactions,omitempty\"`\n\tQuote            *TootStatusDTO        `json:\"quote,omitempty\"`\n\tCircleID         *string               `json:\"circle_id,omitempty\"`\n\tVisibilityEx     *string               `json:\"visibility_ex,omitempty\"`\n}\n\ntype EmojiReactionCount struct {\n\tName       string   `json:\"name\"`\n\tCount      int      `json:\"count\"`\n\tAccountIds []string `json:\"account_ids\"`\n\tMe         *bool    `json:\"me,omitempty\"`\n\tURL        *string  `json:\"url,omitempty\"`\n\tDomain     *string  `json:\"domain,omitempty\"`\n\tStaticURL  *string  `json:\"static_url,omitempty\"`\n}\n\ntype TootPollDTO struct {\n\tID          string    `json:\"id\"`\n\tExpiresAt   time.Time `json:\"expires_at,omitempty\"`\n\tExpired     bool      `json:\"expired,omitempty\"`\n\tMultiple    bool      `json:\"multiple,omitempty\"`\n\tVotesCount  int       `json:\"votes_count,omitempty\"`\n\tVotersCount int       `json:\"voters_count,omitempty\"`\n\tOptions     []Option  `json:\"options\"`\n\tEmojis      []struct {\n\t\tShortCode string `json:\"shortcode\"`\n\t\tURL       string `json:\"url\"`\n\t\tStaticURL string `json:\"static_url\"`\n\t} `json:\"emojis\"`\n\tVoted    bool  `json:\"voted,omitempty\"`\n\tOwnVotes []int `json:\"own_votes,omitempty\"`\n}\n\ntype Option struct {\n\tTitle      string `json:\"title\"`\n\tVotesCount int    `json:\"votes_count,omitempty\"`\n}\n\ntype TootMediaAttachment struct {\n\tID          string `json:\"id\"`\n\tType        string `json:\"type\"`\n\tURL         string `json:\"url,omitempty\"`\n\tPreviewURL  string `json:\"preview_url,omitempty\"`\n\tRemoteURL   string `json:\"remote_url,omitempty\"`\n\tDescription string `json:\"description,omitempty\"`\n\tBlurhash    string `json:\"blurhash,omitempty\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/misskey/account.go",
    "content": "package misskey\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n)\n\ntype AccountClient struct {\n\tBaseUrl string\n\tToken   string\n}\n\nfunc (r *AccountClient) FindSelf(ctx context.Context) (*Account, error) {\n\n\trb := FindSelfRequest{\n\t\tI: r.Token,\n\t}\n\treqJson, err := json.Marshal(rb)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc := &http.Client{}\n\treq, err := http.NewRequest(\"POST\", r.BaseUrl+\"/api/i\", strings.NewReader(string(reqJson)))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treq.Header.Add(\"Content-Type\", \"application/json\")\n\n\tres, err := c.Do(req)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer res.Body.Close()\n\n\tbody, err := io.ReadAll(res.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tvar ac Account\n\t// bodyをAccountに変換\n\terr = json.Unmarshal(body, &ac)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &ac, nil\n}\n\ntype Account struct {\n\tID       string  `json:\"id\"`\n\tUserName string  `json:\"username\"`\n\tName     *string `json:\"name\"`\n}\n\ntype FindSelfRequest struct {\n\tI string `json:\"i\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/misskey/account_test.go",
    "content": "package misskey\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestFindSelf(t *testing.T) {\n\t// Create test server\n\thandler := func(w http.ResponseWriter, r *http.Request) {\n\t\tassert.Equal(t, \"POST\", r.Method)\n\t\tassert.Equal(t, \"/api/i\", r.URL.Path)\n\n\t\t// Check request body\n\t\tdecoder := json.NewDecoder(r.Body)\n\t\tvar req FindSelfRequest\n\t\terr := decoder.Decode(&req)\n\t\tassert.NoError(t, err)\n\t\tassert.Equal(t, \"token\", req.I)\n\n\t\t// Send response\n\t\tac := Account{\n\t\t\tID:       \"test-id\",\n\t\t\tUserName: \"test-username\",\n\t\t\tName:     nil,\n\t\t}\n\t\tres, err := json.Marshal(&ac)\n\t\tassert.NoError(t, err)\n\t\tw.Header().Set(\"Content-Type\", \"application/json\")\n\t\tw.Write(res)\n\t}\n\ttestServer := httptest.NewServer(http.HandlerFunc(handler))\n\tdefer testServer.Close()\n\n\t// Create account client\n\tclient := AccountClient{\n\t\tBaseUrl: testServer.URL,\n\t\tToken:   \"token\",\n\t}\n\n\t// Call FindSelf method\n\tac, err := client.FindSelf(context.Background())\n\n\t// Check response\n\tassert.NoError(t, err)\n\tassert.Equal(t, \"test-id\", ac.ID)\n\tassert.Equal(t, \"test-username\", ac.UserName)\n\tassert.Nil(t, ac.Name)\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/misskey/drive_file.go",
    "content": "package misskey\n\nimport \"time\"\n\ntype DriveFile struct {\n\tID            string    `json:\"id\"`\n\tCreatedAt     time.Time `json:\"createdAt\"`\n\tName          string    `json:\"name\"`\n\tType          string    `json:\"type\"`\n\tMD5           string    `json:\"md5\"`\n\tSize          *int      `json:\"size,omitempty\"`\n\tUserID        *string   `json:\"userId,omitempty\"`\n\tFolderID      *string   `json:\"folderId,omitempty\"`\n\tComment       *string   `json:\"comment,omitempty\"`\n\tIsSensitive   *bool     `json:\"isSensitive,omitempty\"`\n\tURL           string    `json:\"url\"`\n\tThumbnailURL  *string   `json:\"thumbnailUrl,omitempty\"`\n\tAttachedNotes []string  `json:\"attachedNoteIds,omitempty\"`\n\tBlurhash      *string   `json:\"blurhash,omitempty\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/misskey/note.go",
    "content": "package misskey\n\nimport \"time\"\n\ntype NoteDTO struct {\n\tID                 string                  `json:\"id\"`\n\tCreatedAt          time.Time               `json:\"createdAt\"`\n\tText               *string                 `json:\"text,omitempty\"`\n\tCW                 *string                 `json:\"cw,omitempty\"`\n\tUserID             string                  `json:\"userId\"`\n\tReplyID            *string                 `json:\"replyId,omitempty\"`\n\tRenoteID           *string                 `json:\"renoteId,omitempty\"`\n\tViaMobile          *bool                   `json:\"viaMobile,omitempty\"`\n\tVisibility         *NoteVisibilityType     `json:\"visibility,omitempty\"`\n\tLocalOnly          *bool                   `json:\"localOnly,omitempty\"`\n\tVisibleUserIDs     []string                `json:\"visibleUserIds,omitempty\"`\n\tRawReactionEmojis  *EmojisType             `json:\"reactionEmojis,omitempty\"`\n\tURL                *string                 `json:\"url,omitempty\"`\n\tURI                *string                 `json:\"uri,omitempty\"`\n\tRenoteCount        int                     `json:\"renoteCount\"`\n\tReactionCounts     map[string]int          `json:\"reactions,omitempty\"`\n\tRawEmojis          *EmojisType             `json:\"emojis,omitempty\"`\n\tReplyCount         int                     `json:\"repliesCount\"`\n\tUser               Account                 `json:\"user\"`\n\tFiles              []DriveFile             `json:\"files,omitempty\"`\n\tFileIds            []string                `json:\"fileIds,omitempty\"`\n\tPoll               *PollDTO                `json:\"poll,omitempty\"`\n\tRenote             *NoteDTO                `json:\"renote,omitempty\"`\n\tReply              *NoteDTO                `json:\"reply,omitempty\"`\n\tMyReaction         *string                 `json:\"myReaction,omitempty\"`\n\tTmpFeaturedID      *string                 `json:\"_featuredId_,omitempty\"`\n\tPromotionID        *string                 `json:\"_prId_,omitempty\"`\n\tChannelID          *string                 `json:\"channelId,omitempty\"`\n\tChannel            *ChannelInfo            `json:\"channel,omitempty\"`\n\tReactionAcceptance *ReactionAcceptanceType `json:\"reactionAcceptance,omitempty\"`\n}\n\ntype ChannelInfo struct {\n\tID   string `json:\"id\"`\n\tName string `json:\"name\"`\n}\n\ntype NoteVisibilityType string\n\nconst (\n\tPublic    NoteVisibilityType = \"public\"\n\tHome      NoteVisibilityType = \"home\"\n\tFollowers NoteVisibilityType = \"followers\"\n\tSpecified NoteVisibilityType = \"specified\"\n)\n\ntype ReactionAcceptanceType int\n\nconst (\n\tLikeOnly ReactionAcceptanceType = iota\n\tLikeOnly4Remote\n)\n\ntype EmojisType struct {\n\tNone     bool              `json:\"none\"`\n\tType     string            `json:\"type,omitempty\"`\n\tEmojis   []Emoji           `json:\"emojis,omitempty\"`\n\tReaction map[string]string `json:\"reaction,omitempty\"`\n}\n\ntype Emoji struct {\n\tName string `json:\"name\"`\n\tURL  string `json:\"url,omitempty\"`\n\tURI  string `json:\"uri,omitempty\"`\n}\n\ntype PollDTO struct {\n\tChoices   []ChoiceDTO `json:\"choices\"`\n\tExpiresAt *time.Time  `json:\"expiresAt,omitempty\"`\n\tMultiple  bool        `json:\"multiple\"`\n}\n\ntype ChoiceDTO struct {\n\tText    string `json:\"text\"`\n\tVotes   int    `json:\"votes\"`\n\tIsVoted bool   `json:\"isVoted\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/misskey/notification.go",
    "content": "package misskey\n\nimport \"time\"\n\ntype NotificationDTO struct {\n\tID        string    `json:\"id\"`\n\tCreatedAt time.Time `json:\"createdAt\"`\n\tType      string    `json:\"type\"`\n\tUserID    string    `json:\"userId,omitempty\"`\n\tUser      Account   `json:\"user,omitempty\"`\n\tNote      NoteDTO   `json:\"note,omitempty\"`\n\tNoteID    string    `json:\"noteId,omitempty\"`\n\tReaction  string    `json:\"reaction,omitempty\"`\n\tIsRead    bool      `json:\"isRead,omitempty\"`\n\tChoice    int       `json:\"choice,omitempty\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/misskey/sw_subscription.go",
    "content": "package misskey\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n)\n\ntype State string\n\nconst (\n\tStateAlreadySubscribed State = \"already-subscribed\"\n\tStateSubscribed        State = \"subscribed\"\n)\n\ntype SWSubscription struct {\n\tBaseUrl string\n\tToken   string\n}\n\ntype SubscribeRequest struct {\n\tEndpoint  string `json:\"endpoint\"`\n\tAuth      string `json:\"auth\"`\n\tPublicKey string `json:\"publicKey\"`\n}\n\ntype InternalSubscribeRequest struct {\n\tI         string `json:\"i\"`\n\tEndpoint  string `json:\"endpoint\"`\n\tAuth      string `json:\"auth\"`\n\tPublicKey string `json:\"publickey\"`\n}\n\ntype InternalUnSubRequest struct {\n\tI        string `json:\"i\"`\n\tEndPoint string `json:\"endpoint\"`\n}\ntype SubscribeResponse struct {\n\tState State   `json:\"state\"`\n\tKey   *string `json:\"key\"`\n}\n\nfunc (r *SWSubscription) Subscribe(ctx context.Context, req SubscribeRequest) (*SubscribeResponse, error) {\n\trqi := InternalSubscribeRequest{\n\t\tI:         r.Token,\n\t\tEndpoint:  req.Endpoint,\n\t\tAuth:      req.Auth,\n\t\tPublicKey: req.PublicKey,\n\t}\n\trejn, err := json.Marshal(rqi)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tc := &http.Client{}\n\thr, err := http.NewRequest(\"POST\", r.BaseUrl+\"/api/sw/register\", bytes.NewReader(rejn))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\thr.Header.Add(\"Content-Type\", \"application/json\")\n\tres, err := c.Do(hr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer res.Body.Close()\n\trwb, err := io.ReadAll(res.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif res.StatusCode >= 400 {\n\t\tfmt.Printf(\"misskey subscribe error: %s\\n\", rwb)\n\t\treturn nil, errors.New(res.Status)\n\t}\n\n\tvar sr SubscribeResponse\n\terr = json.Unmarshal(rwb, &sr)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &sr, nil\n}\n\nfunc (r *SWSubscription) Unsubscribe(ctx context.Context, endpoint string) error {\n\trqi := InternalUnSubRequest{\n\t\tI:        r.Token,\n\t\tEndPoint: endpoint,\n\t}\n\trejn, err := json.Marshal(rqi)\n\tif err != nil {\n\t\treturn err\n\t}\n\tc := &http.Client{}\n\thr, err := http.NewRequest(\"POST\", r.BaseUrl+\"/api/sw/unregister\", bytes.NewReader(rejn))\n\tif err != nil {\n\t\treturn err\n\t}\n\thr.Header.Add(\"Content-Type\", \"application/json\")\n\tres, err := c.Do(hr)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer res.Body.Close()\n\tif res.StatusCode >= 400 {\n\t\treturn errors.New(res.Status)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/module.go",
    "content": "package api\n"
  },
  {
    "path": "push-to-fcm/pkg/api/well_known/nodeinfo.go",
    "content": "package wellknown\n\ntype NodeInfo struct {\n\tVersion           string       `json:\"version\"`\n\tSoftware          Software     `json:\"software\"`\n\tProtocols         []string     `json:\"protocols\"`\n\tNodeInfoURL       string       `json:\"nodeinfo_url,omitempty\"`\n\tOpenRegistrations bool         `json:\"open_registrations\"`\n\tUsage             Usage        `json:\"usage,omitempty\"`\n\tMetadata          NodeInfoMeta `json:\"metadata,omitempty\"`\n\tProtocolsLocal    []string     `json:\"protocols_local,omitempty\"`\n}\n\ntype Software struct {\n\tName    string `json:\"name\"`\n\tVersion string `json:\"version\"`\n}\n\ntype Usage struct {\n\tUsers       UserUsage  `json:\"users\"`\n\tLocalPosts  LocalUsage `json:\"local_posts,omitempty\"`\n\tPosts       TotalUsage `json:\"posts,omitempty\"`\n\tConnections TotalUsage `json:\"connections,omitempty\"`\n}\n\ntype UserUsage struct {\n\tTotal          int       `json:\"total\"`\n\tActiveMonth    int       `json:\"activeMonth,omitempty\"`\n\tActiveHalfYear int       `json:\"activeHalfYear,omitempty\"`\n\tActiveUsers    UserCount `json:\"activeUsers,omitempty\"`\n}\n\ntype UserCount struct {\n\tTotal int `json:\"total\"`\n\tNew   int `json:\"new,omitempty\"`\n}\n\ntype LocalUsage struct {\n\tTotal          int `json:\"total\"`\n\tActiveMonth    int `json:\"activeMonth,omitempty\"`\n\tActiveHalfYear int `json:\"activeHalfYear,omitempty\"`\n}\n\ntype TotalUsage struct {\n\tTotal int `json:\"total\"`\n}\n\ntype NodeInfoMeta struct {\n\tPeers []string `json:\"peers,omitempty\"`\n}\n\nfunc (r *NodeInfo) IsMastodon() bool {\n\treturn r.Software.Name == \"mastodon\" ||\n\t\tr.Software.Name == \"fedibird\"\n}\n\nfunc (r *NodeInfo) IsMisskey() bool {\n\treturn r.Software.Name == \"misskey\" ||\n\t\tr.Software.Name == \"meisskey\" ||\n\t\tr.Software.Name == \"calckey\" ||\n\t\tr.Software.Name == \"foundkey\"\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/well_known/nodeinfo_test.go",
    "content": "package wellknown\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"net/http\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestNodeInfo_GiveMisskeyPantasystemCom(t *testing.T) {\n\turl := \"https://misskey.pantasystem.com/nodeinfo/2.0\"\n\n\tresp, err := http.Get(url)\n\tassert.NoError(t, err)\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tassert.NoError(t, err)\n\n\tvar ni NodeInfo\n\terr = json.Unmarshal(body, &ni)\n\tassert.NoError(t, err)\n\n\tassert.Equal(t, \"2.0\", ni.Version)\n\tassert.Equal(t, \"misskey\", ni.Software.Name)\n\tassert.NotEmpty(t, ni.Software.Version)\n\tassert.Contains(t, ni.Protocols, \"activitypub\")\n\tassert.NotNil(t, ni.OpenRegistrations)\n\n\tassert.True(t, ni.Usage.Users.Total > 0)\n\tassert.True(t, ni.Usage.Users.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveHalfYear >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveUsers.Total >= 0)\n\n\tassert.True(t, ni.Usage.LocalPosts.Total >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveHalfYear >= 0)\n\n\tassert.True(t, ni.Usage.Posts.Total >= 0)\n\tassert.True(t, ni.Usage.Connections.Total >= 0)\n}\n\nfunc TestNodeInfo_GiveFedibirdCom(t *testing.T) {\n\turl := \"https://fedibird.com/nodeinfo/2.0\"\n\n\tresp, err := http.Get(url)\n\tassert.NoError(t, err)\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tassert.NoError(t, err)\n\n\tvar ni NodeInfo\n\terr = json.Unmarshal(body, &ni)\n\tassert.NoError(t, err)\n\n\tassert.Equal(t, \"2.0\", ni.Version)\n\tassert.Equal(t, \"fedibird\", ni.Software.Name)\n\tassert.NotEmpty(t, ni.Software.Version)\n\tassert.Contains(t, ni.Protocols, \"activitypub\")\n\tassert.NotNil(t, ni.OpenRegistrations)\n\n\tassert.NotNil(t, ni.Usage.Users)\n\tassert.True(t, ni.Usage.Users.Total > 0)\n\tassert.True(t, ni.Usage.Users.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveHalfYear >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveUsers.Total >= 0)\n\n\tassert.NotNil(t, ni.Usage.LocalPosts)\n\tassert.True(t, ni.Usage.LocalPosts.Total >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveHalfYear >= 0)\n\n\tassert.NotNil(t, ni.Usage.Posts)\n\tassert.True(t, ni.Usage.Posts.Total >= 0)\n\tassert.NotNil(t, ni.Usage.Connections)\n\tassert.True(t, ni.Usage.Connections.Total >= 0)\n\n\tif ni.Metadata.Peers != nil {\n\t\tassert.NotEmpty(t, ni.Metadata.Peers)\n\t} else {\n\t\tassert.Nil(t, ni.Metadata.Peers)\n\t}\n}\n\nfunc TestNodeInfo_GiveMastodonSocial(t *testing.T) {\n\turl := \"https://mastodon.social/nodeinfo/2.0\"\n\n\tresp, err := http.Get(url)\n\tassert.NoError(t, err)\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tassert.NoError(t, err)\n\n\tvar ni NodeInfo\n\terr = json.Unmarshal(body, &ni)\n\tassert.NoError(t, err)\n\n\tassert.Equal(t, \"2.0\", ni.Version)\n\tassert.Equal(t, \"mastodon\", ni.Software.Name)\n\tassert.NotEmpty(t, ni.Software.Version)\n\tassert.Contains(t, ni.Protocols, \"activitypub\")\n\tassert.NotNil(t, ni.OpenRegistrations)\n\n\tassert.NotNil(t, ni.Usage.Users)\n\tassert.True(t, ni.Usage.Users.Total > 0)\n\tassert.True(t, ni.Usage.Users.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveHalfYear >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveUsers.Total >= 0)\n\n\tassert.NotNil(t, ni.Usage.LocalPosts)\n\tassert.True(t, ni.Usage.LocalPosts.Total >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveHalfYear >= 0)\n\n\tassert.NotNil(t, ni.Usage.Posts)\n\tassert.True(t, ni.Usage.Posts.Total >= 0)\n\tassert.NotNil(t, ni.Usage.Connections)\n\tassert.True(t, ni.Usage.Connections.Total >= 0)\n\n}\n\nfunc TestNodeInfo_GiveCalckey(t *testing.T) {\n\turl := \"https://calc.panta.systems/nodeinfo/2.0\"\n\n\tresp, err := http.Get(url)\n\tassert.NoError(t, err)\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tassert.NoError(t, err)\n\n\tvar ni NodeInfo\n\terr = json.Unmarshal(body, &ni)\n\tassert.NoError(t, err)\n\n\tassert.Equal(t, \"2.0\", ni.Version)\n\tassert.Equal(t, \"calckey\", ni.Software.Name)\n\tassert.NotEmpty(t, ni.Software.Version)\n\tassert.Contains(t, ni.Protocols, \"activitypub\")\n\tassert.NotNil(t, ni.OpenRegistrations)\n\n\tassert.True(t, ni.Usage.Users.Total > 0)\n\tassert.True(t, ni.Usage.Users.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveHalfYear >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveUsers.Total >= 0)\n\n\tassert.True(t, ni.Usage.LocalPosts.Total >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveHalfYear >= 0)\n\n\tassert.True(t, ni.Usage.Posts.Total >= 0)\n\tassert.True(t, ni.Usage.Connections.Total >= 0)\n}\n\nfunc TestNodeInfo_GiveMeisskey(t *testing.T) {\n\turl := \"https://misskey.m544.net/nodeinfo/2.0\"\n\n\tresp, err := http.Get(url)\n\tassert.NoError(t, err)\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tassert.NoError(t, err)\n\n\tvar ni NodeInfo\n\terr = json.Unmarshal(body, &ni)\n\tassert.NoError(t, err)\n\n\tassert.Equal(t, \"2.0\", ni.Version)\n\tassert.Equal(t, \"meisskey\", ni.Software.Name)\n\tassert.NotEmpty(t, ni.Software.Version)\n\tassert.Contains(t, ni.Protocols, \"activitypub\")\n\tassert.NotNil(t, ni.OpenRegistrations)\n\n\tassert.True(t, ni.Usage.Users.Total > 0)\n\tassert.True(t, ni.Usage.Users.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveHalfYear >= 0)\n\tassert.True(t, ni.Usage.Users.ActiveUsers.Total >= 0)\n\n\tassert.True(t, ni.Usage.LocalPosts.Total >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveMonth >= 0)\n\tassert.True(t, ni.Usage.LocalPosts.ActiveHalfYear >= 0)\n\n\tassert.True(t, ni.Usage.Posts.Total >= 0)\n\tassert.True(t, ni.Usage.Connections.Total >= 0)\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/well_known/well_known.go",
    "content": "package wellknown\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"net/http\"\n)\n\ntype WellKnown struct {\n\tBaseUrl string\n}\n\nfunc (r *WellKnown) FindNodeInfo() (*NodeInfo, error) {\n\tresp, err := http.Get(r.BaseUrl + \"/.well-known/nodeinfo\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err := io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar wellknown struct {\n\t\tLinks []struct {\n\t\t\tRel  string `json:\"rel\"`\n\t\t\tHref string `json:\"href\"`\n\t\t} `json:\"links\"`\n\t}\n\terr = json.Unmarshal(body, &wellknown)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar nodeinfoURL string\n\tfor _, link := range wellknown.Links {\n\t\tif link.Rel == \"http://nodeinfo.diaspora.software/ns/schema/2.0\" {\n\t\t\tnodeinfoURL = link.Href\n\t\t\tbreak\n\t\t}\n\t}\n\n\tresp, err = http.Get(nodeinfoURL)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer resp.Body.Close()\n\n\tbody, err = io.ReadAll(resp.Body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tvar ni NodeInfo\n\terr = json.Unmarshal(body, &ni)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn &ni, nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/api/well_known/well_known_test.go",
    "content": "package wellknown\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestFindNodeInfo(t *testing.T) {\n\twellknown := WellKnown{\n\t\tBaseUrl: \"https://misskey.io\",\n\t}\n\n\tni, err := wellknown.FindNodeInfo()\n\tassert.NoError(t, err)\n\tassert.NotNil(t, ni)\n\tassert.Equal(t, \"2.0\", ni.Version)\n\tassert.Equal(t, \"misskey\", ni.Software.Name)\n\tassert.True(t, len(ni.Protocols) > 0)\n\tassert.True(t, ni.Usage.Users.Total >= 0)\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/config/config.go",
    "content": "package config\n\nimport (\n\t\"os\"\n\t\"strconv\"\n)\n\ntype Config struct {\n\tServerUrl string `json:\"server_url\"`\n\tDsn       string `json:\"dsn\"`\n\tPort      int    `json:\"port\"`\n}\n\nfunc (c *Config) LoadFromEnv() error {\n\tc.ServerUrl = os.Getenv(\"SERVER_URL\")\n\tc.Dsn = os.Getenv(\"DSN\")\n\tp, e := strconv.Atoi(os.Getenv(\"PORT\"))\n\tif e != nil {\n\t\treturn e\n\t}\n\tc.Port = p\n\treturn nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/dao/client_account.go",
    "content": "package dao\n\nimport (\n\t\"context\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n)\n\ntype ClientAccountRepositoryImpl struct {\n\tDB *gorm.DB\n}\n\nfunc (r *ClientAccountRepositoryImpl) Create(ctx context.Context, entity *entity.ClientAccount) (*entity.ClientAccount, error) {\n\terr := r.DB.Create(entity).Error\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn entity, nil\n}\n\nfunc (r *ClientAccountRepositoryImpl) FindByToken(ctx context.Context, clientID string) (*entity.ClientAccount, error) {\n\tvar clientAccount entity.ClientAccount\n\terr := r.DB.Where(\"token = ?\", clientID).First(&clientAccount).Error\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &clientAccount, nil\n}\n\nfunc (r *ClientAccountRepositoryImpl) Delete(ctx context.Context, id uuid.UUID) error {\n\terr := r.DB.Delete(&entity.ClientAccount{}, id).Error\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (r *ClientAccountRepositoryImpl) FindById(ctx context.Context, id uuid.UUID) (*entity.ClientAccount, error) {\n\tvar clientAccount entity.ClientAccount\n\terr := r.DB.Where(\"id = ?\", id).First(&clientAccount).Error\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &clientAccount, nil\n}\n\nfunc (r *ClientAccountRepositoryImpl) Update(ctx context.Context, e *entity.ClientAccount) (*entity.ClientAccount, error) {\n\tresult := r.DB.Model(entity.ClientAccount{}).Where(\"id = ?\", e.ID).Updates(map[string]interface{}{\n\t\t\"device_token\": e.DeviceToken,\n\t\t\"lang\":         e.Lang,\n\t})\n\tif result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn e, nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/dao/module.go",
    "content": "package dao\n\nimport (\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n)\n\ntype RepositoryModuleImpl struct {\n\tDB *gorm.DB\n}\n\nfunc (r *RepositoryModuleImpl) GetClientAccountRepository() repository.ClientAccountRepository {\n\treturn &ClientAccountRepositoryImpl{\n\t\tDB: r.DB,\n\t}\n}\n\nfunc (r *RepositoryModuleImpl) GetPushNotificationRepository() repository.PushNotificationRepository {\n\treturn &PushSubscriptionRepositoryImpl{\n\t\tDB: r.DB,\n\t}\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/dao/push_subscription.go",
    "content": "package dao\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n)\n\ntype PushSubscriptionRepositoryImpl struct {\n\tDB *gorm.DB\n}\n\nfunc (r *PushSubscriptionRepositoryImpl) Create(ctx context.Context, entity *entity.PushSubscription) (*entity.PushSubscription, error) {\n\terr := r.DB.Create(entity).Error\n\tif err != nil {\n\t\tfmt.Printf(\"create subscription error: %v\\n\", err)\n\t\treturn nil, err\n\t}\n\treturn r.FindOne(ctx, entity.ID)\n}\n\nfunc (r *PushSubscriptionRepositoryImpl) FindBy(ctx context.Context, query repository.FindByQuery) (*entity.PushSubscription, error) {\n\tvar subscription entity.PushSubscription\n\terr := r.DB.Where(\"acct = ? AND instance_uri = ? AND client_account_id = ?\", query.Acct, query.InstanceUri, query.ClientAccountId).First(&subscription).Error\n\tif err != nil {\n\t\tif err == gorm.ErrRecordNotFound {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, err\n\t}\n\treturn &subscription, nil\n}\n\nfunc (r *PushSubscriptionRepositoryImpl) Delete(ctx context.Context, id uuid.UUID) error {\n\terr := r.DB.Delete(&entity.PushSubscription{}, id).Error\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (r *PushSubscriptionRepositoryImpl) FindOne(ctx context.Context, id uuid.UUID) (*entity.PushSubscription, error) {\n\tvar subscription entity.PushSubscription\n\terr := r.DB.First(&subscription, id).Error\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &subscription, nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/entity/client_account.go",
    "content": "package entity\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype ClientAccount struct {\n\tID          uuid.UUID `json:\"id\" gorm:\"type:uuid;primary_key;\"`\n\tToken       string    `json:\"-\" gorm:\"type:varchar(255);unique_index\"`\n\tDeviceToken *string   `json:\"-\" gorm:\"type:varchar(255);unique_index\"`\n\tLang        *string   `json:\"lang\" gorm:\"type:varchar(255);index\"`\n\tCreatedAt   time.Time `json:\"created_at\"`\n\tUpdatedAt   time.Time `json:\"updated_at\"`\n}\n\nfunc (r *ClientAccount) BeforeCreate(tx *gorm.DB) error {\n\tu, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn err\n\t}\n\tr.ID = u\n\n\tt, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn err\n\t}\n\tbt := getSHA256Binary(t.String())\n\tr.Token = hex.EncodeToString(bt)\n\n\treturn nil\n}\n\nfunc getSHA256Binary(s string) []byte {\n\tr := sha256.Sum256([]byte(s))\n\treturn r[:]\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/entity/push_subscription.go",
    "content": "package entity\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype PushSubscription struct {\n\tID              uuid.UUID     `json:\"id\" gorm:\"type:uuid;primary_key;\"`\n\tProviderType    ProviderType  `json:\"provider_type\" gorm:\"type:varchar(255);index\"`\n\tAcct            string        `json:\"acct\" gorm:\"type:varchar(255);index;unique_index:idx_acct_account_id_instance_uri;\"`\n\tClientAccountId uuid.UUID     `json:\"client_account_id\" gorm:\"type:uuid;index;unique_index:idx_acct_account_id_instance_uri;\"`\n\tClientAccount   ClientAccount `json:\"client_account\" gorm:\"foreignkey:ClientAccountId\"`\n\tInstanceUri     string        `json:\"instance_uri\" gorm:\"type:varchar(255);index;unique_index:idx_acct_account_id_instance_uri\"`\n\tPublicKey       string        `json:\"-\" gorm:\"type:varchar(255)\"`\n\tPrivateKey      string        `json:\"-\"`\n\tAuth            string        `json:\"-\" gorm:\"type:varchar(255)\"`\n\tCreatedAt       time.Time     `json:\"created_at\"`\n\tUpdatedAt       time.Time     `json:\"updated_at\"`\n}\n\ntype ProviderType string\n\nconst (\n\tProviderTypeMisskey  ProviderType = \"misskey\"\n\tProviderTypeMastodon ProviderType = \"mastodon\"\n)\n\nfunc (r *PushSubscription) BeforeCreate(tx *gorm.DB) error {\n\tuuid, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn err\n\t}\n\tr.ID = uuid\n\n\treturn nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/handler/client_account.go",
    "content": "package handler\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/handler/middleware\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/service\"\n)\n\ntype ClientAccountHandler struct {\n\tRepositoryModule repository.Module\n\tServiceModule    service.Module\n}\n\nfunc (r *ClientAccountHandler) RegisterHandlers(gin *gin.Engine) {\n\tm := middleware.ClientAccountAuthMiddleware{\n\t\tRepositoryModule: r.RepositoryModule,\n\t}\n\tgin.POST(\"api/client-account/get-or-register\", r.GetOrRegisterClientAccount())\n\tgin.PUT(\"api/client-account\", m.CheckToken(), r.UpdateClientAccount())\n}\n\nfunc (r *ClientAccountHandler) GetOrRegisterClientAccount() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tt := middleware.GetToken(c)\n\t\tac, err := r.ServiceModule.GetClientAccountService().GetOrRegisterClientAccount(c, t)\n\t\tif err != nil {\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tres := GetOrRegisterClientAccountRes{\n\t\t\tToken:   ac.Token,\n\t\t\tAccount: ac,\n\t\t}\n\t\tc.JSON(200, res)\n\t}\n}\n\nfunc (r *ClientAccountHandler) UpdateClientAccount() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tc.Value(middleware.IS_AUTHENTICATED)\n\t\ta, exists := c.Get(middleware.CLIENT_ACCOUNT)\n\t\tif !exists {\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tac, ok := a.(*entity.ClientAccount)\n\t\tif !ok {\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tvar req UpdateClientAccountReq\n\t\terr := c.BindJSON(&req)\n\t\tif err != nil {\n\t\t\tc.Status(400)\n\t\t\treturn\n\t\t}\n\n\t\tif req.DeviceToken != nil && len(*req.DeviceToken) > 0 {\n\t\t\tac.DeviceToken = req.DeviceToken\n\t\t}\n\n\t\tif req.Lang != nil && len(*req.Lang) > 0 {\n\t\t\tac.Lang = req.Lang\n\t\t}\n\t\tac, err = r.RepositoryModule.GetClientAccountRepository().Update(c, ac)\n\t\tif err != nil {\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\n\t\tc.JSON(200, ac)\n\t}\n}\n\ntype GetOrRegisterClientAccountRes struct {\n\tToken   string                `json:\"token\"`\n\tAccount *entity.ClientAccount `json:\"account\"`\n}\n\ntype UpdateClientAccountReq struct {\n\tDeviceToken *string `json:\"device_token\"`\n\tLang        *string `json:\"lang\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/handler/middleware/client_account_auth.go",
    "content": "package middleware\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n)\n\nconst (\n\tCLIENT_ACCOUNT_ID = \"client_account_id\"\n\tCLIENT_ACCOUNT    = \"client_account\"\n\tIS_AUTHENTICATED  = \"is_authenticated\"\n)\n\ntype ClientAccountAuthMiddleware struct {\n\tRepositoryModule repository.Module\n}\n\nfunc (r *ClientAccountAuthMiddleware) GetTokenWithAccount() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\ttoken := GetToken(c)\n\t\tif token == nil {\n\t\t\tc.Set(IS_AUTHENTICATED, false)\n\t\t\tc.Next()\n\t\t\treturn\n\t\t}\n\t\taccount, err := r.RepositoryModule.GetClientAccountRepository().FindByToken(c, *token)\n\t\tif account != nil && err == nil {\n\t\t\tc.Set(CLIENT_ACCOUNT, account)\n\t\t\tc.Set(CLIENT_ACCOUNT_ID, account.ID)\n\t\t\tc.Set(IS_AUTHENTICATED, true)\n\t\t\tc.Next()\n\t\t\treturn\n\t\t} else {\n\t\t\tc.Set(IS_AUTHENTICATED, false)\n\t\t\tc.Next()\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc (r *ClientAccountAuthMiddleware) CheckToken() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\ttoken := GetToken(c)\n\t\tif token == nil {\n\t\t\tc.JSON(http.StatusUnauthorized, gin.H{\"type\": \"unauthorized\", \"message\": \"invalid token\"})\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\taccount, err := r.RepositoryModule.GetClientAccountRepository().FindByToken(c, *token)\n\t\tif account != nil && err == nil {\n\t\t\tc.Set(CLIENT_ACCOUNT, account)\n\t\t\tc.Set(CLIENT_ACCOUNT_ID, account.ID)\n\t\t\tc.Next()\n\t\t\treturn\n\t\t} else {\n\t\t\tc.JSON(http.StatusUnauthorized, gin.H{\"type\": \"unauthorized\", \"message\": \"invalid token\"})\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc GetToken(c *gin.Context) *string {\n\taHeader := c.Request.Header[\"Authorization\"]\n\tif len(aHeader) < 1 {\n\t\treturn nil\n\t}\n\tsliced := strings.Split(aHeader[0], \" \")\n\tif len(sliced) <= 1 {\n\t\treturn nil\n\t}\n\n\ttoken := sliced[1]\n\treturn &token\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/handler/subscription.go",
    "content": "package handler\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/handler/middleware\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/service\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/util\"\n)\n\ntype SubscriptionHandler struct {\n\tServiceModule    service.Module\n\tRepositoryModule repository.Module\n}\n\nfunc (r *SubscriptionHandler) RegisterHandlers(gin *gin.Engine) {\n\tm := middleware.ClientAccountAuthMiddleware{\n\t\tRepositoryModule: r.RepositoryModule,\n\t}\n\tgin.POST(\"api/subscriptions\", m.CheckToken(), r.Subscribe())\n\tgin.DELETE(\"api/subscriptions\", m.CheckToken(), r.Unsubscribe())\n\tgin.POST(\"api/subscriptions/:id/callbacks\", r.OnRecieveNotification())\n}\n\nfunc (r *SubscriptionHandler) Subscribe() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tvar req SubscribeRequest\n\t\terr := c.BindJSON(&req)\n\t\tif err != nil {\n\t\t\tc.Status(400)\n\t\t\treturn\n\t\t}\n\t\tif req.ProviderType != entity.ProviderTypeMisskey && req.ProviderType != entity.ProviderTypeMastodon {\n\t\t\tc.Status(400)\n\t\t\treturn\n\t\t}\n\t\ta, exists := c.Get(middleware.CLIENT_ACCOUNT)\n\t\tif !exists {\n\t\t\tfmt.Printf(\"account fetch failed\\n\")\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tac, ok := a.(*entity.ClientAccount)\n\t\tif !ok {\n\t\t\tfmt.Printf(\"account cast failed\\n\")\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tsub, err := r.ServiceModule.GetPushNotificationService().Subscribe(c, ac.ID, service.SubscribeArgs{\n\t\t\tProviderType: req.ProviderType,\n\t\t\tAcct:         req.Acct,\n\t\t\tInstanceUri:  req.InstanceUri,\n\t\t\tToken:        req.Token,\n\t\t})\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"err: %v\\n\", err)\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tc.JSON(200, sub)\n\t}\n}\n\nfunc (r *SubscriptionHandler) Unsubscribe() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t}\n}\n\nfunc (r *SubscriptionHandler) OnRecieveNotification() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tsuuid := c.Params.ByName(\"id\")\n\t\tid, err := uuid.Parse(suuid)\n\t\tif err != nil {\n\t\t\tc.Status(400)\n\t\t\treturn\n\t\t}\n\t\tsub, err := r.RepositoryModule.GetPushNotificationRepository().FindOne(c, id)\n\t\tif err != nil {\n\t\t\tif errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\t\tc.Status(410)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tc.Status(500)\n\t\t}\n\n\t\tdecrypter, err := util.NewDecrypter(sub.Auth, sub.PublicKey, sub.PrivateKey)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"decrypter init failed: %v\\n\", err)\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tdefer c.Request.Body.Close()\n\t\trbd, err := io.ReadAll(c.Request.Body)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"read body failed: %v\\n\", err)\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\n\t\tdecryptBody, err := decrypter.Decrypt(string(rbd))\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"decrypt failed: %v\\n\", err)\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"decrypt body: %s\\n\", *decryptBody)\n\n\t\tswitch sub.ProviderType {\n\t\tcase entity.ProviderTypeMisskey:\n\t\tcase entity.ProviderTypeMastodon:\n\t\t}\n\n\t\tc.Status(200)\n\t}\n}\n\ntype SubscribeRequest struct {\n\tProviderType entity.ProviderType `json:\"provider_type\"`\n\tAcct         string              `json:\"acct\"`\n\tInstanceUri  string              `json:\"instance_uri\"`\n\tToken        string              `json:\"token\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/repository/client_account.go",
    "content": "package repository\n\nimport (\n\t\"context\"\n\n\t\"github.com/google/uuid\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n)\n\ntype ClientAccountRepository interface {\n\tCreate(ctx context.Context, entity *entity.ClientAccount) (*entity.ClientAccount, error)\n\tFindByToken(ctx context.Context, token string) (*entity.ClientAccount, error)\n\tDelete(ctx context.Context, id uuid.UUID) error\n\tFindById(ctx context.Context, id uuid.UUID) (*entity.ClientAccount, error)\n\tUpdate(ctx context.Context, entity *entity.ClientAccount) (*entity.ClientAccount, error)\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/repository/module.go",
    "content": "package repository\n\ntype Module interface {\n\tGetClientAccountRepository() ClientAccountRepository\n\tGetPushNotificationRepository() PushNotificationRepository\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/repository/push_notification.go",
    "content": "package repository\n\nimport (\n\t\"context\"\n\n\t\"github.com/google/uuid\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n)\n\ntype PushNotificationRepository interface {\n\tFindBy(ctx context.Context, query FindByQuery) (*entity.PushSubscription, error)\n\tCreate(ctx context.Context, subscription *entity.PushSubscription) (*entity.PushSubscription, error)\n\tDelete(ctx context.Context, id uuid.UUID) error\n\tFindOne(ctx context.Context, id uuid.UUID) (*entity.PushSubscription, error)\n}\n\ntype FindByQuery struct {\n\tAcct            string\n\tInstanceUri     string\n\tClientAccountId uuid.UUID\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/root/impl/module.go",
    "content": "package impl\n\nimport (\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/config\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/dao\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/root\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/service\"\n)\n\ntype RootModuleImpl struct {\n\tDB     *gorm.DB\n\tConfig *config.Config\n}\n\nfunc NewModule(db *gorm.DB, config *config.Config) root.Module {\n\treturn &RootModuleImpl{\n\t\tDB:     db,\n\t\tConfig: config,\n\t}\n}\n\nfunc (r *RootModuleImpl) GetRepositoryModule() repository.Module {\n\treturn &dao.RepositoryModuleImpl{\n\t\tDB: r.DB,\n\t}\n\n}\n\nfunc (r *RootModuleImpl) GetServiceModule() service.Module {\n\treturn service.Module{\n\t\tRepositoryModule: r.GetRepositoryModule(),\n\t\tConfig:           r.Config,\n\t}\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/root/module.go",
    "content": "package root\n\nimport (\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/service\"\n)\n\ntype Module interface {\n\tGetRepositoryModule() repository.Module\n\tGetServiceModule() service.Module\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/service/client_account.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\t\"errors\"\n\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n)\n\ntype ClientAccountService struct {\n\tClientAccountRepository repository.ClientAccountRepository\n}\n\nfunc (r *ClientAccountService) GetOrRegisterClientAccount(ctx context.Context, token *string) (*entity.ClientAccount, error) {\n\tif token == nil {\n\t\treturn r.ClientAccountRepository.Create(\n\t\t\tctx,\n\t\t\t&entity.ClientAccount{},\n\t\t)\n\t}\n\n\tclientAccount, err := r.ClientAccountRepository.FindByToken(ctx, *token)\n\tif err != nil {\n\t\tif !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\treturn nil, err\n\t\t}\n\t\treturn r.ClientAccountRepository.Create(\n\t\t\tctx,\n\t\t\t&entity.ClientAccount{},\n\t\t)\n\t}\n\n\treturn clientAccount, nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/service/module.go",
    "content": "package service\n\nimport (\n\t\"systems.panta.milktea/push-to-fcm/pkg/config\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n)\n\ntype Module struct {\n\tRepositoryModule repository.Module\n\tConfig           *config.Config\n}\n\nfunc (r *Module) GetClientAccountService() *ClientAccountService {\n\treturn &ClientAccountService{\n\t\tClientAccountRepository: r.RepositoryModule.GetClientAccountRepository(),\n\t}\n}\n\nfunc (r *Module) GetPushNotificationService() *PushNotificationService {\n\treturn &PushNotificationService{\n\t\tPushNotificationRepository: r.RepositoryModule.GetPushNotificationRepository(),\n\t\tClientAccountRepository:    r.RepositoryModule.GetClientAccountRepository(),\n\t\tConfig:                     r.Config,\n\t}\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/service/push_notification.go",
    "content": "package service\n\nimport (\n\t\"context\"\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/api/mastodon\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/api/misskey\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/config\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/entity\"\n\t\"systems.panta.milktea/push-to-fcm/pkg/repository\"\n)\n\ntype PushNotificationService struct {\n\tPushNotificationRepository repository.PushNotificationRepository\n\tClientAccountRepository    repository.ClientAccountRepository\n\tConfig                     *config.Config\n}\n\nfunc (s *PushNotificationService) Subscribe(ctx context.Context, clientAccountID uuid.UUID, args SubscribeArgs) (*entity.PushSubscription, error) {\n\tca, err := s.ClientAccountRepository.FindById(ctx, clientAccountID)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tsub, err := s.PushNotificationRepository.FindBy(ctx, repository.FindByQuery{\n\t\tAcct:            args.Acct,\n\t\tInstanceUri:     args.InstanceUri,\n\t\tClientAccountId: ca.ID,\n\t})\n\tif err != nil {\n\t\tif !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\tif sub != nil {\n\t\treturn sub, nil\n\t}\n\n\tkeys, err := s.GenerateKey()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tsub, err = s.PushNotificationRepository.Create(ctx, &entity.PushSubscription{\n\t\tAcct:            args.Acct,\n\t\tInstanceUri:     args.InstanceUri,\n\t\tClientAccountId: ca.ID,\n\t\tPublicKey:       keys.Public,\n\t\tPrivateKey:      keys.Private,\n\t\tAuth:            keys.Auth,\n\t\tProviderType:    args.ProviderType,\n\t})\n\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif sub == nil {\n\t\treturn nil, errors.New(\"failed to create subscription\")\n\t}\n\n\tendpoint := s.Config.ServerUrl + \"/api/subscriptions/\" + sub.ID.String() + \"/callbacks\"\n\tfmt.Printf(\"endpoint: %s\", endpoint)\n\tswitch args.ProviderType {\n\tcase entity.ProviderTypeMastodon:\n\t\tc := mastodon.NotificationSubscriptionClient{\n\t\t\tBaseUrl: args.InstanceUri,\n\t\t\tToken:   args.Token,\n\t\t}\n\t\t_, err := c.Subscribe(ctx, mastodon.PushSubscriptionRequest{\n\t\t\tSubscrption: mastodon.Subscrption{\n\t\t\t\tEndpoint: endpoint,\n\t\t\t\tKeys: mastodon.Keys{\n\t\t\t\t\tAuth:   sub.Auth,\n\t\t\t\t\tP256dh: sub.PublicKey,\n\t\t\t\t},\n\t\t\t},\n\t\t\tData: mastodon.Data{\n\t\t\t\tPolicy: \"all\",\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\ts.rollback(ctx, sub)\n\t\t\treturn nil, err\n\t\t}\n\n\tcase entity.ProviderTypeMisskey:\n\t\tc := misskey.SWSubscription{\n\t\t\tBaseUrl: args.InstanceUri,\n\t\t\tToken:   args.Token,\n\t\t}\n\t\t_, err := c.Subscribe(ctx, misskey.SubscribeRequest{\n\t\t\tEndpoint:  endpoint,\n\t\t\tPublicKey: sub.PublicKey,\n\t\t\tAuth:      sub.Auth,\n\t\t})\n\t\tif err != nil {\n\t\t\ts.rollback(ctx, sub)\n\t\t\treturn nil, err\n\t\t}\n\t}\n\t// TODO\n\treturn sub, nil\n}\n\nfunc (s *PushNotificationService) GenerateKey() (*Keys, error) {\n\tprivateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tpublicKeyBytes := elliptic.Marshal(privateKey.PublicKey.Curve, privateKey.PublicKey.X, privateKey.PublicKey.Y)\n\tpublicKeyBase64 := base64.URLEncoding.EncodeToString(publicKeyBytes)\n\n\tprivateKeyBytes := privateKey.D.Bytes()\n\tprivateKeyBase64 := base64.URLEncoding.EncodeToString(privateKeyBytes)\n\n\tauthBytes := make([]byte, 16)\n\tif _, err := rand.Read(authBytes); err != nil {\n\t\treturn nil, err\n\t}\n\tauthBase64 := base64.URLEncoding.EncodeToString(authBytes)\n\n\treturn &Keys{\n\t\tAuth:    authBase64,\n\t\tPublic:  publicKeyBase64,\n\t\tPrivate: privateKeyBase64,\n\t}, nil\n\n}\n\nfunc (s *PushNotificationService) rollback(ctx context.Context, sub *entity.PushSubscription) error {\n\treturn s.PushNotificationRepository.Delete(ctx, sub.ID)\n}\n\ntype Keys struct {\n\tAuth    string\n\tPublic  string\n\tPrivate string\n}\n\ntype SubscribeArgs struct {\n\tInstanceUri  string              `json:\"instance_uri\"`\n\tToken        string              `json:\"token\"`\n\tProviderType entity.ProviderType `json:\"provider_type\"`\n\tAcct         string              `json:\"acct\"`\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/service/push_notification_test.go",
    "content": "package service_test\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"systems.panta.milktea/push-to-fcm/pkg/service\"\n)\n\nfunc TestPushNotificationService_GenerateKey(t *testing.T) {\n\ts := &service.PushNotificationService{}\n\n\tkeys, err := s.GenerateKey()\n\tif err != nil {\n\t\tt.Fatalf(\"Unexpected error: %v\", err)\n\t}\n\n\tif keys.Auth == \"\" || keys.Public == \"\" || keys.Private == \"\" {\n\t\tt.Fatalf(\"Unexpected empty field(s) in generated key\")\n\t}\n\n\t_, err = base64.URLEncoding.DecodeString(keys.Auth)\n\tif err != nil {\n\t\tt.Fatalf(\"Error decoding auth base64: %v\", err)\n\t}\n\n\t_, err = base64.URLEncoding.DecodeString(keys.Public)\n\tif err != nil {\n\t\tt.Fatalf(\"Error decoding public key base64: %v\", err)\n\t}\n\n\t_, err = base64.URLEncoding.DecodeString(keys.Private)\n\tif err != nil {\n\t\tt.Fatalf(\"Error decoding private key base64: %v\", err)\n\t}\n\tfmt.Printf(\"Keys: %+v\", keys)\n\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/util/webpush_decrypter.go",
    "content": "package util\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/elliptic\"\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/aead/ecdh\"\n)\n\ntype Decrypter struct {\n\tauthSecret      []byte\n\treceiverPublic  []byte\n\treceiverPrivate []byte\n}\n\nfunc Sha256(key []byte, data []byte) []byte {\n\thash := hmac.New(sha256.New, []byte(key))\n\thash.Write(data)\n\treturn hash.Sum(nil)\n}\n\nfunc DecodeBase64(src string) ([]byte, error) {\n\tresult, err := base64.URLEncoding.DecodeString(src)\n\tif err == nil {\n\t\treturn result, err\n\t}\n\tresult, err = base64.RawURLEncoding.DecodeString(src)\n\tif err == nil {\n\t\treturn result, err\n\t}\n\n\tresult, err = base64.StdEncoding.DecodeString(src)\n\tif err == nil {\n\t\treturn result, err\n\t}\n\n\treturn base64.RawStdEncoding.DecodeString(src)\n}\n\nfunc NewDecrypter(authSecret string, receiverPublic string, receiverPrivate string) (*Decrypter, error) {\n\n\tasb, err := DecodeBase64(authSecret)\n\tif err != nil {\n\t\tfmt.Printf(\"decode failed:%s\", err.Error())\n\t\treturn nil, err\n\t}\n\trcpb, err := DecodeBase64(receiverPublic)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\trpb, err := DecodeBase64(receiverPrivate)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdecrypter := Decrypter{\n\t\tauthSecret:      asb,\n\t\treceiverPublic:  rcpb,\n\t\treceiverPrivate: rpb,\n\t}\n\treturn &decrypter, nil\n}\n\nfunc (r Decrypter) Decrypt(base64Body string) (*string, error) {\n\n\tenc, err := DecodeBase64(base64Body)\n\tif err != nil {\n\t\tfmt.Printf(\"bodyをdecode base64するのに失敗:%s\\n\", err.Error())\n\t\treturn nil, err\n\t}\n\tbody := enc\n\n\tsalt := body[0:16]\n\t// rs := body[16:(16 + 4)]\n\tidlen, err := r.GetIdlen(body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tkeyId := r.GetKeyId(body, idlen)\n\tcontent := body[(16 + 4 + 1 + idlen):]\n\n\tsenderPublic, err := DecodeBase64(base64.StdEncoding.EncodeToString(keyId))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfmt.Printf(\"senderPublic:%s\\n\", senderPublic)\n\n\t// fmt.Printf(\"salt: %s, rs:%s, idlenHex:%s, idlen:%s, keyId:%s, content:%s, senderPublic:%s\", salt, rs, idlenHex, idlen, keyId, content, &senderPublic)\n\n\tfmt.Printf(\"keyid:%s\\n\", keyId)\n\n\tsharedSecret, err := r.GenerateSharedKey(keyId)\n\tif err != nil {\n\t\tfmt.Printf(\"Get SharedSecret failed\\n\")\n\t\treturn nil, err\n\t}\n\tfmt.Printf(\"sharedSecret:%s\\n\", sharedSecret)\n\tfmt.Printf(\"salt:%s, content:%s\\n\", base64.URLEncoding.EncodeToString(salt), content)\n\n\tprkKey := Sha256(r.authSecret, sharedSecret)\n\tkeyInfo := append(append(append([]byte(\"WebPush: info\\000\"), r.receiverPublic...), senderPublic...), []byte(\"\\001\")...)\n\tikm := Sha256(prkKey, keyInfo)\n\tprk := Sha256(salt, ikm)\n\n\tcekInfo := \"Content-Encoding: aes128gcm\\000\\001\"\n\tcek := Sha256(prk, []byte(cekInfo))[0:16]\n\n\tnonceInfo := \"Content-Encoding: nonce\\000\\001\"\n\tnonce := Sha256(prk, []byte(nonceInfo))[0:12]\n\tfmt.Printf(\"cek:%s, nonce:%s\\n\", base64.URLEncoding.EncodeToString(cek), base64.URLEncoding.EncodeToString(nonce))\n\tiv := nonce\n\tblock, err := aes.NewCipher([]byte(cek))\n\tif err != nil {\n\t\tfmt.Printf(\"aes.NewCipherに失敗\")\n\t\treturn nil, err\n\t}\n\taesgcm, err := cipher.NewGCM(block)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tplaintext, err := aesgcm.Open(nil, []byte(iv), []byte(content), nil)\n\tif err != nil {\n\t\tfmt.Printf(\"aesgcm.Openに失敗:%s\", err.Error())\n\n\t\treturn nil, err\n\t}\n\n\t// for plaintext[(len(plaintext)-1):] != []byte(\"}\") {\n\t// \tplaintext = plaintext[(len(plaintext) - 1):]\n\t// }\n\t// hoge := string(plaintext)\n\t// return &hoge, nil\n\ttext := string(plaintext)\n\tfor text[(len(text)-1):] != \"}\" {\n\t\ttext = text[0:(len(text) - 1)]\n\t\tfmt.Printf(\"json length:%d\\n\", len(text))\n\t}\n\treturn &text, nil\n\n}\n\nfunc (r Decrypter) GetKeyId(body []byte, idlen int64) []byte {\n\treturn body[(16 + 4 + 1):(16 + 4 + 1 + idlen)]\n}\n\nfunc (r Decrypter) GetIdlen(body []byte) (int64, error) {\n\tidlenHex := hex.EncodeToString(body[(16 + 4):(16 + 4 + 1)])\n\treturn strconv.ParseInt(idlenHex, 16, 64)\n}\nfunc (r Decrypter) GenerateSharedKey(keyId []byte) ([]byte, error) {\n\n\tp256 := elliptic.P256()\n\n\tgeneric := ecdh.Generic(p256)\n\n\tx, y := elliptic.Unmarshal(p256, keyId)\n\tif x == nil || y == nil {\n\t\treturn nil, fmt.Errorf(\"invalid keyId\")\n\t}\n\tfmt.Printf(\"x:%s, y:%s\\n\", x, y)\n\treturn generic.ComputeSecret(r.receiverPrivate, ecdh.Point{X: x, Y: y}), nil\n}\n"
  },
  {
    "path": "push-to-fcm/pkg/util/webpush_decrypter_test.go",
    "content": "package util\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\n// var (\n//      publicKey  = \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\n//\tauthSecret = \"43w_wOVYeF9XzyRyZL3O8g\"\n//\n// )\nvar (\n\texpectSharedSecret = \"oP7t4W/jHURAO+M+DQjqjljNu8D2p7+3uf48Hd2Z91c=\"\n\t// nonce              = \"OxF/eyKT/8Pt3iN8\"\n\t// recurvePrivateKey  = \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n)\n\nfunc TestSha256(t *testing.T) {\n\texpect := \"yb1GUyy4+k/dcGubgS2+QRWvBW0VgTpw3H9JLVx2Iss=\"\n\tresult := Sha256([]byte(\"hogehoge\"), []byte(\"piyopiyo\"))\n\tassert.Equal(t, expect, base64.StdEncoding.EncodeToString(result))\n}\n\nfunc TestDecodeBase64(t *testing.T) {\n\tresult, err := DecodeBase64(\"test\")\n\tassert.Nil(t, err)\n\tassert.Equal(t, []byte{0xb5, 0xeb, 0x2d}, result)\n}\n\nfunc TestDecodeBase642(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\tresult, err := DecodeBase64(publicKey)\n\n\tassert.Nil(t, err)\n\tassert.NotNil(t, result)\n\tfmt.Printf(\"base 64 result %s\", result)\n\n\tresult, err = DecodeBase64(privateKey)\n\tassert.Nil(t, err)\n\tassert.NotNil(t, result)\n\n\tresult, e := DecodeBase64(authSecret)\n\t// fmt.Printf(\"error:%s\\n\", e.Error())\n\tassert.Nil(t, e)\n\tassert.NotNil(t, result)\n\n}\nfunc TestDecrypt(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\tbody := \"B8TZpK9vmRlCbkFTLG6l5gAAEABBBE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI4dyaI36CvBMPCf1lOAF50FV7JkgvMGyuYnzgUOh5KSvjDygDpygjRdFYI7amKXXCeRSMcwqn8lXgP1G6CUI43z88+bg/piRVBEnnALn2d60vzUzQNSXUdHAGCQ6aElewpxe3xT74ua0Bxcd4tB3fFaUzpOzYApQRpIlG5ITDTd1haMCuarE5vUGO+oPMsIv1nJO5keRhcvKBWSynj3d0+pGkgajrNjdQentooEQt5GmntKus+mUzLT+UQN1KNWnR3FN9LjsXX8fTk3Vhl7NabiW+N/vDPxI0/lw0VdBNeI460XcWi8aJd6Yb4THB0DjJ5p2JwXHB3zZ1dGSOA6f2hQWTQbVM/9Kisji0SEYdmysFNJaiajax2IeP8eG5lmJ/Lsq6Fs+CCRHnEUZIENEo0Mw3H44Wx/zWG1mEJxffIeuWUFbCcyfD8JYZkvilUu6azhPkTbhidbZ/NQO8oJHU21K5qQbOxiFhPD//cUORE/aCeF8uMdS1PgCvD1I0wfGOxmj3tLOXyvjmTNVzR7jZ7jRMro69/9K2dZ0YrcVMHgZuXfr9OtBD25FoHkkZ6uOxU8rX+FBDt4Af5A3mseX72dUFuhSCYh2akdrhUldvqnjb7IQKQpLrBDh4t4YGmPgXvVs/uSa48MOWNfgWUgng2BReDD7RwT1MeF3KQObAdOaocRZFRWx51JgDv16o7qr5Q/vd5TPIXGKloMgMMwCA5sAsIhmBdBZLjpPrFEspPVJvfGgcu7Hdb/9/xRAOsXBjlcg4iDetdTjkBpr5Gysn1EJfEZZAJaOTD4kgKtKURmynxvtX/nDKLmaIUt1f8Dfo/UKhq+9HcSfoohH/9AcFQCiSPPJrfJFt1BstJi/PhwbmWAMvxwbrzRZXzmXk8iiTEqbnlOqml+dnDZ4aJUjTrCb5OxbfaGsr3kXATcKT8jNKTOK6/0r25NNyGHCXlaF7awdjzQXLamWrsa/ieFmRnrpWKGobW45uNXEwiKmXvDWcVBH5PDeKQpu3IQSdzBXJSpYtrwpwnyyMbI0h+Y8JufjLWFZqNqCpcHG7CiwnKAR3icC3MLbZOS8oxo2AHYfhWXxzuqU5apbuCAzKNtk4N86wEuFLb1XkpI2AJ9u9k8MDBUdRxhxWhgKbQ2EOh4KZeKQDD6olVWR7ECU0otyM1g3+Ej89WOSrqJGhk+S704v1A73+EED0MFaY+MjrIOhCsrgL/Tcu0bbHYjOiuoEFN3Uf75Nr/+qTS6SatkHtqyIi24Y/NWCIZ976946gtym8iWi9aJieCLNYE4IuKjhgIOVrWqo57nbg0/4OQvTubSzBbis3x1X+PrL3IrSKufEs5pzEPuRbyhQfLHJ2gL4v2S0od5v9mxT3XacJAq2rHEd3/GXIxfgwWm/s/aSAIOnxU5DIM71UbVuEKBFtpk0IGt6DzsZiC7lELGUfR/VSv7Hg0d4aMmAsHPmo5r9FDDsALxp2OfL1XMg8/rPnUvRoKjdkY61MHfH7rQoXfy3Yidtx7dHeZ/O21tT/V83HXC6xNXpcGew0wyTjWGBqhVXkRZUjN3EteFniv90gg0SIPW4zzKJ42/uf0tzg76gZiJboAqWwlXmt+FmjnMg4990vA1obltewm6NIRha6EJb4fpafsnA8Hqk/rM7zu57vBLCr22o0VC7gery4xbRMW/es=\"\n\n\tdecrypter, err := NewDecrypter(authSecret, publicKey, privateKey)\n\tassert.NotNil(t, decrypter)\n\tassert.Nil(t, err)\n\t// fmt.Printf(\"decrypter generatedああああ\\n\")\n\t// assert.Nil(t, err)\n\tkeyId := \"BE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI=\"\n\tpk, err := DecodeBase64(keyId)\n\tassert.Nil(t, err)\n\tsharedKey, err := decrypter.GenerateSharedKey(pk)\n\tassert.Nil(t, err)\n\tassert.NotEmpty(t, sharedKey)\n\tfmt.Printf(\"sharedKey:%s\\n\", sharedKey)\n\tresult, err := decrypter.Decrypt(body)\n\tassert.Nil(t, err)\n\tfmt.Printf(\"result:%s\\n\", *result)\n\n}\n\nfunc TestGenerateSharedSecret2(t *testing.T) {\n\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\n\tdecrypter, err := NewDecrypter(authSecret, publicKey, privateKey)\n\tassert.NotNil(t, decrypter)\n\tassert.Nil(t, err)\n\n\tkeyId := \"BE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI=\"\n\tpk, err := DecodeBase64(keyId)\n\n\tassert.Nil(t, err)\n\n\tsecret, err := decrypter.GenerateSharedKey(pk)\n\tassert.Nil(t, err)\n\n\texpect, err := DecodeBase64(expectSharedSecret)\n\tassert.Equal(t, expect, secret)\n\tassert.Nil(t, err)\n\n\tfmt.Printf(\"secret:%s\\n\", secret)\n\n}\n\nfunc TestHex(t *testing.T) {\n\tresult := hex.EncodeToString([]byte{5, 10, 7})\n\tassert.Equal(t, \"050a07\", result)\n\tfmt.Printf(\"hex result:%s\\n\", result)\n\tlength, err := strconv.ParseInt(result, 16, 64)\n\tassert.Nil(t, err)\n\tassert.Equal(t, int64(330247), length)\n}\n\nfunc TestIdlen(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\n\tdecrypter, err := NewDecrypter(authSecret, publicKey, privateKey)\n\tassert.NotNil(t, decrypter)\n\tassert.Nil(t, err)\n\n\tbase64Body := \"B8TZpK9vmRlCbkFTLG6l5gAAEABBBE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI4dyaI36CvBMPCf1lOAF50FV7JkgvMGyuYnzgUOh5KSvjDygDpygjRdFYI7amKXXCeRSMcwqn8lXgP1G6CUI43z88+bg/piRVBEnnALn2d60vzUzQNSXUdHAGCQ6aElewpxe3xT74ua0Bxcd4tB3fFaUzpOzYApQRpIlG5ITDTd1haMCuarE5vUGO+oPMsIv1nJO5keRhcvKBWSynj3d0+pGkgajrNjdQentooEQt5GmntKus+mUzLT+UQN1KNWnR3FN9LjsXX8fTk3Vhl7NabiW+N/vDPxI0/lw0VdBNeI460XcWi8aJd6Yb4THB0DjJ5p2JwXHB3zZ1dGSOA6f2hQWTQbVM/9Kisji0SEYdmysFNJaiajax2IeP8eG5lmJ/Lsq6Fs+CCRHnEUZIENEo0Mw3H44Wx/zWG1mEJxffIeuWUFbCcyfD8JYZkvilUu6azhPkTbhidbZ/NQO8oJHU21K5qQbOxiFhPD//cUORE/aCeF8uMdS1PgCvD1I0wfGOxmj3tLOXyvjmTNVzR7jZ7jRMro69/9K2dZ0YrcVMHgZuXfr9OtBD25FoHkkZ6uOxU8rX+FBDt4Af5A3mseX72dUFuhSCYh2akdrhUldvqnjb7IQKQpLrBDh4t4YGmPgXvVs/uSa48MOWNfgWUgng2BReDD7RwT1MeF3KQObAdOaocRZFRWx51JgDv16o7qr5Q/vd5TPIXGKloMgMMwCA5sAsIhmBdBZLjpPrFEspPVJvfGgcu7Hdb/9/xRAOsXBjlcg4iDetdTjkBpr5Gysn1EJfEZZAJaOTD4kgKtKURmynxvtX/nDKLmaIUt1f8Dfo/UKhq+9HcSfoohH/9AcFQCiSPPJrfJFt1BstJi/PhwbmWAMvxwbrzRZXzmXk8iiTEqbnlOqml+dnDZ4aJUjTrCb5OxbfaGsr3kXATcKT8jNKTOK6/0r25NNyGHCXlaF7awdjzQXLamWrsa/ieFmRnrpWKGobW45uNXEwiKmXvDWcVBH5PDeKQpu3IQSdzBXJSpYtrwpwnyyMbI0h+Y8JufjLWFZqNqCpcHG7CiwnKAR3icC3MLbZOS8oxo2AHYfhWXxzuqU5apbuCAzKNtk4N86wEuFLb1XkpI2AJ9u9k8MDBUdRxhxWhgKbQ2EOh4KZeKQDD6olVWR7ECU0otyM1g3+Ej89WOSrqJGhk+S704v1A73+EED0MFaY+MjrIOhCsrgL/Tcu0bbHYjOiuoEFN3Uf75Nr/+qTS6SatkHtqyIi24Y/NWCIZ976946gtym8iWi9aJieCLNYE4IuKjhgIOVrWqo57nbg0/4OQvTubSzBbis3x1X+PrL3IrSKufEs5pzEPuRbyhQfLHJ2gL4v2S0od5v9mxT3XacJAq2rHEd3/GXIxfgwWm/s/aSAIOnxU5DIM71UbVuEKBFtpk0IGt6DzsZiC7lELGUfR/VSv7Hg0d4aMmAsHPmo5r9FDDsALxp2OfL1XMg8/rPnUvRoKjdkY61MHfH7rQoXfy3Yidtx7dHeZ/O21tT/V83HXC6xNXpcGew0wyTjWGBqhVXkRZUjN3EteFniv90gg0SIPW4zzKJ42/uf0tzg76gZiJboAqWwlXmt+FmjnMg4990vA1obltewm6NIRha6EJb4fpafsnA8Hqk/rM7zu57vBLCr22o0VC7gery4xbRMW/es=\"\n\n\tenc, err := DecodeBase64(base64Body)\n\tassert.Nil(t, err)\n\tidlen, err := decrypter.GetIdlen(enc)\n\tassert.Nil(t, err)\n\tassert.Equal(t, int64(65), idlen)\n\n}\n\nfunc TestGetKeyId(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\n\tdecrypter, _ := NewDecrypter(authSecret, publicKey, privateKey)\n\n\tbase64Body := \"B8TZpK9vmRlCbkFTLG6l5gAAEABBBE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI4dyaI36CvBMPCf1lOAF50FV7JkgvMGyuYnzgUOh5KSvjDygDpygjRdFYI7amKXXCeRSMcwqn8lXgP1G6CUI43z88+bg/piRVBEnnALn2d60vzUzQNSXUdHAGCQ6aElewpxe3xT74ua0Bxcd4tB3fFaUzpOzYApQRpIlG5ITDTd1haMCuarE5vUGO+oPMsIv1nJO5keRhcvKBWSynj3d0+pGkgajrNjdQentooEQt5GmntKus+mUzLT+UQN1KNWnR3FN9LjsXX8fTk3Vhl7NabiW+N/vDPxI0/lw0VdBNeI460XcWi8aJd6Yb4THB0DjJ5p2JwXHB3zZ1dGSOA6f2hQWTQbVM/9Kisji0SEYdmysFNJaiajax2IeP8eG5lmJ/Lsq6Fs+CCRHnEUZIENEo0Mw3H44Wx/zWG1mEJxffIeuWUFbCcyfD8JYZkvilUu6azhPkTbhidbZ/NQO8oJHU21K5qQbOxiFhPD//cUORE/aCeF8uMdS1PgCvD1I0wfGOxmj3tLOXyvjmTNVzR7jZ7jRMro69/9K2dZ0YrcVMHgZuXfr9OtBD25FoHkkZ6uOxU8rX+FBDt4Af5A3mseX72dUFuhSCYh2akdrhUldvqnjb7IQKQpLrBDh4t4YGmPgXvVs/uSa48MOWNfgWUgng2BReDD7RwT1MeF3KQObAdOaocRZFRWx51JgDv16o7qr5Q/vd5TPIXGKloMgMMwCA5sAsIhmBdBZLjpPrFEspPVJvfGgcu7Hdb/9/xRAOsXBjlcg4iDetdTjkBpr5Gysn1EJfEZZAJaOTD4kgKtKURmynxvtX/nDKLmaIUt1f8Dfo/UKhq+9HcSfoohH/9AcFQCiSPPJrfJFt1BstJi/PhwbmWAMvxwbrzRZXzmXk8iiTEqbnlOqml+dnDZ4aJUjTrCb5OxbfaGsr3kXATcKT8jNKTOK6/0r25NNyGHCXlaF7awdjzQXLamWrsa/ieFmRnrpWKGobW45uNXEwiKmXvDWcVBH5PDeKQpu3IQSdzBXJSpYtrwpwnyyMbI0h+Y8JufjLWFZqNqCpcHG7CiwnKAR3icC3MLbZOS8oxo2AHYfhWXxzuqU5apbuCAzKNtk4N86wEuFLb1XkpI2AJ9u9k8MDBUdRxhxWhgKbQ2EOh4KZeKQDD6olVWR7ECU0otyM1g3+Ej89WOSrqJGhk+S704v1A73+EED0MFaY+MjrIOhCsrgL/Tcu0bbHYjOiuoEFN3Uf75Nr/+qTS6SatkHtqyIi24Y/NWCIZ976946gtym8iWi9aJieCLNYE4IuKjhgIOVrWqo57nbg0/4OQvTubSzBbis3x1X+PrL3IrSKufEs5pzEPuRbyhQfLHJ2gL4v2S0od5v9mxT3XacJAq2rHEd3/GXIxfgwWm/s/aSAIOnxU5DIM71UbVuEKBFtpk0IGt6DzsZiC7lELGUfR/VSv7Hg0d4aMmAsHPmo5r9FDDsALxp2OfL1XMg8/rPnUvRoKjdkY61MHfH7rQoXfy3Yidtx7dHeZ/O21tT/V83HXC6xNXpcGew0wyTjWGBqhVXkRZUjN3EteFniv90gg0SIPW4zzKJ42/uf0tzg76gZiJboAqWwlXmt+FmjnMg4990vA1obltewm6NIRha6EJb4fpafsnA8Hqk/rM7zu57vBLCr22o0VC7gery4xbRMW/es=\"\n\tenc, _ := DecodeBase64(base64Body)\n\tidlen, _ := decrypter.GetIdlen(enc)\n\tkeyId := decrypter.GetKeyId(enc, idlen)\n\n\texpectKeyId := \"BE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI=\"\n\texpect, _ := DecodeBase64(expectKeyId)\n\tassert.Equal(t, expect, keyId)\n\n}\n\nfunc TestByteConvert(t *testing.T) {\n\texpect := []byte{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x61, 0x65, 0x73, 0x31, 0x32, 0x38, 0x67, 0x63, 0x6d, 0x00, 0x01}\n\tcekInfo := \"Content-Encoding: aes128gcm\\000\\001\"\n\tassert.Equal(t, expect, []byte(cekInfo))\n\t//43 6f 6e 74 65 6e 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 61 65 73 31 32 38 67 63 6d 00 01\n}\n"
  },
  {
    "path": "server/Dockerfile",
    "content": "FROM golang:1.18.7-bullseye\n\nENV GOPATH /go\nENV GO111MODULE on\n\nRUN apt update && \\\n    apt install git\n\nRUN mkdir /go/src/app\nWORKDIR /go/src/app\n\nADD ./api /go/src/app\n\nRUN go mod tidy && \\\n    go install github.com/cosmtrek/air@v1.27.3\n\nCMD [\"air\", \"-c\", \".air.toml\"]"
  },
  {
    "path": "server/Dockerfile.production",
    "content": "FROM golang:1.18.7-bullseye\nENV GOPATH /go\nENV GO111MODULE on\n\nRUN apt update && \\\n    apt install git\n\nRUN mkdir /go/src/app\nWORKDIR /go/src/app\n\nCOPY ./api /go/src/app\n\n\nCMD [\"go\", \"run\", \"main.go\"]"
  },
  {
    "path": "server/api/.air.toml",
    "content": "\n\n# Config file for [Air](https://github.com/cosmtrek/air) in TOML format\n\n# Working directory\n# . or absolute path, please note that the directories following must be under root.\nroot = \".\"\ntmp_dir = \"tmp\"\n\n[build]\n# Just plain old shell command. You could use `make` as well.\ncmd = \"go build -o ./tmp/main .\"\n# Binary file yields from `cmd`.\nbin = \"tmp/main\"\n# Customize binary, can setup environment variables when run your app.\nfull_bin = \"APP_ENV=dev APP_USER=air ./tmp/main\"\n# Watch these filename extensions.\ninclude_ext = [\"go\", \"tpl\", \"tmpl\", \"html\"]\n# Ignore these filename extensions or directories.\nexclude_dir = [\"assets\", \"tmp\", \"vendor\", \"client/node_modules\", \"client.old\"]\n# Watch these directories if you specified.\ninclude_dir = []\n# Exclude files.\nexclude_file = []\n# Exclude specific regular expressions.\nexclude_regex = [\"_test.go\"]\n# Exclude unchanged files.\nexclude_unchanged = true\n# Follow symlink for directories\nfollow_symlink = true\n# This log file places in your tmp_dir.\nlog = \"air.log\"\n# It's not necessary to trigger build each time file changes if it's too frequent.\ndelay = 1000 # ms\n# Stop running old binary when build errors occur.\nstop_on_error = true\n# Send Interrupt signal before killing process (windows does not support this feature)\nsend_interrupt = false\n# Delay after sending Interrupt signal\nkill_delay = 500 # ms\n\n[log]\n# Show log time\ntime = false\n\n[color]\n# Customize each part's color. If no color found, use the raw app log.\nmain = \"magenta\"\nwatcher = \"cyan\"\nbuild = \"yellow\"\nrunner = \"green\"\n\n[misc]\n# Delete tmp directory on exit\nclean_on_exit = true"
  },
  {
    "path": "server/api/.gitignore",
    "content": "# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,go,intellij,androidstudio\n# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,go,intellij,androidstudio\n\n### Go ###\n# If you prefer the allow list template instead of the deny list, see community template:\n# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore\n#\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\n\n# Test binary, built with `go test -c`\n*.test\n\n# Output of the go coverage tool, specifically when used with LiteIDE\n*.out\n\n# Dependency directories (remove the comment below to include it)\n# vendor/\n\n# Go workspace file\ngo.work\n\n### Go Patch ###\n/vendor/\n/Godeps/\n\n### Intellij ###\n# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider\n# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839\n\n# User-specific stuff\n.idea/**/workspace.xml\n.idea/**/tasks.xml\n.idea/**/usage.statistics.xml\n.idea/**/dictionaries\n.idea/**/shelf\n\n# AWS User-specific\n.idea/**/aws.xml\n\n# Generated files\n.idea/**/contentModel.xml\n\n# Sensitive or high-churn files\n.idea/**/dataSources/\n.idea/**/dataSources.ids\n.idea/**/dataSources.local.xml\n.idea/**/sqlDataSources.xml\n.idea/**/dynamic.xml\n.idea/**/uiDesigner.xml\n.idea/**/dbnavigator.xml\n\n# Gradle\n.idea/**/gradle.xml\n.idea/**/libraries\n\n# Gradle and Maven with auto-import\n# When using Gradle or Maven with auto-import, you should exclude module files,\n# since they will be recreated, and may cause churn.  Uncomment if using\n# auto-import.\n# .idea/artifacts\n# .idea/compiler.xml\n# .idea/jarRepositories.xml\n# .idea/modules.xml\n# .idea/*.iml\n# .idea/modules\n# *.iml\n# *.ipr\n\n# CMake\ncmake-build-*/\n\n# Mongo Explorer plugin\n.idea/**/mongoSettings.xml\n\n# File-based project format\n*.iws\n\n# IntelliJ\nout/\n\n# mpeltonen/sbt-idea plugin\n.idea_modules/\n\n# JIRA plugin\natlassian-ide-plugin.xml\n\n# Cursive Clojure plugin\n.idea/replstate.xml\n\n# SonarLint plugin\n.idea/sonarlint/\n\n# Crashlytics plugin (for Android Studio and IntelliJ)\ncom_crashlytics_export_strings.xml\ncrashlytics.properties\ncrashlytics-build.properties\nfabric.properties\n\n# Editor-based Rest Client\n.idea/httpRequests\n\n# Android studio 3.1+ serialized cache file\n.idea/caches/build_file_checksums.ser\n\n### Intellij Patch ###\n# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721\n\n# *.iml\n# modules.xml\n# .idea/misc.xml\n# *.ipr\n\n# Sonarlint plugin\n# https://plugins.jetbrains.com/plugin/7973-sonarlint\n.idea/**/sonarlint/\n\n# SonarQube Plugin\n# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin\n.idea/**/sonarIssues.xml\n\n# Markdown Navigator plugin\n# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced\n.idea/**/markdown-navigator.xml\n.idea/**/markdown-navigator-enh.xml\n.idea/**/markdown-navigator/\n\n# Cache file creation bug\n# See https://youtrack.jetbrains.com/issue/JBR-2257\n.idea/$CACHE_FILE$\n\n# CodeStream plugin\n# https://plugins.jetbrains.com/plugin/12206-codestream\n.idea/codestream.xml\n\n# Azure Toolkit for IntelliJ plugin\n# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij\n.idea/**/azureSettings.xml\n\n### VisualStudioCode ###\n.vscode/*\n!.vscode/settings.json\n!.vscode/tasks.json\n!.vscode/launch.json\n!.vscode/extensions.json\n!.vscode/*.code-snippets\n\n# Local History for Visual Studio Code\n.history/\n\n# Built Visual Studio Code Extensions\n*.vsix\n\n### VisualStudioCode Patch ###\n# Ignore all local history of files\n.history\n.ionide\n\n# Support for Project snippet scope\n.vscode/*.code-snippets\n\n# Ignore code-workspaces\n*.code-workspace\n\n### AndroidStudio ###\n# Covers files to be ignored for android development using Android Studio.\n\n# Built application files\n*.apk\n*.ap_\n*.aab\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\n\n# Gradle files\n.gradle\n.gradle/\nbuild/\n\n# Signing files\n.signing/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Log Files\n*.log\n\n# Android Studio\n/*/build/\n/*/local.properties\n/*/out\n/*/*/build\n/*/*/production\ncaptures/\n.navigation/\n*.ipr\n*~\n*.swp\n\n# Keystore files\n*.jks\n*.keystore\n\n# Google Services (e.g. APIs or Firebase)\n# google-services.json\n\n# Android Patch\ngen-external-apklibs\n\n# External native build folder generated in Android Studio 2.2 and later\n.externalNativeBuild\n\n# NDK\nobj/\n\n# IntelliJ IDEA\n*.iml\n/out/\n\n# User-specific configurations\n.idea/caches/\n.idea/libraries/\n.idea/shelf/\n.idea/workspace.xml\n.idea/tasks.xml\n.idea/.name\n.idea/compiler.xml\n.idea/copyright/profiles_settings.xml\n.idea/encodings.xml\n.idea/misc.xml\n.idea/modules.xml\n.idea/scopes/scope_settings.xml\n.idea/dictionaries\n.idea/vcs.xml\n.idea/jsLibraryMappings.xml\n.idea/datasources.xml\n.idea/dataSources.ids\n.idea/sqlDataSources.xml\n.idea/dynamic.xml\n.idea/uiDesigner.xml\n.idea/assetWizardSettings.xml\n.idea/gradle.xml\n.idea/jarRepositories.xml\n.idea/navEditor.xml\n\n# Legacy Eclipse project files\n.classpath\n.project\n.cproject\n.settings/\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.war\n*.ear\n\n# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml)\nhs_err_pid*\n\n## Plugin-specific files:\n\n# mpeltonen/sbt-idea plugin\n\n# JIRA plugin\n\n# Mongo Explorer plugin\n.idea/mongoSettings.xml\n\n# Crashlytics plugin (for Android Studio and IntelliJ)\n\n### AndroidStudio Patch ###\n\n!/gradle/wrapper/gradle-wrapper.jar\n\n# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,go,intellij,androidstudio\n\n/tmp"
  },
  {
    "path": "server/api/cli/create_admin_account/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\n\t\"systems.panta.milktea/pkg/dao\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\nfunc main() {\n\n\tfmt.Printf(\"アカウント登録を開始します\")\n\tfmt.Printf(\"Emailアドレスを入力してください\")\n\tvar email string\n\tfmt.Scan(&email)\n\n\tfmt.Printf(\"パスワードを入力してください\")\n\tvar password string\n\tfmt.Scan(&password)\n\n\tdao := dao.Init()\n\n\tfmt.Printf(\"以下内容で登録します。\\n\")\n\tfmt.Printf(\"Email:%s, Password:%s\", email, password)\n\taccount := domain.AdAccount{\n\t\tEmail: email,\n\t}\n\taccount.SetPassword(password)\n\tresult, err := dao.NewAdAccountRepository().Create(&account)\n\tif err != nil {\n\t\tfmt.Printf(\"登録に失敗しました\")\n\t} else {\n\t\tfmt.Printf(\"登録に成功しました ID:%s\", result.Id)\n\t}\n\n}\n"
  },
  {
    "path": "server/api/config/.gitignore",
    "content": "*\n!.gitignore"
  },
  {
    "path": "server/api/go.mod",
    "content": "module systems.panta.milktea\n\ngo 1.18\n\nrequire (\n\tgithub.com/aead/ecdh v0.2.0\n\tgithub.com/gin-gonic/gin v1.9.1\n\tgithub.com/google/uuid v1.3.0\n\tgithub.com/stretchr/testify v1.8.3\n\tgolang.org/x/crypto v0.9.0\n\tgorm.io/driver/postgres v1.4.4\n\tgorm.io/gorm v1.24.0\n)\n\nrequire (\n\tgithub.com/bytedance/sonic v1.9.1 // indirect\n\tgithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect\n\tgithub.com/davecgh/go-spew v1.1.1 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.2 // indirect\n\tgithub.com/gin-contrib/sse v0.1.0 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.14.0 // indirect\n\tgithub.com/goccy/go-json v0.10.2 // indirect\n\tgithub.com/jackc/chunkreader/v2 v2.0.1 // indirect\n\tgithub.com/jackc/pgconn v1.13.0 // indirect\n\tgithub.com/jackc/pgio v1.0.0 // indirect\n\tgithub.com/jackc/pgpassfile v1.0.0 // indirect\n\tgithub.com/jackc/pgproto3/v2 v2.3.1 // indirect\n\tgithub.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect\n\tgithub.com/jackc/pgtype v1.12.0 // indirect\n\tgithub.com/jackc/pgx/v4 v4.17.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.4 // indirect\n\tgithub.com/leodido/go-urn v1.2.4 // indirect\n\tgithub.com/lib/pq v1.10.7 // indirect\n\tgithub.com/mattn/go-isatty v0.0.19 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.0.8 // indirect\n\tgithub.com/pmezard/go-difflib v1.0.0 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.2.11 // indirect\n\tgolang.org/x/arch v0.3.0 // indirect\n\tgolang.org/x/net v0.10.0 // indirect\n\tgolang.org/x/sys v0.8.0 // indirect\n\tgolang.org/x/text v0.9.0 // indirect\n\tgoogle.golang.org/protobuf v1.30.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n)\n"
  },
  {
    "path": "server/api/go.sum",
    "content": "github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=\ngithub.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=\ngithub.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=\ngithub.com/aead/ecdh v0.2.0 h1:pYop54xVaq/CEREFEcukHRZfTdjiWvYIsZDXXrBapQQ=\ngithub.com/aead/ecdh v0.2.0/go.mod h1:a9HHtXuSo8J1Js1MwLQx2mBhkXMT6YwUmVVEY4tTB8U=\ngithub.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=\ngithub.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s=\ngithub.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=\ngithub.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=\ngithub.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=\ngithub.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=\ngithub.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=\ngithub.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=\ngithub.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=\ngithub.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=\ngithub.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=\ngithub.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=\ngithub.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=\ngithub.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=\ngithub.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=\ngithub.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=\ngithub.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=\ngithub.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=\ngithub.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=\ngithub.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=\ngithub.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=\ngithub.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=\ngithub.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=\ngithub.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=\ngithub.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js=\ngithub.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=\ngithub.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=\ngithub.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=\ngithub.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=\ngithub.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=\ngithub.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=\ngithub.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=\ngithub.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=\ngithub.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=\ngithub.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=\ngithub.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=\ngithub.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=\ngithub.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=\ngithub.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=\ngithub.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=\ngithub.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=\ngithub.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=\ngithub.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=\ngithub.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=\ngithub.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=\ngithub.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=\ngithub.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=\ngithub.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=\ngithub.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=\ngithub.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI=\ngithub.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=\ngithub.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=\ngithub.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=\ngithub.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=\ngithub.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=\ngithub.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=\ngithub.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=\ngithub.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=\ngithub.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=\ngithub.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=\ngithub.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=\ngithub.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=\ngithub.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=\ngithub.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=\ngithub.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=\ngithub.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=\ngithub.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=\ngithub.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=\ngithub.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=\ngithub.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=\ngithub.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=\ngithub.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=\ngithub.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=\ngithub.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=\ngithub.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=\ngithub.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=\ngithub.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=\ngithub.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=\ngithub.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=\ngithub.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=\ngithub.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw=\ngithub.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=\ngithub.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=\ngithub.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=\ngithub.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=\ngithub.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=\ngithub.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=\ngithub.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=\ngithub.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=\ngithub.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=\ngithub.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=\ngithub.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=\ngithub.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=\ngithub.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=\ngithub.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=\ngithub.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=\ngithub.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=\ngithub.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=\ngithub.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=\ngithub.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=\ngithub.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=\ngithub.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=\ngithub.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=\ngithub.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=\ngithub.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=\ngithub.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=\ngithub.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=\ngithub.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=\ngithub.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=\ngithub.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=\ngithub.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=\ngithub.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=\ngithub.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=\ngithub.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=\ngithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=\ngithub.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=\ngithub.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=\ngithub.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=\ngithub.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=\ngithub.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=\ngithub.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=\ngithub.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=\ngithub.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=\ngithub.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=\ngithub.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=\ngithub.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=\ngithub.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=\ngithub.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=\ngithub.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=\ngithub.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=\ngithub.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=\ngithub.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=\ngithub.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=\ngithub.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=\ngithub.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=\ngithub.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=\ngithub.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=\ngithub.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=\ngithub.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=\ngithub.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=\ngithub.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=\ngithub.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=\ngithub.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=\ngithub.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=\ngithub.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=\ngithub.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=\ngithub.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=\ngithub.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=\ngithub.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=\ngithub.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=\ngithub.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=\ngo.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=\ngo.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=\ngo.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=\ngo.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=\ngo.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=\ngo.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=\ngo.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=\ngo.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=\ngo.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=\ngolang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=\ngolang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=\ngolang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=\ngolang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=\ngolang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=\ngolang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=\ngolang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=\ngolang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=\ngolang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=\ngolang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=\ngolang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=\ngolang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=\ngolang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=\ngolang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=\ngolang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=\ngolang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=\ngolang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=\ngolang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=\ngolang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=\ngolang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=\ngolang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=\ngolang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=\ngolang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=\ngolang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=\ngolang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=\ngolang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=\ngolang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngolang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=\ngolang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=\ngolang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=\ngolang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=\ngolang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=\ngolang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=\ngolang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=\ngolang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=\ngolang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=\ngolang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=\ngolang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=\ngolang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=\ngolang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=\ngoogle.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=\ngoogle.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=\ngoogle.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=\ngopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=\ngopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=\ngopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=\ngopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=\ngopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=\ngopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=\ngopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=\ngorm.io/driver/postgres v1.4.4 h1:zt1fxJ+C+ajparn0SteEnkoPg0BQ6wOWXEQ99bteAmw=\ngorm.io/driver/postgres v1.4.4/go.mod h1:whNfh5WhhHs96honoLjBAMwJGYEuA3m1hvgUbNXhPCw=\ngorm.io/gorm v1.23.7/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=\ngorm.io/gorm v1.24.0 h1:j/CoiSm6xpRpmzbFJsQHYj+I8bGYWLXVHeYEyyKlF74=\ngorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=\nhonnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=\nrsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=\n"
  },
  {
    "path": "server/api/main.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"systems.panta.milktea/pkg/config\"\n\t\"systems.panta.milktea/pkg/dao\"\n\t\"systems.panta.milktea/pkg/domain\"\n\t\"systems.panta.milktea/pkg/handler\"\n\t\"systems.panta.milktea/pkg/handler/admin\"\n)\n\nfunc main() {\n\tfmt.Printf(\"Test\")\n\tconfig, err := config.LoadConfig()\n\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\td := dao.Init()\n\tengine := gin.Default()\n\n\tengine.GET(\"/api/ping\", func(c *gin.Context) {\n\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\"message\": \"pongggg\",\n\t\t})\n\t})\n\tinstanceHnadler := handler.InstanceHandler{\n\t\tDao: d,\n\t}\n\n\tadminAccountHandler := admin.AccountHandler{\n\t\tDao: d,\n\t}\n\n\tadminInstanceHandler := admin.AdminInstanceHandler{\n\t\tDao: d,\n\t}\n\n\tdecrypter, err := domain.NewDecrypter(config.WebPushAuthSecret, config.WebPushPublicKey, config.WebPushPrivateKey)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tpushToFcmHandler := handler.PushToFCMHandler{\n\t\tDecrypter: *decrypter,\n\t\tDao:       d,\n\t}\n\n\tinstanceHnadler.Setup(engine)\n\tadminAccountHandler.Setup(engine)\n\tpushToFcmHandler.Setup(engine)\n\tadminInstanceHandler.Setup(engine)\n\n\tengine.Run(\":8080\")\n}\n"
  },
  {
    "path": "server/api/pkg/config/config.go",
    "content": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n)\n\ntype Config struct {\n\tWebPushAuthSecret string `json:\"webPushAuthSecret\"`\n\tWebPushPrivateKey string `json:\"webPushPrivateKey\"`\n\tWebPushPublicKey  string `json:\"webPushPublicKey\"`\n}\n\nfunc LoadConfig() (*Config, error) {\n\tf, err := os.Open(\"config/config.json\")\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer f.Close()\n\n\tvar config Config\n\terr = json.NewDecoder(f).Decode(&config)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\treturn &config, err\n}\n"
  },
  {
    "path": "server/api/pkg/dao/account_dao.go",
    "content": "package dao\n\nimport (\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/clause\"\n\t\"systems.panta.milktea/pkg/domain\"\n\t\"systems.panta.milktea/pkg/repository\"\n)\n\ntype AdAccountDAO struct {\n\tdb gorm.DB\n}\n\nfunc (r AdAccountDAO) FindByEmail(email string) (*domain.AdAccount, error) {\n\tvar account *domain.AdAccount\n\tif result := r.db.Where(\"email = ?\", email).First(&account); result.Error != nil {\n\t\tif result.Error == gorm.ErrRecordNotFound {\n\t\t\treturn nil, nil\n\t\t}\n\t\treturn nil, result.Error\n\t}\n\treturn account, nil\n}\n\nfunc (r AdAccountDAO) Create(account *domain.AdAccount) (*domain.AdAccount, error) {\n\tif result := r.db.Create(account); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn r.FindOne(account.Id)\n}\n\nfunc (r AdAccountDAO) Delete(id uuid.UUID) error {\n\tif result := r.db.Delete(&domain.AdAccount{}, id); result.Error != nil {\n\t\treturn result.Error\n\t}\n\treturn nil\n}\n\nfunc (r AdAccountDAO) FindOne(id uuid.UUID) (*domain.AdAccount, error) {\n\tvar account domain.AdAccount\n\tif result := r.db.Preload(clause.Associations).First(&account, id); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn &account, nil\n}\n\nfunc (r AdAccountDAO) FindByToken(token string) (*domain.AdAccount, error) {\n\tvar tokenModel domain.Token\n\tif result := r.db.Where(\"token = ?\", token).First(&tokenModel); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn r.FindOne(tokenModel.AdAccountId)\n}\n\nfunc (r AdAccountDAO) CreateToken(accountId uuid.UUID, ipAddress string) (*domain.Token, error) {\n\ttoken := domain.Token{\n\t\tAdAccountId: accountId,\n\t\tIpAddress:   ipAddress,\n\t}\n\tif result := r.db.Create(&token); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn &token, nil\n}\n\nfunc (r AdAccountDAO) RemoveToken(token domain.Token) error {\n\tresult := r.db.Delete(&domain.Token{}, token.ID)\n\treturn result.Error\n}\n\nfunc NewAccountDAO(db gorm.DB) repository.AdAccountRepository {\n\treturn AdAccountDAO{db: db}\n}\n"
  },
  {
    "path": "server/api/pkg/dao/dao.go",
    "content": "package dao\n\nimport (\n\t\"gorm.io/driver/postgres\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/pkg/domain\"\n\t\"systems.panta.milktea/pkg/repository\"\n)\n\ntype Dao struct {\n\tdb *gorm.DB\n}\n\nfunc Init() Dao {\n\tdsn := \"host=psql user=dbuser password=secret dbname=database port=5432 sslmode=disable TimeZone=Asia/Tokyo\"\n\n\tdb, err := gorm.Open(postgres.Open(dsn))\n\tif err != nil {\n\t\tpanic(\"db connection error\")\n\t}\n\tif err := db.AutoMigrate(&domain.Instance{}, &domain.Meta{}, &domain.AdAccount{}, &domain.Token{}); err != nil {\n\t\tpanic(err)\n\t}\n\treturn Dao{\n\t\tdb: db,\n\t}\n}\n\nfunc (r *Dao) NewInstanceRepository() repository.InstanceRepository {\n\treturn NewInstanceRepository(*r.db)\n}\n\nfunc (r *Dao) NewMetaRepository() repository.MetaRepository {\n\treturn NewMetaDao(*r.db)\n}\n\nfunc (r *Dao) NewAdAccountRepository() repository.AdAccountRepository {\n\treturn NewAccountDAO(*r.db)\n}\n"
  },
  {
    "path": "server/api/pkg/dao/instance_dao.go",
    "content": "package dao\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/pkg/domain\"\n\t\"systems.panta.milktea/pkg/repository\"\n)\n\ntype InstanceDao struct {\n\tdb gorm.DB\n}\n\nvar columns = []string{\n\t\"instances.id\",\n\t\"instances.host\",\n\t\"meta.name\", \"meta.description\",\n\t\"instances.client_max_body_byte_size\",\n\t\"meta.icon_url\",\n\t\"meta.theme_color\",\n}\n\nfunc (r InstanceDao) Approve(instance domain.Instance) (*domain.Instance, error) {\n\ti, err := r.FindById(instance.Id)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\ti.Approve()\n\tif result := r.db.Model(&domain.Instance{}).\n\t\tWhere(\"id = ?\", instance.Id).\n\t\tUpdates(map[string]interface{}{\n\t\t\t\"PublishedAt\": i.PublishedAt,\n\t\t}); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\n\treturn r.FindById(instance.Id)\n}\n\nfunc (r InstanceDao) Request(instance domain.Instance) (*domain.Instance, error) {\n\ti, err := r.FindByHost(instance.Host)\n\tif err != nil && err != gorm.ErrRecordNotFound {\n\t\treturn nil, err\n\t}\n\tfmt.Printf(\"第一段階突破\")\n\tif i == nil || err == gorm.ErrRecordNotFound {\n\t\tinstance.PublishedAt = nil\n\t\treturn r.Create(instance)\n\t} else {\n\t\treturn i, err\n\t}\n\n}\n\nfunc (r InstanceDao) FindByPublishedInstances() ([]domain.InstanceInfo, error) {\n\tvar list []domain.InstanceInfo\n\tif result := r.db.\n\t\tTable(\"instances\").\n\t\tSelect(\n\t\t\tcolumns,\n\t\t).\n\t\tWhere(\"instances.published_at is not null\").\n\t\tWhere(\"instances.deleted_at is null\").\n\t\tJoins(\"LEFT JOIN meta ON instances.host = meta.host\").\n\t\tFind(&list); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn list, nil\n\n}\n\nfunc (r InstanceDao) FindById(instanceId uuid.UUID) (*domain.Instance, error) {\n\tvar instance *domain.Instance\n\tif result := r.db.First(&instance, instanceId); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn instance, nil\n}\n\nfunc (r InstanceDao) Create(instance domain.Instance) (*domain.Instance, error) {\n\tif result := r.db.Create(&instance); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\n\treturn r.FindById(instance.Id)\n}\n\nfunc (r InstanceDao) FindByHost(host string) (*domain.Instance, error) {\n\tvar instance domain.Instance\n\tif result := r.db.Where(\"host = ?\", host).First(&instance); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn &instance, nil\n}\n\nfunc (r InstanceDao) FindAll() ([]*domain.Instance, error) {\n\tvar instances []*domain.Instance\n\tif result := r.db.Find(&instances); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn instances, nil\n}\n\nfunc (r InstanceDao) Update(instance domain.Instance) error {\n\n\tif result := r.db.Model(&domain.Instance{}).\n\t\tWhere(\"id = ?\", instance.Id).\n\t\tUpdates(map[string]interface{}{\n\t\t\t\"ClientMaxBodyByteSize\": instance.ClientMaxBodyByteSize,\n\t\t\t\"PublishedAt\":           instance.PublishedAt,\n\t\t}); result.Error != nil {\n\t\treturn result.Error\n\t}\n\treturn nil\n}\n\nfunc (r InstanceDao) FindInstanceInfoByHost(host string, published bool) (*domain.InstanceInfo, error) {\n\tvar instanceInfo domain.InstanceInfo\n\tquery := r.db.Table(\"instances\").\n\t\tSelect(columns).\n\t\tWhere(\"instances.deleted_at is null\").\n\t\tWhere(\"instances.host = ?\", host).\n\t\tJoins(\"LEFT JOIN meta ON instances.host = meta.host\")\n\tif published {\n\t\tquery = query.Where(\"instances.published_at is not null\")\n\t}\n\tif result := query.First(&instanceInfo); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn &instanceInfo, nil\n}\n\nfunc NewInstanceRepository(db gorm.DB) repository.InstanceRepository {\n\treturn InstanceDao{db: db}\n}\n"
  },
  {
    "path": "server/api/pkg/dao/meta_dao.go",
    "content": "package dao\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/pkg/domain\"\n\t\"systems.panta.milktea/pkg/repository\"\n)\n\ntype MetaDao struct {\n\tdb gorm.DB\n}\n\nfunc (r MetaDao) Sync(host string) (*domain.Meta, error) {\n\turl := \"https://\" + host + \"/api/meta\"\n\treq, err := http.NewRequest(\"POST\", url, nil)\n\treq.Header.Set(\"Content-Type\", \"application/json\")\n\tclient := &http.Client{}\n\thttpRes, httpErr := client.Do(req)\n\n\tif httpErr != nil {\n\t\treturn nil, httpErr\n\t}\n\tif httpRes.StatusCode != 200 {\n\t\treturn nil, fmt.Errorf(\"Failed Request meta\")\n\t}\n\n\tbody, err := ioutil.ReadAll(httpRes.Body)\n\tif err != nil {\n\n\t\treturn nil, err\n\t}\n\n\tvar meta MisskeyMeta\n\tif err := json.Unmarshal(body, &meta); err != nil {\n\n\t\treturn nil, err\n\t}\n\treturn r.Save(domain.Meta{\n\t\tHost:        host,\n\t\tName:        meta.Name,\n\t\tDescription: meta.Description,\n\t\tThemeColor:  meta.ThemeColor,\n\t\tBannerUrl:   meta.BannerUrl,\n\t\tIconUrl:     meta.IconUrl,\n\t})\n\n}\n\nfunc (r MetaDao) FindByHost(host string) (*domain.Meta, error) {\n\tvar meta domain.Meta\n\tif result := r.db.Where(\"host = ?\", host).\n\t\tFirst(&meta); result.Error != nil {\n\t\treturn nil, result.Error\n\t}\n\treturn &meta, nil\n}\n\nfunc (r MetaDao) Save(meta domain.Meta) (*domain.Meta, error) {\n\tm, err := r.FindByHost(meta.Host)\n\tif m == nil && err != gorm.ErrRecordNotFound {\n\t\treturn nil, err\n\t}\n\n\tif m == nil {\n\t\tr.db.Create(&meta)\n\n\t} else {\n\t\tr.db.Save(meta)\n\t}\n\treturn r.FindByHost(meta.Host)\n\n}\nfunc NewMetaDao(db gorm.DB) repository.MetaRepository {\n\treturn MetaDao{\n\t\tdb: db,\n\t}\n}\n\ntype MisskeyMeta struct {\n\tName        *string `json:\"name\"`\n\tDescription *string `json:\"description\"`\n\tThemeColor  *string `json:\"themeColor\"`\n\tBannerUrl   *string `json:\"bannerUrl\"`\n\tIconUrl     *string `json:\"iconUrl\"`\n}\n"
  },
  {
    "path": "server/api/pkg/domain/account.go",
    "content": "package domain\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t\"golang.org/x/crypto/bcrypt\"\n\t\"gorm.io/gorm\"\n)\n\ntype AdAccount struct {\n\tId                uuid.UUID `json:\"id\" gorm:\"primaryKey\"`\n\tCreatedAt         time.Time `json:\"createdAt\"`\n\tUpdatedAt         time.Time `json:\"updatedAt\"`\n\tEmail             string    `json:\"-\" gorm:\"unique\"`\n\tEncryptedPassword string    `json:\"-\"`\n\tTokens            []*Token  `json:\"-\"`\n}\n\nfunc (r *AdAccount) BeforeCreate(tx *gorm.DB) (err error) {\n\tid, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn nil\n\t}\n\tr.Id = id\n\n\treturn nil\n}\n\nfunc (r *AdAccount) SetPassword(password string) bool {\n\thash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)\n\tif err != nil {\n\t\treturn false\n\t}\n\tr.EncryptedPassword = string(hash)\n\treturn true\n}\n\nfunc (r *AdAccount) CheckPassword(password string) error {\n\treturn bcrypt.CompareHashAndPassword([]byte(r.EncryptedPassword), []byte(password))\n}\n\nfunc (r *AdAccount) GetToken(token string) *Token {\n\tfor _, t := range r.Tokens {\n\t\tif t.Token == token {\n\t\t\treturn t\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "server/api/pkg/domain/instance.go",
    "content": "package domain\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype Instance struct {\n\tId                    uuid.UUID  `json:\"id\" gorm:\"primaryKey\"`\n\tHost                  string     `json:\"host\" gorm:\"unique\"`\n\tPublishedAt           *time.Time `json:\"publishedAt\"`\n\tClientMaxBodyByteSize *int64     `json:\"clientMaxBodyByteSize\"`\n\tDeletedAt             *time.Time `json:\"deletedAt\"`\n\tCreatedAt             time.Time  `json:\"createdAt\"`\n\tUpdatedAt             time.Time  `json:\"updatedAt\"`\n}\n\nfunc (r *Instance) Approve() {\n\tnow := time.Now()\n\tr.PublishedAt = &now\n}\n\nfunc (r *Instance) BeforeCreate(tx *gorm.DB) (err error) {\n\tuuid, err := uuid.NewRandom()\n\tr.Id = uuid\n\treturn err\n}\n"
  },
  {
    "path": "server/api/pkg/domain/instance_info.go",
    "content": "package domain\n\ntype InstanceInfo struct {\n\tId                    string  `json:\"id\"`\n\tHost                  string  `json:\"host\"`\n\tName                  *string `json:\"name\"`\n\tDescription           *string `json:\"description\"`\n\tClientMaxBodyByteSize *int64  `json:\"clientMaxBodyByteSize\"`\n\tIconUrl               *string `json:\"iconUrl\"`\n\tThemeColor            *string `json:\"themeColor\"`\n}\n"
  },
  {
    "path": "server/api/pkg/domain/meta.go",
    "content": "package domain\n\ntype Meta struct {\n\tHost        string  `json:\"host\" gorm:\"primaryKey\"`\n\tName        *string `json:\"name\"`\n\tDescription *string `json:\"description\"`\n\tThemeColor  *string `json:\"themeColor\"`\n\tBannerUrl   *string `json:\"bannerUrl\"`\n\tIconUrl     *string `json:\"iconUrl\"`\n}\n"
  },
  {
    "path": "server/api/pkg/domain/token.go",
    "content": "package domain\n\nimport (\n\t\"time\"\n\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n)\n\ntype Token struct {\n\tID          uuid.UUID `json:\"id\" gorm:\"primaryKey\"`\n\tToken       string    `json:\"token\" gorm:\"unique\"`\n\tAdAccountId uuid.UUID `json:\"accountId\" gorm:\"foreignKey\"`\n\tAdAccount   AdAccount `json:\"-\"`\n\tCreatedAt   time.Time `json:\"createdAt\"`\n\tUpdatedAt   time.Time `json:\"updatedAt\"`\n\tIpAddress   string    `json:\"ipAddress\"`\n}\n\nfunc (t *Token) BeforeCreate(tx *gorm.DB) (err error) {\n\tt.ID, err = uuid.NewRandom()\n\tif err != nil {\n\t\treturn err\n\t}\n\ttoken, err := uuid.NewRandom()\n\tif err != nil {\n\t\treturn err\n\t}\n\tt.Token = token.String()\n\treturn err\n}\n"
  },
  {
    "path": "server/api/pkg/domain/webpush_decrypter.go",
    "content": "package domain\n\nimport (\n\t\"crypto/aes\"\n\t\"crypto/cipher\"\n\t\"crypto/elliptic\"\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/aead/ecdh\"\n)\n\ntype Decrypter struct {\n\tauthSecret      []byte\n\treceiverPublic  []byte\n\treceiverPrivate []byte\n}\n\nfunc Sha256(key []byte, data []byte) []byte {\n\thash := hmac.New(sha256.New, []byte(key))\n\thash.Write(data)\n\treturn hash.Sum(nil)\n}\n\nfunc DecodeBase64(src string) ([]byte, error) {\n\tresult, err := base64.URLEncoding.DecodeString(src)\n\tif err == nil {\n\t\treturn result, err\n\t}\n\tresult, err = base64.RawURLEncoding.DecodeString(src)\n\tif err == nil {\n\t\treturn result, err\n\t}\n\n\tresult, err = base64.StdEncoding.DecodeString(src)\n\tif err == nil {\n\t\treturn result, err\n\t}\n\treturn base64.RawStdEncoding.DecodeString(src)\n}\n\nfunc NewDecrypter(authSecret string, receiverPublic string, receiverPrivate string) (*Decrypter, error) {\n\n\tasb, err := DecodeBase64(authSecret)\n\tif err != nil {\n\t\tfmt.Printf(\"decode failed:%s\", err.Error())\n\t\treturn nil, err\n\t}\n\trcpb, err := DecodeBase64(receiverPublic)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\trpb, err := DecodeBase64(receiverPrivate)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdecrypter := Decrypter{\n\t\tauthSecret:      asb,\n\t\treceiverPublic:  rcpb,\n\t\treceiverPrivate: rpb,\n\t}\n\treturn &decrypter, nil\n}\n\nfunc (r Decrypter) Decrypt(base64Body string) (*string, error) {\n\n\tenc, err := DecodeBase64(base64Body)\n\tif err != nil {\n\t\tfmt.Printf(\"bodyをdecode base64するのに失敗:%s\\n\", err.Error())\n\t\treturn nil, err\n\t}\n\tbody := enc\n\n\tsalt := body[0:16]\n\t// rs := body[16:(16 + 4)]\n\tidlen, err := r.GetIdlen(body)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tkeyId := r.GetKeyId(body, idlen)\n\tcontent := body[(16 + 4 + 1 + idlen):]\n\n\tsenderPublic, err := DecodeBase64(base64.StdEncoding.EncodeToString(keyId))\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tfmt.Printf(\"senderPublic:%s\\n\", senderPublic)\n\n\t// fmt.Printf(\"salt: %s, rs:%s, idlenHex:%s, idlen:%s, keyId:%s, content:%s, senderPublic:%s\", salt, rs, idlenHex, idlen, keyId, content, &senderPublic)\n\n\tfmt.Printf(\"keyid:%s\\n\", keyId)\n\n\tsharedSecret, err := r.GenerateSharedKey(keyId)\n\tif err != nil {\n\t\tfmt.Printf(\"Get SharedSecret failed\\n\")\n\t\treturn nil, err\n\t}\n\tfmt.Printf(\"sharedSecret:%s\\n\", sharedSecret)\n\tfmt.Printf(\"salt:%s, content:%s\\n\", base64.URLEncoding.EncodeToString(salt), content)\n\n\tprkKey := Sha256(r.authSecret, sharedSecret)\n\tkeyInfo := append(append(append([]byte(\"WebPush: info\\000\"), r.receiverPublic...), senderPublic...), []byte(\"\\001\")...)\n\tikm := Sha256(prkKey, keyInfo)\n\tprk := Sha256(salt, ikm)\n\n\tcekInfo := \"Content-Encoding: aes128gcm\\000\\001\"\n\tcek := Sha256(prk, []byte(cekInfo))[0:16]\n\n\tnonceInfo := \"Content-Encoding: nonce\\000\\001\"\n\tnonce := Sha256(prk, []byte(nonceInfo))[0:12]\n\tfmt.Printf(\"cek:%s, nonce:%s\\n\", base64.URLEncoding.EncodeToString(cek), base64.URLEncoding.EncodeToString(nonce))\n\tiv := nonce\n\tblock, err := aes.NewCipher([]byte(cek))\n\tif err != nil {\n\t\tfmt.Printf(\"aes.NewCipherに失敗\")\n\t\treturn nil, err\n\t}\n\taesgcm, err := cipher.NewGCM(block)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tplaintext, err := aesgcm.Open(nil, []byte(iv), []byte(content), nil)\n\tif err != nil {\n\t\tfmt.Printf(\"aesgcm.Openに失敗:%s\", err.Error())\n\n\t\treturn nil, err\n\t}\n\n\t// for plaintext[(len(plaintext)-1):] != []byte(\"}\") {\n\t// \tplaintext = plaintext[(len(plaintext) - 1):]\n\t// }\n\t// hoge := string(plaintext)\n\t// return &hoge, nil\n\ttext := string(plaintext)\n\tfor text[(len(text)-1):] != \"}\" {\n\t\ttext = text[0:(len(text) - 1)]\n\t\tfmt.Printf(\"json length:%d\\n\", len(text))\n\t}\n\treturn &text, nil\n\n}\n\nfunc (r Decrypter) GetKeyId(body []byte, idlen int64) []byte {\n\treturn body[(16 + 4 + 1):(16 + 4 + 1 + idlen)]\n}\n\nfunc (r Decrypter) GetIdlen(body []byte) (int64, error) {\n\tidlenHex := hex.EncodeToString(body[(16 + 4):(16 + 4 + 1)])\n\treturn strconv.ParseInt(idlenHex, 16, 64)\n}\nfunc (r Decrypter) GenerateSharedKey(keyId []byte) ([]byte, error) {\n\n\tp256 := elliptic.P256()\n\n\tgeneric := ecdh.Generic(p256)\n\n\tx, y := elliptic.Unmarshal(p256, keyId)\n\tif x == nil || y == nil {\n\t\treturn nil, fmt.Errorf(\"Invalid keyId\")\n\t}\n\tfmt.Printf(\"x:%s, y:%s\\n\", x, y)\n\treturn generic.ComputeSecret(r.receiverPrivate, ecdh.Point{X: x, Y: y}), nil\n}\n"
  },
  {
    "path": "server/api/pkg/domain/webpush_decrypter_test.go",
    "content": "package domain_test\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\n// var (\n// \tpublicKey  = \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\n// \tauthSecret = \"43w_wOVYeF9XzyRyZL3O8g\"\n// )\nvar (\n\texpectSharedSecret = \"oP7t4W/jHURAO+M+DQjqjljNu8D2p7+3uf48Hd2Z91c=\"\n\tnonce              = \"OxF/eyKT/8Pt3iN8\"\n\trecurvePrivateKey  = \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n)\n\nfunc TestSha256(t *testing.T) {\n\texpect := \"yb1GUyy4+k/dcGubgS2+QRWvBW0VgTpw3H9JLVx2Iss=\"\n\tresult := domain.Sha256([]byte(\"hogehoge\"), []byte(\"piyopiyo\"))\n\tassert.Equal(t, expect, base64.StdEncoding.EncodeToString(result))\n}\n\nfunc TestDecodeBase64(t *testing.T) {\n\tresult, err := domain.DecodeBase64(\"test\")\n\tassert.Nil(t, err)\n\tassert.Equal(t, []byte{0xb5, 0xeb, 0x2d}, result)\n}\n\nfunc TestDecodeBase642(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\tresult, err := domain.DecodeBase64(publicKey)\n\n\tassert.Nil(t, err)\n\tassert.NotNil(t, result)\n\tfmt.Printf(\"base 64 result %s\", result)\n\n\tresult, err = domain.DecodeBase64(privateKey)\n\tassert.Nil(t, err)\n\tassert.NotNil(t, result)\n\n\tresult, err = domain.DecodeBase64(authSecret)\n\tfmt.Printf(\"error:%s\\n\", err.Error())\n\tassert.Nil(t, err)\n\tassert.NotNil(t, result)\n\n}\nfunc TestDecrypt(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\tbody := \"B8TZpK9vmRlCbkFTLG6l5gAAEABBBE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI4dyaI36CvBMPCf1lOAF50FV7JkgvMGyuYnzgUOh5KSvjDygDpygjRdFYI7amKXXCeRSMcwqn8lXgP1G6CUI43z88+bg/piRVBEnnALn2d60vzUzQNSXUdHAGCQ6aElewpxe3xT74ua0Bxcd4tB3fFaUzpOzYApQRpIlG5ITDTd1haMCuarE5vUGO+oPMsIv1nJO5keRhcvKBWSynj3d0+pGkgajrNjdQentooEQt5GmntKus+mUzLT+UQN1KNWnR3FN9LjsXX8fTk3Vhl7NabiW+N/vDPxI0/lw0VdBNeI460XcWi8aJd6Yb4THB0DjJ5p2JwXHB3zZ1dGSOA6f2hQWTQbVM/9Kisji0SEYdmysFNJaiajax2IeP8eG5lmJ/Lsq6Fs+CCRHnEUZIENEo0Mw3H44Wx/zWG1mEJxffIeuWUFbCcyfD8JYZkvilUu6azhPkTbhidbZ/NQO8oJHU21K5qQbOxiFhPD//cUORE/aCeF8uMdS1PgCvD1I0wfGOxmj3tLOXyvjmTNVzR7jZ7jRMro69/9K2dZ0YrcVMHgZuXfr9OtBD25FoHkkZ6uOxU8rX+FBDt4Af5A3mseX72dUFuhSCYh2akdrhUldvqnjb7IQKQpLrBDh4t4YGmPgXvVs/uSa48MOWNfgWUgng2BReDD7RwT1MeF3KQObAdOaocRZFRWx51JgDv16o7qr5Q/vd5TPIXGKloMgMMwCA5sAsIhmBdBZLjpPrFEspPVJvfGgcu7Hdb/9/xRAOsXBjlcg4iDetdTjkBpr5Gysn1EJfEZZAJaOTD4kgKtKURmynxvtX/nDKLmaIUt1f8Dfo/UKhq+9HcSfoohH/9AcFQCiSPPJrfJFt1BstJi/PhwbmWAMvxwbrzRZXzmXk8iiTEqbnlOqml+dnDZ4aJUjTrCb5OxbfaGsr3kXATcKT8jNKTOK6/0r25NNyGHCXlaF7awdjzQXLamWrsa/ieFmRnrpWKGobW45uNXEwiKmXvDWcVBH5PDeKQpu3IQSdzBXJSpYtrwpwnyyMbI0h+Y8JufjLWFZqNqCpcHG7CiwnKAR3icC3MLbZOS8oxo2AHYfhWXxzuqU5apbuCAzKNtk4N86wEuFLb1XkpI2AJ9u9k8MDBUdRxhxWhgKbQ2EOh4KZeKQDD6olVWR7ECU0otyM1g3+Ej89WOSrqJGhk+S704v1A73+EED0MFaY+MjrIOhCsrgL/Tcu0bbHYjOiuoEFN3Uf75Nr/+qTS6SatkHtqyIi24Y/NWCIZ976946gtym8iWi9aJieCLNYE4IuKjhgIOVrWqo57nbg0/4OQvTubSzBbis3x1X+PrL3IrSKufEs5pzEPuRbyhQfLHJ2gL4v2S0od5v9mxT3XacJAq2rHEd3/GXIxfgwWm/s/aSAIOnxU5DIM71UbVuEKBFtpk0IGt6DzsZiC7lELGUfR/VSv7Hg0d4aMmAsHPmo5r9FDDsALxp2OfL1XMg8/rPnUvRoKjdkY61MHfH7rQoXfy3Yidtx7dHeZ/O21tT/V83HXC6xNXpcGew0wyTjWGBqhVXkRZUjN3EteFniv90gg0SIPW4zzKJ42/uf0tzg76gZiJboAqWwlXmt+FmjnMg4990vA1obltewm6NIRha6EJb4fpafsnA8Hqk/rM7zu57vBLCr22o0VC7gery4xbRMW/es=\"\n\n\tdecrypter, err := domain.NewDecrypter(authSecret, publicKey, privateKey)\n\tassert.NotNil(t, decrypter)\n\tassert.Nil(t, err)\n\t// fmt.Printf(\"decrypter generatedああああ\\n\")\n\t// assert.Nil(t, err)\n\tkeyId := \"BE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI=\"\n\tpk, err := domain.DecodeBase64(keyId)\n\tassert.Nil(t, err)\n\tsharedKey, err := decrypter.GenerateSharedKey(pk)\n\tassert.Nil(t, err)\n\tassert.NotEmpty(t, sharedKey)\n\tfmt.Printf(\"sharedKey:%s\\n\", sharedKey)\n\tresult, err := decrypter.Decrypt(body)\n\tassert.Nil(t, err)\n\tfmt.Printf(\"result:%s\\n\", *result)\n\n}\n\nfunc TestGenerateSharedSecret2(t *testing.T) {\n\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\n\tdecrypter, err := domain.NewDecrypter(authSecret, publicKey, privateKey)\n\tassert.NotNil(t, decrypter)\n\tassert.Nil(t, err)\n\n\tkeyId := \"BE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI=\"\n\tpk, err := domain.DecodeBase64(keyId)\n\n\tassert.Nil(t, err)\n\n\tsecret, err := decrypter.GenerateSharedKey(pk)\n\tassert.Nil(t, err)\n\n\texpect, err := domain.DecodeBase64(expectSharedSecret)\n\tassert.Equal(t, expect, secret)\n\n\tfmt.Printf(\"secret:%s\\n\", secret)\n\n}\n\nfunc TestHex(t *testing.T) {\n\tresult := hex.EncodeToString([]byte{5, 10, 7})\n\tassert.Equal(t, \"050a07\", result)\n\tfmt.Printf(\"hex result:%s\\n\", result)\n\tlength, err := strconv.ParseInt(result, 16, 64)\n\tassert.Nil(t, err)\n\tassert.Equal(t, int64(330247), length)\n}\n\nfunc TestIdlen(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\n\tdecrypter, err := domain.NewDecrypter(authSecret, publicKey, privateKey)\n\tassert.NotNil(t, decrypter)\n\tassert.Nil(t, err)\n\n\tbase64Body := \"B8TZpK9vmRlCbkFTLG6l5gAAEABBBE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI4dyaI36CvBMPCf1lOAF50FV7JkgvMGyuYnzgUOh5KSvjDygDpygjRdFYI7amKXXCeRSMcwqn8lXgP1G6CUI43z88+bg/piRVBEnnALn2d60vzUzQNSXUdHAGCQ6aElewpxe3xT74ua0Bxcd4tB3fFaUzpOzYApQRpIlG5ITDTd1haMCuarE5vUGO+oPMsIv1nJO5keRhcvKBWSynj3d0+pGkgajrNjdQentooEQt5GmntKus+mUzLT+UQN1KNWnR3FN9LjsXX8fTk3Vhl7NabiW+N/vDPxI0/lw0VdBNeI460XcWi8aJd6Yb4THB0DjJ5p2JwXHB3zZ1dGSOA6f2hQWTQbVM/9Kisji0SEYdmysFNJaiajax2IeP8eG5lmJ/Lsq6Fs+CCRHnEUZIENEo0Mw3H44Wx/zWG1mEJxffIeuWUFbCcyfD8JYZkvilUu6azhPkTbhidbZ/NQO8oJHU21K5qQbOxiFhPD//cUORE/aCeF8uMdS1PgCvD1I0wfGOxmj3tLOXyvjmTNVzR7jZ7jRMro69/9K2dZ0YrcVMHgZuXfr9OtBD25FoHkkZ6uOxU8rX+FBDt4Af5A3mseX72dUFuhSCYh2akdrhUldvqnjb7IQKQpLrBDh4t4YGmPgXvVs/uSa48MOWNfgWUgng2BReDD7RwT1MeF3KQObAdOaocRZFRWx51JgDv16o7qr5Q/vd5TPIXGKloMgMMwCA5sAsIhmBdBZLjpPrFEspPVJvfGgcu7Hdb/9/xRAOsXBjlcg4iDetdTjkBpr5Gysn1EJfEZZAJaOTD4kgKtKURmynxvtX/nDKLmaIUt1f8Dfo/UKhq+9HcSfoohH/9AcFQCiSPPJrfJFt1BstJi/PhwbmWAMvxwbrzRZXzmXk8iiTEqbnlOqml+dnDZ4aJUjTrCb5OxbfaGsr3kXATcKT8jNKTOK6/0r25NNyGHCXlaF7awdjzQXLamWrsa/ieFmRnrpWKGobW45uNXEwiKmXvDWcVBH5PDeKQpu3IQSdzBXJSpYtrwpwnyyMbI0h+Y8JufjLWFZqNqCpcHG7CiwnKAR3icC3MLbZOS8oxo2AHYfhWXxzuqU5apbuCAzKNtk4N86wEuFLb1XkpI2AJ9u9k8MDBUdRxhxWhgKbQ2EOh4KZeKQDD6olVWR7ECU0otyM1g3+Ej89WOSrqJGhk+S704v1A73+EED0MFaY+MjrIOhCsrgL/Tcu0bbHYjOiuoEFN3Uf75Nr/+qTS6SatkHtqyIi24Y/NWCIZ976946gtym8iWi9aJieCLNYE4IuKjhgIOVrWqo57nbg0/4OQvTubSzBbis3x1X+PrL3IrSKufEs5pzEPuRbyhQfLHJ2gL4v2S0od5v9mxT3XacJAq2rHEd3/GXIxfgwWm/s/aSAIOnxU5DIM71UbVuEKBFtpk0IGt6DzsZiC7lELGUfR/VSv7Hg0d4aMmAsHPmo5r9FDDsALxp2OfL1XMg8/rPnUvRoKjdkY61MHfH7rQoXfy3Yidtx7dHeZ/O21tT/V83HXC6xNXpcGew0wyTjWGBqhVXkRZUjN3EteFniv90gg0SIPW4zzKJ42/uf0tzg76gZiJboAqWwlXmt+FmjnMg4990vA1obltewm6NIRha6EJb4fpafsnA8Hqk/rM7zu57vBLCr22o0VC7gery4xbRMW/es=\"\n\n\tenc, err := domain.DecodeBase64(base64Body)\n\tassert.Nil(t, err)\n\tidlen, err := decrypter.GetIdlen(enc)\n\tassert.Equal(t, int64(65), idlen)\n\n}\n\nfunc TestGetKeyId(t *testing.T) {\n\tpublicKey := \"BJgVD2cj1pNKNR2Ss3U_8e7P9AyoL5kWaxVio5aO16Cvnx-P1r7HH8SRb-h5tuxaydZ1ky3oO0V40s6t_uN1SdA\"\n\tprivateKey := \"ciQ800G-6jyKWf6KKG94g5rCSU_l_rgbHbyHny_UsIM\"\n\tauthSecret := \"43w_wOVYeF9XzyRyZL3O8g\"\n\n\tdecrypter, _ := domain.NewDecrypter(authSecret, publicKey, privateKey)\n\n\tbase64Body := \"B8TZpK9vmRlCbkFTLG6l5gAAEABBBE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI4dyaI36CvBMPCf1lOAF50FV7JkgvMGyuYnzgUOh5KSvjDygDpygjRdFYI7amKXXCeRSMcwqn8lXgP1G6CUI43z88+bg/piRVBEnnALn2d60vzUzQNSXUdHAGCQ6aElewpxe3xT74ua0Bxcd4tB3fFaUzpOzYApQRpIlG5ITDTd1haMCuarE5vUGO+oPMsIv1nJO5keRhcvKBWSynj3d0+pGkgajrNjdQentooEQt5GmntKus+mUzLT+UQN1KNWnR3FN9LjsXX8fTk3Vhl7NabiW+N/vDPxI0/lw0VdBNeI460XcWi8aJd6Yb4THB0DjJ5p2JwXHB3zZ1dGSOA6f2hQWTQbVM/9Kisji0SEYdmysFNJaiajax2IeP8eG5lmJ/Lsq6Fs+CCRHnEUZIENEo0Mw3H44Wx/zWG1mEJxffIeuWUFbCcyfD8JYZkvilUu6azhPkTbhidbZ/NQO8oJHU21K5qQbOxiFhPD//cUORE/aCeF8uMdS1PgCvD1I0wfGOxmj3tLOXyvjmTNVzR7jZ7jRMro69/9K2dZ0YrcVMHgZuXfr9OtBD25FoHkkZ6uOxU8rX+FBDt4Af5A3mseX72dUFuhSCYh2akdrhUldvqnjb7IQKQpLrBDh4t4YGmPgXvVs/uSa48MOWNfgWUgng2BReDD7RwT1MeF3KQObAdOaocRZFRWx51JgDv16o7qr5Q/vd5TPIXGKloMgMMwCA5sAsIhmBdBZLjpPrFEspPVJvfGgcu7Hdb/9/xRAOsXBjlcg4iDetdTjkBpr5Gysn1EJfEZZAJaOTD4kgKtKURmynxvtX/nDKLmaIUt1f8Dfo/UKhq+9HcSfoohH/9AcFQCiSPPJrfJFt1BstJi/PhwbmWAMvxwbrzRZXzmXk8iiTEqbnlOqml+dnDZ4aJUjTrCb5OxbfaGsr3kXATcKT8jNKTOK6/0r25NNyGHCXlaF7awdjzQXLamWrsa/ieFmRnrpWKGobW45uNXEwiKmXvDWcVBH5PDeKQpu3IQSdzBXJSpYtrwpwnyyMbI0h+Y8JufjLWFZqNqCpcHG7CiwnKAR3icC3MLbZOS8oxo2AHYfhWXxzuqU5apbuCAzKNtk4N86wEuFLb1XkpI2AJ9u9k8MDBUdRxhxWhgKbQ2EOh4KZeKQDD6olVWR7ECU0otyM1g3+Ej89WOSrqJGhk+S704v1A73+EED0MFaY+MjrIOhCsrgL/Tcu0bbHYjOiuoEFN3Uf75Nr/+qTS6SatkHtqyIi24Y/NWCIZ976946gtym8iWi9aJieCLNYE4IuKjhgIOVrWqo57nbg0/4OQvTubSzBbis3x1X+PrL3IrSKufEs5pzEPuRbyhQfLHJ2gL4v2S0od5v9mxT3XacJAq2rHEd3/GXIxfgwWm/s/aSAIOnxU5DIM71UbVuEKBFtpk0IGt6DzsZiC7lELGUfR/VSv7Hg0d4aMmAsHPmo5r9FDDsALxp2OfL1XMg8/rPnUvRoKjdkY61MHfH7rQoXfy3Yidtx7dHeZ/O21tT/V83HXC6xNXpcGew0wyTjWGBqhVXkRZUjN3EteFniv90gg0SIPW4zzKJ42/uf0tzg76gZiJboAqWwlXmt+FmjnMg4990vA1obltewm6NIRha6EJb4fpafsnA8Hqk/rM7zu57vBLCr22o0VC7gery4xbRMW/es=\"\n\tenc, _ := domain.DecodeBase64(base64Body)\n\tidlen, _ := decrypter.GetIdlen(enc)\n\tkeyId := decrypter.GetKeyId(enc, idlen)\n\n\texpectKeyId := \"BE8bArSb8EH1d8PH0J4Wrf/p2CY2rLUx55TgRayuyH0B3ZjJ2JiMDJH+c2FsA526yd08GVf7QjwqGWnNo4+LwpI=\"\n\texpect, _ := domain.DecodeBase64(expectKeyId)\n\tassert.Equal(t, expect, keyId)\n\n}\n\nfunc TestByteConvert(t *testing.T) {\n\texpect := []byte{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x61, 0x65, 0x73, 0x31, 0x32, 0x38, 0x67, 0x63, 0x6d, 0x00, 0x01}\n\tcekInfo := \"Content-Encoding: aes128gcm\\000\\001\"\n\tassert.Equal(t, expect, []byte(cekInfo))\n\t//43 6f 6e 74 65 6e 74 2d 45 6e 63 6f 64 69 6e 67 3a 20 61 65 73 31 32 38 67 63 6d 00 01\n}\n"
  },
  {
    "path": "server/api/pkg/handler/admin/account.go",
    "content": "package admin\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"systems.panta.milktea/pkg/dao\"\n)\n\ntype AccountHandler struct {\n\tDao dao.Dao\n}\n\ntype LoginRequest struct {\n\tEmail    string `json:\"email\"`\n\tPassword string `json:\"password\"`\n}\n\ntype UpdateClientMaxBodySizeRequest struct {\n\tSize int64 `json:\"size\"`\n}\n\nfunc (r AccountHandler) Setup(engine *gin.Engine) {\n\tm := DefaultAuthMiddleware{Dao: r.Dao}\n\trepository := r.Dao.NewAdAccountRepository()\n\n\tengine.GET(\"api/admin/accounts/current\", m.CheckToken(), func(c *gin.Context) {\n\t\tuser, err := GetCurrentUser(&r.Dao, c)\n\t\tif user == nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusOK, user)\n\t\treturn\n\t})\n\n\tengine.POST(\"api/admin/accounts/login\", func(c *gin.Context) {\n\t\tvar req LoginRequest\n\t\tif err := c.ShouldBindJSON(&req); err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\t\taccount, err := repository.FindByEmail(req.Email)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\t\tresult := account.CheckPassword(req.Password)\n\t\tif result != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\t\ttoken, err := repository.CreateToken(account.Id, c.ClientIP())\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusOK, token)\n\t})\n\n\tengine.POST(\"api/admin/accounts/logout\", m.CheckToken(), func(c *gin.Context) {\n\t\ttoken := *GetToken(c)\n\t\taccount, err := repository.FindByToken(token)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\t\tif err := repository.RemoveToken(*account.GetToken(token)); err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusAccepted, nil)\n\t\treturn\n\n\t})\n\n}\n"
  },
  {
    "path": "server/api/pkg/handler/admin/admin_auth_middleware.go",
    "content": "package admin\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"systems.panta.milktea/pkg/dao\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\ntype DefaultAuthMiddleware struct {\n\tDao dao.Dao\n}\n\nfunc (r *DefaultAuthMiddleware) CheckToken() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\ttoken := GetToken(c)\n\t\tif token == nil {\n\t\t\tc.JSON(http.StatusUnauthorized, gin.H{\"type\": \"unauthorized\", \"message\": \"invalid token\"})\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t\tuser, err := r.Dao.NewAdAccountRepository().FindByToken(*token)\n\t\tif user != nil && err == nil {\n\t\t\tc.Next()\n\t\t\treturn\n\t\t} else {\n\t\t\tc.JSON(http.StatusUnauthorized, gin.H{\"type\": \"unauthorized\", \"message\": \"invalid token\"})\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\t}\n}\n\nfunc GetToken(c *gin.Context) *string {\n\taHeader := c.Request.Header[\"Authorization\"]\n\tif len(aHeader) < 1 {\n\t\treturn nil\n\t}\n\tsliced := strings.Split(aHeader[0], \" \")\n\tif len(sliced) <= 1 {\n\t\treturn nil\n\t}\n\n\ttoken := sliced[1]\n\treturn &token\n}\n\nfunc GetCurrentUser(dao *dao.Dao, c *gin.Context) (*domain.AdAccount, error) {\n\ttoken := GetToken(c)\n\tif token == nil {\n\t\treturn nil, nil\n\t}\n\treturn dao.NewAdAccountRepository().FindByToken(*token)\n}\n"
  },
  {
    "path": "server/api/pkg/handler/admin/admin_instance.go",
    "content": "package admin\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/google/uuid\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/pkg/dao\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\ntype AdminInstanceHandler struct {\n\tDao dao.Dao\n}\n\ntype CreateInstanceRequest struct {\n\tHost      string `json:\"host\"`\n\tIsPublish bool   `json:\"isPublish\"`\n}\n\nfunc (r *AdminInstanceHandler) Setup(engine *gin.Engine) {\n\tm := DefaultAuthMiddleware{Dao: r.Dao}\n\tinstanceRepository := r.Dao.NewInstanceRepository()\n\n\tengine.GET(\"api/admin/instances\", m.CheckToken(), func(c *gin.Context) {\n\t\tinstances, err := instanceRepository.FindAll()\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusOK, instances)\n\t})\n\n\tengine.POST(\"api/admin/instances\", m.CheckToken(), func(c *gin.Context) {\n\t\tvar req CreateInstanceRequest\n\t\tif err := c.ShouldBindJSON(&req); err != nil {\n\t\t\tc.Status(400)\n\t\t\treturn\n\t\t}\n\n\t\t_, err := r.Dao.NewMetaRepository().Sync(req.Host)\n\t\tif err != nil {\n\t\t\tc.Status(400)\n\t\t\treturn\n\t\t}\n\n\t\tinstance, err := instanceRepository.Request(domain.Instance{\n\t\t\tHost: req.Host,\n\t\t})\n\t\tif err != nil {\n\t\t\tc.Status(400)\n\t\t\treturn\n\t\t}\n\n\t\tif req.IsPublish {\n\t\t\tinstance, err = instanceRepository.Approve(*instance)\n\t\t}\n\n\t\tif err != nil {\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusOK, instance)\n\t})\n\n\tengine.GET(\"api/admin/instances/:instanceId\", m.CheckToken(), func(c *gin.Context) {\n\t\tinstanceId := c.Params.ByName(\"instanceId\")\n\t\tid, err := uuid.Parse(instanceId)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\t\tinstance, conti := r.GetInstance(c, id)\n\t\tif !conti {\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusOK, instance)\n\t\treturn\n\t})\n\n\tengine.GET(\"api/admin/instance-with-meta/:host\", m.CheckToken(), func(c *gin.Context) {\n\t\thost := c.Params.ByName(\"host\")\n\t\tinstance, err := instanceRepository.FindInstanceInfoByHost(host, false)\n\t\tif err != nil {\n\t\t\tif err == gorm.ErrRecordNotFound {\n\t\t\t\tc.Status(http.StatusNotFound)\n\t\t\t\treturn\n\t\t\t} else {\n\t\t\t\tc.Status(http.StatusInternalServerError)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tc.JSON(http.StatusOK, instance)\n\t\treturn\n\t})\n\n\tengine.POST(\"api/admin/instances/:instanceId/approve\", m.CheckToken(), func(c *gin.Context) {\n\t\tinstanceId := c.Params.ByName(\"instanceId\")\n\t\tid, err := uuid.Parse(instanceId)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\t\tinstance, err := instanceRepository.FindById(id)\n\t\tif err == gorm.ErrRecordNotFound {\n\t\t\tc.JSON(http.StatusNotFound, err.Error())\n\t\t\treturn\n\t\t}\n\t\tif err != nil || instance == nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\n\t\tinstance, err = instanceRepository.Approve(*instance)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusOK, instance)\n\t})\n\n\tengine.POST(\"api/admin/instances/:instanceId/update-client-max-body-size\", m.CheckToken(), func(c *gin.Context) {\n\t\tvar req UpdateClientMaxBodySizeRequest\n\n\t\terr := c.ShouldBindJSON(&req)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\n\t\tinstanceId := c.Params.ByName(\"instanceId\")\n\t\tid, err := uuid.Parse(instanceId)\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\n\t\tinstance, conti := r.GetInstance(c, id)\n\t\tif !conti {\n\t\t\treturn\n\t\t}\n\t\tinstance.ClientMaxBodyByteSize = &req.Size\n\t\tinstanceRepository.Update(*instance)\n\t\tc.Status(http.StatusAccepted)\n\t\treturn\n\t})\n\n}\n\nfunc (r AdminInstanceHandler) GetInstance(c *gin.Context, instanceId uuid.UUID) (*domain.Instance, bool) {\n\tinstance, err := r.Dao.NewInstanceRepository().FindById(instanceId)\n\tif err != nil {\n\t\tif err == gorm.ErrRecordNotFound {\n\t\t\tc.JSON(http.StatusNotFound, err.Error())\n\t\t\treturn nil, false\n\t\t} else {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn nil, false\n\t\t}\n\t}\n\treturn instance, true\n}\n"
  },
  {
    "path": "server/api/pkg/handler/instances.go",
    "content": "package handler\n\nimport (\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"gorm.io/gorm\"\n\t\"systems.panta.milktea/pkg/dao\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\ntype InstanceHandler struct {\n\tDao dao.Dao\n}\n\ntype CreateInstanceRequest struct {\n\tHost string `json:\"host\"`\n}\n\ntype MisskeyMeta struct {\n\tName        *string `json:\"name\"`\n\tDescription *string `json:\"description\"`\n\tThemeColor  *string `json:\"themeColor\"`\n\tBannerUrl   *string `json:\"bannerUrl\"`\n\tIconUrl     *string `json:\"iconUrl\"`\n}\n\nfunc (r InstanceHandler) Setup(e *gin.Engine) {\n\te.POST(\"/api/instances\", func(c *gin.Context) {\n\n\t\tvar jsonReq CreateInstanceRequest\n\t\tif err := c.ShouldBindJSON(&jsonReq); err != nil {\n\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\treturn\n\t\t}\n\n\t\tinstance, err := r.Dao.NewInstanceRepository().FindByHost(jsonReq.Host)\n\n\t\tif err != nil && err != gorm.ErrRecordNotFound {\n\t\t\tc.Status(500)\n\t\t\treturn\n\t\t}\n\n\t\tif instance == nil || (time.Now().Unix()-instance.UpdatedAt.Unix()) >= 24*60*60*1000 {\n\t\t\t_, err := r.Dao.NewMetaRepository().Sync(jsonReq.Host)\n\n\t\t\tif err != nil {\n\t\t\t\tc.JSON(http.StatusBadRequest, err.Error())\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tres, err := r.Dao.NewInstanceRepository().Request(domain.Instance{\n\t\t\tHost: jsonReq.Host,\n\t\t})\n\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, \"Error\")\n\t\t\treturn\n\t\t}\n\t\tif res != nil {\n\t\t\tc.JSON(http.StatusOK, instance)\n\t\t}\n\n\t})\n\n\te.GET(\"/api/instances\", func(c *gin.Context) {\n\t\tinstances, err := r.Dao.NewInstanceRepository().FindByPublishedInstances()\n\t\tif err != nil {\n\t\t\tc.JSON(http.StatusInternalServerError, err.Error())\n\t\t\treturn\n\t\t}\n\t\tc.JSON(http.StatusOK, instances)\n\n\t})\n}\n"
  },
  {
    "path": "server/api/pkg/handler/push_to_fcm.go",
    "content": "package handler\n\nimport (\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"systems.panta.milktea/pkg/dao\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\ntype PushToFCMHandler struct {\n\tDao       dao.Dao\n\tDecrypter domain.Decrypter\n}\n\nfunc (r PushToFCMHandler) Setup(e *gin.Engine) {\n\te.POST(\"/webpushcallback\", func(ctx *gin.Context) {\n\t\tdeviceToken, dtErr := ctx.GetQuery(\"deviceToken\")\n\t\taccountId, acErr := ctx.GetQuery(\"accountId\")\n\t\tif !dtErr || !acErr {\n\t\t\tctx.Status(410)\n\t\t\treturn\n\t\t}\n\n\t\tfmt.Printf(\"deviceToken:%s, accountId:%s\", deviceToken, accountId)\n\t\tbody, err := ioutil.ReadAll(ctx.Request.Body)\n\t\tif err != nil {\n\t\t\tctx.Status(500)\n\t\t}\n\n\t\tdecryptedBody, err := r.Decrypter.Decrypt(string(body))\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"decrypt error:%s\", err.Error())\n\t\t\tctx.Status(500)\n\t\t}\n\t\tctx.JSON(http.StatusOK, decryptedBody)\n\t})\n}\n"
  },
  {
    "path": "server/api/pkg/repository/account_repository.go",
    "content": "package repository\n\nimport (\n\t\"github.com/google/uuid\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\ntype AdAccountRepository interface {\n\tFindByEmail(email string) (*domain.AdAccount, error)\n\tCreate(user *domain.AdAccount) (*domain.AdAccount, error)\n\tDelete(id uuid.UUID) error\n\tFindOne(id uuid.UUID) (*domain.AdAccount, error)\n\tFindByToken(token string) (*domain.AdAccount, error)\n\tCreateToken(userId uuid.UUID, ipAddress string) (*domain.Token, error)\n\tRemoveToken(token domain.Token) error\n}\n"
  },
  {
    "path": "server/api/pkg/repository/instance_repository.go",
    "content": "package repository\n\nimport (\n\t\"github.com/google/uuid\"\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\ntype InstanceRepository interface {\n\tApprove(domain.Instance) (*domain.Instance, error)\n\tRequest(domain.Instance) (*domain.Instance, error)\n\tFindByPublishedInstances() ([]domain.InstanceInfo, error)\n\tFindById(uuid.UUID) (*domain.Instance, error)\n\tFindInstanceInfoByHost(host string, isRequirePublished bool) (*domain.InstanceInfo, error)\n\tCreate(domain.Instance) (*domain.Instance, error)\n\tFindByHost(host string) (*domain.Instance, error)\n\tFindAll() ([]*domain.Instance, error)\n\tUpdate(domain.Instance) error\n}\n"
  },
  {
    "path": "server/api/pkg/repository/meta_repository.go",
    "content": "package repository\n\nimport (\n\t\"systems.panta.milktea/pkg/domain\"\n)\n\ntype MetaRepository interface {\n\tSync(string) (*domain.Meta, error)\n\tFindByHost(string) (*domain.Meta, error)\n\tSave(domain.Meta) (*domain.Meta, error)\n}\n"
  },
  {
    "path": "server/client/.gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# production\n/build\n\n# misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n"
  },
  {
    "path": "server/client/README.md",
    "content": "# Getting Started with Create React App\n\nThis project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).\n\n## Available Scripts\n\nIn the project directory, you can run:\n\n### `npm start`\n\nRuns the app in the development mode.\\\nOpen [http://localhost:3000](http://localhost:3000) to view it in the browser.\n\nThe page will reload if you make edits.\\\nYou will also see any lint errors in the console.\n\n### `npm test`\n\nLaunches the test runner in the interactive watch mode.\\\nSee the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.\n\n### `npm run build`\n\nBuilds the app for production to the `build` folder.\\\nIt correctly bundles React in production mode and optimizes the build for the best performance.\n\nThe build is minified and the filenames include the hashes.\\\nYour app is ready to be deployed!\n\nSee the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.\n\n### `npm run eject`\n\n**Note: this is a one-way operation. Once you `eject`, you can’t go back!**\n\nIf you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.\n\nInstead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own.\n\nYou don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it.\n\n## Learn More\n\nYou can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).\n\nTo learn React, check out the [React documentation](https://reactjs.org/).\n"
  },
  {
    "path": "server/client/package.json",
    "content": "{\n  \"name\": \"client\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@tanstack/react-query\": \"^4.14.5\",\n    \"@testing-library/jest-dom\": \"^5.16.5\",\n    \"@testing-library/react\": \"^13.4.0\",\n    \"@testing-library/user-event\": \"^13.5.0\",\n    \"@types/jest\": \"^27.5.2\",\n    \"@types/node\": \"^16.18.3\",\n    \"@types/react\": \"^18.0.25\",\n    \"@types/react-dom\": \"^18.0.8\",\n    \"dayjs\": \"^1.11.6\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-hook-form\": \"^7.39.1\",\n    \"react-router\": \"^6.4.3\",\n    \"react-router-dom\": \"^6.4.3\",\n    \"react-scripts\": \"5.0.1\",\n    \"recoil\": \"^0.7.6\",\n    \"typescript\": \"^4.8.4\",\n    \"web-vitals\": \"^2.1.4\",\n    \"zod\": \"^3.19.1\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\"\n  },\n  \"eslintConfig\": {\n    \"extends\": [\n      \"react-app\",\n      \"react-app/jest\"\n    ]\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.2%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  },\n  \"devDependencies\": {\n    \"autoprefixer\": \"^10.4.13\",\n    \"postcss\": \"^8.4.18\",\n    \"tailwindcss\": \"^3.2.2\"\n  }\n}\n"
  },
  {
    "path": "server/client/public/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"icon\" href=\"%PUBLIC_URL%/favicon.ico\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n    <meta name=\"theme-color\" content=\"#000000\" />\n    <meta\n      name=\"description\"\n      content=\"Web site created using create-react-app\"\n    />\n    <link rel=\"apple-touch-icon\" href=\"%PUBLIC_URL%/logo192.png\" />\n    <!--\n      manifest.json provides metadata used when your web app is installed on a\n      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n    -->\n    <link rel=\"manifest\" href=\"%PUBLIC_URL%/manifest.json\" />\n    <!--\n      Notice the use of %PUBLIC_URL% in the tags above.\n      It will be replaced with the URL of the `public` folder during the build.\n      Only files inside the `public` folder can be referenced from the HTML.\n\n      Unlike \"/favicon.ico\" or \"favicon.ico\", \"%PUBLIC_URL%/favicon.ico\" will\n      work correctly both with client-side routing and a non-root public URL.\n      Learn how to configure a non-root public URL by running `npm run build`.\n    -->\n    <title>React App</title>\n  </head>\n  <body>\n    <noscript>You need to enable JavaScript to run this app.</noscript>\n    <div id=\"root\"></div>\n    <!--\n      This HTML file is a template.\n      If you open it directly in the browser, you will see an empty page.\n\n      You can add webfonts, meta tags, or analytics to this file.\n      The build step will place the bundled scripts into the <body> tag.\n\n      To begin the development, run `npm start` or `yarn start`.\n      To create a production bundle, use `npm run build` or `yarn build`.\n    -->\n  </body>\n</html>\n"
  },
  {
    "path": "server/client/public/manifest.json",
    "content": "{\n  \"short_name\": \"React App\",\n  \"name\": \"Create React App Sample\",\n  \"icons\": [\n    {\n      \"src\": \"favicon.ico\",\n      \"sizes\": \"64x64 32x32 24x24 16x16\",\n      \"type\": \"image/x-icon\"\n    },\n    {\n      \"src\": \"logo192.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"192x192\"\n    },\n    {\n      \"src\": \"logo512.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"512x512\"\n    }\n  ],\n  \"start_url\": \".\",\n  \"display\": \"standalone\",\n  \"theme_color\": \"#000000\",\n  \"background_color\": \"#ffffff\"\n}\n"
  },
  {
    "path": "server/client/public/robots.txt",
    "content": "# https://www.robotstxt.org/robotstxt.html\nUser-agent: *\nDisallow:\n"
  },
  {
    "path": "server/client/src/App.test.tsx",
    "content": "import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport App from './App';\n\ntest('renders learn react link', () => {\n  render(<App />);\n  const linkElement = screen.getByText(/learn react/i);\n  expect(linkElement).toBeInTheDocument();\n});\n"
  },
  {
    "path": "server/client/src/App.tsx",
    "content": "import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport React from 'react';\nimport {\n  createBrowserRouter,\n  RouterProvider,\n} from \"react-router-dom\";\nimport AdminRootPage from './pages/admin/admin-root-page';\nimport AllInstancesPage from './pages/admin/all-instances';\nimport ApprovedInstancesPage from './pages/admin/approved-instances-page';\nimport InstanceDetailPage from './pages/admin/instance-detail-page';\nimport { InstanceRegisterPage } from './pages/admin/instance-register-page';\nimport UnapprovedInstancesPage from './pages/admin/unapproved-instances-page';\n\nexport const queryClient = new QueryClient();\n\nconst router = createBrowserRouter([\n  {\n    path: \"/\",\n    element: <div>Home</div>\n  },\n  {\n    path: \"/admin\",\n    element: <AdminRootPage />,\n    errorElement: <div>Not Found</div>,\n    children: [\n      {\n        path: \"\",\n        element: <div>管理画面</div>\n      },\n      {\n        path: \"all-instances\",\n        element: <AllInstancesPage />\n      },\n      {\n        path: \"approved-instances\",\n        element: <ApprovedInstancesPage />\n      },\n      {\n        path: \"unapproved-instances\",\n        element: <UnapprovedInstancesPage />\n      },\n      {\n        path: \"blacklist\",\n        element: <div>Blacklist</div>\n      },\n      {\n        path: \"account\",\n        element: <div>Account</div>\n      },\n      {\n        path: \"instances/:instanceId\",\n        element: <InstanceDetailPage />,\n      },\n      {\n        path: \"instances/create\",\n        element: <InstanceRegisterPage />\n\n      }\n    ]\n  }\n]);\n\n\nfunction App() {\n  return (\n    <QueryClientProvider client={queryClient}>\n      <RouterProvider router={router} />\n    </QueryClientProvider>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "server/client/src/data/instances.ts",
    "content": "import { useMutation, useQuery } from \"@tanstack/react-query\";\nimport { queryClient } from \"../App\";\nimport { instanceRepository } from \"../repositories/instance-repository\";\nexport type FilterType = \"all\" | \"approved\" | \"unapproved\";\n\nexport const useInstancesQuery = ({filterType}: {filterType: FilterType}) => {\n  return useQuery({queryKey: ['getInstances', filterType], queryFn: async () => {\n      const res = await instanceRepository.getInstances()\n    if (filterType === \"all\") {\n      return res;\n    } else if (filterType === \"approved\") {\n      return res.filter((i) => i.publishedAt != null)\n    } else if (filterType === \"unapproved\") {\n      return res.filter((i) => i.publishedAt == null)\n    }\n  }});\n}\n\nexport const useInstanceDetailQuery = ({instanceId}: {instanceId: string}) => {\n  return useQuery({queryKey: ['getInstanceDetail', instanceId], queryFn: () => {\n    return instanceRepository.get(instanceId);\n  }});\n}\n\nexport const useInstanceInfoQuery = ({host}: {host: string}) => {\n  return useQuery({queryKey: ['getInstanceInfo', host], queryFn: () => {\n    return instanceRepository.getInstanceInfo(host);\n  }});\n}\n\nexport const useUpdateInstanceClietMaxBodySize = ({instanceId}: {instanceId: string}) => {\n  return useMutation({\n    mutationFn: async ({instanceId, size}:{instanceId: string, size: number}) => {\n      await instanceRepository.updateClientBodyByteSize(instanceId, {size: size})\n    },\n    onSuccess: () => {\n      queryClient.invalidateQueries(['getInstanceDetail', instanceId]);\n    }\n  })\n}"
  },
  {
    "path": "server/client/src/index.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;"
  },
  {
    "path": "server/client/src/index.tsx",
    "content": "import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\nimport { RecoilRoot } from 'recoil';\n\nconst root = ReactDOM.createRoot(\n  document.getElementById('root') as HTMLElement\n);\n\nroot.render(\n  <React.StrictMode>\n    <RecoilRoot>\n      <App />\n    </RecoilRoot>\n  </React.StrictMode>\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"
  },
  {
    "path": "server/client/src/layout/app-bar-layout.tsx",
    "content": "import React, { ReactNode } from \"react\";\n\ntype Props = {\n  children: ReactNode,\n  actions?: ReactNode,\n}\nconst AppBarLayout: React.FC<Props> = ({ children, actions }) => {\n  return <div className=\"drop-shadow-md w-full bg-white p-3 flex justify-between items-center\">\n    <div className=\"text-2xl\">\n      {children}\n    </div>\n    <div>\n      {actions}\n    </div>\n  </div>\n   \n}\n\nexport default AppBarLayout;"
  },
  {
    "path": "server/client/src/layout/app-layout.tsx",
    "content": "import { ReactNode} from \"react\";\nimport React from \"react\";\n\ntype AppLayoutProps = {\n    children: React.ReactElement,\n    sideBar?: ReactNode,\n\n}\n\nconst AppNavHead: React.FC = () => {\n  return (\n  <div className=\"text-4xl text-white pl-4 pr-4\">\n    Milktea\n  </div>\n  )\n}\n\n\n\nconst AppLayout: React.FC<AppLayoutProps> = ({children, sideBar}) => {\n    return (\n    <div className=\"flex h-screen w-screen\">\n      {\n        sideBar && (\n          <div className=\"w-64 bg-sky-900 pt-4\">\n            <AppNavHead />\n            <div className=\"text-slate-200 pt-2\">\n              {sideBar}\n            </div>\n          </div>\n        )\n      }\n      <div className=\"flex-1\">\n      {children}\n      </div>\n    </div>\n    )\n}\n\nexport default AppLayout;"
  },
  {
    "path": "server/client/src/layout/body-layout.tsx",
    "content": "import { ReactNode } from \"react\";\nimport React from \"react\";\n\ntype Props = {\n  children?: ReactNode;\n  topAppBar?: ReactNode;\n};\nconst BodyLayout: React.FC<Props> = (\n  { children, topAppBar }\n) => {\n  return <div className=\"w-full h-full flex-col flex\">\n    <div>\n      {topAppBar}\n    </div>\n    {children}\n  </div>\n}\n\nexport default BodyLayout;"
  },
  {
    "path": "server/client/src/layout/scroll-layout.tsx",
    "content": "import React, { ReactNode } from \"react\";\n\ntype Props = {\n    children: ReactNode\n}\nconst ScrollLayout: React.FC<Props> = ({children}) => {\n  return <div className=\"overflow-y-scroll\">\n    {children}\n  </div>\n}\n\nexport default ScrollLayout;"
  },
  {
    "path": "server/client/src/layout/side-menu-item-layout.tsx",
    "content": "import { ReactNode } from \"react\";\nimport { Link, To } from \"react-router-dom\";\n\ntype Props = {\n  children?: ReactNode;\n  to: To\n\n}\nconst SideMenuItemLayout: React.FC<Props> = ({ children, to }) => {\n  return (\n    <Link to={to}>\n    <div className=\"pt-1 pb-1 text-lg hover:bg-sky-600 pl-4 pr-4\">\n      {children}\n    </div>\n    </Link>\n  )\n};\n\nexport default SideMenuItemLayout;"
  },
  {
    "path": "server/client/src/models/account.tsx",
    "content": "import { z } from \"zod\";\nimport dateSchema from \"./date-schema\";\n\nconst AccountSchema = z.object({\n  id: z.string(),\n  createdAt: dateSchema,\n  updatedAt: dateSchema,\n});\n\ntype Account = z.infer<typeof AccountSchema>;\n\nexport default Account\nexport {AccountSchema};"
  },
  {
    "path": "server/client/src/models/date-schema.tsx",
    "content": "import { z } from \"zod\";\n\nconst dateSchema = z.preprocess((arg) => {\n    if (typeof arg == \"string\" || arg instanceof Date) return new Date(arg);\n  }, z.date());\n\nexport default dateSchema"
  },
  {
    "path": "server/client/src/models/instance-info.tsx",
    "content": "import { z } from \"zod\";\n\nconst InstanceInfoSchema = z.object({\n  host: z.string(),\n  name: z.string().nullable(),\n  description: z.string().nullable(),\n  clientMaxBodyByteSize: z.number().nullable(),\n  iconUrl: z.string().nullable(),\n  themeColor: z.string().nullable(),\n});\n\ntype InstanceInfo = z.infer<typeof InstanceInfoSchema>;\n\nexport default InstanceInfo;\nexport {InstanceInfoSchema};\n"
  },
  {
    "path": "server/client/src/models/instance.tsx",
    "content": "import { z } from \"zod\";\nimport dateSchema from \"./date-schema\";\n\nconst InstanceSchema = z.object({\n  id: z.string(),\n  host: z.string(),\n  publishedAt: dateSchema.nullable(),\n  clientMaxBodyByteSize: z.number().nullable(),\n  deletedAt: dateSchema.nullable(),\n  createdAt: dateSchema,\n  updatedAt: dateSchema\n});\n\ntype Instance = z.infer<typeof InstanceSchema>;\nexport type {Instance}\n\nexport {InstanceSchema};"
  },
  {
    "path": "server/client/src/models/token.tsx",
    "content": "import { z } from \"zod\";\nimport dateSchema from \"./date-schema\";\n\nconst TokenSchema = z.object({\n    id: z.string(),\n    token: z.string(),\n    accountId: z.string(),\n    createdAt: dateSchema,\n    updatedAt: dateSchema,\n});\n\ntype Token = z.infer<typeof TokenSchema>;\n\nexport default Token;\nexport {TokenSchema};"
  },
  {
    "path": "server/client/src/pages/admin/admin-root-page.tsx",
    "content": "import { useEffect } from \"react\";\nimport { Outlet } from \"react-router\";\nimport { useRecoilState } from \"recoil\";\nimport AppLayout from \"../../layout/app-layout\";\nimport SideMenuItemLayout from \"../../layout/side-menu-item-layout\";\nimport { AccountSchema } from \"../../models/account\";\nimport { authAtom, AuthState } from \"../../state/auth\";\nimport LoginPage from \"./login\";\nimport React from \"react\";\n\n\n\n\nconst AutohrizedSideMenu: React.FC = () => {\n  return (\n    <div>\n      <SideMenuItemLayout to=\"/admin/all-instances\">\n          全インスタンス\n          </SideMenuItemLayout>\n          <SideMenuItemLayout to=\"/admin/approved-instances\">\n          承認済み\n          </SideMenuItemLayout>\n          <SideMenuItemLayout to=\"/admin/unapproved-instances\">\n          未承認\n          </SideMenuItemLayout>\n          <SideMenuItemLayout to=\"/admin/blacklist\">\n          ブラックリスト\n          </SideMenuItemLayout>\n          <SideMenuItemLayout to=\"/admin/account\">\n          アカウント\n          </SideMenuItemLayout>\n        </div>\n  );\n};\n\ntype AdminRootPageLayoutProps = {\n  state: AuthState\n}\nconst AdminRootPageLayout: React.FC<AdminRootPageLayoutProps> = ({state}) => {\n  if (state === \"Loading\") {\n    return <div>Loading...</div>\n  } else {\n    return <AppLayout\n      children={\n        state === \"Authorized\" ? <Outlet /> : <LoginPage />\n      }\n      sideBar={\n        state === \"Authorized\" ? <AutohrizedSideMenu /> : undefined\n      }\n    />\n  }\n}\nconst AdminRootPage: React.FC = () => {\n  const [authState, setAuthState] = useRecoilState(authAtom)\n  useEffect(() => {\n    const currentAccount = async() => {\n      const res = await fetch(\"/api/admin/accounts/current\", {\n        headers: {\n          \"Authorization\": `Bearer ${localStorage.getItem(\"Token\")}`\n        }\n      })\n      const result = await AccountSchema.safeParseAsync(await res.json())\n      if (result.success) {\n        setAuthState(\"Authorized\");\n      } else {\n        if (res.status === 401) {\n          setAuthState(\"Unauthorized\");\n        }\n      }\n    }\n    currentAccount();\n  }, [setAuthState]);\n  \n  return (\n    <AdminRootPageLayout state={authState} />\n  )\n}\n\nexport default AdminRootPage;"
  },
  {
    "path": "server/client/src/pages/admin/all-instances.tsx",
    "content": "import AppBarLayout from \"../../layout/app-bar-layout\";\nimport BodyLayout from \"../../layout/body-layout\";\nimport InstancesStatePage from \"./components/instances-state-page\";\nimport React from \"react\";\nimport ScrollLayout from \"../../layout/scroll-layout\";\nimport { Link } from \"react-router-dom\";\n\nconst AllInstancesPage: React.FC = () => {\n  return <BodyLayout topAppBar={\n      <AppBarLayout actions={\n        <div>\n          <Link to={`/admin/instances/create`}><p className=\"bg-sky-600 p-1 rounded-lg text-white hover:bg-sky-500\">追加</p></Link>\n        </div>\n      }>\n        全てのインスタンス\n      </AppBarLayout>\n    }>\n      <ScrollLayout>\n        <InstancesStatePage filterType=\"all\" />\n      </ScrollLayout>\n    </BodyLayout>\n}\nexport default AllInstancesPage;"
  },
  {
    "path": "server/client/src/pages/admin/approved-instances-page.tsx",
    "content": "import React from \"react\";\nimport AppBarLayout from \"../../layout/app-bar-layout\";\nimport BodyLayout from \"../../layout/body-layout\";\nimport ScrollLayout from \"../../layout/scroll-layout\";\nimport InstancesStatePage from \"./components/instances-state-page\";\n\n\nconst ApprovedInstancesPage: React.FC = () => {\n    return <BodyLayout topAppBar={\n        <AppBarLayout>\n          公開承認済みインスタンス\n        </AppBarLayout>\n      }>\n        <ScrollLayout>\n          <InstancesStatePage filterType=\"approved\" />\n        </ScrollLayout>\n      </BodyLayout>\n}\nexport default ApprovedInstancesPage"
  },
  {
    "path": "server/client/src/pages/admin/components/instances-state-page.tsx",
    "content": "import { useMutation } from \"@tanstack/react-query\";\nimport { queryClient } from \"../../../App\";\nimport { instanceRepository } from \"../../../repositories/instance-repository\";\nimport InstancesTable, { OnPublishButtonClicked } from \"./instances-table\";\nimport React from \"react\";\nimport { FilterType, useInstancesQuery } from \"../../../data/instances\";\n\n\ntype Props = {\n  filterType: FilterType\n}\nconst InstancesStatePage: React.FC<Props> = ({filterType}) => {\n  \n  const query  = useInstancesQuery({filterType})\n\n  const approveMutation = useMutation({\n    mutationFn: instanceRepository.approve,\n    onSuccess: () => {\n      queryClient.invalidateQueries({\n        queryKey: ['getInstances']\n      })\n    }\n  })\n  \n  \n  const onPublishButtonClicked: OnPublishButtonClicked = (instance) => {\n    approveMutation.mutate(instance.id)\n  }\n\n  return <div className=\"p-4\">\n  {\n    query.isLoading\n      ? \"Loading\"\n        : query.isError\n        ? \"Error\"\n        : query.data\n        ? <InstancesTable\n            instances={query.data}\n            onPublishButtonClicked={onPublishButtonClicked}\n          />\n        : null\n    }\n    \n  </div>\n}\nexport default InstancesStatePage"
  },
  {
    "path": "server/client/src/pages/admin/components/instances-table.tsx",
    "content": "import dayjs from \"dayjs\";\nimport { Instance } from \"../../../models/instance\";\nimport React from \"react\";\nimport { Link } from \"react-router-dom\";\n\ntype OnPublishButtonClicked = (instance: Instance) => void;\ntype InstancesTableProps = {\n  instances: Instance[],\n  onPublishButtonClicked: OnPublishButtonClicked\n\n}\nconst InstancesTable: React.FC<InstancesTableProps> = ({instances, onPublishButtonClicked}) => {\n  \n  return <table className=\"table-fixed\">\n    <thead>\n      <tr>\n        <th className=\"px-4 py-2\">ホスト</th>\n        <th className=\"px-4 py-2\">公開承認日</th>\n        <th className=\"px-4 py-2\">作成日</th>\n        <th className=\"px-4 py-2\">更新日</th>\n        <th className=\"px-4 py-2\">リクエストボディ許容サイズ(Byte)</th>\n        <th className=\"px-4 py-2\">アクション</th>\n\n      </tr>\n    </thead>\n    <tbody>\n      {\n        instances.map((i)=>{\n          return <tr>\n            <td className=\"border px-4 py-2\"><Link to={`/admin/instances/${i.id}`}>{i.host}</Link></td>\n            <td className=\"border px-4 py-2\">{i.publishedAt == null ? \"未配信\" : dayjs(i.publishedAt).format(\"YYYY/M/DD\")}</td>\n            <td className=\"border px-4 py-2\">{dayjs(i.createdAt).format(\"YYYY/M/DD\")}</td>\n            <td className=\"border px-4 py-2\">{dayjs(i.updatedAt).format(\"YYYY/M/DD\")}</td>\n            <td className=\"border px-4 py-2\">{i.clientMaxBodyByteSize}</td>\n            <td className=\"border px-4 py-2\">\n              <button className=\"bg-sky-600 p-1 rounded-md text-white hover:bg-sky-500\" onClick={() => onPublishButtonClicked(i)}>\n                承認\n              </button>\n            </td>\n          </tr>\n        })\n      }\n    </tbody>\n  </table>\n}\nexport type {OnPublishButtonClicked};\nexport default InstancesTable;"
  },
  {
    "path": "server/client/src/pages/admin/instance-client-max-body-size-form.tsx",
    "content": "import React from \"react\"\nimport { SubmitHandler, useForm } from \"react-hook-form\"\nimport { useUpdateInstanceClietMaxBodySize } from \"../../data/instances\"\nimport { Instance } from \"../../models/instance\"\n\ntype Props = {\n  instance: Instance,\n}\n\ntype Inputs = {\n  size: string,\n}\nexport const InstanceClientBodySizeForm : React.FC<Props> = ({instance}) => {\n  const {register, handleSubmit, setValue} = useForm<Inputs>({\n    defaultValues: {\n      size: (instance.clientMaxBodyByteSize || 0).toString()\n    }\n  });\n\n  const updateMutation = useUpdateInstanceClietMaxBodySize({instanceId: instance.id})\n\n  const onSubmit: SubmitHandler<Inputs> = async (e) => {\n    await updateMutation.mutateAsync({instanceId: instance.id, size: parseInt(e.size)});\n  };\n  return (\n    <div className=\"pt-2\">\n      <form onSubmit={handleSubmit(onSubmit)}>\n        <label htmlFor=\"input-body-size\">バイト数</label>\n        <input id=\"input-body-size\" type=\"number\" className=\"block w-9/12 border p-2 bg-gray-100 rounded-md\" {...register(\"size\")} />\n        <div className=\"pt-2\">\n          {[100, 200, 300, 400, 500, 600, 700, 800, 900].map((n)=>\n            <SetByteSizeButton onClick={() => setValue(\"size\", (1048576 * n).toString())}>\n            {n}MB\n            </SetByteSizeButton>  \n          )}\n          <SetByteSizeButton onClick={() => setValue(\"size\", (1048576 * 1000).toString())}>\n            1GB\n          </SetByteSizeButton>\n        </div>\n        \n\n        <button type=\"submit\" className=\"bg-sky-700 text-white p-2 rounded-lg mt-2\">更新</button>\n\n      </form>\n      \n    </div>\n  )\n}\n\nconst SetByteSizeButton = ({onClick, children}: {onClick: () => void, children: React.ReactNode}) => {\n  return (\n    <button type=\"button\" onClick={onClick} className=\"bg-gray-500 text-white p-2 rounded-lg mr-1\">\n      {children}\n    </button>\n  )\n}"
  },
  {
    "path": "server/client/src/pages/admin/instance-detail-page.tsx",
    "content": "import dayjs from \"dayjs\";\nimport React from \"react\";\nimport { useParams } from \"react-router\";\nimport { useInstanceDetailQuery, useInstanceInfoQuery } from \"../../data/instances\";\nimport AppBarLayout from \"../../layout/app-bar-layout\";\nimport BodyLayout from \"../../layout/body-layout\";\nimport ScrollLayout from \"../../layout/scroll-layout\";\nimport { Instance } from \"../../models/instance\";\nimport { InstanceClientBodySizeForm } from \"./instance-client-max-body-size-form\";\n\ntype InstanceDetailContentProps = {\n  instance: Instance\n}\n\nconst InstanceDetailContentNormal : React.FC<InstanceDetailContentProps> = ({instance}) => {\n  return (\n    <div className=\"rounded-md drop-shadow-md bg-white p-4\">\n      <div className=\"text-xl\">\n        基本情報\n      </div>\n      <div>\n        Id: {instance.id}  \n      </div>\n      <div>\n        Host: {instance.host}  \n      </div>\n      <div>\n        作成日: {dayjs(instance.createdAt).format(\"YYYY/M/D\")}\n      </div>\n      <div>\n        更新日: {dayjs(instance.updatedAt).format(\"YYYY/M/D\")}\n      </div>\n    </div>\n  )\n}\n\nconst InstanceMetaContent: React.FC<{host: string}> = ({host}) => {\n  const query = useInstanceInfoQuery({host: host});\n  if (query.isLoading) {\n    return <div>Loading</div>\n  } else if (query.isError) {\n    return <div>\n      取得失敗:{`${query.error}`}\n    </div>\n  } else if (query.data) {\n    return <div>\n      \n      <div className=\"flex\">\n        {query.data.iconUrl && <img className=\"w-6 h-6 rounded-md\" src={query.data.iconUrl} alt=\"\" />}{query.data.host}\n      </div>\n      <div>\n        Description: {query.data.description}\n      </div>\n    </div>\n  } else {\n    return <></>\n  }\n}\nconst InstanceDetailContent: React.FC<InstanceDetailContentProps> = ({instance}) => {\n  return <div className=\"p-4\">\n    <div className=\"pb-4\">\n      <div className=\"rounded-md drop-shadow-md bg-white p-4\">\n        <div className=\"flex items-center justify-between\">\n          <div className=\"text-2xl\">\n            {instance.host}\n          </div>\n          <div>\n            <a href={`https://${instance.host}`} target=\"blank\" className=\"bg-sky-600 text-white p-2 rounded-md hover:bg-sky-500\">表示</a>\n          </div>\n        </div>\n        \n      </div>\n    </div>\n    <div className=\"pb-4\">\n      <InstanceDetailContentNormal instance={instance}/>\n    </div>\n    \n    <div className=\"pb-4\">\n      <div className=\"rounded-md drop-shadow-md bg-white p-4\">\n        <div className=\"text-xl\">\n          ステータス\n        </div>\n        <div>\n          {instance.publishedAt \n            ? '公開済み' \n            : instance.deletedAt\n            ? '削除済み'\n            : '未承認'\n          }\n        </div>\n      </div>\n    </div>\n    <div className=\"pb-4\">\n      <div className=\"rounded-md drop-shadow-md bg-white p-4\">\n        <div className=\"text-xl\">\n          送信可能なボディのサイズ(バイト)\n        </div>\n        <div>\n          {instance.clientMaxBodyByteSize?.toString() || \"未設定\"}\n          <InstanceClientBodySizeForm instance={instance} />\n        </div>\n      </div>\n    </div>\n    <div className=\"pb-4\">\n      <div className=\"rounded-md drop-shadow-md bg-white p-4\">\n        <div className=\"text-xl\">\n          メタ情報\n        </div>\n        <InstanceMetaContent host={instance.host} />\n      </div>\n    </div>\n  </div>\n  \n}\n\n\nconst InstanceDetailPage: React.FC = () => {\n  const { instanceId } = useParams();\n  \n  const query = useInstanceDetailQuery({instanceId: instanceId ?? ''});\n  return <BodyLayout topAppBar={\n    <AppBarLayout>\n      インスタンス詳細\n    </AppBarLayout>\n  }>\n    <ScrollLayout>\n    {\n      query.isLoading ? 'Loading'\n      : query.isError ? 'Error'\n      : query.data ? <InstanceDetailContent instance={query.data}/>\n      : null\n    }\n    </ScrollLayout>\n  </BodyLayout>\n}\n\nexport default InstanceDetailPage;"
  },
  {
    "path": "server/client/src/pages/admin/instance-register-page.tsx",
    "content": "import React from \"react\";\nimport { SubmitHandler, useForm } from \"react-hook-form\";\nimport { useNavigate } from \"react-router\";\nimport AppBarLayout from \"../../layout/app-bar-layout\";\nimport BodyLayout from \"../../layout/body-layout\";\nimport { instanceRepository } from \"../../repositories/instance-repository\";\n\ntype Inputs = {\n  host: string,\n  isPublish: boolean,\n}\n\nexport const InstanceRegisterPage: React.FC = () => {\n\n  const navigator = useNavigate();\n  const {\n    register,\n    handleSubmit,\n  } = useForm<Inputs>();\n\n  const onSubmit: SubmitHandler<Inputs> = async (e) => {\n    await instanceRepository.create(e); \n    navigator(-1);\n  }\n\n  return (\n    <BodyLayout topAppBar={\n      <AppBarLayout>インスタンスを登録</AppBarLayout>\n    }>\n      <div className=\"p-4\">\n        <form onSubmit={handleSubmit(onSubmit)}>\n          <div className=\"pt-2 pb-2\">\n            <label htmlFor=\"host\">Host</label>\n            <div className=\"flex items-center\">  \n              https://<input id=\"host\" type=\"text\" className=\"block w-9/12 border p-2 bg-gray-100 rounded-md\" {...register(\"host\")} />\n            </div>\n          </div>\n          <div className=\"pt-2 pb-2\">\n            <label htmlFor=\"isPublish\">即時公開</label>\n            <input type=\"checkbox\" id=\"isPublish\" {...register(\"isPublish\")}/>\n          </div>\n          <button type=\"submit\" className=\"bg-sky-700 text-white p-2 rounded-lg\">送信</button>\n        </form>\n      </div>\n    </BodyLayout>\n  )\n}"
  },
  {
    "path": "server/client/src/pages/admin/instances-page.tsx",
    "content": "import React from \"react\";\n\nconst InstancePage: React.FC = () => {\n    return <>全てのインスタンス</>\n}\nexport default InstancePage;"
  },
  {
    "path": "server/client/src/pages/admin/login.tsx",
    "content": "import AppBarLayout from \"../../layout/app-bar-layout\";\nimport BodyLayout from \"../../layout/body-layout\";\nimport { SubmitHandler, useForm } from 'react-hook-form';\nimport { TokenSchema } from \"../../models/token\";\nimport { useRecoilState } from \"recoil\";\nimport { authAtom } from \"../../state/auth\";\nimport { tokenRepository } from \"../../repositories\";\nimport React from \"react\";\n\n\ntype Inputs = {\n  email: string;\n  password: string;\n}\nconst LoginForm: React.FC = () => {\n\n  const {\n    register,\n    handleSubmit,\n  } = useForm<Inputs>();\n  // const handleSubmit: FormEventHandler<any> = (e) => {\n  //   e.preventDefault();\n  // };\n\n  const [, setAuthState] = useRecoilState(authAtom);\n\n  const onSubmit: SubmitHandler<Inputs> = async (e) => {\n    const res = await fetch(\"/api/admin/accounts/login\", {\n      method: \"POST\",\n      body: JSON.stringify({\n        email: e.email,\n        password: e.password\n      }),\n    });\n    const result = await TokenSchema.safeParseAsync(await res.json());\n    if (result.success) {\n      setAuthState(\"Authorized\");\n      tokenRepository.setToken(result.data.token)\n    } else {\n      console.log(\"失敗 status\", res.status, result.error)\n    }\n  }\n  return <div className=\"w-full h-full  flex justify-center items-center\">\n    <div className=\"p-8 drop-shadow-lg bg-white rounded-lg\">\n      <div className=\"pb-4\">\n        <h1 className=\"text-xl\">Login</h1>\n      </div>\n      <form onSubmit={handleSubmit(onSubmit)}>\n        <div className=\"pt-2 pb-2\">\n          <label htmlFor=\"email\">Email</label>\n          <input id=\"email\" type=\"email\" className=\"block w-96 border p-2 bg-gray-100 rounded-md\" {...register(\"email\")}/>\n        </div>\n        <div className=\"pt-2 pb-2\">\n          <label htmlFor=\"password\">Password</label>\n          <input id=\"password\" type=\"password\" className=\"block w-96 border p-2 bg-gray-100 rounded-md\" {...register(\"password\")}/>\n        </div>\n        <button type=\"submit\" className=\"bg-sky-700 text-white p-2 rounded-lg\">Login</button>\n      </form>\n    </div>\n    \n  </div>\n\n}\nconst LoginPage: React.FC = () => {\n    return (\n        <BodyLayout topAppBar={\n            <AppBarLayout>\n                Login\n            </AppBarLayout>\n        }>\n            <LoginForm />\n        </BodyLayout>\n    )\n}\n\n\n\nexport default LoginPage;"
  },
  {
    "path": "server/client/src/pages/admin/unapproved-instances-page.tsx",
    "content": "import AppBarLayout from \"../../layout/app-bar-layout\";\nimport BodyLayout from \"../../layout/body-layout\";\nimport InstancesStatePage from \"./components/instances-state-page\";\nimport React from \"react\";\n\n\nconst UnapprovedInstancesPage: React.FC = () => {\n    return <BodyLayout topAppBar={\n        <AppBarLayout>\n          公開未承認済みインスタンス\n        </AppBarLayout>\n      }>\n        <InstancesStatePage filterType=\"unapproved\" />\n      </BodyLayout>\n}\nexport default UnapprovedInstancesPage;"
  },
  {
    "path": "server/client/src/react-app-env.d.ts",
    "content": "/// <reference types=\"react-scripts\" />\n"
  },
  {
    "path": "server/client/src/reportWebVitals.ts",
    "content": "import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n  if (onPerfEntry && onPerfEntry instanceof Function) {\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n      getCLS(onPerfEntry);\n      getFID(onPerfEntry);\n      getFCP(onPerfEntry);\n      getLCP(onPerfEntry);\n      getTTFB(onPerfEntry);\n    });\n  }\n};\n\nexport default reportWebVitals;\n"
  },
  {
    "path": "server/client/src/repositories/index.ts",
    "content": "import { TokenRepository } from \"./token-repository\";\n\nconst tokenRepository = new TokenRepository()\nexport {tokenRepository}"
  },
  {
    "path": "server/client/src/repositories/instance-repository.ts",
    "content": "import { z } from \"zod\";\nimport { tokenRepository } from \".\";\nimport { InstanceSchema } from \"../models/instance\"\nimport { InstanceInfoSchema } from \"../models/instance-info\";\n\nexport class InstanceRepository {\n\n    getInstances = async () => {\n        const res = await fetch(\"/api/admin/instances\", {\n            headers: {\n              \"Authorization\": `Bearer ${tokenRepository.getToken()}`\n            }\n        })\n        const result =  await z.array(InstanceSchema).safeParseAsync(await res.json());\n        if (result.success) {\n            return result.data\n        } else {\n            throw result.error\n        }\n    }\n    \n    approve = async (instanceId: string) => {\n        await fetch(`/api/admin/instances/${instanceId}/approve`, {\n            headers: {\n              \"Authorization\": `Bearer ${tokenRepository.getToken()}`\n            },\n            method: \"POST\"\n        });\n    }\n\n    get = async (instanceId: string) => {\n        const res = await fetch(`/api/admin/instances/${instanceId}`, {\n            headers: {\n                \"Authorization\": `Bearer ${tokenRepository.getToken()}`\n            },\n            method: \"GET\"\n        });\n        const result = await InstanceSchema.safeParseAsync(await res.json());\n        if (result.success) {\n            return result.data;\n        } else {\n            throw result.error;\n        }\n    }\n\n    getInstanceInfo = async (host: string) => {\n        const res = await fetch(`/api/admin/instance-with-meta/${host}`, {\n            headers: {\n                \"Authorization\": `Bearer ${tokenRepository.getToken()}`\n            },\n            method: \"GET\"\n        });\n        const reuslt = await InstanceInfoSchema.safeParseAsync(await res.json());\n        if (reuslt.success) {\n            return reuslt.data;\n        } else {\n            throw reuslt.error;\n        }\n    }\n\n    create = async (request: {host: string, isPublish: boolean}) => {\n        const res = await fetch(`/api/admin/instances`, {\n            headers: {\n                \"Authorization\": `Bearer ${tokenRepository.getToken()}`\n            },\n            body: JSON.stringify(request),\n            method: \"POST\"\n        })\n        const result = await InstanceSchema.safeParseAsync(await res.json());\n        if (result.success) {\n            return result.data;\n        } else {\n            throw result.error;\n        }\n    }\n\n    updateClientBodyByteSize = async (instanceId: string, request: {size: number}) => {\n        await fetch(`/api/admin/instances/${instanceId}/update-client-max-body-size`, {\n            headers: {\n                \"Authorization\": `Bearer ${tokenRepository.getToken()}`\n            },\n            body: JSON.stringify(request),\n            method: \"POST\"\n        })\n    }\n    \n}\n\nconst instanceRepository = new InstanceRepository()\n\nexport {instanceRepository}"
  },
  {
    "path": "server/client/src/repositories/token-repository.ts",
    "content": "export class TokenRepository {\n    getToken(): string | null {\n        return localStorage.getItem(\"Token\")\n    }\n\n    setToken(token: string | null) {\n        localStorage.setItem(\"Token\", token ?? \"\")\n    }\n}"
  },
  {
    "path": "server/client/src/setupTests.ts",
    "content": "// jest-dom adds custom jest matchers for asserting on DOM nodes.\n// allows you to do things like:\n// expect(element).toHaveTextContent(/react/i)\n// learn more: https://github.com/testing-library/jest-dom\nimport '@testing-library/jest-dom';\n"
  },
  {
    "path": "server/client/src/state/auth.tsx",
    "content": "import { atom } from \"recoil\";\n\n\nexport type AuthState = \"Loading\" | \"Unauthorized\" | \"Authorized\";\n\nexport const authAtom = atom<AuthState>({\n    key: \"authState\",\n    default: \"Loading\"\n});\nexport const tokenAtom = atom<string>({\n    key: \"authToken\",\n    default: \"\",\n});"
  },
  {
    "path": "server/client/tailwind.config.js",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n  content: [\"./src/**/*.{js,jsx,ts,tsx}\"],\n  theme: {\n    extend: {},\n  },\n  plugins: [],\n}\n"
  },
  {
    "path": "server/client/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"esModuleInterop\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noFallthroughCasesInSwitch\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"noEmit\": true,\n    \"jsx\": \"react-jsx\"\n  },\n  \"include\": [\n    \"src\"\n  ]\n}\n"
  },
  {
    "path": "server/docker/client/Dockerfile",
    "content": "\nFROM node:16.13.1-alpine\nWORKDIR /usr/src/app\nCMD [\"npm\", \"run\", \"start\"]"
  },
  {
    "path": "server/docker/client/Dockerfile.production",
    "content": "\nFROM node:16.13.1-alpine\nWORKDIR /usr/src/app\nCMD [\"npm\", \"run\", \"build\"]"
  },
  {
    "path": "server/docker/nginx/config/default.conf",
    "content": "server {\n    listen  80;\n    server_name localhost;\n    location /api {\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-Host $host;\n        proxy_set_header X-Forwarded-Server $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_pass http://api:8080;\n    }\n    location / {\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-Host $host;\n        proxy_set_header X-Forwarded-Server $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_pass http://client:3000/;\n    }\n\n\n}"
  },
  {
    "path": "server/docker/production/nginx/config/default.conf",
    "content": "server {\n    listen  80;\n    server_name localhost;\n    location /api {\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-Host $host;\n        proxy_set_header X-Forwarded-Server $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_pass http://api:8080;\n    }\n\n    root /usr/share/nginx/html;\n    index index.html;\n    location / {\n        try_files $uri /index.html;    \n    }\n\n\n}"
  },
  {
    "path": "server/docker-compose.production.yaml",
    "content": "\nversion: \"3.9\"\nservices:\n  api:\n    build:\n      context: .\n      dockerfile: Dockerfile.production\n    tty: true\n    ports:\n      - \"3001:8080\"\n    volumes:\n      - \"./api:/go/src/app\"\n\n  psql:\n    container_name: \"psql\"\n    image: postgres:latest\n    restart: always\n    environment:\n      POSTGRES_PASSWORD: secret\n      POSTGRES_USER: dbuser\n      POSTGRES_DB: database\n    volumes:\n      - ./db:/var/lib/postgresql/data\n    ports:\n      - \"5433:5432\"\n  proxy:\n    container_name: \"proxy\"\n    image: nginx:latest\n    ports:\n      - \"3000:80\"\n    volumes:\n      - ./docker/production/nginx/config/default.conf:/etc/nginx/conf.d/default.conf\n      - ./client/build:/usr/share/nginx/html\n    tty: true\n    restart: always\n  client:\n    container_name: \"client\"\n    build: \n      context: ./docker/client\n      dockerfile: Dockerfile.production\n    volumes:\n      - type: bind\n        source: ./client\n        target: /usr/src/app"
  },
  {
    "path": "server/docker-compose.yaml",
    "content": "\nversion: \"3\"\nservices:\n  api:\n    build: .\n    tty: true\n    ports:\n      - \"3001:8080\"\n    volumes:\n      - \"./api:/go/src/app\"\n\n  psql:\n    container_name: \"psql\"\n    image: postgres:latest\n    restart: always\n    environment:\n      POSTGRES_PASSWORD: secret\n      POSTGRES_USER: dbuser\n      POSTGRES_DB: database\n    ports:\n      - \"5433:5432\"\n  proxy:\n    container_name: \"proxy\"\n    image: nginx:latest\n    ports:\n      - \"3000:80\"\n    volumes:\n      - ./docker/nginx/config/default.conf:/etc/nginx/conf.d/default.conf\n    tty: true\n    restart: always\n  client:\n    container_name: \"client\"\n    build: ./docker/client\n    tty: true\n    ports:\n      - \"3002:3000\"\n    volumes:\n      - type: bind\n        source: ./client\n        target: /usr/src/app"
  },
  {
    "path": "settings.gradle",
    "content": "\npluginManagement {\n    repositories {\n        google()\n        gradlePluginPortal()\n        mavenCentral()\n        maven { url \"https://jitpack.io\" }\n        maven { url 'https://maven.google.com' }\n    }\n}\n\ndependencyResolutionManagement {\n    versionCatalogs {\n        libs {\n            from(files(\"libs.versions.toml\"))\n        }\n    }\n}\n\n//dependencyResolutionManagement {\n//    versionCatalogs {\n//        libs {\n//            library(\"kotlin-datetime\", \"org.jetbrains.kotlinx:kotlinx-datetime:0.4.0\")\n//\n//            // compose libs\n//            library(\"compose-ui-ui\", \"androidx.compose.ui:ui:1.3.3\")\n//            library(\"compose-ui-ui-tooling\", \"androidx.compose.ui:ui-tooling:1.3.3\")\n////            bundle(\"compose-ui\", [\"compose-ui-ui-tooling\", \"compose-ui-ui\"])\n//\n//            library(\"compose-foundation-foundation\", \"androidx.compose.foundation:foundation:1.3.3\")\n////            bundle(\"compose-foundation\", [\"compose-foundation-foundation\"])\n//\n//            library(\"compose-material-material\", \"androidx.compose.material:material:1.3.3\")\n//            library(\"compose-material-material-icons-core\", \"androidx.compose.material:material-icons-core:1.5.3\")\n//            library(\"compose-material-material-icons-extended\", \"androidx.compose.material:material-icons-extended:1.5.3\")\n//            bundle(\"compose-material\", [\"compose-material-material\", \"compose-material-material-icons-core\", \"compose-material-material-icons-extended\"])\n//\n//            library(\"compose-ui-ui-test-junit4\", \"androidx.compose.ui:ui-test-junit4:1.3.3\")\n//            library(\"compose-runtime-runtime-livedata\", \"androidx.compose.runtime:runtime-livedata:1.3.3\")\n//            library(\"android-material-compose-theme-adapter\", \"com.google.android.material:compose-theme-adapter:1.1.16\")\n//            library(\"accompanist-swiperefresh\", \"com.google.accompanist:accompanist-swiperefresh:0.25.1\")\n//            library(\"activity-compose\", \"androidx.activity:activity-compose:1.6.1\")\n//\n//            library(\"accompanist-pager\", \"com.google.accompanist:accompanist-pager:0.14.0\")\n//            library(\"accompanist-pager-indicators\", \"com.google.accompanist:accompanist-pager-indicators:0.14.0\")\n//            library(\"coil-compose\", \"io.coil-kt:coil-compose:2.4.0\")\n//            library(\"coil-svg\", \"io.coil-kt:coil-svg:2.4.0\")\n//            library(\"compose-constraintlayout\", \"androidx.constraintlayout:constraintlayout-compose:1.0.1\")\n//\n//            library(\"hilt-android\", \"com.google.dagger:hilt-android:2.48.1\")\n//            library(\"hilt-compiler\", \"com.google.dagger:hilt-compiler:2.48.1\")\n//            library(\"hilt-android-testing\", \"com.google.dagger:hilt-android-testing:2.48.1\")\n//\n//\n//            def lifecycle_version = \"2.6.2\"\n//            def arch_version = \"2.1.0\"\n//\n//            library(\"lifecycle-runtime\", \"androidx.lifecycle:lifecycle-runtime:$lifecycle_version\")\n//            library(\"lifecycle-viewmodel-savestate\", \"androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version\")\n//            library(\"lifecycle-compiler\", \"androidx.lifecycle:lifecycle-compiler:$lifecycle_version\")\n//            library(\"lifecycle-common-java8\", \"androidx.lifecycle:lifecycle-common-java8:$lifecycle_version\")\n//            library(\"lifecycle-service\", \"androidx.lifecycle:lifecycle-service:$lifecycle_version\")\n//            library(\"lifecycle-process\", \"androidx.lifecycle:lifecycle-process:$lifecycle_version\")\n//            library(\"arch-core-testing\", \"androidx.arch.core:core-testing:$arch_version\")\n//            library(\"lifecycle-runtime-testing\", \"androidx.lifecycle:lifecycle-runtime-testing:$lifecycle_version\")\n//\n//            library(\"lifecycle-viewmodel\", \"androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1\")\n//            library(\"lifecycle-livedata\", \"androidx.lifecycle:lifecycle-livedata-ktx:2.5.1\")\n//\n//            bundle('lifecycle', ['lifecycle-viewmodel'])\n//\n//\n//            library('glide-glide', 'com.github.bumptech.glide:glide:4.14.2')\n//            library('glide-compiler', 'com.github.bumptech.glide:compiler:4.14.2')\n//            library('accompanist-glide', 'com.google.accompanist:accompanist-glide:0.14.0')\n//            library('animation-apng', 'com.github.penfeizhou.android.animation:apng:2.24.0')\n//\n//            library('wada811-databinding', 'com.github.wada811:DataBinding-ktx:5.0.2')\n//\n//            library('appcompat-appcompat', 'androidx.appcompat:appcompat:1.6.1')\n//            library('android-material-material', 'com.google.android.material:material:1.8.0')\n//            library('androidx-core-ktx', 'androidx.core:core-ktx:1.9.0')\n//            library('fragment-ktx', 'androidx.fragment:fragment-ktx:1.5.5')\n//            library('activity-ktx', 'androidx.activity:activity-ktx:1.5.0')\n//\n//            def emoji2_version = \"1.4.0\"\n//            library('androidx-emoji2', \"androidx.emoji2:emoji2:$emoji2_version\")\n//            library('androidx-emoji2-views', \"androidx.emoji2:emoji2-views:$emoji2_version\")\n//            library('androidx-emoji2-views-helper', \"androidx.emoji2:emoji2-views-helper:$emoji2_version\")\n//            library('androidx-emoji2-bundled', \"androidx.emoji2:emoji2-bundled:$emoji2_version\")\n//\n//            library('androidx-constraintlayout', 'androidx.constraintlayout:constraintlayout:2.1.4')\n//            library(\"androidx-viewpager2\", \"androidx.viewpager2:viewpager2:1.1.0-beta01\")\n//            library(\"androidx-swiperefreshlayout\", \"androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01\")\n//            library(\"flexbox\", \"com.google.android.flexbox:flexbox:3.0.0\")\n//            library(\"okhttp3-logging-inspector\", 'com.squareup.okhttp3:logging-interceptor:4.10.0')\n//            library(\"androidx-hilt-navigation-compose\", 'androidx.hilt:hilt-navigation-compose:1.0.0')\n//            library(\"androidx-work-ktx\", \"androidx.work:work-runtime-ktx:2.8.1\")\n//            library(\"hilt-work\", \"androidx.hilt:hilt-work:1.0.0\")\n//            library(\"androidx-hilt-compiler\", \"androidx.hilt:hilt-compiler:1.0.0\")\n//\n//            library(\"androidx-test-ext-junit\", \"androidx.test.ext:junit:1.1.4\")\n//            library(\"junit\", \"junit:junit:4.13.2\")\n//            library(\"androidx-test-espresso-core\", \"androidx.test.espresso:espresso-core:3.5.0\")\n//\n//            // App Startup\n//            library(\"androidx-appstartup\", \"androidx.startup:startup-runtime:1.1.1\")\n//\n//            library(\"junit-jupiter-api\", \"org.junit.jupiter:junit-jupiter-api:5.9.3\")\n//            library(\"junit-jupiter-engine\", \"org.junit.jupiter:junit-jupiter-engine:5.7.0\")\n//\n//            library(\"okhttp-sse\", \"com.squareup.okhttp3:okhttp-sse:4.10.0\")\n//\n//            library(\"kotlin-serialization\", \"org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0\")\n//\n//            library(\"recyclerview\", \"androidx.recyclerview:recyclerview:1.3.1\")\n//\n//\n//            library(\"konfetti\", \"nl.dionsegijn:konfetti-xml:2.0.3\")\n//\n//            library(\"robolectric\", \"org.robolectric:robolectric:4.13\")\n//        }\n//    }\n//}\n\ninclude \":app\"\ninclude \":modules:data\"\ninclude \":modules:common\"\ninclude \":modules:api\"\ninclude \":modules:model\"\ninclude \":modules:features:auth\"\ninclude \":modules:features:channel\"\ninclude ':modules:features:drive'\ninclude ':modules:features:media'\ninclude ':modules:features:messaging'\ninclude ':modules:common_compose'\ninclude ':modules:common_navigation'\ninclude ':modules:features:gallery'\ninclude ':modules:common_viewmodel'\ninclude ':modules:api_streaming'\ninclude ':modules:features:group'\ninclude ':modules:app_store'\ninclude ':modules:common_android'\ninclude ':modules:features:note'\ninclude ':modules:common_resource'\ninclude ':modules:common_android_ui'\ninclude ':modules:features:setting'\ninclude ':modules:features:userlist'\ninclude ':modules:features:antenna'\ninclude ':modules:features:user'\ninclude ':modules:features:notification'\ninclude ':modules:features:search'\ninclude ':modules:features:favorite'\ninclude ':modules:worker'\ninclude ':modules:features:clip'\ninclude ':modules:features:account'\ninclude ':benchmark'\n"
  },
  {
    "path": "terms_of_service_ch.md",
    "content": "# 使用条款\nMisskey第三方应用程序Milktea的使用条款（以下简称 \"使用条款\"）适用于Misskey第三方应用程序Milktea（以下简称 \"应用程序\"）的用户（以下简称 \"使用者\"）。通过同意这些使用条款，用户可以使用该应用程序。\n\n##主体\n本协议适用于用户下载本应用程序并使用本应用程序。\n\n## ＃＃应用\n本协议在用户下载本应用时适用。\n\n##权利和义务\n1.用户对使用本应用引起的任何和所有损失负责。\n2. 用户应负责因使用本应用程序而产生的任何数据通信费用。\n3. 用户应负责管理因使用本应用而产生的个人信息。\n4. 用户应负责解决因使用本应用而产生的任何问题或纠纷。\n\n#提供服务\n1.本应用应免费提供给用户。\n2. 本应用程序的提供可能会被暂停或终止，而不另行通知。\n3. 不保证与本应用有关的信息和数据的准确性。\n\n# 个人信息的处理\n请参阅我们的隐私政策\nhttps://github.com/pantasystem/Milktea/blob/develop/privacy_policy_en.md\n\n# 使用条款的变更\n这些使用条款如有变更，恕不另行通知。修改后的条款和条件应在本应用程序内公布。\n\n# 争端解决\n东京地方法院对与这些使用条款有关的任何争议拥有一审的专属管辖权。\n\n# 其他\n本使用条款应受日本法律管辖并按其解释。"
  },
  {
    "path": "terms_of_service_en.md",
    "content": "# Terms of Use\nThe Misskey Third Party Application Milktea Terms of Use (hereinafter referred to as \"Terms of Use\") apply to the user (hereinafter referred to as \"User\") of Misskey Third Party Application Milktea (hereinafter referred to as \"Application\"). By agreeing to these Terms of Use, the User may use the Application.\n\n## Subject\nThis Agreement applies to the User by downloading this Application and using this Application.\n\n## Application\nThis Agreement shall apply to the user at the time of downloading this application.\n\n## Rights and Obligations\n1. the user is responsible for any and all damages arising from the use of this application.\n2. the user shall be responsible for any data communication charges incurred by using this application. \n3. The user shall be responsible for the management of personal information arising from the use of this application. \n4. Users shall be responsible for resolving any problems or disputes arising from the use of this application.\n\n# Provision of Service\n1. this application shall be provided to the user free of charge. \n2. The provision of this application may be suspended or terminated without notice. \n3. The accuracy of information and data related to this application is not guaranteed.\n\n# Handling of Personal Information\nPlease see our privacy policy\nhttps://github.com/pantasystem/Milktea/blob/develop/privacy_policy_en.md\n\n# Changes to Terms of Use\nThese Terms of Use are subject to change without notice. Modified terms and conditions shall be posted within this application.\n\n# Dispute Resolution\nThe Tokyo District Court shall have exclusive jurisdiction in the first instance over any disputes related to these Terms of Use.\n\n# Others\nThe Terms of Use shall be governed by and construed in accordance with the laws of Japan."
  },
  {
    "path": "terms_of_service_jp.md",
    "content": "# 利用規約\nMisskeyサードパーティアプリケーションMilkteaの利用規約（以下、本規約）は、MisskeyサードパーティアプリケーションMilktea（以下、本アプリ）をご利用いただくユーザー（以下、ユーザー）に適用されるものです。本規約に同意いただくことで、ユーザーは本アプリを利用することができます。\n\n## 対象\n本規約は、ユーザーが本アプリをダウンロードし、本アプリを利用することにより適用されます。\n\n## 適用\n本規約は、本アプリをダウンロードした時点で、ユーザーに対して適用されるものとします。\n\n# 権利と義務\n1. ユーザーは、本アプリを利用することで生じる一切の損害の責任を負います。\n2. ユーザーは、本アプリを利用することで発生するデータ通信料は、ユーザーの負担となります。\n3. ユーザーは、本アプリを利用することで発生する個人情報の管理について、自己の責任で行うものとします。\n4. ユーザーは、本アプリを利用することで発生するトラブルや紛争について、自己の責任で解決するものとします。\n\n# サービスの提供\n1. 本アプリは、ユーザーに対して無料で提供されるものとします。\n2. 本アプリの提供は、予告なく中断または終了することがあります。\n3. 本アプリに関する情報やデータの正確性を保証するものではありません。\n\n# 個人情報の取り扱い\nプライバシーポリシーをご覧ください\nhttps://github.com/pantasystem/Milktea/blob/develop/privacy_policy_ja.md\n\n# 利用規約の変更\n本規約は、予告なく変更されることがあります。変更後の規約は、本アプリ内に掲載されるものとします。\n\n# 紛争解決\n本規約に関する紛争は、東京地方裁判所を第一審の専属的合意管轄裁判所とします。\n\n# その他\n本規約の解釈にあたっては、日本法を準拠法とします。"
  }
]